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>