diff --git a/src/sql/engine/expr/ob_expr_statement_digest.cpp b/src/sql/engine/expr/ob_expr_statement_digest.cpp index 6905fa2b6b..d52cf3a8fe 100644 --- a/src/sql/engine/expr/ob_expr_statement_digest.cpp +++ b/src/sql/engine/expr/ob_expr_statement_digest.cpp @@ -51,26 +51,53 @@ int calc_digest_text(ObIAllocator &allocator, ObPlanCacheCtx pc_ctx(sql_str, PC_TEXT_MODE, allocator, sql_ctx, exec_ctx, session->get_effective_tenant_id()); ObParser parser(allocator, session->get_sql_mode(), cs_type); - ParseResult parse_result; - ParamStore tmp_params((ObWrapperAllocator(allocator))); - stmt::StmtType stmt_type = stmt::T_NONE; - if (OB_FAIL(parser.parse(sql_str, parse_result))) { - LOG_WARN("fail to parse sql str", K(sql_str), K(ret)); - } else if (OB_FAIL(ObResolverUtils::resolve_stmt_type(parse_result, stmt_type))) { - LOG_WARN("failed to resolve stmt type", K(ret)); - } else if (ObStmt::is_dml_stmt(stmt_type) && !ObStmt::is_show_stmt(stmt_type)) { - if (OB_FAIL(ObSqlParameterization::parameterize_syntax_tree(allocator, - true, - pc_ctx, - parse_result.result_tree_, - tmp_params, - cs_type))) { - LOG_WARN("fail to parameterize syntax tree", K(sql_str), K(ret)); + ObSEArray queries; + ObMPParseStat parse_stat; + if (OB_FAIL(parser.split_multiple_stmt(sql_str, queries, parse_stat))) { + LOG_WARN("failed to split multiple stmt", K(ret)); + } + for (int64_t i = 0; OB_SUCC(ret) && i < queries.count(); ++i) { + ParseResult parse_result; + ParamStore tmp_params((ObWrapperAllocator(allocator))); + stmt::StmtType stmt_type = stmt::T_NONE; + ObItemType item_type = T_NULL; + if (OB_FAIL(parser.parse(queries.at(i), parse_result))) { + LOG_WARN("fail to parse sql str", K(sql_str), K(ret)); + } else if (OB_ISNULL(parse_result.result_tree_) + || OB_ISNULL(parse_result.result_tree_->children_[0])) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected parse result", K(ret)); + } else if (FALSE_IT(item_type = parse_result.result_tree_->children_[0]->type_)) { + } else if (i > 0) { + if (OB_UNLIKELY(T_EMPTY_QUERY != item_type)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid stmt type", K(item_type), K(ret)); + LOG_USER_ERROR(OB_INVALID_ARGUMENT, "digest function"); + } + } else if (OB_UNLIKELY(T_EMPTY_QUERY == item_type)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid empty query", K(item_type), K(ret)); + LOG_USER_ERROR(OB_INVALID_ARGUMENT, "digest function"); + } else if (OB_FAIL(ObResolverUtils::resolve_stmt_type(parse_result, stmt_type))) { + LOG_WARN("failed to resolve stmt type", K(ret)); + } else if (ObStmt::is_dml_stmt(stmt_type) && !ObStmt::is_show_stmt(stmt_type)) { + if (OB_UNLIKELY(parse_result.result_tree_->children_[0]->value_ > 0)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("query contains questionmark", K(queries.at(i)), K(ret)); + LOG_USER_ERROR(OB_INVALID_ARGUMENT, "digest function"); + } else if (OB_FAIL(ObSqlParameterization::parameterize_syntax_tree(allocator, + true, + pc_ctx, + parse_result.result_tree_, + tmp_params, + cs_type))) { + LOG_WARN("fail to parameterize syntax tree", K(sql_str), K(ret)); + } else { + digest_str = pc_ctx.sql_ctx_.spm_ctx_.bl_key_.constructed_sql_; + } } else { - digest_str = pc_ctx.sql_ctx_.spm_ctx_.bl_key_.constructed_sql_; + digest_str = queries.at(i); } - } else { - digest_str = sql_str; } } return ret; diff --git a/src/sql/resolver/ob_resolver.cpp b/src/sql/resolver/ob_resolver.cpp index 971b8b0352..ab9ea4b63b 100644 --- a/src/sql/resolver/ob_resolver.cpp +++ b/src/sql/resolver/ob_resolver.cpp @@ -1072,9 +1072,10 @@ int ObResolver::resolve(IsPrepared if_prepared, const ParseNode &parse_tree, ObS break; } default: { - ret = OB_ERR_UNEXPECTED; + ret = OB_NOT_SUPPORTED; const char *type_name = get_type_name(parse_tree.type_); LOG_WARN("Statement not supported now", K(ret), K(type_name)); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "statement type"); break; } } // end switch