diff --git a/src/sql/engine/expr/ob_expr_cast.cpp b/src/sql/engine/expr/ob_expr_cast.cpp index dc29adada8..37f7093f90 100644 --- a/src/sql/engine/expr/ob_expr_cast.cpp +++ b/src/sql/engine/expr/ob_expr_cast.cpp @@ -329,7 +329,7 @@ int ObExprCast::calc_result_type2(ObExprResType &type, LOG_WARN("adjust udt cast sub type failed", K(ret)); } else if (OB_UNLIKELY(!cast_supported(type1.get_type(), type1.get_collation_type(), dst_type.get_type(), dst_type.get_collation_type()))) { - if (session->is_ps_prepare_stage()) { + if (session->is_varparams_sql_prepare()) { type.set_null(); LOG_TRACE("ps prepare phase ignores type deduce error"); } else { @@ -346,7 +346,7 @@ int ObExprCast::calc_result_type2(ObExprResType &type, } else if (!check_cast_allowed(type1.get_type(), type1.get_collation_type(), dst_type.get_type(), dst_type.get_collation_type(), is_explicit_cast)) { - if (session->is_ps_prepare_stage()) { + if (session->is_varparams_sql_prepare()) { type.set_null(); LOG_TRACE("ps prepare phase ignores type deduce error"); } else { diff --git a/src/sql/ob_sql.cpp b/src/sql/ob_sql.cpp index 0d3c72b376..bcee5ae684 100644 --- a/src/sql/ob_sql.cpp +++ b/src/sql/ob_sql.cpp @@ -967,7 +967,7 @@ int ObSql::do_real_prepare(const ObString &sql, context.is_dynamic_sql_ = !context.is_dynamic_sql_ ? !is_inner_sql : context.is_dynamic_sql_; bool is_from_pl = (NULL != context.secondary_namespace_ || result.is_simple_ps_protocol()); - ObPsPrepareStatusGuard ps_status_guard(session, is_from_pl); + ObPsPrepareStatusGuard ps_status_guard(session); ObPlanCacheCtx pc_ctx(sql, PC_PS_MODE, allocator, context, ectx, session.get_effective_tenant_id()); ParamStore param_store( (ObWrapperAllocator(&allocator)) ); @@ -991,6 +991,8 @@ int ObSql::do_real_prepare(const ObString &sql, && ObSQLUtils::is_mysql_ps_not_support_stmt(parse_result)) { ret = OB_ER_UNSUPPORTED_PS; LOG_WARN("This command is not supported in the prepared statement protocol yet", K(ret)); + } else { + ps_status_guard.is_varparams_sql_prepare(is_from_pl, parse_result.question_mark_ctx_.count_ > 0 ? true : false); } OZ (ObResolverUtils::resolve_stmt_type(parse_result, stmt_type)); diff --git a/src/sql/optimizer/ob_optimizer_util.cpp b/src/sql/optimizer/ob_optimizer_util.cpp index 1df532d969..1edc05b2e5 100644 --- a/src/sql/optimizer/ob_optimizer_util.cpp +++ b/src/sql/optimizer/ob_optimizer_util.cpp @@ -6177,13 +6177,13 @@ int ObOptimizerUtil::try_add_cast_to_set_child_list(ObIAllocator *allocator, && (ob_is_user_defined_sql_type(right_type.get_type()) || ob_is_user_defined_pl_type(right_type.get_type()))))) { // || (left_type.is_lob() && right_type.is_lob() && !is_distinct))) { // Originally, cases like "select clob from t union all select blob from t" return error - if (session_info->is_ps_prepare_stage()) { + if (session_info->is_varparams_sql_prepare()) { skip_add_cast = true; LOG_WARN("ps prepare stage expression has different datatype", K(i), K(left_type), K(right_type)); } else { ret = OB_ERR_EXP_NEED_SAME_DATATYPE; LOG_WARN("expression must have same datatype as corresponding expression", K(ret), - K(session_info->is_ps_prepare_stage()), K(right_type.is_varchar_or_char()), + K(session_info->is_varparams_sql_prepare()), K(right_type.is_varchar_or_char()), K(i), K(left_type), K(right_type)); } } else if (left_type.is_character_type() @@ -6217,7 +6217,7 @@ int ObOptimizerUtil::try_add_cast_to_set_child_list(ObIAllocator *allocator, LOG_WARN("failed to get collation connection", K(ret)); } else if (OB_FAIL(dummy_op.aggregate_result_type_for_merge(res_type, &types.at(0), 2, coll_type, is_oracle_mode(), length_semantics, session_info))) { - if (session_info->is_ps_prepare_stage()) { + if (session_info->is_varparams_sql_prepare()) { skip_add_cast = true; res_type = left_type; LOG_WARN("failed to deduce type in ps prepare stage", K(types)); diff --git a/src/sql/plan_cache/ob_ps_cache.h b/src/sql/plan_cache/ob_ps_cache.h index cc8d467ad0..42e84613e0 100644 --- a/src/sql/plan_cache/ob_ps_cache.h +++ b/src/sql/plan_cache/ob_ps_cache.h @@ -35,16 +35,19 @@ namespace sql class ObPsPrepareStatusGuard final { public: - explicit ObPsPrepareStatusGuard(ObSQLSessionInfo &session_info, bool is_from_pl) + explicit ObPsPrepareStatusGuard(ObSQLSessionInfo &session_info) : session_info_(session_info) { - if (!is_from_pl) { - session_info_.set_is_ps_prepare_stage(true); - } } ~ObPsPrepareStatusGuard() { - session_info_.set_is_ps_prepare_stage(false); + session_info_.set_is_varparams_sql_prepare(false); + } + void is_varparams_sql_prepare(bool is_from_pl, bool with_template) + { + if (!is_from_pl && with_template) { + session_info_.set_is_varparams_sql_prepare(true); + } } private: ObSQLSessionInfo &session_info_; diff --git a/src/sql/resolver/expr/ob_raw_expr.cpp b/src/sql/resolver/expr/ob_raw_expr.cpp index 6072e169c1..af51b8b795 100644 --- a/src/sql/resolver/expr/ob_raw_expr.cpp +++ b/src/sql/resolver/expr/ob_raw_expr.cpp @@ -389,7 +389,7 @@ int ObRawExpr::deduce_type(const ObSQLSessionInfo *session_info) ObRawExprDeduceType expr_deducer(session_info); expr_deducer.set_expr_factory(expr_factory_); if (OB_FAIL(expr_deducer.deduce(*this))) { - if (session_info->is_ps_prepare_stage()) { + if (session_info->is_varparams_sql_prepare()) { ret = OB_SUCCESS; LOG_TRACE("ps prepare phase ignores type deduce error"); } else { 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 e646f0c274..7c25f89cc7 100644 --- a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp @@ -228,7 +228,7 @@ int ObRawExprDeduceType::calc_result_type_with_const_arg( break; } // end switch } - if (OB_FAIL(ret) && my_session_->is_ps_prepare_stage()) { + if (OB_FAIL(ret) && my_session_->is_varparams_sql_prepare()) { // the ps prepare stage does not do type deduction, and directly gives a default type. result_type.set_null(); ret = OB_SUCCESS; @@ -447,7 +447,7 @@ int ObRawExprDeduceType::calc_result_type(ObNonTerminalRawExpr &expr, LOG_WARN("fail to calc result type with const arguments", K(ret)); } } - if (OB_FAIL(ret) && my_session_->is_ps_prepare_stage()) { + if (OB_FAIL(ret) && my_session_->is_varparams_sql_prepare()) { // the ps prepare stage does not do type deduction, and directly gives a default type. result_type.set_null(); ret = OB_SUCCESS; @@ -475,11 +475,11 @@ int ObRawExprDeduceType::calc_result_type(ObNonTerminalRawExpr &expr, if (OB_FAIL(ret)) { } else if (from != to && !cast_supported(from, from_cs_type, to, to_cs_type) - && !my_session_->is_ps_prepare_stage()) { + && !my_session_->is_varparams_sql_prepare()) { ret = OB_ERR_INVALID_TYPE_FOR_OP; LOG_WARN("cast parameter to expected type not supported", K(ret), K(i), K(from), K(to)); } else if (is_oracle_mode && (ob_is_lob_locator(from) || ob_is_text_tc(from))) { - if (!my_session_->is_ps_prepare_stage() + if (!my_session_->is_varparams_sql_prepare() && OB_FAIL(check_lob_param_allowed(from, from_cs_type, to, to_cs_type, expr.get_expr_type()))) { LOG_WARN("lob parameter not allowed", K(ret)); @@ -1413,7 +1413,7 @@ int ObRawExprDeduceType::visit(ObAggFunRawExpr &expr) : ObNumberType); if (from_type != to_type && !cast_supported(from_type, from_cs_type, to_type, CS_TYPE_BINARY) - && !my_session_->is_ps_prepare_stage()) { + && !my_session_->is_varparams_sql_prepare()) { ret = OB_ERR_INVALID_TYPE_FOR_OP; LOG_WARN("cast to expected type not supported", K(ret), K(from_type), K(to_type)); } else { @@ -1563,7 +1563,7 @@ int ObRawExprDeduceType::visit(ObAggFunRawExpr &expr) ? from_cs_type : CS_TYPE_BINARY); if (from_type != to_type && !cast_supported(from_type, from_cs_type, to_type, to_cs_type) - && !my_session_->is_ps_prepare_stage()) { + && !my_session_->is_varparams_sql_prepare()) { ret = OB_ERR_INVALID_TYPE_FOR_OP; LOG_WARN("cast to expected type not supported", K(ret), K(from_type), K(to_type)); } else { @@ -1637,12 +1637,12 @@ int ObRawExprDeduceType::visit(ObAggFunRawExpr &expr) } if (from_type1 != to_type && !cast_supported(from_type1, from_cs_type1, to_type, to_cs_type) - && !my_session_->is_ps_prepare_stage()) { + && !my_session_->is_varparams_sql_prepare()) { ret = OB_ERR_INVALID_TYPE_FOR_OP; LOG_WARN("cast to expected type not supported", K(ret), K(from_type1), K(to_type)); } else if (from_type2 != to_type && !cast_supported(from_type2, from_cs_type2, to_type, to_cs_type) - && !my_session_->is_ps_prepare_stage()) { + && !my_session_->is_varparams_sql_prepare()) { ret = OB_ERR_INVALID_TYPE_FOR_OP; LOG_WARN("cast to expected type not supported", K(ret), K(from_type2), K(to_type)); } else { @@ -3304,7 +3304,7 @@ int ObRawExprDeduceType::try_add_cast_expr(RawExprType &parent, LOG_WARN("cast to lob type not allowed", K(ret)); } OZ(parent.replace_param_expr(child_idx, new_expr)); - if (OB_FAIL(ret) && my_session_->is_ps_prepare_stage()) { + if (OB_FAIL(ret) && my_session_->is_varparams_sql_prepare()) { ret = OB_SUCCESS; LOG_DEBUG("ps prepare phase ignores type deduce error"); } diff --git a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp index c92aab7658..b352f2011f 100644 --- a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp @@ -3452,7 +3452,7 @@ int ObRawExprResolverImpl::process_like_node(const ParseNode *node, ObRawExpr *& LOG_WARN("invalid escape char length, expect 1, get 0", K(ret)); } } else if (escape_node->value_ < 0 || escape_node->value_ >= ctx_.param_list_->count()) { - if (OB_NOT_NULL(ctx_.session_info_) && ctx_.session_info_->is_ps_prepare_stage()) { + if (OB_NOT_NULL(ctx_.session_info_) && ctx_.session_info_->is_varparams_sql_prepare()) { // skip check question mark about escape node in prepare statement } else { ret = OB_ERR_UNEXPECTED; diff --git a/src/sql/session/ob_sql_session_info.cpp b/src/sql/session/ob_sql_session_info.cpp index 01895645cd..d4867aa0de 100644 --- a/src/sql/session/ob_sql_session_info.cpp +++ b/src/sql/session/ob_sql_session_info.cpp @@ -169,7 +169,7 @@ ObSQLSessionInfo::ObSQLSessionInfo(const uint64_t tenant_id) : piece_cache_(NULL), is_load_data_exec_session_(false), pl_exact_err_msg_(), - is_ps_prepare_stage_(false), + is_varparams_sql_prepare_(false), got_tenant_conn_res_(false), got_user_conn_res_(false), conn_res_user_id_(OB_INVALID_ID), diff --git a/src/sql/session/ob_sql_session_info.h b/src/sql/session/ob_sql_session_info.h index 346fb67826..8762afd048 100644 --- a/src/sql/session/ob_sql_session_info.h +++ b/src/sql/session/ob_sql_session_info.h @@ -1103,8 +1103,8 @@ public: cached_tenant_config_info_.refresh(); return cached_tenant_config_info_.get_enable_sql_extension(); } - bool is_ps_prepare_stage() const { return is_ps_prepare_stage_; } - void set_is_ps_prepare_stage(bool v) { is_ps_prepare_stage_ = v; } + bool is_varparams_sql_prepare() const { return is_varparams_sql_prepare_; } + void set_is_varparams_sql_prepare(bool v) { is_varparams_sql_prepare_ = v; } int get_tenant_audit_trail_type(ObAuditTrailType &at_type) { cached_tenant_config_info_.refresh(); @@ -1298,7 +1298,7 @@ private: void *piece_cache_; bool is_load_data_exec_session_; ObSqlString pl_exact_err_msg_; - bool is_ps_prepare_stage_; + bool is_varparams_sql_prepare_; // Record whether this session has got connection resource, which means it increased connections count. // It's used for on_user_disconnect. // No matter whether apply for resource successfully, a session will call on_user_disconnect when disconnect.