[to #52911707] Fix bug, PL supports split multi stmts in MySQL mode.

This commit is contained in:
obdev
2024-02-10 05:28:38 +00:00
committed by ob-robot
parent 2f2b7654a9
commit 0e4919cb0f
5 changed files with 26 additions and 4 deletions

View File

@ -25,6 +25,7 @@ extern "C" {
#endif #endif
extern int obpl_parser_init(ObParseCtx *parse_ctx); extern int obpl_parser_init(ObParseCtx *parse_ctx);
extern int obpl_parser_parse(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 obpl_parser_check_stack_overflow() {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
bool is_overflow = true; bool is_overflow = true;
@ -340,6 +341,8 @@ int ObPLParser::parse_stmt_block(ObParseCtx &parse_ctx, ObStmtNodeTree *&multi_s
if (OB_NOT_SUPPORTED == ret) { if (OB_NOT_SUPPORTED == ret) {
LOG_USER_ERROR(OB_NOT_SUPPORTED, parse_ctx.global_errmsg_); 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 { } else {
multi_stmt = parse_ctx.stmt_tree_; multi_stmt = parse_ctx.stmt_tree_;

View File

@ -300,10 +300,12 @@ stmt_list:
stmt_list ';' stmt stmt_list ';' stmt
{ {
malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_LINK_NODE, 2, $1, $3); malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_LINK_NODE, 2, $1, $3);
parse_ctx->stmt_tree_ = $$;
} }
| stmt | stmt
{ {
$$ = $1; $$ = $1;
parse_ctx->stmt_tree_ = $$;
} }
/* | stmt_list ';' error /* | stmt_list ';' error
{ {

View File

@ -558,13 +558,30 @@ int ObParser::split_start_with_pl(const ObString &stmt,
ObString part(remain, stmt.ptr()); ObString part(remain, stmt.ptr());
if (OB_FAIL(tmp_ret = parse(part, parse_result, parse_mode, false, true))) { 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) { if (OB_SUCCESS == ret) {
parse_stat.parse_fail_ = true; parse_stat.parse_fail_ = true;
parse_stat.fail_query_idx_ = queries.count() - 1; parse_stat.fail_query_idx_ = queries.count() - 1;
parse_stat.fail_ret_ = tmp_ret; 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 { } else {
CK(remain == parse_result.end_col_); CK(remain == parse_result.end_col_);
CK(nullptr != bak_allocator); CK(nullptr != bak_allocator);

View File

@ -350,7 +350,7 @@ cExtProps mediumtext YES NULL
cDesignProps mediumtext YES NULL cDesignProps mediumtext YES NULL
ytenant_id varchar(36) NO ~ ytenant_id varchar(36) NO ~
drop procedure if exists p_aa_updatecolumn; 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), CREATE PROCEDURE `addIndex`(IN tablename VARCHAR(200), IN indexname VARCHAR(200), IN executeStr VARCHAR(1000),
IN executeType VARCHAR(50)) IN executeType VARCHAR(50))
BEGIN BEGIN

View File

@ -255,7 +255,7 @@ desc pb_meta_filter_item_ext;
--disable_warnings --disable_warnings
drop procedure if exists p_aa_updatecolumn; drop procedure if exists p_aa_updatecolumn;
DELIMITER //; 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), CREATE PROCEDURE `addIndex`(IN tablename VARCHAR(200), IN indexname VARCHAR(200), IN executeStr VARCHAR(1000),
IN executeType VARCHAR(50)) IN executeType VARCHAR(50))
BEGIN BEGIN