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

This commit is contained in:
swjtu-wenxiang
2024-02-02 18:42:09 +00:00
committed by ob-robot
parent d3969568dc
commit 29f29ee7a6
5 changed files with 26 additions and 4 deletions

View File

@ -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);