From 546c42df0afd05394110de3408a363559599e4bb Mon Sep 17 00:00:00 2001 From: seuwebber Date: Wed, 2 Aug 2023 09:54:27 +0000 Subject: [PATCH] [to #43194241]fix bug nested sql --- src/sql/engine/dml/ob_table_delete_op.cpp | 26 ++++++++++++----------- src/sql/engine/dml/ob_table_insert_op.cpp | 26 ++++++++++++----------- src/sql/engine/dml/ob_table_merge_op.cpp | 2 +- src/sql/engine/dml/ob_table_update_op.cpp | 26 ++++++++++++----------- src/sql/ob_result_set.cpp | 8 +++++++ 5 files changed, 51 insertions(+), 37 deletions(-) diff --git a/src/sql/engine/dml/ob_table_delete_op.cpp b/src/sql/engine/dml/ob_table_delete_op.cpp index e6ad3cb46c..168e0d0450 100644 --- a/src/sql/engine/dml/ob_table_delete_op.cpp +++ b/src/sql/engine/dml/ob_table_delete_op.cpp @@ -201,18 +201,20 @@ OB_INLINE int ObTableDeleteOp::open_table_for_each() OB_INLINE int ObTableDeleteOp::close_table_for_each() { int ret = OB_SUCCESS; - for (int64_t i = 0; OB_SUCC(ret) && i < del_rtdefs_.count(); ++i) { - if (!del_rtdefs_.at(i).empty()) { - const ObDelCtDef &primary_del_ctdef = *MY_SPEC.del_ctdefs_.at(i).at(0); - ObDelRtDef &primary_del_rtdef = del_rtdefs_.at(i).at(0); - if (OB_NOT_NULL(primary_del_rtdef.das_rtdef_.table_loc_)) { - primary_del_rtdef.das_rtdef_.table_loc_->is_writing_ = false; - } - if (OB_FAIL(ObDMLService::process_after_stmt_trigger(primary_del_ctdef, - primary_del_rtdef, - dml_rtctx_, - ObDmlEventType::DE_DELETING))) { - LOG_WARN("process after stmt trigger failed", K(ret)); + if (OB_SUCCESS == ctx_.get_errcode()) { + for (int64_t i = 0; OB_SUCC(ret) && i < del_rtdefs_.count(); ++i) { + if (!del_rtdefs_.at(i).empty()) { + const ObDelCtDef &primary_del_ctdef = *MY_SPEC.del_ctdefs_.at(i).at(0); + ObDelRtDef &primary_del_rtdef = del_rtdefs_.at(i).at(0); + if (OB_NOT_NULL(primary_del_rtdef.das_rtdef_.table_loc_)) { + primary_del_rtdef.das_rtdef_.table_loc_->is_writing_ = false; + } + if (OB_FAIL(ObDMLService::process_after_stmt_trigger(primary_del_ctdef, + primary_del_rtdef, + dml_rtctx_, + ObDmlEventType::DE_DELETING))) { + LOG_WARN("process after stmt trigger failed", K(ret)); + } } } } diff --git a/src/sql/engine/dml/ob_table_insert_op.cpp b/src/sql/engine/dml/ob_table_insert_op.cpp index 7d2c0b03c1..f2139e6cf1 100644 --- a/src/sql/engine/dml/ob_table_insert_op.cpp +++ b/src/sql/engine/dml/ob_table_insert_op.cpp @@ -431,18 +431,20 @@ int ObTableInsertOp::inner_close() OB_INLINE int ObTableInsertOp::close_table_for_each() { int ret = OB_SUCCESS; - for (int64_t i = 0; OB_SUCC(ret) && i < ins_rtdefs_.count(); ++i) { - if (!ins_rtdefs_.at(i).empty()) { - const ObInsCtDef &primary_ins_ctdef = *MY_SPEC.ins_ctdefs_.at(i).at(0); - ObInsRtDef &primary_ins_rtdef = ins_rtdefs_.at(i).at(0); - if (OB_NOT_NULL(primary_ins_rtdef.das_rtdef_.table_loc_)) { - primary_ins_rtdef.das_rtdef_.table_loc_->is_writing_ = false; - } - if (OB_FAIL(ObDMLService::process_after_stmt_trigger(primary_ins_ctdef, - primary_ins_rtdef, - dml_rtctx_, - ObDmlEventType::DE_INSERTING))) { - LOG_WARN("process after stmt trigger failed", K(ret)); + if (OB_SUCCESS == ctx_.get_errcode()) { + for (int64_t i = 0; OB_SUCC(ret) && i < ins_rtdefs_.count(); ++i) { + if (!ins_rtdefs_.at(i).empty()) { + const ObInsCtDef &primary_ins_ctdef = *MY_SPEC.ins_ctdefs_.at(i).at(0); + ObInsRtDef &primary_ins_rtdef = ins_rtdefs_.at(i).at(0); + if (OB_NOT_NULL(primary_ins_rtdef.das_rtdef_.table_loc_)) { + primary_ins_rtdef.das_rtdef_.table_loc_->is_writing_ = false; + } + if (OB_FAIL(ObDMLService::process_after_stmt_trigger(primary_ins_ctdef, + primary_ins_rtdef, + dml_rtctx_, + ObDmlEventType::DE_INSERTING))) { + LOG_WARN("process after stmt trigger failed", K(ret)); + } } } } diff --git a/src/sql/engine/dml/ob_table_merge_op.cpp b/src/sql/engine/dml/ob_table_merge_op.cpp index 333c03fcf6..456fabf6fb 100644 --- a/src/sql/engine/dml/ob_table_merge_op.cpp +++ b/src/sql/engine/dml/ob_table_merge_op.cpp @@ -271,7 +271,7 @@ int ObTableMergeOp::open_table_for_each() OB_INLINE int ObTableMergeOp::close_table_for_each() { int ret = OB_SUCCESS; - if (!merge_rtdefs_.empty()) { + if (!merge_rtdefs_.empty() && (OB_SUCCESS == ctx_.get_errcode())) { //only primary index table need to execute triggered const ObMergeCtDef &merge_ctdef = *MY_SPEC.merge_ctdefs_.at(0); ObMergeRtDef &merge_rtdef = merge_rtdefs_.at(0); diff --git a/src/sql/engine/dml/ob_table_update_op.cpp b/src/sql/engine/dml/ob_table_update_op.cpp index cfad47ac69..223dab7372 100644 --- a/src/sql/engine/dml/ob_table_update_op.cpp +++ b/src/sql/engine/dml/ob_table_update_op.cpp @@ -251,18 +251,20 @@ OB_INLINE int ObTableUpdateOp::open_table_for_each() OB_INLINE int ObTableUpdateOp::close_table_for_each() { int ret = OB_SUCCESS; - for (int64_t i = 0; OB_SUCC(ret) && i < upd_rtdefs_.count(); ++i) { - if (!upd_rtdefs_.at(i).empty()) { - const ObUpdCtDef &primary_upd_ctdef = *MY_SPEC.upd_ctdefs_.at(i).at(0); - ObUpdRtDef &primary_upd_rtdef = upd_rtdefs_.at(i).at(0); - if (OB_NOT_NULL(primary_upd_rtdef.dupd_rtdef_.table_loc_)) { - primary_upd_rtdef.dupd_rtdef_.table_loc_->is_writing_ = false; - } - if (OB_FAIL(ObDMLService::process_after_stmt_trigger(primary_upd_ctdef, - primary_upd_rtdef, - dml_rtctx_, - ObDmlEventType::DE_UPDATING))) { - LOG_WARN("process after stmt trigger failed", K(ret)); + if (OB_SUCCESS == ctx_.get_errcode()) { + for (int64_t i = 0; OB_SUCC(ret) && i < upd_rtdefs_.count(); ++i) { + if (!upd_rtdefs_.at(i).empty()) { + const ObUpdCtDef &primary_upd_ctdef = *MY_SPEC.upd_ctdefs_.at(i).at(0); + ObUpdRtDef &primary_upd_rtdef = upd_rtdefs_.at(i).at(0); + if (OB_NOT_NULL(primary_upd_rtdef.dupd_rtdef_.table_loc_)) { + primary_upd_rtdef.dupd_rtdef_.table_loc_->is_writing_ = false; + } + if (OB_FAIL(ObDMLService::process_after_stmt_trigger(primary_upd_ctdef, + primary_upd_rtdef, + dml_rtctx_, + ObDmlEventType::DE_UPDATING))) { + LOG_WARN("process after stmt trigger failed", K(ret)); + } } } } diff --git a/src/sql/ob_result_set.cpp b/src/sql/ob_result_set.cpp index 6f292b69da..ed02f49e3a 100644 --- a/src/sql/ob_result_set.cpp +++ b/src/sql/ob_result_set.cpp @@ -703,12 +703,20 @@ OB_INLINE int ObResultSet::do_close_plan(int errcode, ObExecContext &ctx) // 但是由于目前调度线程给主线程push完最后一个task结果之后, 调度线程不会用到exec_result_.close中释放的变量, // 因此目前这样写暂时是没有问题的。 // 以后要修正这里的逻辑。 + + int old_errcode = ctx.get_errcode(); + if (OB_SUCCESS == old_errcode) { + // record error code generated in open-phase for after stmt trigger + ctx.set_errcode(errcode); + } if (OB_ISNULL(exec_result_)) { ret = OB_NOT_INIT; LOG_WARN("exec result is null", K(ret)); } else if (OB_FAIL(exec_result_->close(ctx))) { SQL_LOG(WARN, "fail close main query", K(ret)); } + // whether `close` is successful or not, restore ctx.errcode_ + ctx.set_errcode(old_errcode); // 通知该plan的所有task删掉对应的中间结果 int close_ret = OB_SUCCESS; ObPhysicalPlanCtx *plan_ctx = NULL;