From a4a7c5e9e8f440e16fd47040f34df1d24373bd38 Mon Sep 17 00:00:00 2001 From: bit-dance <2634358021@qq.com> Date: Thu, 2 Jan 2025 14:45:50 +0000 Subject: [PATCH] [CP] [#2024122600106652938]Fix: fast_parse do not report error when parse sql failed and memmove core. --- src/pl/parser/ob_pl_parser.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/pl/parser/ob_pl_parser.cpp b/src/pl/parser/ob_pl_parser.cpp index 2cac6618f..8ef3111f6 100644 --- a/src/pl/parser/ob_pl_parser.cpp +++ b/src/pl/parser/ob_pl_parser.cpp @@ -108,16 +108,24 @@ int ObPLParser::fast_parse(const ObString &query, LOG_WARN("failed to parse pl stmt", K(ret)); } } else { - memmove(parse_ctx.no_param_sql_ + parse_ctx.no_param_sql_len_, + int64_t buf_remain_len = parse_ctx.no_param_sql_buf_len_ - parse_ctx.no_param_sql_len_; + int64_t copy_len = parse_ctx.stmt_len_ - parse_ctx.copied_pos_; + if (buf_remain_len < copy_len) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Can not memmove due to remain buf len less than copy len", + K(ret), K(buf_remain_len), K(copy_len)); + } else { + memmove(parse_ctx.no_param_sql_ + parse_ctx.no_param_sql_len_, parse_ctx.stmt_str_ + parse_ctx.copied_pos_, - parse_ctx.stmt_len_ - parse_ctx.copied_pos_); - parse_ctx.no_param_sql_len_ += parse_ctx.stmt_len_ - parse_ctx.copied_pos_; - parse_result.no_param_sql_ = parse_ctx.no_param_sql_; - parse_result.no_param_sql_len_ = parse_ctx.no_param_sql_len_; - parse_result.no_param_sql_buf_len_ = parse_ctx.no_param_sql_buf_len_; - parse_result.param_node_num_ = parse_ctx.param_node_num_; - parse_result.param_nodes_ = parse_ctx.param_nodes_; - parse_result.tail_param_node_ = parse_ctx.tail_param_node_; + copy_len); + parse_ctx.no_param_sql_len_ += copy_len; + parse_result.no_param_sql_ = parse_ctx.no_param_sql_; + parse_result.no_param_sql_len_ = parse_ctx.no_param_sql_len_; + parse_result.no_param_sql_buf_len_ = parse_ctx.no_param_sql_buf_len_; + parse_result.param_node_num_ = parse_ctx.param_node_num_; + parse_result.param_nodes_ = parse_ctx.param_nodes_; + parse_result.tail_param_node_ = parse_ctx.tail_param_node_; + } } } return ret;