fix used incorrect cached temp expr ctx bug
This commit is contained in:
		| @ -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) { | ||||
|  | ||||
| @ -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) { | ||||
|  | ||||
| @ -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*/ | ||||
|  | ||||
| @ -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<int64_t>(&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<int64_t>(&temp_expr), | ||||
|                                              reinterpret_cast<int64_t>(temp_expr_ctx))); | ||||
|       } else { | ||||
|         LOG_WARN("fail to get temp expr ctx", K(temp_expr), K(ret)); | ||||
|       } | ||||
|     } else { | ||||
|       temp_expr_ctx = reinterpret_cast<ObTempExprCtx *>(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<int64_t>(&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<int64_t>(&temp_expr), | ||||
|                                                reinterpret_cast<int64_t>(temp_expr_ctx))); | ||||
|         } else { | ||||
|           LOG_WARN("fail to get temp expr ctx", K(temp_expr), K(ret)); | ||||
|         } | ||||
|       } else { | ||||
|         temp_expr_ctx = reinterpret_cast<ObTempExprCtx *>(ctx_ptr); | ||||
|       } | ||||
|     } | ||||
|   } else { | ||||
|     OZ(build_temp_expr_ctx(temp_expr, temp_expr_ctx)); | ||||
|   } | ||||
|  | ||||
|   return ret; | ||||
|  | ||||
| @ -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<ObAddr, int64_t> admission_addr_map_; | ||||
|   // used for temp expr ctx manager | ||||
|   bool use_temp_expr_ctx_cache_; | ||||
|   hash::ObHashMap<int64_t, int64_t> temp_expr_ctx_map_; | ||||
|   // for pl/trigger | ||||
|   ObDmlEventType dml_event_; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -426,6 +426,7 @@ int ObRemoteBaseExecuteP<T>::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<T>::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; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 obdev
					obdev