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 8f906a5ed8d Support parsing MySQL stored procedure syntax part1 
(#35154)
8f906a5ed8d is described below

commit 8f906a5ed8d7412df500226d4f7b36ce98ee9f1d
Author: jiazhang <65228898+ji...@users.noreply.github.com>
AuthorDate: Mon Apr 21 08:28:46 2025 +0800

    Support parsing MySQL stored procedure syntax part1 (#35154)
    
    * Support parsing MySQL stored procedure syntax part1
    
    * Update statement-class-simple-name
    
    ---------
    
    Co-authored-by: jia zhang <keven.jia.zh...@qq.com>
---
 .../src/main/antlr4/imports/mysql/DDLStatement.g4  | 13 +++++++++--
 .../main/resources/case/ddl/create-procedure.xml   | 27 ++++++++++++++++++++++
 .../sql/supported/ddl/create-procedure.xml         |  5 ++++
 3 files changed, 43 insertions(+), 2 deletions(-)

diff --git 
a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DDLStatement.g4 
b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DDLStatement.g4
index 7d2fee0ce9b..ec90b6628f6 100644
--- a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DDLStatement.g4
+++ b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/DDLStatement.g4
@@ -293,7 +293,7 @@ dropFunction
 
 createProcedure
     : CREATE ownerStatement?
-      PROCEDURE functionName LP_ procedureParameter? (COMMA_ 
procedureParameter)* RP_
+      PROCEDURE ifNotExists? functionName LP_ procedureParameter? (COMMA_ 
procedureParameter)* RP_
       routineOption*
       routineBody
     ;
@@ -681,7 +681,16 @@ validStatement
     : (createTable | alterTable | dropTable | dropDatabase | truncateTable
     | insert | replace | update | delete | select | call
     | createView | prepare | executeStmt | commit | deallocate
-    | setVariable | beginStatement | declareStatement | flowControlStatement | 
cursorStatement | conditionHandlingStatement) SEMI_?
+    | setVariable | beginStatement | declareStatement | flowControlStatement | 
cursorStatement | conditionHandlingStatement
+    | setStatement | showStatement) SEMI_?
+    ;
+
+showStatement
+    : SHOW WARNINGS
+    ;
+
+setStatement
+    : SET optionType TRANSACTION transactionCharacteristics (COMMA_ 
transactionCharacteristics)*
     ;
 
 beginStatement
diff --git a/test/it/parser/src/main/resources/case/ddl/create-procedure.xml 
b/test/it/parser/src/main/resources/case/ddl/create-procedure.xml
index 788f6da030d..558649c67cc 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-procedure.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-procedure.xml
@@ -64,4 +64,31 @@
             <sql-statement start-index="152" stop-index="169" 
statement-class-simple-name="FirebirdOpenCursorStatement" />
         </sql-statements>
     </create-procedure>
+    <create-procedure 
sql-case-id="create_procedure_with_handler_and_table_creation">
+        <procedure-name name="peter1" />
+        <sql-statements>
+            <sql-statement start-index="65" stop-index="158" 
statement-class-simple-name="MySQLHandlerStatement" />
+            <sql-statement start-index="160" stop-index="202" 
statement-class-simple-name="MySQLCreateTableStatement" />
+            <sql-statement start-index="204" stop-index="218" 
statement-class-simple-name="MySQLCallStatement" />
+        </sql-statements>
+    </create-procedure>
+    <create-procedure sql-case-id="create_procedure_with_decimal_variable">
+        <procedure-name name="bug15231_4" />
+        <sql-statements>
+            <sql-statement start-index="60" stop-index="73" 
statement-class-simple-name="MySQLSetStatement" />
+            <sql-statement start-index="75" stop-index="88" 
statement-class-simple-name="MySQLShowWarningsStatement" />
+        </sql-statements>
+    </create-procedure>
+    <create-procedure 
sql-case-id="create_procedure_with_transaction_read_only_and_isolation">
+        <procedure-name name="p1" />
+        <sql-statements>
+            <sql-statement start-index="22" stop-index="84" 
statement-class-simple-name="MySQLSetStatement" />
+        </sql-statements>
+    </create-procedure>
+    <create-procedure 
sql-case-id="create_procedure_with_transaction_read_only" >
+        <sql-statements>
+            <sql-statement start-index="22" stop-index="54" 
statement-class-simple-name="MySQLSetStatement" />
+        </sql-statements>
+    </create-procedure>
+    <create-procedure sql-case-id="create_procedure_if_not_exists" />
 </sql-parser-test-cases>
diff --git 
a/test/it/parser/src/main/resources/sql/supported/ddl/create-procedure.xml 
b/test/it/parser/src/main/resources/sql/supported/ddl/create-procedure.xml
index 4769985b11f..12975247024 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-procedure.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-procedure.xml
@@ -49,4 +49,9 @@
     <sql-case id="create_plsql_block" value="DECLARE warehouse NUMBER := 1;   
ground    NUMBER := 1;   insured   NUMBER := 1;   result    NUMBER; BEGIN   
SELECT BIN_TO_NUM(warehouse, ground, insured) INTO result FROM DUAL;   UPDATE 
orders SET order_status = result WHERE order_id = 2441; END;" db-types="Oracle" 
/>
     <sql-case id="create_procedure_with_insert_into_values" value="create 
procedure T522_PROC (i int =10) as begin insert into T522 (ROW_INT) values 
(:i); end" db-types="Firebird"/>
     <sql-case 
id="create_procedure_with_declare_and_cursor_for_in_select_and_open" 
value="CREATE PROCEDURE F865_PROC (offset_value INT, page_size INT) as DECLARE 
catalog_page CURSOR FOR (SELECT * FROM company ORDER BY namecompany OFFSET 
:offset_value ROWS FETCH NEXT :page_size ROWS ONLY); BEGIN OPEN catalog_page; 
END" db-types="Firebird"/>
+    <sql-case id="create_procedure_with_handler_and_table_creation" 
value="CREATE PROCEDURE peter1 () BEGIN DECLARE v INTEGER DEFAULT 1234; DECLARE 
CONTINUE HANDLER FOR SQLWARNING BEGIN SHOW WARNINGS; SELECT &quot;handler done: 
&quot;,v; END; CREATE TABLE gg (smallint_column SMALLINT); CALL peter2(v); END" 
db-types="MySQL" />
+    <sql-case id="create_procedure_with_decimal_variable" value="CREATE 
PROCEDURE bug15231_4() BEGIN DECLARE x DECIMAL(2,1); SET x = 'zap'; SHOW 
WARNINGS; END" db-types="MySQL" />
+    <sql-case id="create_procedure_with_transaction_read_only_and_isolation" 
value="CREATE PROCEDURE p1() SET SESSION TRANSACTION READ ONLY, ISOLATION LEVEL 
SERIALIZABLE" db-types="MySQL" />
+    <sql-case id="create_procedure_with_transaction_read_only" value="CREATE 
PROCEDURE p1() SET SESSION TRANSACTION READ ONLY" db-types="MySQL" />
+    <sql-case id="create_procedure_if_not_exists" value="CREATE PROCEDURE IF 
NOT EXISTS sp1() BEGIN END" db-types="MySQL" />
 </sql-cases>

Reply via email to