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 3c478b2f7e0 Fix SQLParsingException when using reserved word `order`
in ORDER BY clause (#37958)
3c478b2f7e0 is described below
commit 3c478b2f7e0c640e5b114063dc2b86f7332e9ff1
Author: Claire <[email protected]>
AuthorDate: Thu Feb 5 09:17:44 2026 +0800
Fix SQLParsingException when using reserved word `order` in ORDER BY clause
(#37958)
* support order by order
* release-notes
* update xml
---
RELEASE-NOTES.md | 1 +
.../src/main/antlr4/imports/doris/BaseRule.g4 | 1 +
.../src/main/antlr4/imports/firebird/BaseRule.g4 | 1 +
.../hive/src/main/antlr4/imports/hive/BaseRule.g4 | 1 +
.../src/main/antlr4/imports/presto/BaseRule.g4 | 1 +
.../src/main/antlr4/imports/sql92/BaseRule.g4 | 1 +
.../src/main/antlr4/imports/sqlserver/BaseRule.g4 | 2 +-
.../parser/src/main/resources/case/dml/select.xml | 26 ++++++++++++++++++++++
.../main/resources/sql/supported/dml/select.xml | 2 ++
9 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index aea2c709e27..57ebd82d78b 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -9,6 +9,7 @@
1. SQL Parser: Support Oracle SQL parser correctly extract REGEXP_SUBSTR
parameters - [#37924](https://github.com/apache/shardingsphere/pull/37924)
2. SQL Parser: Fix escape '\' in SQL causing DialectSQLParsingException -
[#37943](https://github.com/apache/shardingsphere/pull/37943)
3. SQL Parser: Fix error parsing \l command SQL statement when front-end
protocol is og - [#37953](https://github.com/apache/shardingsphere/pull/37953)
+4. SQL Parser:Fix SQLParsingException when using reserved word `order` in
ORDER BY clause - [#37958](https://github.com/apache/shardingsphere/pull/37958)
## Release 5.5.3
diff --git
a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4
b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4
index dc097b4458e..03805cc0bc4 100644
--- a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4
+++ b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4
@@ -370,6 +370,7 @@ identifierKeywordsUnambiguous
| OPEN
| OPTIONAL
| OPTIONS
+ | ORDER
| ORDINALITY
| ORGANIZATION
| OTHERS
diff --git
a/parser/sql/engine/dialect/firebird/src/main/antlr4/imports/firebird/BaseRule.g4
b/parser/sql/engine/dialect/firebird/src/main/antlr4/imports/firebird/BaseRule.g4
index 602ef184bc1..333ffdfa9ef 100644
---
a/parser/sql/engine/dialect/firebird/src/main/antlr4/imports/firebird/BaseRule.g4
+++
b/parser/sql/engine/dialect/firebird/src/main/antlr4/imports/firebird/BaseRule.g4
@@ -77,6 +77,7 @@ unreservedWord
| LENGTH
| MESSAGE_LENGTH | MESSAGE_OCTET_LENGTH | MESSAGE_TEXT | MORE92 | MUMPS
| NAME | NULLABLE | NUMBER
+ | ORDER
| PASCAL | PLI
| REPEATABLE | RETURNED_LENGTH | RETURNED_OCTET_LENGTH | RETURNED_SQLSTATE
| ROW_COUNT
| SCALE | SCHEMA_NAME | SERIALIZABLE | SERVER_NAME | SUBCLASS_ORIGIN
diff --git
a/parser/sql/engine/dialect/hive/src/main/antlr4/imports/hive/BaseRule.g4
b/parser/sql/engine/dialect/hive/src/main/antlr4/imports/hive/BaseRule.g4
index 2c91c97baa5..3ff5612528f 100644
--- a/parser/sql/engine/dialect/hive/src/main/antlr4/imports/hive/BaseRule.g4
+++ b/parser/sql/engine/dialect/hive/src/main/antlr4/imports/hive/BaseRule.g4
@@ -339,6 +339,7 @@ identifierKeywordsUnambiguous
| OPEN
| OPTIONAL
| OPTIONS
+ | ORDER
| ORDINALITY
| ORGANIZATION
| OTHERS
diff --git
a/parser/sql/engine/dialect/presto/src/main/antlr4/imports/presto/BaseRule.g4
b/parser/sql/engine/dialect/presto/src/main/antlr4/imports/presto/BaseRule.g4
index e9097a67281..2ed8690e347 100644
---
a/parser/sql/engine/dialect/presto/src/main/antlr4/imports/presto/BaseRule.g4
+++
b/parser/sql/engine/dialect/presto/src/main/antlr4/imports/presto/BaseRule.g4
@@ -343,6 +343,7 @@ identifierKeywordsUnambiguous
| OPEN
| OPTIONAL
| OPTIONS
+ | ORDER
| ORDINALITY
| ORGANIZATION
| OTHERS
diff --git
a/parser/sql/engine/dialect/sql92/src/main/antlr4/imports/sql92/BaseRule.g4
b/parser/sql/engine/dialect/sql92/src/main/antlr4/imports/sql92/BaseRule.g4
index 6d3d1da193a..bbde8e425a5 100644
--- a/parser/sql/engine/dialect/sql92/src/main/antlr4/imports/sql92/BaseRule.g4
+++ b/parser/sql/engine/dialect/sql92/src/main/antlr4/imports/sql92/BaseRule.g4
@@ -77,6 +77,7 @@ unreservedWord
| LENGTH
| MESSAGE_LENGTH | MESSAGE_OCTET_LENGTH | MESSAGE_TEXT | MORE92 | MUMPS
| NAME | NULLABLE | NUMBER
+ | ORDER
| PASCAL | PLI
| REPEATABLE | RETURNED_LENGTH | RETURNED_OCTET_LENGTH | RETURNED_SQLSTATE
| ROW_COUNT
| SCALE | SCHEMA_NAME | SERIALIZABLE | SERVER_NAME | SUBCLASS_ORIGIN
diff --git
a/parser/sql/engine/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4
b/parser/sql/engine/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4
index 9ea2035af6a..90a8cb74d62 100644
---
a/parser/sql/engine/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4
+++
b/parser/sql/engine/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4
@@ -84,7 +84,7 @@ unreservedWord
| DISTRIBUTION | DOCUMENT | DURABILITY | ENCRYPTED | FILESTREAM |
FILETABLE | FOLLOWING
| HASH | HEAP | INBOUND | INFINITE | LOGIN | MASKED | MAXDOP
| MINUTES | MONTHS | MOVE | NOCHECK | NONCLUSTERED | OBJECT | OFF
- | ONLINE | OUTBOUND | OVER | PAGE | PARTITIONS | PAUSED | PERIOD
+ | ONLINE | ORDER | OUTBOUND | OVER | PAGE | PARTITIONS | PAUSED | PERIOD
| PERSISTED | PRECEDING | RANDOMIZED | RANGE | REBUILD | REPLICATE |
REPLICATION
| RESUMABLE | ROWGUIDCOL | SAVE | SELF | SPARSE | SWITCH | TRAN
| TRANCOUNT | UNBOUNDED | YEARS | WEEKS | ABORT_AFTER_WAIT |
ALLOW_PAGE_LOCKS | ALLOW_ROW_LOCKS
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 2aaf5fc7ff1..43833d5a56d 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -13713,6 +13713,32 @@
</expr>
</where>
</select>
+
+ <select sql-case-id="select_order_by_order">
+ <projections start-index="7" stop-index="8">
+ <column-projection name="id" start-index="7" stop-index="8" />
+ </projections>
+ <from>
+ <simple-table name="test" start-index="15" stop-index="18" />
+ </from>
+ <order-by>
+ <column-item name="order" start-delimiter="`" end-delimiter="`"
start-index="29" stop-index="35" />
+ </order-by>
+ </select>
+
+ <select sql-case-id="select_order_by_order_two">
+ <projections start-index="7" stop-index="8">
+ <column-projection name="id" start-index="7" stop-index="8" />
+ </projections>
+ <from>
+ <simple-table name="t_test" start-index="15" stop-index="20" />
+ </from>
+ <order-by>
+ <column-item name="order" start-index="31" stop-index="42">
+ <owner name="t_test" start-index="31" stop-index="36" />
+ </column-item>
+ </order-by>
+ </select>
<select sql-case-id="select_pg_database_info">
<projections start-index="7" stop-index="250">
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 7279a7c32b6..4a7d30cdd3e 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
@@ -495,5 +495,7 @@
<sql-case id="select_format_function_oracle" value="SELECT FORMAT('abc',
'999') FROM dual" db-types="Oracle" />
<sql-case id="select_first_value_oracle" value="SELECT FIRST_VALUE(salary)
OVER (ORDER BY salary) FROM employees" db-types="Oracle" />
<sql-case id="select_datetime_lbe_literal_oracle" value="SELECT {ts
'2020-02-02 10:00:00'} FROM dual" db-types="Oracle" />
+ <sql-case id="select_order_by_order" value="SELECT id FROM test ORDER BY
`order` " db-types="MySQL,Hive,Doris,Presto" />
+ <sql-case id="select_order_by_order_two" value="SELECT id FROM t_test
ORDER BY t_test.order"
db-types="MySQL,Hive,Doris,SQLServer,Firebird,SQL92,Presto" />
<sql-case id="select_pg_database_info" value="SELECT d.datname as
"Name", pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
d.datcollate as "Collate", d.datctype as "Ctype",
pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d ORDER BY 1;" db-types="openGauss" />
</sql-cases>