This is an automated email from the ASF dual-hosted git repository. duanzhengqiang 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 bde788276b6 Support Oracle in literal sql parsing (#35384) bde788276b6 is described below commit bde788276b69478fd319ca3c2cc4f1d14f76aafe Author: ZhangCheng <chengzh...@apache.org> AuthorDate: Tue May 13 18:33:04 2025 +0800 Support Oracle in literal sql parsing (#35384) * Support Oracle in literal sql parsing * Support Oracle in literal sql parsing --- RELEASE-NOTES.md | 1 + .../src/main/antlr4/imports/oracle/BaseRule.g4 | 1 + .../visitor/statement/OracleStatementVisitor.java | 14 ++++++++---- .../parser/src/main/resources/case/dml/select.xml | 25 ++++++++++++++++++++++ .../main/resources/sql/supported/dml/select.xml | 1 + 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 92073487c74..7a5096cadf1 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -34,6 +34,7 @@ 1. DistSQL: Add InUsedStorageUnitRetriever for single rule - [#35131](https://github.com/apache/shardingsphere/pull/35131) 1. SQL Parser: Support parsing MySQL stored procedure syntax - [#35137](https://github.com/apache/shardingsphere/pull/35137) 1. SQL Parser: Support Oracle SQL parsing V1 keywords as identifiers - [#35373](https://github.com/apache/shardingsphere/pull/35373) +1. SQL Parser: Support Oracle in literal sql parsing - [#35384](https://github.com/apache/shardingsphere/pull/35384) ### Bug Fixes 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 b1b0897e907..46d6ab6917a 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 @@ -456,6 +456,7 @@ predicate | PRIOR predicate | bitExpr NOT? IN LP_ expr (COMMA_ expr)* RP_ | bitExpr NOT? IN LP_ expr (COMMA_ expr)* RP_ AND predicate + | bitExpr NOT? IN stringLiterals | bitExpr NOT? BETWEEN bitExpr AND predicate | bitExpr NOT? LIKE simpleExpr (ESCAPE simpleExpr)? | bitExpr 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 125ce772a0c..db5238efb31 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 @@ -538,11 +538,17 @@ public abstract class OracleStatementVisitor extends OracleStatementBaseVisitor< ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0)); ExpressionSegment right; if (null == ctx.subquery()) { - ListExpression listExpression = new ListExpression(ctx.LP_().getSymbol().getStartIndex(), ctx.RP_().getSymbol().getStopIndex()); - for (ExprContext each : ctx.expr()) { - listExpression.getItems().add((ExpressionSegment) visit(each)); + if (null == ctx.LP_() || null == ctx.RP_()) { + StringLiteralsContext stringLiteralsContext = ctx.stringLiterals(); + right = new LiteralExpressionSegment(stringLiteralsContext.start.getStartIndex(), stringLiteralsContext.stop.getStopIndex(), + ((StringLiteralValue) visit(stringLiteralsContext)).getValue()); + } else { + ListExpression listExpression = new ListExpression(ctx.LP_().getSymbol().getStartIndex(), ctx.RP_().getSymbol().getStopIndex()); + for (ExprContext each : ctx.expr()) { + listExpression.getItems().add((ExpressionSegment) visit(each)); + } + right = listExpression; } - right = listExpression; } else { right = new SubqueryExpressionSegment( new SubquerySegment(ctx.subquery().start.getStartIndex(), ctx.subquery().stop.getStopIndex(), (OracleSelectStatement) visit(ctx.subquery()), getOriginalText(ctx.subquery()))); diff --git a/test/it/parser/src/main/resources/case/dml/select.xml b/test/it/parser/src/main/resources/case/dml/select.xml index 8592625389a..0313e6a95c0 100644 --- a/test/it/parser/src/main/resources/case/dml/select.xml +++ b/test/it/parser/src/main/resources/case/dml/select.xml @@ -10192,4 +10192,29 @@ </from> </select> + + <select sql-case-id="select_in_literal"> + <projections start-index="7" stop-index="7"> + <shorthand-projection start-index="7" stop-index="7"> + <actual-projections start-index="0" stop-index="0"/> + </shorthand-projection> + </projections> + <from start-index="14" stop-index="20"> + <simple-table name="t_order" start-index="14" stop-index="20"/> + </from> + <where start-index="22" stop-index="45"> + <expr start-index="28" stop-index="45"> + <in-expression start-index="28" stop-index="45"> + <not>false</not> + <left start-index="28" stop-index="35"> + <column name="ORDER_ID" start-index="28" stop-index="35"> + </column> + </left> + <right start-index="40" stop-index="45"> + <literal-expression value="test" start-index="40" stop-index="45"/> + </right> + </in-expression> + </expr> + </where> + </select> </sql-parser-test-cases> diff --git a/test/it/parser/src/main/resources/sql/supported/dml/select.xml b/test/it/parser/src/main/resources/sql/supported/dml/select.xml index 11f348ff983..0989309ecac 100644 --- a/test/it/parser/src/main/resources/sql/supported/dml/select.xml +++ b/test/it/parser/src/main/resources/sql/supported/dml/select.xml @@ -319,4 +319,5 @@ <sql-case id="select_with_not_equal_comparison_with_space" value="select * from test where id < > 1 and name ! = 1 and id ^ = 3 " db-types="Oracle"/> <sql-case id="select_match_against" value="SELECT * FROM t_order WHERE MATCH(phone) AGAINST('15111111111')" db-types="MySQL"/> <sql-case id="select_with_oracle_v1_keyword" value="SELECT * FROM dual v1" db-types="Oracle" /> + <sql-case id="select_in_literal" value="select * from t_order where ORDER_ID in 'test'" db-types="Oracle" /> </sql-cases>