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 &lt;  &gt; 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>

Reply via email to