diff --git a/src/pl/parser/ob_pl_parser.cpp b/src/pl/parser/ob_pl_parser.cpp index 7569b52140..958b8ff44a 100644 --- a/src/pl/parser/ob_pl_parser.cpp +++ b/src/pl/parser/ob_pl_parser.cpp @@ -25,6 +25,7 @@ extern "C" { #endif extern int obpl_parser_init(ObParseCtx *parse_ctx); extern int obpl_parser_parse(ObParseCtx *parse_ctx); +extern ParseNode *merge_tree(void *malloc_pool, int *fatal_error, ObItemType node_tag, ParseNode *source_tree); int obpl_parser_check_stack_overflow() { int ret = OB_SUCCESS; bool is_overflow = true; @@ -340,6 +341,8 @@ int ObPLParser::parse_stmt_block(ObParseCtx &parse_ctx, ObStmtNodeTree *&multi_s if (OB_NOT_SUPPORTED == ret) { LOG_USER_ERROR(OB_NOT_SUPPORTED, parse_ctx.global_errmsg_); } + parse_ctx.stmt_tree_ = merge_tree(parse_ctx.mem_pool_, &(parse_ctx.global_errno_), T_STMT_LIST, parse_ctx.stmt_tree_); + multi_stmt = parse_ctx.stmt_tree_; } } else { multi_stmt = parse_ctx.stmt_tree_; diff --git a/src/pl/parser/pl_parser_mysql_mode.y b/src/pl/parser/pl_parser_mysql_mode.y index 074001d64e..b6a70b9e94 100644 --- a/src/pl/parser/pl_parser_mysql_mode.y +++ b/src/pl/parser/pl_parser_mysql_mode.y @@ -300,10 +300,12 @@ stmt_list: stmt_list ';' stmt { malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_LINK_NODE, 2, $1, $3); + parse_ctx->stmt_tree_ = $$; } | stmt { $$ = $1; + parse_ctx->stmt_tree_ = $$; } /* | stmt_list ';' error { diff --git a/src/sql/parser/ob_parser.cpp b/src/sql/parser/ob_parser.cpp index aaba7aa4eb..b913bfbbe9 100644 --- a/src/sql/parser/ob_parser.cpp +++ b/src/sql/parser/ob_parser.cpp @@ -558,13 +558,30 @@ int ObParser::split_start_with_pl(const ObString &stmt, ObString part(remain, stmt.ptr()); if (OB_FAIL(tmp_ret = parse(part, parse_result, parse_mode, false, true))) { - ret = queries.push_back(part); + if(parse_result.result_tree_ != NULL && parse_result.result_tree_->num_child_ > 0) { + ret = OB_SUCCESS; + for (int64_t i = 0; OB_SUCC(ret) && i < parse_result.result_tree_->num_child_; ++i) { + int64_t str_len = parse_result.result_tree_->children_[i]->str_len_; + int64_t offset = parse_result.result_tree_->children_[i]->pos_; + ObString query(str_len, stmt.ptr() + offset); + OZ(queries.push_back(query)); + } + int64_t success_len = 0; + OX(success_len = parse_result.result_tree_->children_[parse_result.result_tree_->num_child_ - 1]->str_len_ + + parse_result.result_tree_->children_[parse_result.result_tree_->num_child_ - 1]->pos_); + if(OB_SUCC(ret) && ';' == stmt[success_len]) success_len++; + CK(success_len < remain); + ObString error_part(remain - success_len, stmt.ptr() + success_len); + OZ(queries.push_back(error_part)); + } else { + ret = queries.push_back(part); + } if (OB_SUCCESS == ret) { parse_stat.parse_fail_ = true; parse_stat.fail_query_idx_ = queries.count() - 1; parse_stat.fail_ret_ = tmp_ret; } - LOG_WARN("fail parse multi part", K(part), K(stmt), K(ret)); + LOG_WARN("fail parse multi part", K(part), K(stmt), K(tmp_ret)); } else { CK(remain == parse_result.end_col_); CK(nullptr != bak_allocator); diff --git a/tools/deploy/mysql_test/test_suite/yonyou_test/r/mysql/yonyou_online_ddl.result b/tools/deploy/mysql_test/test_suite/yonyou_test/r/mysql/yonyou_online_ddl.result index 46874ea1aa..4ba0a7ee84 100644 --- a/tools/deploy/mysql_test/test_suite/yonyou_test/r/mysql/yonyou_online_ddl.result +++ b/tools/deploy/mysql_test/test_suite/yonyou_test/r/mysql/yonyou_online_ddl.result @@ -350,7 +350,7 @@ cExtProps mediumtext YES NULL cDesignProps mediumtext YES NULL ytenant_id varchar(36) NO ~ drop procedure if exists p_aa_updatecolumn; -DROP PROCEDURE if exists addIndex;; +DROP PROCEDURE if exists addIndex; CREATE PROCEDURE `addIndex`(IN tablename VARCHAR(200), IN indexname VARCHAR(200), IN executeStr VARCHAR(1000), IN executeType VARCHAR(50)) BEGIN diff --git a/tools/deploy/mysql_test/test_suite/yonyou_test/t/yonyou_online_ddl.test b/tools/deploy/mysql_test/test_suite/yonyou_test/t/yonyou_online_ddl.test index ce8b0fd93c..43495c367e 100644 --- a/tools/deploy/mysql_test/test_suite/yonyou_test/t/yonyou_online_ddl.test +++ b/tools/deploy/mysql_test/test_suite/yonyou_test/t/yonyou_online_ddl.test @@ -255,7 +255,7 @@ desc pb_meta_filter_item_ext; --disable_warnings drop procedure if exists p_aa_updatecolumn; DELIMITER //; -DROP PROCEDURE if exists addIndex;; +DROP PROCEDURE if exists addIndex; CREATE PROCEDURE `addIndex`(IN tablename VARCHAR(200), IN indexname VARCHAR(200), IN executeStr VARCHAR(1000), IN executeType VARCHAR(50)) BEGIN