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>

Reply via email to