This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 efe71555550 Support MySQL Function statement parse (#38182)
efe71555550 is described below
commit efe7155555052e070569d7d737cd0cd09eeeecc0
Author: Claire <[email protected]>
AuthorDate: Thu Feb 26 16:06:05 2026 +0800
Support MySQL Function statement parse (#38182)
* support ltrim
* update test
* update tests
* update
* update release notes
---
RELEASE-NOTES.md | 1 +
.../src/main/antlr4/imports/mysql/BaseRule.g4 | 2 +-
.../mysql/src/main/antlr4/imports/mysql/Keyword.g4 | 4 +
.../parser/src/main/resources/case/dml/select.xml | 164 +++++++++++++++++++++
.../main/resources/sql/supported/dml/select.xml | 10 ++
5 files changed, 180 insertions(+), 1 deletion(-)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 4a5133e85e3..fb6f58ba6a9 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -55,6 +55,7 @@
1. SQL Parser: Support to parse more SQL statements for Hive -
[#36694](https://github.com/apache/shardingsphere/pull/36694)
[#37074](https://github.com/apache/shardingsphere/pull/37074)
1. SQL Parser: Support to parse CREATE MATERIALIZED VIEW for Doris -
[#31499](https://github.com/apache/shardingsphere/pull/31499)
1. SQL Parser: Support to parse CREATE FUNCTION with $$ symbol for PostgreSQL
and openGauss - [#35947](https://github.com/apache/shardingsphere/pull/35947)
+1. SQL Parser: Support MySQL Function statement parse -
[#38182](https://github.com/apache/shardingsphere/pull/38182)
1. SQL Parser: Support Oracle SQL parser correctly extract REGEXP_SUBSTR
parameters - [#37924](https://github.com/apache/shardingsphere/pull/37924)
1. SQL Parser: Fix escape '\' in SQL causing DialectSQLParsingException -
[#37943](https://github.com/apache/shardingsphere/pull/37943)
1. SQL Parser: Fix error parsing \l command SQL statement when front-end
protocol is og - [#37953](https://github.com/apache/shardingsphere/pull/37953)
diff --git
a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
index 342da79612e..fd89f2eadd6 100644
--- a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
+++ b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
@@ -126,7 +126,7 @@ identifier
unreservedWord
: MAX | MIN | SUM | COUNT | GROUP_CONCAT | CAST | POSITION | SUBSTRING |
SUBSTR | MID | EXTRACT | TRIM | LAST_DAY | TRADITIONAL | TREE | MYSQL_MAIN |
MYSQL_ADMIN | INSTANT | INPLACE | COPY | UL_BINARY | AUTOCOMMIT | REDO_LOG |
DELIMITER | ARCHIVE | BLACKHOLE | CSV | FEDERATED | INNODB | MEMORY |
MRG_MYISAM | MYISAM | NDB | NDBCLUSTER | PERFORMANCE_SCHEMA | TOKUDB
- | ACCESSIBLE | ACCOUNT | ACTION | ACTIVE | ADD | ADMIN | AFTER | AGAINST |
AGGREGATE | ALGORITHM | ALL | ALTER | ALWAYS | ANALYZE | AND | ANY | ARRAY | AS
| ASC | ASCII | ASENSITIVE | AT | ATTRIBUTE | AUTOEXTEND_SIZE | AUTHENTICATION
| AUTO | AUTO_INCREMENT | AVG | ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS |
BIT_XOR | AVG_ROW_LENGTH | BACKUP | BEFORE | BERNOULLI | BEGIN | BETWEEN |
BIGINT | BINARY | BINLOG | BIT | BLOB | BLOCK | BOOL | BOOLEAN | BOTH | BTREE |
BUCKETS | BULK | BY | BYTE [...]
+ | ACCESSIBLE | ACCOUNT | ACTION | ACTIVE | ADD | ADMIN | AFTER | AGAINST |
AGGREGATE | ALGORITHM | ALL | ALTER | ALWAYS | ANALYZE | AND | ANY | ARRAY | AS
| ASC | ASCII | ASENSITIVE | AT | ATTRIBUTE | AUTOEXTEND_SIZE | AUTHENTICATION
| AUTO | AUTO_INCREMENT | AVG | ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS |
BIT_XOR | AVG_ROW_LENGTH | BACKUP | BEFORE | BERNOULLI | BEGIN | BETWEEN |
BIGINT | BINARY | BINLOG | BIT | BLOB | BLOCK | BOOL | BOOLEAN | BOTH | BTREE |
BUCKETS | BULK | BY | BYTE [...]
;
textOrIdentifier
diff --git
a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/Keyword.g4
b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/Keyword.g4
index 68cdec8445f..40054223103 100644
--- a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/Keyword.g4
+++ b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/Keyword.g4
@@ -167,3 +167,7 @@ PERFORMANCE_SCHEMA
TOKUDB
: T O K U D B
;
+
+LTRIM
+ : L T R I M
+ ;
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 b2cbc94c45f..5356eaa8771 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -14064,4 +14064,168 @@
</expression-projection>
</projections>
</select>
+
+ <select sql-case-id="select_ltrim_function">
+ <projections start-index="7" stop-index="23">
+ <expression-projection text="LTRIM(' barbar')" start-index="7"
stop-index="23" >
+ <expr>
+ <function start-index="7" stop-index="23" text="LTRIM('
barbar')" function-name="LTRIM">
+ <parameter>
+ <literal-expression start-index="13"
stop-index="22" value=" barbar" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
+
+ <select sql-case-id="select_ltrim_as_column_alias">
+ <projections start-index="7" stop-index="17">
+ <column-projection name="id" alias="ltrim" start-index="7"
stop-index="17" />
+ </projections>
+ <from>
+ <simple-table name="t" start-index="24" stop-index="24" />
+ </from>
+ </select>
+
+ <select sql-case-id="select_ltrim_as_qualified_column">
+ <projections start-index="7" stop-index="13">
+ <column-projection name="ltrim" start-index="7" stop-index="13">
+ <owner name="t" start-index="7" stop-index="7" />
+ </column-projection>
+ </projections>
+ <from>
+ <simple-table name="t" start-index="20" stop-index="20" />
+ </from>
+ </select>
+
+ <select sql-case-id="select_make_set_single">
+ <projections start-index="7" stop-index="29">
+ <expression-projection text="MAKE_SET(1,'a','b','c')"
start-index="7" stop-index="29">
+ <expr>
+ <function start-index="7" stop-index="29"
text="MAKE_SET(1,'a','b','c')" function-name="MAKE_SET">
+ <parameter><literal-expression start-index="16"
stop-index="16" value="1" /></parameter>
+ <parameter><literal-expression start-index="18"
stop-index="20" value="a" /></parameter>
+ <parameter><literal-expression start-index="22"
stop-index="24" value="b" /></parameter>
+ <parameter><literal-expression start-index="26"
stop-index="28" value="c" /></parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
+
+ <select sql-case-id="select_make_set_bits_or">
+ <projections start-index="7" stop-index="42">
+ <expression-projection text="MAKE_SET(1|4,'hello','nice','world')"
start-index="7" stop-index="42">
+ <expr>
+ <function start-index="7" stop-index="42"
text="MAKE_SET(1|4,'hello','nice','world')" function-name="MAKE_SET">
+ <parameter>
+ <binary-operation-expression start-index="16"
stop-index="18">
+ <left><literal-expression start-index="16"
stop-index="16" value="1" /></left>
+ <operator>|</operator>
+ <right><literal-expression start-index="18"
stop-index="18" value="4" /></right>
+ </binary-operation-expression>
+ </parameter>
+ <parameter><literal-expression start-index="20"
stop-index="26" value="hello" /></parameter>
+ <parameter><literal-expression start-index="28"
stop-index="33" value="nice" /></parameter>
+ <parameter><literal-expression start-index="35"
stop-index="41" value="world" /></parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
+
+ <select sql-case-id="select_make_set_with_null">
+ <projections start-index="7" stop-index="47">
+ <expression-projection
text="MAKE_SET(1|4,'hello','nice',NULL,'world')" start-index="7"
stop-index="47">
+ <expr>
+ <function start-index="7" stop-index="47"
text="MAKE_SET(1|4,'hello','nice',NULL,'world')" function-name="MAKE_SET">
+ <parameter>
+ <binary-operation-expression start-index="16"
stop-index="18">
+ <left><literal-expression start-index="16"
stop-index="16" value="1" /></left>
+ <operator>|</operator>
+ <right><literal-expression start-index="18"
stop-index="18" value="4" /></right>
+ </binary-operation-expression>
+ </parameter>
+ <parameter><literal-expression start-index="20"
stop-index="26" value="hello" /></parameter>
+ <parameter><literal-expression start-index="28"
stop-index="33" value="nice" /></parameter>
+ <parameter><literal-expression start-index="35"
stop-index="38" value="null" /></parameter>
+ <parameter><literal-expression start-index="40"
stop-index="46" value="world" /></parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
+
+ <select sql-case-id="select_make_set_zero">
+ <projections start-index="7" stop-index="29">
+ <expression-projection text="MAKE_SET(0,'a','b','c')"
start-index="7" stop-index="29">
+ <expr>
+ <function start-index="7" stop-index="29"
text="MAKE_SET(0,'a','b','c')" function-name="MAKE_SET">
+ <parameter><literal-expression start-index="16"
stop-index="16" value="0" /></parameter>
+ <parameter><literal-expression start-index="18"
stop-index="20" value="a" /></parameter>
+ <parameter><literal-expression start-index="22"
stop-index="24" value="b" /></parameter>
+ <parameter><literal-expression start-index="26"
stop-index="28" value="c" /></parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
+
+ <select sql-case-id="select_makedate_function">
+ <projections start-index="7" stop-index="42">
+ <expression-projection text="MAKEDATE(2011,31)" start-index="7"
stop-index="23">
+ <expr>
+ <function function-name="MAKEDATE" start-index="7"
stop-index="23" text="MAKEDATE(2011,31)">
+ <parameter><literal-expression value="2011"
start-index="16" stop-index="19" /></parameter>
+ <parameter><literal-expression value="31"
start-index="21" stop-index="22" /></parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ <expression-projection text="MAKEDATE(2011,32)" start-index="26"
stop-index="42">
+ <expr>
+ <function function-name="MAKEDATE" start-index="26"
stop-index="42" text="MAKEDATE(2011,32)">
+ <parameter><literal-expression value="2011"
start-index="35" stop-index="38" /></parameter>
+ <parameter><literal-expression value="32"
start-index="40" stop-index="41" /></parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
+
+ <select sql-case-id="select_maketime_function">
+ <projections start-index="7" stop-index="24">
+ <expression-projection text="MAKETIME(12,15,30)" start-index="7"
stop-index="24">
+ <expr>
+ <function function-name="MAKETIME" start-index="7"
stop-index="24" text="MAKETIME(12,15,30)">
+ <parameter><literal-expression value="12"
start-index="16" stop-index="17" /></parameter>
+ <parameter><literal-expression value="15"
start-index="19" stop-index="20" /></parameter>
+ <parameter><literal-expression value="30"
start-index="22" stop-index="23" /></parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
+
+ <select sql-case-id="select_source_pos_wait_function">
+ <projections start-index="7" stop-index="82">
+ <expression-projection text="SOURCE_POS_WAIT('mysql-bin.000001',
100)" start-index="7" stop-index="46">
+ <expr>
+ <function function-name="SOURCE_POS_WAIT" start-index="7"
stop-index="46" text="SOURCE_POS_WAIT('mysql-bin.000001', 100)">
+ <parameter><literal-expression
value="mysql-bin.000001" start-index="23" stop-index="40" /></parameter>
+ <parameter><literal-expression value="100"
start-index="43" stop-index="45" /></parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ <expression-projection text="SOURCE_POS_WAIT('bin.002', 200, 5)"
start-index="49" stop-index="82">
+ <expr>
+ <function function-name="SOURCE_POS_WAIT" start-index="49"
stop-index="82" text="SOURCE_POS_WAIT('bin.002', 200, 5)">
+ <parameter><literal-expression value="bin.002"
start-index="65" stop-index="73" /></parameter>
+ <parameter><literal-expression value="200"
start-index="76" stop-index="78" /></parameter>
+ <parameter><literal-expression value="5"
start-index="81" stop-index="81" /></parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ </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 ff0efe4cfd0..2f7ff303a4f 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
@@ -515,4 +515,14 @@
<sql-case id="select_limit_parameter" value="SELECT * FROM t4 LIMIT ?;"
db-types="PostgreSQL,openGauss" />
<sql-case id="select_limit_complex_expr" value="SELECT * FROM t4 LIMIT
(CASE WHEN true THEN 10 ELSE 20 END);" db-types="PostgreSQL,openGauss" />
<sql-case id="select_func" value="select public.int4range(400, 500,
'[]');" db-types="PostgreSQL" />
+ <sql-case id="select_ltrim_function" value="SELECT LTRIM(' barbar')"
db-types="MySQL" />
+ <sql-case id="select_ltrim_as_column_alias" value="SELECT id AS ltrim FROM
t" db-types="MySQL" />
+ <sql-case id="select_ltrim_as_qualified_column" value="SELECT t.ltrim FROM
t" db-types="MySQL" />
+ <sql-case id="select_make_set_single" value="SELECT
MAKE_SET(1,'a','b','c')" db-types="MySQL" />
+ <sql-case id="select_make_set_bits_or" value="SELECT
MAKE_SET(1|4,'hello','nice','world')" db-types="MySQL" />
+ <sql-case id="select_make_set_with_null" value="SELECT
MAKE_SET(1|4,'hello','nice',NULL,'world')" db-types="MySQL" />
+ <sql-case id="select_make_set_zero" value="SELECT MAKE_SET(0,'a','b','c')"
db-types="MySQL" />
+ <sql-case id="select_makedate_function" value="SELECT MAKEDATE(2011,31),
MAKEDATE(2011,32)" db-types="MySQL" />
+ <sql-case id="select_maketime_function" value="SELECT MAKETIME(12,15,30)"
db-types="MySQL" />
+ <sql-case id="select_source_pos_wait_function" value="SELECT
SOURCE_POS_WAIT('mysql-bin.000001', 100), SOURCE_POS_WAIT('bin.002', 200, 5)"
db-types="MySQL" />
</sql-cases>