From 3e6a171faa3914491930865c082d9060e863a61c Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 15 Nov 2022 03:06:24 +0000 Subject: [PATCH] fix used incorrect cached temp expr ctx bug --- src/sql/engine/cmd/ob_load_data_impl.cpp | 2 + .../engine/expr/ob_expr_to_outfile_row.cpp | 6 +-- src/sql/engine/ob_des_exec_context.cpp | 1 + src/sql/engine/ob_exec_context.cpp | 41 +++++++++++-------- src/sql/engine/ob_exec_context.h | 3 ++ src/sql/executor/ob_executor.cpp | 1 + .../executor/ob_remote_executor_processor.cpp | 2 + 7 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/sql/engine/cmd/ob_load_data_impl.cpp b/src/sql/engine/cmd/ob_load_data_impl.cpp index a2f18a3268..7a463d026a 100644 --- a/src/sql/engine/cmd/ob_load_data_impl.cpp +++ b/src/sql/engine/cmd/ob_load_data_impl.cpp @@ -1021,6 +1021,8 @@ int ObLoadDataSPImpl::exec_shuffle(int64_t task_id, ObShuffleTaskHandle *handle) LOG_WARN("fail to init buffer", K(ret)); } else if (OB_FAIL(parse_result.prepare_allocate(handle->generator.get_field_exprs().count()))) { LOG_WARN("fail to allocate", K(ret)); + } else { + handle->exec_ctx.set_use_temp_expr_ctx_cache(true); } while (OB_SUCC(ret) && ptr < end) { diff --git a/src/sql/engine/expr/ob_expr_to_outfile_row.cpp b/src/sql/engine/expr/ob_expr_to_outfile_row.cpp index ba8426a554..5c57352556 100644 --- a/src/sql/engine/expr/ob_expr_to_outfile_row.cpp +++ b/src/sql/engine/expr/ob_expr_to_outfile_row.cpp @@ -229,9 +229,9 @@ int ObExprToOutfileRow::extract_fisrt_wchar_from_varhcar(const ObObj &obj, int32 // as NULL, not \N. int ObExprToOutfileRow::print_field(char *buf, const int64_t buf_len, int64_t &pos, const ObObj &obj, ObExprOutFileInfo &out_info) -{ - int ret = OB_SUCCESS; - int64_t tmp_pos = 0; +{ + int ret = OB_SUCCESS; + int64_t tmp_pos = 0; const bool need_enclose = 0 != out_info.wchar_enclose_ && (!out_info.is_optional_ || obj.is_string_type()); if (need_enclose) { diff --git a/src/sql/engine/ob_des_exec_context.cpp b/src/sql/engine/ob_des_exec_context.cpp index e44ceae97a..7de78b0d9a 100644 --- a/src/sql/engine/ob_des_exec_context.cpp +++ b/src/sql/engine/ob_des_exec_context.cpp @@ -216,6 +216,7 @@ DEFINE_DESERIALIZE(ObDesExecContext) LOG_WARN("init exec context expr op failed", K(ret)); } } + use_temp_expr_ctx_cache_ = true; return ret; } }/* ns sql*/ diff --git a/src/sql/engine/ob_exec_context.cpp b/src/sql/engine/ob_exec_context.cpp index bf0931fe6f..f01950cbab 100644 --- a/src/sql/engine/ob_exec_context.cpp +++ b/src/sql/engine/ob_exec_context.cpp @@ -112,6 +112,7 @@ ObExecContext::ObExecContext(ObIAllocator &allocator) px_batch_id_(0), admission_version_(UINT64_MAX), admission_addr_map_(), + use_temp_expr_ctx_cache_(false), temp_expr_ctx_map_(), dml_event_(ObDmlEventType::DE_INVALID), update_columns_(nullptr), @@ -301,25 +302,29 @@ int ObExecContext::get_temp_expr_eval_ctx(const ObTempExpr &temp_expr, ObTempExprCtx *&temp_expr_ctx) { int ret = OB_SUCCESS; - if (!temp_expr_ctx_map_.created()) { - OZ(temp_expr_ctx_map_.create(8, ObLabel("TempExprCtx"))); - } - if (OB_SUCC(ret)) { - int64_t ctx_ptr = 0; - if (OB_FAIL(temp_expr_ctx_map_.get_refactored(reinterpret_cast(&temp_expr), - ctx_ptr))) { - if (OB_HASH_NOT_EXIST == ret) { - ret = OB_SUCCESS; - OZ(build_temp_expr_ctx(temp_expr, temp_expr_ctx)); - CK(OB_NOT_NULL(temp_expr_ctx)); - OZ(temp_expr_ctx_map_.set_refactored(reinterpret_cast(&temp_expr), - reinterpret_cast(temp_expr_ctx))); - } else { - LOG_WARN("fail to get temp expr ctx", K(temp_expr), K(ret)); - } - } else { - temp_expr_ctx = reinterpret_cast(ctx_ptr); + if (use_temp_expr_ctx_cache_) { + if (!temp_expr_ctx_map_.created()) { + OZ(temp_expr_ctx_map_.create(8, ObLabel("TempExprCtx"))); } + if (OB_SUCC(ret)) { + int64_t ctx_ptr = 0; + if (OB_FAIL(temp_expr_ctx_map_.get_refactored(reinterpret_cast(&temp_expr), + ctx_ptr))) { + if (OB_HASH_NOT_EXIST == ret) { + ret = OB_SUCCESS; + OZ(build_temp_expr_ctx(temp_expr, temp_expr_ctx)); + CK(OB_NOT_NULL(temp_expr_ctx)); + OZ(temp_expr_ctx_map_.set_refactored(reinterpret_cast(&temp_expr), + reinterpret_cast(temp_expr_ctx))); + } else { + LOG_WARN("fail to get temp expr ctx", K(temp_expr), K(ret)); + } + } else { + temp_expr_ctx = reinterpret_cast(ctx_ptr); + } + } + } else { + OZ(build_temp_expr_ctx(temp_expr, temp_expr_ctx)); } return ret; diff --git a/src/sql/engine/ob_exec_context.h b/src/sql/engine/ob_exec_context.h index 10e4ebda8d..31da3795d2 100644 --- a/src/sql/engine/ob_exec_context.h +++ b/src/sql/engine/ob_exec_context.h @@ -369,6 +369,8 @@ public: // for granule iterator int get_gi_task_map(GIPrepareTaskMap *&gi_prepare_task_map); + void set_use_temp_expr_ctx_cache(bool v) { use_temp_expr_ctx_cache_ = v; } + // for udf int get_udf_ctx_mgr(ObUdfCtxMgr *&udf_ctx_mgr); @@ -599,6 +601,7 @@ protected: uint64_t admission_version_; hash::ObHashMap admission_addr_map_; // used for temp expr ctx manager + bool use_temp_expr_ctx_cache_; hash::ObHashMap temp_expr_ctx_map_; // for pl/trigger ObDmlEventType dml_event_; diff --git a/src/sql/executor/ob_executor.cpp b/src/sql/executor/ob_executor.cpp index d8d02e0862..3a693b443f 100644 --- a/src/sql/executor/ob_executor.cpp +++ b/src/sql/executor/ob_executor.cpp @@ -59,6 +59,7 @@ int ObExecutor::execute_plan(ObExecContext &ctx) ObSQLSessionInfo *session_info = ctx.get_my_session(); ObPhysicalPlanCtx *plan_ctx = ctx.get_physical_plan_ctx(); int64_t batched_stmt_cnt = ctx.get_sql_ctx()->multi_stmt_item_.get_batched_stmt_cnt(); + ctx.set_use_temp_expr_ctx_cache(true); // If the batch execution is rewritten by insert multi values, there is no need to repack multiple times if (ctx.get_sql_ctx()->multi_stmt_item_.is_ins_multi_val_opt()) { batched_stmt_cnt = 0; diff --git a/src/sql/executor/ob_remote_executor_processor.cpp b/src/sql/executor/ob_remote_executor_processor.cpp index d79e58a570..8416286133 100644 --- a/src/sql/executor/ob_remote_executor_processor.cpp +++ b/src/sql/executor/ob_remote_executor_processor.cpp @@ -426,6 +426,7 @@ int ObRemoteBaseExecuteP::execute_remote_plan(ObExecContext &exec_ctx, ObSQLSessionInfo *session = exec_ctx.get_my_session(); ObPhysicalPlanCtx *plan_ctx = exec_ctx.get_physical_plan_ctx(); ObOperator *se_op = nullptr; // static engine operator + exec_ctx.set_use_temp_expr_ctx_cache(true); if (OB_ISNULL(plan_ctx) || OB_ISNULL(session)) { ret = OB_ERR_UNEXPECTED; LOG_ERROR("op is NULL", K(ret), K(plan_ctx), K(session)); @@ -633,6 +634,7 @@ int ObRemoteBaseExecuteP::execute_with_sql(ObRemoteTask &task) bool enable_sql_audit = GCONF.enable_sql_audit; ObPhysicalPlan *plan = nullptr; ObPhysicalPlanCtx *plan_ctx = nullptr; + exec_ctx_.set_use_temp_expr_ctx_cache(false); int inject_err_no = EVENT_CALL(EventTable::EN_REMOTE_EXEC_ERR); if (0 != inject_err_no) { ret = inject_err_no;