[FEAT MERGE] Merge foreign key refactor to master;

This commit is contained in:
obdev
2023-01-28 16:30:04 +08:00
committed by ob-robot
parent a7753ea302
commit dfbfe7050d
54 changed files with 882 additions and 201 deletions

View File

@ -315,6 +315,7 @@ int ObTableInsertUpOp::do_insert_up_cache()
} else if (constraint_values.empty()) {
// do insert
ObChunkDatumStore::StoredRow *insert_new_row = NULL;
ObDMLModifyRowNode modify_row(this, &ins_ctdef, &ins_rtdef, ObDmlEventType::DE_INSERTING);
if (is_ignore_) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("ignore is unexpected", K(ret), KPC(insert_row));
@ -322,11 +323,6 @@ int ObTableInsertUpOp::do_insert_up_cache()
LOG_WARN("fail to do process insert", K(ret), K(ins_ctdef),
"insert_row", ROWEXPR2STR(eval_ctx_, get_primary_table_insert_row()));
// TODO(yikang): fix trigger related for heap table
} else if (ins_ctdef.is_primary_index_ && OB_FAIL(TriggerHandle::do_handle_after_row(*this,
ins_ctdef.trig_ctdef_,
ins_rtdef.trig_rtdef_,
ObTriggerEvents::get_insert_event()))) {
LOG_WARN("failed to handle before trigger", K(ret));
} else if (OB_FAIL(conflict_checker_.convert_exprs_to_stored_row(get_primary_table_insert_row(),
insert_new_row))) {
LOG_WARN("convert expr to stored row failed", K(ret),
@ -335,7 +331,12 @@ int ObTableInsertUpOp::do_insert_up_cache()
LOG_WARN("fail to insert row", K(ret),
"insert_row", ROWEXPR2STR(eval_ctx_, get_primary_table_insert_row()));
} else {
insert_rows_++;
modify_row.new_row_ = insert_new_row;
if (need_after_row_process(ins_ctdef) && OB_FAIL(dml_modify_rows_.push_back(modify_row))) {
LOG_WARN("failed to push dml modify row to modified row list", K(ret));
} else {
insert_rows_++;
}
}
} else {
// do update
@ -344,6 +345,7 @@ int ObTableInsertUpOp::do_insert_up_cache()
// clear_evaluated_flag, 并且将数据重新flush到insert_row中
ObChunkDatumStore::StoredRow *upd_new_row = NULL;
const ObChunkDatumStore::StoredRow *upd_old_row = constraint_values.at(0).current_datum_row_;
ObDMLModifyRowNode modify_row(this, &upd_ctdef, &upd_rtdef, ObDmlEventType::DE_UPDATING);
clear_evaluated_flag();
if (OB_FAIL(insert_row->to_expr(MY_SPEC.all_saved_exprs_, eval_ctx_))) {
LOG_WARN("insert_row to expr failed", K(ret), KPC(insert_row),
@ -368,13 +370,6 @@ int ObTableInsertUpOp::do_insert_up_cache()
} else if (upd_ctdef.is_heap_table_ &&
OB_FAIL(set_heap_table_new_pk(upd_ctdef, upd_rtdef))) {
LOG_WARN("set heap table hidden_pk failed", K(ret), K(upd_ctdef));
} else if (!is_skipped && upd_rtdef.is_row_changed_
&& OB_FAIL(TriggerHandle::do_handle_after_row(*this,
upd_ctdef.trig_ctdef_,
upd_rtdef.trig_rtdef_,
ObTriggerEvents::get_update_event()))) {
//兼容mysql如果行没变化,不执行行后trigger
LOG_WARN("failed to handle after trigger", K(ret));
} else if (OB_FAIL(conflict_checker_.convert_exprs_to_stored_row(get_primary_table_upd_new_row(),
upd_new_row))) {
LOG_WARN("convert expr to stored row failed", K(ret), "exprs", get_primary_table_upd_old_row());
@ -394,8 +389,14 @@ int ObTableInsertUpOp::do_insert_up_cache()
LOG_WARN("fail to update row in conflict_checker", K(ret),
KPC(upd_new_row), KPC(upd_old_row));
} else {
insert_rows_++;
upd_changed_rows_++;
modify_row.old_row_ = const_cast<ObChunkDatumStore::StoredRow *>(upd_old_row);
modify_row.new_row_ = upd_new_row;
if (need_after_row_process(upd_ctdef) && OB_FAIL(dml_modify_rows_.push_back(modify_row))) {
LOG_WARN("failed to push dml modify row to modified row list", K(ret));
} else {
insert_rows_++;
upd_changed_rows_++;
}
}
} else {
// create table t1(c1 int primary key, c2 timestamp default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP);
@ -419,7 +420,24 @@ int ObTableInsertUpOp::insert_row_to_das(const ObInsCtDef &ins_ctdef,
const ObDASTabletLoc *tablet_loc)
{
int ret = OB_SUCCESS;
if (OB_FAIL(ObDMLService::insert_row(ins_ctdef, ins_rtdef, tablet_loc, dml_rtctx_))) {
ObChunkDatumStore::StoredRow* stored_row = nullptr;
if (OB_FAIL(ObDMLService::insert_row(ins_ctdef, ins_rtdef, tablet_loc, dml_rtctx_, stored_row))) {
LOG_WARN("insert row with das failed", K(ret));
} else {
LOG_TRACE("insert one row", KPC(tablet_loc),
"insert row", ROWEXPR2STR(eval_ctx_, ins_ctdef.new_row_));
}
return ret;
}
int ObTableInsertUpOp::insert_row_to_das(const ObInsCtDef &ins_ctdef,
ObInsRtDef &ins_rtdef,
const ObDASTabletLoc *tablet_loc,
ObDMLModifyRowNode &modify_row)
{
int ret = OB_SUCCESS;
if (OB_FAIL(ObDMLService::insert_row(ins_ctdef, ins_rtdef, tablet_loc, dml_rtctx_, modify_row.new_row_))) {
LOG_WARN("insert row with das failed", K(ret));
} else {
LOG_TRACE("insert one row", KPC(tablet_loc),
@ -441,6 +459,7 @@ int ObTableInsertUpOp::try_insert_row()
ObInsertUpRtDef &insert_up_rtdef = insert_up_rtdefs_.at(i);
ObInsRtDef &ins_rtdef = insert_up_rtdef.ins_rtdef_;
ObDASTabletLoc *tablet_loc = nullptr;
ObDMLModifyRowNode modify_row(this, const_cast<ObInsCtDef *>(&ins_ctdef), &ins_rtdef, ObDmlEventType::DE_INSERTING);
++ins_rtdef.cur_row_num_;
if (OB_FAIL(ObDMLService::process_insert_row(ins_ctdef, ins_rtdef, *this, is_skipped))) {
LOG_WARN("process insert row failed", K(ret));
@ -451,14 +470,11 @@ int ObTableInsertUpOp::try_insert_row()
} else if (ins_ctdef.is_heap_table_ &&
OB_FAIL(ObDMLService::set_heap_table_hidden_pk(ins_ctdef, tablet_loc->tablet_id_, eval_ctx_))) {
LOG_WARN("set_heap_table_hidden_pk failed", K(ret), KPC(tablet_loc));
} else if (OB_FAIL(insert_row_to_das(ins_ctdef, ins_rtdef, tablet_loc))) {
} else if (OB_FAIL(insert_row_to_das(ins_ctdef, ins_rtdef, tablet_loc, modify_row))) {
LOG_WARN("insert row with das failed", K(ret));
// TODO(yikang): fix trigger related for heap table
} else if (ins_ctdef.is_primary_index_ && OB_FAIL(TriggerHandle::do_handle_after_row(*this,
ins_ctdef.trig_ctdef_,
ins_rtdef.trig_rtdef_,
ObTriggerEvents::get_insert_event()))) {
LOG_WARN("failed to handle before trigger", K(ret));
} else if (need_after_row_process(ins_ctdef) && OB_FAIL(dml_modify_rows_.push_back(modify_row))) {
LOG_WARN("failed to push dml modify row to modified row list", K(ret));
}
}
return ret;
@ -580,7 +596,7 @@ int ObTableInsertUpOp::delete_one_upd_old_row_das(const ObUpdCtDef &upd_ctdef,
LOG_WARN("init das dml rtdef failed", K(ret), K(upd_ctdef), K(upd_rtdef));
}
}
ObChunkDatumStore::StoredRow* stored_row = nullptr;
if (OB_FAIL(ret)) {
//do nothing
} else if (OB_ISNULL(upd_rtdef.ddel_rtdef_)) {
@ -596,7 +612,8 @@ int ObTableInsertUpOp::delete_one_upd_old_row_das(const ObUpdCtDef &upd_ctdef,
*upd_rtdef.ddel_rtdef_,
tablet_loc,
upd_rtctx_,
upd_ctdef.old_row_))) {
upd_ctdef.old_row_,
stored_row))) {
LOG_WARN("delete row with das failed", K(ret));
} else {
LOG_DEBUG("delete upd old_row", KPC(tablet_loc), "upd old_row",
@ -621,7 +638,7 @@ int ObTableInsertUpOp::insert_one_upd_new_row_das(const ObUpdCtDef &upd_ctdef,
LOG_WARN("init das dml rtdef failed", K(ret), K(upd_ctdef), K(upd_rtdef));
}
}
ObChunkDatumStore::StoredRow* stored_row = nullptr;
if (OB_FAIL(ret)) {
//do nothing
} else if (OB_ISNULL(upd_rtdef.dins_rtdef_)) {
@ -637,7 +654,8 @@ int ObTableInsertUpOp::insert_one_upd_new_row_das(const ObUpdCtDef &upd_ctdef,
*upd_rtdef.dins_rtdef_,
tablet_loc,
upd_rtctx_,
upd_ctdef.new_row_))) {
upd_ctdef.new_row_,
stored_row))) {
LOG_WARN("insert row with das failed", K(ret));
} else {
LOG_DEBUG("ins upd new_row", KPC(tablet_loc), "upd new_row",
@ -801,6 +819,8 @@ int ObTableInsertUpOp::do_insert_up()
LOG_WARN("fail to load all row", K(ret));
} else if (OB_FAIL(post_all_dml_das_task(dml_rtctx_, false))) {
LOG_WARN("fail to post all das task", K(ret));
} else if (!check_is_duplicated() && OB_FAIL(ObDMLService::handle_after_row_processing_batch(&dml_modify_rows_))) {
LOG_WARN("try insert is not duplicated, failed to process foreign key handle", K(ret));
} else if (!check_is_duplicated()) {
insert_rows_ += insert_rows;
LOG_TRACE("try insert is not duplicated", K(ret), K(insert_rows_));
@ -823,6 +843,8 @@ int ObTableInsertUpOp::do_insert_up()
LOG_WARN("do insert rows post process failed", K(ret));
} else if (OB_FAIL(post_all_dml_das_task(dml_rtctx_, false))) {
LOG_WARN("do insert rows post process failed", K(ret));
} else if (OB_FAIL(ObDMLService::handle_after_row_processing_batch(&dml_modify_rows_))) {
LOG_WARN("try insert is duplicated, failed to process foreign key handle", K(ret));
}
if (OB_SUCC(ret) && !is_iter_end) {
@ -999,7 +1021,6 @@ int ObTableInsertUpOp::prepare_final_insert_up_task()
OZ(do_insert(constraint_value));
}
}
return ret;
}
@ -1073,6 +1094,7 @@ int ObTableInsertUpOp::do_update_with_ignore()
ObUpdRtDef &upd_rtdef = insert_up_rtdef.upd_rtdef_;
ObDASTabletLoc *old_tablet_loc = nullptr;
ObDASTabletLoc *new_tablet_loc = nullptr;
ObDMLModifyRowNode modify_row(this, (upd_ctdef), &upd_rtdef, ObDmlEventType::DE_UPDATING);
if (MY_SPEC.insert_up_ctdefs_.count() > 1) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("not support global index with ignore", K(ret));
@ -1083,8 +1105,11 @@ int ObTableInsertUpOp::do_update_with_ignore()
ret = OB_NOT_SUPPORTED;
LOG_WARN("ignore not supported", K(ret), KPC(old_tablet_loc), KPC(new_tablet_loc));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "Do update with ignore under inconsistent tablet loc");
} else if (OB_FAIL(ObDMLService::update_row(*upd_ctdef, upd_rtdef, old_tablet_loc, new_tablet_loc, dml_rtctx_))) {
} else if (OB_FAIL(ObDMLService::update_row(*upd_ctdef, upd_rtdef, old_tablet_loc, new_tablet_loc, dml_rtctx_,
modify_row.old_row_, modify_row.new_row_, modify_row.full_row_))) {
LOG_WARN("fail to insert update_row to das", K(ret));
} else if (need_after_row_process(*upd_ctdef) && OB_FAIL(dml_modify_rows_.push_back(modify_row))) {
LOG_WARN("failed to push dml modify row to modified row list", K(ret));
}
return ret;
}
@ -1124,6 +1149,7 @@ int ObTableInsertUpOp::reset_das_env()
LOG_WARN("close all das task failed", K(ret));
} else {
dml_rtctx_.das_ref_.reuse();
dml_modify_rows_.clear();
}
// 因为第二次插入不需要fetch conflict result了,如果有conflict
@ -1158,6 +1184,7 @@ int ObTableInsertUpOp::reuse()
LOG_WARN("fail to reuse conflict checker", K(ret));
} else {
insert_up_row_store_.reset();
dml_modify_rows_.clear();
}
}