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,15 +51,41 @@ 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);
ObSEArray<ObString, 1> 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;
if (OB_FAIL(parser.parse(sql_str, parse_result))) {
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_FAIL(ObSqlParameterization::parameterize_syntax_tree(allocator,
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_,
@ -70,7 +96,8 @@ int calc_digest_text(ObIAllocator &allocator,
digest_str = pc_ctx.sql_ctx_.spm_ctx_.bl_key_.constructed_sql_;
}
} else {
digest_str = sql_str;
digest_str = queries.at(i);
}
}
}
return ret;

View File

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