[FEAT MERGE] Merge foreign key refactor to master;
This commit is contained in:
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user