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 "handler done: ",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>