FIX: fix the core induced by foreign key handle overwrite the datum pointer of expr in DML op

This commit is contained in:
obdev
2024-04-08 10:24:42 +00:00
committed by ob-robot
parent 0740b8fc8a
commit 2ce6bc28c8
4 changed files with 15 additions and 11 deletions

View File

@ -2214,9 +2214,14 @@ int ObDMLService::handle_after_processing_multi_row(ObDMLModifyRowsList *dml_mod
const ObDmlEventType t_insert = ObDmlEventType::DE_INSERTING;
const ObDmlEventType t_update = ObDmlEventType::DE_UPDATING;
const ObDmlEventType t_delete = ObDmlEventType::DE_DELETING;
if (OB_ISNULL(dml_modify_rows) || OB_ISNULL(dml_op)) {
if (OB_ISNULL(dml_modify_rows) || OB_ISNULL(dml_op) || OB_ISNULL(dml_op->get_child())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("dml operator or modify rows list is null", K(dml_modify_rows), K(dml_op));
} else if (OB_ISNULL(dml_op->last_store_row_.get_store_row()) &&
OB_FAIL(dml_op->last_store_row_.init(dml_op->get_exec_ctx().get_allocator(), dml_op->get_child()->get_spec().output_.count()))) {
LOG_WARN("failed to init shadow stored row", K(ret));
} else if (OB_FAIL(dml_op->last_store_row_.shadow_copy(dml_op->get_child()->get_spec().output_, dml_op->get_eval_ctx()))) {
LOG_WARN("failed to backup the datum ptr of child operator", K(ret));
} else {
ObDMLModifyRowsList::iterator row_iter = dml_modify_rows->begin();
for (; OB_SUCC(ret) && row_iter != dml_modify_rows->end(); row_iter++) {
@ -2276,8 +2281,12 @@ int ObDMLService::handle_after_processing_multi_row(ObDMLModifyRowsList *dml_mod
}
// check the result of batch foreign key check results
if (OB_SUCC(ret) && dml_op->get_spec().check_fk_batch_ && OB_FAIL(dml_op->perform_batch_fk_check())) {
LOG_WARN("failed to perform batch foreign key check", K(ret));
if (OB_SUCC(ret)) {
if (dml_op->get_spec().check_fk_batch_ && OB_FAIL(dml_op->perform_batch_fk_check())) {
LOG_WARN("failed to perform batch foreign key check", K(ret));
} else if (OB_FAIL(dml_op->last_store_row_.restore(dml_op->get_child()->get_spec().output_, dml_op->get_eval_ctx()))) {
LOG_WARN("failed to restore the datum ptr", K(ret));
}
}
}
return ret;

View File

@ -675,6 +675,7 @@ ObTableModifyOp::ObTableModifyOp(ObExecContext &ctx,
execute_single_row_(false),
err_log_rt_def_(),
dml_modify_rows_(ctx.get_allocator()),
last_store_row_(),
saved_session_(NULL)
{
obj_print_params_ = CREATE_OBJ_PRINT_PARAM(ctx_.get_my_session());

View File

@ -206,6 +206,7 @@ public:
dml_rtctx_.cleanup();
trigger_clear_exprs_.reset();
fk_checkers_.reset();
last_store_row_.reset();
ObOperator::destroy();
}
@ -214,10 +215,6 @@ public:
int close_inner_conn();
int begin_nested_session(bool skip_cur_stmt_tables);
int end_nested_session();
int set_foreign_key_cascade(bool is_cascade);
int get_foreign_key_cascade(bool &is_cascade) const;
int set_foreign_key_check_exist(bool is_check_exist);
int get_foreign_key_check_exist(bool &is_check_exist) const;
int execute_write(const char *sql);
int execute_read(const char *sql, common::ObMySQLProxy::MySQLResult &res);
int check_stack();
@ -292,6 +289,7 @@ public:
ObSEArray<ObExpr *, 4> trigger_clear_exprs_;
ObDMLModifyRowsList dml_modify_rows_;
ObSEArray<ObForeignKeyChecker *, 4> fk_checkers_;
ObChunkDatumStore::ShadowStoredRow last_store_row_;
private:
ObSQLSessionInfo::StmtSavedValue *saved_session_;
char saved_session_buf_[sizeof(ObSQLSessionInfo::StmtSavedValue)] __attribute__((aligned (16)));;