This is an automated email from the ASF dual-hosted git repository.

chengzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new ad6f0f75b99 Support Oracle Feature Functions (#27514)
ad6f0f75b99 is described below

commit ad6f0f75b99cacbeaaed8581cc9ecbdfec3af547
Author: Zichao <[email protected]>
AuthorDate: Fri Jul 28 02:24:57 2023 +1200

    Support Oracle Feature Functions (#27514)
---
 .../oracle/src/main/antlr4/imports/oracle/BaseRule.g4 | 19 ++++++++++++++++++-
 .../src/main/antlr4/imports/oracle/OracleKeyword.g4   |  8 ++++++++
 .../visitor/statement/OracleStatementVisitor.java     |  9 +++++++++
 .../src/main/resources/case/dml/select-expression.xml | 11 +++++++++++
 .../resources/sql/supported/dml/select-expression.xml |  1 +
 5 files changed, 47 insertions(+), 1 deletion(-)

diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
index 56e0ce2d334..46734580807 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
@@ -451,6 +451,10 @@ functionName
     : identifier
     ;
 
+featureId
+    : numberLiterals
+    ;
+
 dbLink
     : identifier (DOT_ identifier)*
     ;
@@ -741,7 +745,20 @@ leadLagInfo
     ;
 
 specialFunction
-    : castFunction  | charFunction | extractFunction | formatFunction | 
firstOrLastValueFunction | trimFunction
+    : castFunction  | charFunction | extractFunction | formatFunction | 
firstOrLastValueFunction | trimFunction | featureFunction
+    ;
+
+featureFunction
+    : featureFunctionName LP_ (schemaName DOT_)? modelName (COMMA_ featureId)? 
(COMMA_ numberLiterals (COMMA_ numberLiterals)?)?
+    (DESC | ASC | ABS)? miningAttributeClause (AND miningAttributeClause)? RP_
+    ;
+
+featureFunctionName
+    : FEATURE_COMPARE | FEATURE_DETAILS | FEATURE_SET | FEATURE_ID | 
FEATURE_VALUE
+    ;
+
+miningAttributeClause
+    : USING (ASTERISK_ | (schemaName DOT_)? tableName DOT_ ASTERISK_ | expr 
(AS? alias)?)
     ;
 
 trimFunction
diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
index da9887a2410..9e1d207b5c6 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
@@ -7655,3 +7655,11 @@ XS_SYS_CONTEXT
 X_DYN_PRUNE
     :X UL_ D Y N UL_ P R U N E
     ;
+
+FEATURE_COMPARE
+    : F E A T U R E UL_ C O M P A R E
+    ;
+
+FEATURE_DETAILS
+    : F E A T U R E UL_ D E T A I L S
+    ;
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
index 6f85faa255b..f11df559c4c 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
@@ -42,6 +42,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DataTy
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DataTypeNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DatetimeExprContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExprContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.FeatureFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.FunctionCallContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.FunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.HexadecimalLiteralsContext;
@@ -798,6 +799,9 @@ public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<
         if (null != ctx.charFunction()) {
             return visit(ctx.charFunction());
         }
+        if (null != ctx.featureFunction()) {
+            return visit(ctx.featureFunction());
+        }
         return new FunctionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ctx.getChild(0).getChild(0).getText(), 
getOriginalText(ctx));
     }
     
@@ -826,6 +830,11 @@ public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<
         return new FunctionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ctx.CHAR().getText(), getOriginalText(ctx));
     }
     
+    @Override
+    public ASTNode visitFeatureFunction(final FeatureFunctionContext ctx) {
+        return new FunctionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ctx.featureFunctionName().getText(), 
getOriginalText(ctx));
+    }
+    
     @Override
     public final ASTNode visitRegularFunction(final RegularFunctionContext 
ctx) {
         FunctionSegment result = new 
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), 
ctx.regularFunctionName().getText(), getOriginalText(ctx));
diff --git a/test/it/parser/src/main/resources/case/dml/select-expression.xml 
b/test/it/parser/src/main/resources/case/dml/select-expression.xml
index 998704efef7..004fed887cc 100644
--- a/test/it/parser/src/main/resources/case/dml/select-expression.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-expression.xml
@@ -2619,4 +2619,15 @@
             <simple-table name="orders" start-index="57" stop-index="62" />
         </from>
     </select>
+    
+    <select sql-case-id="select_feature_function">
+        <projections start-index="7" stop-index="45">
+            <expression-projection text="FEATURE_VALUE(nmf_sh_sample, 3 USING 
*)" start-index="7" stop-index="45">
+                <function function-name="FEATURE_VALUE" 
text="FEATURE_VALUE(nmf_sh_sample, 3 USING *)" />
+            </expression-projection>
+        </projections>
+        <from>
+            <simple-table name="nmf_sh_sample_apply_prepared" start-index="52" 
stop-index="79" />
+        </from>
+    </select>
 </sql-parser-test-cases>
diff --git 
a/test/it/parser/src/main/resources/sql/supported/dml/select-expression.xml 
b/test/it/parser/src/main/resources/sql/supported/dml/select-expression.xml
index 9ba0539ecdf..26a3b77719d 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select-expression.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select-expression.xml
@@ -107,4 +107,5 @@
     <sql-case id="select_between_expression" value="SELECT item_id BETWEEN 1 
AND order_id, status FROM t_order_item;" db-types="MySQL" />
     <sql-case id="select_dbms_logmnr_mine_value_regular_function" 
value="SELECT DBMS_LOGMNR.MINE_VALUE(UNDO_VALUE, 'HR.EMPLOYEES.SALARY') FROM 
V$LOGMNR_CONTENTS;" db-types="Oracle" />
     <sql-case id="select_interval_day_to_second_expression" value="SELECT 
(SYSTIMESTAMP - order_date) DAY(9) TO SECOND FROM orders" db-types="Oracle" />
+    <sql-case id="select_feature_function" value="SELECT 
FEATURE_VALUE(nmf_sh_sample, 3 USING *) FROM nmf_sh_sample_apply_prepared" 
db-types="Oracle" />
 </sql-cases>

Reply via email to