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

FlyingZC 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 3275787f184 Support Oracle full width SQL symbols (#39349)
3275787f184 is described below

commit 3275787f1846d9fc006a434b17d1d8cdd1a74410
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Aug 6 09:02:07 2026 +0800

    Support Oracle full width SQL symbols (#39349)
    
    * Support Oracle full width SQL symbols
    
    * Add Oracle parser release note
    
    * Support Oracle full width qualified wildcard
---
 RELEASE-NOTES.md                                   |  1 +
 .../src/main/antlr4/imports/oracle/Literals.g4     | 10 ++-
 .../src/main/antlr4/imports/oracle/Symbol.g4       | 30 +++----
 .../main/resources/case/dml/select-expression.xml  | 32 ++++++++
 .../main/resources/case/dml/select-sub-query.xml   | 94 ++++++++++++++++++++++
 .../sql/supported/dml/select-expression.xml        |  3 +
 .../sql/supported/dml/select-sub-query.xml         |  1 +
 7 files changed, 155 insertions(+), 16 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 2465a20f815..faf6230cb7e 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -84,6 +84,7 @@
 1. SQL Parser: Support parsing Oracle CREATE INDEX sql - 
[#39292](https://github.com/apache/shardingsphere/pull/39292)
 1. SQL Parser: Support function table alias column parsing for PostgreSQL and 
openGauss - [#39268](https://github.com/apache/shardingsphere/pull/39268)
 1. SQL Parser: Support MySQL and Oracle CTAS parsing and binding enhancements, 
and Doris TABLE statement segment extraction - 
[#39332](https://github.com/apache/shardingsphere/pull/39332)
+1. SQL Parser: Support Oracle full width SQL symbols parsing - 
[#39349](https://github.com/apache/shardingsphere/pull/39349)
 1. SQL Binder: Support select order by index bind metadata - 
[#38386](https://github.com/apache/shardingsphere/pull/38386)
 1. SQL Binder: Support SQL bind when with temp table name is same with 
physical table - [#38411](https://github.com/apache/shardingsphere/pull/38411)
 1. SQL Binder: Support PostgreSQL whole-row projection binding - 
[#39276](https://github.com/apache/shardingsphere/pull/39276)
diff --git 
a/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/Literals.g4 
b/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/Literals.g4
index 5af239ae56e..40cdeb813a7 100644
--- 
a/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/Literals.g4
+++ 
b/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/Literals.g4
@@ -20,7 +20,7 @@ lexer grammar Literals;
 import Alphabet, Symbol;
 
 IDENTIFIER_
-    : 
[A-Za-z\u0080-\u2FFF\u3001-\uFF0B\uFF0D-\uFFFF]+[A-Za-z_$#0-9\u0080-\u2FFF\u3001-\uFF0B\uFF0D-\uFFFF]*
+    : IDENTIFIER_START_ IDENTIFIER_PART_*
     ;
 
 STRING_
@@ -138,3 +138,11 @@ fragment INT_
 fragment HEX_
     : [0-9a-fA-F]
     ;
+
+fragment IDENTIFIER_START_
+    : 
[A-Za-z\u0080-\u2FFF\u3001-\uFF00\uFF02-\uFF07\uFF0E\uFF10-\uFF1B\uFF1F-\uFF5B\uFF5D-\uFFFF]
+    ;
+
+fragment IDENTIFIER_PART_
+    : 
[A-Za-z_$#0-9\u0080-\u2FFF\u3001-\uFF00\uFF02-\uFF07\uFF0E\uFF10-\uFF1B\uFF1F-\uFF5B\uFF5D-\uFFFF]
+    ;
diff --git 
a/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/Symbol.g4 
b/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/Symbol.g4
index dd8b3bc4f42..91dc14c6c58 100644
--- a/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/Symbol.g4
+++ b/parser/sql/engine/dialect/oracle/src/main/antlr4/imports/oracle/Symbol.g4
@@ -18,34 +18,34 @@
 lexer grammar Symbol;
 
 AND_:                '&&';
-OR_:                 '||';
+OR_:                 '||' | '\uFF5C\uFF5C' | '\uFF5C|' | '|\uFF5C';
 NOT_:                '!';
 TILDE_:              '~';
-VERTICAL_BAR_:       '|';
+VERTICAL_BAR_:       '|' | '\uFF5C';
 AMPERSAND_:          '&';
 SIGNED_LEFT_SHIFT_:  '<<';
 SIGNED_RIGHT_SHIFT_: '>>';
 CARET_:              '^';
 MOD_:                '%';
 COLON_:              ':';
-PLUS_:               '+';
-MINUS_:              '-';
-ASTERISK_:           '*';
-SLASH_:              '/';
+PLUS_:               '+' | '\uFF0B';
+MINUS_:              '-' | '\uFF0D';
+ASTERISK_:           '*' | '\uFF0A';
+SLASH_:              '/' | '\uFF0F';
 BACKSLASH_:          '\\';
 DOT_:                '.';
-DOT_ASTERISK_:       '.*';
+DOT_ASTERISK_:       '.*' | '.\uFF0A';
 SAFE_EQ_:            '<=>';
 DEQ_:                '==';
-EQ_:                 '=';
-NEQ_:                '<>' | '!=' | '^=';
-GT_:                 '>';
-GTE_:                '>=';
-LT_:                 '<';
-LTE_:                '<=';
+EQ_:                 '=' | '\uFF1D';
+NEQ_:                '<>' | '<\uFF1E' | '\uFF1C>' | '\uFF1C\uFF1E' | '!=' | 
'!\uFF1D' | '\uFF01=' | '\uFF01\uFF1D' | '^=';
+GT_:                 '>' | '\uFF1E';
+GTE_:                '>=' | '>\uFF1D' | '\uFF1E=' | '\uFF1E\uFF1D';
+LT_:                 '<' | '\uFF1C';
+LTE_:                '<=' | '<\uFF1D' | '\uFF1C=' | '\uFF1C\uFF1D';
 POUND_:              '#';
-LP_:                 '(';
-RP_:                 ')';
+LP_:                 '(' | '\uFF08';
+RP_:                 ')' | '\uFF09';
 LBE_:                '{';
 RBE_:                '}';
 LBT_:                '[';
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 b14cc7a590c..187bf2c9f32 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
@@ -325,6 +325,38 @@
         </projections>
     </select>
 
+    <select sql-case-id="select_oracle_full_width_arithmetic_and_concat">
+        <from>
+            <simple-table name="dual" start-index="44" stop-index="47" />
+        </from>
+        <projections start-index="7" stop-index="37">
+            <expression-projection text="3 - 1" start-index="7" 
stop-index="11" />
+            <expression-projection text="2 * 3" start-index="14" 
stop-index="18" />
+            <expression-projection text="4 / 2" start-index="21" 
stop-index="25" />
+            <expression-projection text="'A' || 'B'" start-index="28" 
stop-index="37" />
+        </projections>
+    </select>
+
+    <select sql-case-id="select_oracle_full_width_comparison">
+        <from>
+            <simple-table name="dual" start-index="100" stop-index="103" />
+        </from>
+        <projections start-index="7" stop-index="93">
+            <expression-projection text="" start-index="7" stop-index="93" />
+        </projections>
+    </select>
+
+    <select 
sql-case-id="select_oracle_full_width_qualified_shorthand_projection">
+        <from>
+            <simple-table name="t_order" alias="t" start-index="16" 
stop-index="24" />
+        </from>
+        <projections start-index="7" stop-index="9">
+            <shorthand-projection start-index="7" stop-index="9">
+                <owner name="t" start-index="7" stop-index="7" />
+            </shorthand-projection>
+        </projections>
+    </select>
+
     <select sql-case-id="select_with_encode_function">
         <from>
             <simple-table name="test_bytea" start-index="54" stop-index="63" />
diff --git a/test/it/parser/src/main/resources/case/dml/select-sub-query.xml 
b/test/it/parser/src/main/resources/case/dml/select-sub-query.xml
index 81dda434c5f..d08732cb73b 100644
--- a/test/it/parser/src/main/resources/case/dml/select-sub-query.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-sub-query.xml
@@ -1045,6 +1045,100 @@
         </from>
     </select>
 
+    <select sql-case-id="select_oracle_full_width_symbols_with_subquery" 
parameters="1">
+        <from>
+            <simple-table name="t_order_item" alias="t" start-index="43" 
stop-index="56" />
+        </from>
+        <projections start-index="7" stop-index="36">
+            <expression-projection text="DECODE(COUNT(t.item_id),0,0,1)" 
start-index="7" stop-index="36" />
+        </projections>
+        <where start-index="58" stop-index="169">
+            <expr>
+                <binary-operation-expression start-index="64" stop-index="169">
+                    <left>
+                        <binary-operation-expression start-index="64" 
stop-index="146">
+                            <left>
+                                <column name="user_id" start-index="64" 
stop-index="72">
+                                    <owner name="t" start-index="64" 
stop-index="64" />
+                                </column>
+                            </left>
+                            <operator>=</operator>
+                            <right>
+                                <subquery start-index="76" stop-index="146">
+                                    <select parameters="1">
+                                        <from start-index="99" 
stop-index="106">
+                                            <simple-table name="t_user" 
alias="u" start-index="99" stop-index="106" />
+                                        </from>
+                                        <projections start-index="84" 
stop-index="92">
+                                            <column-projection name="user_id" 
start-index="84" stop-index="92">
+                                                <owner name="u" 
start-index="84" stop-index="84" />
+                                            </column-projection>
+                                        </projections>
+                                        <where start-index="108" 
stop-index="145">
+                                            <expr>
+                                                <binary-operation-expression 
start-index="114" stop-index="145">
+                                                    <left>
+                                                        
<binary-operation-expression start-index="114" stop-index="128">
+                                                            <left>
+                                                                <column 
name="user_name" start-index="114" stop-index="124">
+                                                                    <owner 
name="u" start-index="114" stop-index="114" />
+                                                                </column>
+                                                            </left>
+                                                            
<operator>=</operator>
+                                                            <right>
+                                                                
<parameter-marker-expression parameter-index="0" start-index="128" 
stop-index="128" />
+                                                            </right>
+                                                        
</binary-operation-expression>
+                                                    </left>
+                                                    <operator>AND</operator>
+                                                    <right>
+                                                        
<binary-operation-expression start-index="134" stop-index="145">
+                                                            <left>
+                                                                <column 
name="status" start-index="134" stop-index="141">
+                                                                    <owner 
name="u" start-index="134" stop-index="134" />
+                                                                </column>
+                                                            </left>
+                                                            
<operator>=</operator>
+                                                            <right>
+                                                                
<literal-expression value="1" start-index="145" stop-index="145" />
+                                                            </right>
+                                                        
</binary-operation-expression>
+                                                    </right>
+                                                </binary-operation-expression>
+                                            </expr>
+                                        </where>
+                                    </select>
+                                </subquery>
+                            </right>
+                        </binary-operation-expression>
+                    </left>
+                    <operator>AND</operator>
+                    <right>
+                        <binary-operation-expression start-index="152" 
stop-index="169">
+                            <left>
+                                <binary-operation-expression start-index="152" 
stop-index="165">
+                                    <left>
+                                        <column name="quantity" 
start-index="152" stop-index="161">
+                                            <owner name="t" start-index="152" 
stop-index="152" />
+                                        </column>
+                                    </left>
+                                    <operator>+</operator>
+                                    <right>
+                                        <literal-expression value="1" 
start-index="165" stop-index="165" />
+                                    </right>
+                                </binary-operation-expression>
+                            </left>
+                            <operator>></operator>
+                            <right>
+                                <literal-expression value="0" 
start-index="169" stop-index="169" />
+                            </right>
+                        </binary-operation-expression>
+                    </right>
+                </binary-operation-expression>
+            </expr>
+        </where>
+    </select>
+
     <select sql-case-id="select_subquery_projection_sql92">
         <from>
             <simple-table name="t_order" start-index="27" stop-index="33" />
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 42bbdaacf29..d14d3a1355c 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
@@ -26,6 +26,9 @@
     <sql-case id="select_with_expression" value="SELECT o.order_id + 1 * 2 as 
exp FROM t_order AS o ORDER BY o.order_id" db-types="MySQL, H2, SQL92, 
SQLServer" />
     <sql-case id="select_with_expression_for_postgresql" value="SELECT 
o.order_id + 1 * 2 as exp FROM t_order AS o ORDER BY o.order_id" 
db-types="PostgreSQL,openGauss" />
     <sql-case id="select_with_oracle_unary_expression_projection" 
value="SELECT user_id, +user_id AS positive_user_id, -user_id AS 
negative_user_id FROM t_user" db-types="Oracle" />
+    <sql-case id="select_oracle_full_width_arithmetic_and_concat" 
value="SELECT 3 - 1, 2 * 3, 4 / 2, 'A' || 'B' FROM dual" db-types="Oracle" />
+    <sql-case id="select_oracle_full_width_comparison" value="SELECT CASE WHEN 
1 < 2 AND 2 > 1 AND 1 <= 1 AND 2 >= 2 AND 1 != 2 AND 1 <> 2 THEN 1 ELSE 0 END 
FROM dual" db-types="Oracle" />
+    <sql-case id="select_oracle_full_width_qualified_shorthand_projection" 
value="SELECT t.* FROM t_order t" db-types="Oracle" />
     <sql-case id="select_with_encode_function" value="SELECT 
ENCODE(test_datetype_col::bytea,'escape') FROM test_bytea" 
db-types="PostgreSQL,openGauss" />
     <sql-case id="select_with_date_function" value="SELECT 
DATE(i.creation_date) AS creation_date FROM `t_order_item` AS i ORDER BY 
DATE(i.creation_date) DESC" db-types="MySQL" />
     <sql-case id="select_with_regexp" value="SELECT * FROM t_order_item t 
WHERE t.status REGEXP ? AND t.item_id IN (?, ?)" db-types="MySQL,Doris,Hive" />
diff --git 
a/test/it/parser/src/main/resources/sql/supported/dml/select-sub-query.xml 
b/test/it/parser/src/main/resources/sql/supported/dml/select-sub-query.xml
index 9039b220696..bc1addd4f2f 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select-sub-query.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select-sub-query.xml
@@ -40,4 +40,5 @@
     <sql-case id="select_sub_query_with_sum" value="SELECT [T1_1].[col] AS 
[col] FROM (SELECT SUM([T2_1].[Quantity]) AS [col] FROM 
[AdventureWorks2022].[Production].[ProductInventory] AS T2_1) AS T1_1" 
db-types="SQLServer"/>
     <sql-case id="select_sub_query_with_rownumber" value="SELECT * FROM 
(SELECT col1, ROW_NUMBER () OVER (PARTITION by col1 ORDER BY col1) rn FROM tab1 
WHERE col1='XYZ') WHERE rn = 1" db-types="SQLServer"/>
     <sql-case id="select_sub_query_with_alias" value="SELECT B.* FROM (SELECT 
A.* FROM (SELECT * FROM ACT_DEPLOY_FORM WHERE FORM_KEY = 1) AS A) AS B" 
db-types="Oracle"/>
+    <sql-case id="select_oracle_full_width_symbols_with_subquery" 
value="SELECT DECODE(COUNT(t.item_id),0,0,1) FROM t_order_item t WHERE 
t.user_id = (SELECT u.user_id FROM t_user u WHERE u.user_name = ? AND u.status 
= 1) AND t.quantity + 1 > 0" db-types="Oracle" case-types="PLACEHOLDER" />
 </sql-cases>

Reply via email to