From f34f2dd35227f42bf4293d779849d4b784fd49bd Mon Sep 17 00:00:00 2001 From: GongYusen <986957406@qq.com> Date: Mon, 17 Jun 2024 22:22:10 +0000 Subject: [PATCH] [CP] Fix bug: in Oracle mode, the prepared statement throws an error -4016. --- src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp | 8 ++++++++ src/sql/resolver/ob_resolver.cpp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp index 18c9309d46..2ec59c983a 100644 --- a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp @@ -780,6 +780,14 @@ int ObRawExprDeduceType::visit(ObOpRawExpr &expr) expr.set_result_type(result_type); } else if (T_OP_ROW == expr.get_expr_type()) { expr.set_data_type(ObNullType); + // During the prepare phase, some boolean expressions do not undergo recursive type deduction. + // T_OP_EQ, T_OP_NSEQ, T_OP_LE, T_OP_LT, T_OP_GE, T_OP_GT, T_OP_NE. + } else if (my_session_->is_varparams_sql_prepare() && T_OP_EQ <= expr.get_expr_type() && expr.get_expr_type() <= T_OP_NE) { + ObExprResType result_type; + result_type.set_tinyint(); + result_type.set_precision(DEFAULT_PRECISION_FOR_BOOL); + result_type.set_scale(DEFAULT_SCALE_FOR_INTEGER); + expr.set_result_type(result_type); } else { ObExprOperator *op = expr.get_op(); if (NULL == op) { diff --git a/src/sql/resolver/ob_resolver.cpp b/src/sql/resolver/ob_resolver.cpp index bd886f9bef..a8dc7fc1ff 100644 --- a/src/sql/resolver/ob_resolver.cpp +++ b/src/sql/resolver/ob_resolver.cpp @@ -1250,7 +1250,7 @@ int ObResolver::resolve(IsPrepared if_prepared, const ParseNode &parse_tree, ObS // todo yanli:检查主备库 } - if (OB_SUCC(ret) && stmt->is_dml_stmt()) { + if (OB_SUCC(ret) && stmt->is_dml_stmt() && !params_.session_info_->is_varparams_sql_prepare()) { ObDMLStmt *dml_stmt = static_cast(stmt); ObRawExprWrapEnumSet enum_set_wrapper(*params_.expr_factory_, params_.session_info_); if (OB_FAIL(enum_set_wrapper.wrap_enum_set(*dml_stmt))) {