[to #43194241]fix bug nested sql

This commit is contained in:
seuwebber
2023-08-02 09:54:27 +00:00
committed by ob-robot
parent a9decfb7e1
commit 546c42df0a
5 changed files with 51 additions and 37 deletions

View File

@ -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));
}
}
}
}

View File

@ -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));
}
}
}
}

View File

@ -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);

View File

@ -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));
}
}
}
}

View File

@ -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;