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>