fix statement_digest expr bug

This commit is contained in:
yinyj17
2023-05-24 11:47:46 +00:00
committed by ob-robot
parent cd382e0f9e
commit d33ce0d08c
2 changed files with 47 additions and 19 deletions

View File

@ -51,26 +51,53 @@ int calc_digest_text(ObIAllocator &allocator,
ObPlanCacheCtx pc_ctx(sql_str, PC_TEXT_MODE, allocator, sql_ctx, exec_ctx, ObPlanCacheCtx pc_ctx(sql_str, PC_TEXT_MODE, allocator, sql_ctx, exec_ctx,
session->get_effective_tenant_id()); session->get_effective_tenant_id());
ObParser parser(allocator, session->get_sql_mode(), cs_type); ObParser parser(allocator, session->get_sql_mode(), cs_type);
ParseResult parse_result; ObSEArray<ObString, 1> queries;
ParamStore tmp_params((ObWrapperAllocator(allocator))); ObMPParseStat parse_stat;
stmt::StmtType stmt_type = stmt::T_NONE; if (OB_FAIL(parser.split_multiple_stmt(sql_str, queries, parse_stat))) {
if (OB_FAIL(parser.parse(sql_str, parse_result))) { LOG_WARN("failed to split multiple stmt", K(ret));
LOG_WARN("fail to parse sql str", K(sql_str), K(ret)); }
} else if (OB_FAIL(ObResolverUtils::resolve_stmt_type(parse_result, stmt_type))) { for (int64_t i = 0; OB_SUCC(ret) && i < queries.count(); ++i) {
LOG_WARN("failed to resolve stmt type", K(ret)); ParseResult parse_result;
} else if (ObStmt::is_dml_stmt(stmt_type) && !ObStmt::is_show_stmt(stmt_type)) { ParamStore tmp_params((ObWrapperAllocator(allocator)));
if (OB_FAIL(ObSqlParameterization::parameterize_syntax_tree(allocator, stmt::StmtType stmt_type = stmt::T_NONE;
true, ObItemType item_type = T_NULL;
pc_ctx, if (OB_FAIL(parser.parse(queries.at(i), parse_result))) {
parse_result.result_tree_, LOG_WARN("fail to parse sql str", K(sql_str), K(ret));
tmp_params, } else if (OB_ISNULL(parse_result.result_tree_)
cs_type))) { || OB_ISNULL(parse_result.result_tree_->children_[0])) {
LOG_WARN("fail to parameterize syntax tree", K(sql_str), K(ret)); 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 { } 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; return ret;

View File

@ -1072,9 +1072,10 @@ int ObResolver::resolve(IsPrepared if_prepared, const ParseNode &parse_tree, ObS
break; break;
} }
default: { default: {
ret = OB_ERR_UNEXPECTED; ret = OB_NOT_SUPPORTED;
const char *type_name = get_type_name(parse_tree.type_); const char *type_name = get_type_name(parse_tree.type_);
LOG_WARN("Statement not supported now", K(ret), K(type_name)); LOG_WARN("Statement not supported now", K(ret), K(type_name));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "statement type");
break; break;
} }
} // end switch } // end switch