[FEAT MERGE] materialized view

Co-authored-by: suz-yang <suz.yang@foxmail.com>
Co-authored-by: leftgeek <1094669802@qq.com>
Co-authored-by: chimyue <chimyue@gmail.com>
This commit is contained in:
coolfishchen
2023-12-14 07:42:51 +00:00
committed by ob-robot
parent 0f946e55fb
commit f7cd32be94
257 changed files with 35700 additions and 4337 deletions

View File

@ -1037,6 +1037,7 @@ int ObDmlCgService::generate_dml_column_ids(const ObLogicalOperator &op,
int ObDmlCgService::generate_updated_column_ids(const ObLogDelUpd &log_op,
const ObAssignments &assigns,
const ObIArray<uint64_t> &column_ids,
const ObDASDMLBaseCtDef &das_ctdef,
ObIArray<uint64_t> &updated_column_ids)
{
int ret = OB_SUCCESS;
@ -1049,18 +1050,34 @@ int ObDmlCgService::generate_updated_column_ids(const ObLogDelUpd &log_op,
} else if (OB_FAIL(updated_column_ids.reserve(assigns.count()))) {
LOG_WARN("init updated column ids array failed", K(ret), K(assigns.count()));
} else {
ARRAY_FOREACH(assigns, i) {
ObColumnRefRawExpr *column_expr = assigns.at(i).column_expr_;
ColumnItem *column_item = nullptr;
if (OB_ISNULL(column_expr) ||
OB_ISNULL(column_item = stmt->get_column_item_by_id(column_expr->get_table_id(),
column_expr->get_column_id()))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null", K(ret), K(column_expr), K(column_item));
} else if (!has_exist_in_array(column_ids, column_item->base_cid_)) {
//not found in column ids, ignore it
} else if (OB_FAIL(updated_column_ids.push_back(column_item->base_cid_))) {
LOG_WARN("add updated column id failed", K(ret));
ObArray<uint64_t> storage_column_ids;
if (OB_FAIL(storage_column_ids.assign(column_ids))) {
LOG_WARN("failed to assign column ids", KR(ret));
} else {
for (int64_t i = 0; OB_SUCC(ret) && (i < storage_column_ids.count()); ++i) {
if (is_mlog_reference_column(storage_column_ids.at(i))
&& !das_ctdef.is_access_mlog_as_master_table_) {
uint64_t ref_col_id = ObTableSchema::gen_ref_col_id_from_mlog_col_id(storage_column_ids.at(i));
storage_column_ids.at(i) = ref_col_id;
}
}
}
if (OB_SUCC(ret)) {
ARRAY_FOREACH(assigns, i) {
ObColumnRefRawExpr *column_expr = assigns.at(i).column_expr_;
ColumnItem *column_item = nullptr;
if (OB_ISNULL(column_expr) ||
OB_ISNULL(column_item = stmt->get_column_item_by_id(column_expr->get_table_id(),
column_expr->get_column_id()))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null", K(ret), K(column_expr), K(column_item));
} else {
if (!has_exist_in_array(storage_column_ids, column_item->base_cid_)) {
//not found in column ids, ignore it
} else if (OB_FAIL(updated_column_ids.push_back(column_item->base_cid_))) {
LOG_WARN("add updated column id failed", K(ret));
}
}
}
}
}
@ -1187,6 +1204,10 @@ int ObDmlCgService::generate_das_projector(const ObIArray<uint64_t> &dml_column_
uint64_t ref_cid = is_shadow_column(storage_cid) ?
storage_cid - OB_MIN_SHADOW_COLUMN_ID :
storage_cid;
if (is_mlog_reference_column(storage_cid)
&& !das_ctdef.is_access_mlog_as_master_table_) {
ref_cid = ObTableSchema::gen_ref_col_id_from_mlog_col_id(storage_cid);
}
int64_t column_idx = OB_INVALID_INDEX;
int64_t projector_idx = OB_INVALID_INDEX;
old_row_projector.at(i) = OB_INVALID_INDEX;
@ -1218,6 +1239,10 @@ int ObDmlCgService::generate_das_projector(const ObIArray<uint64_t> &dml_column_
uint64_t ref_cid = is_shadow_column(storage_cid) ?
storage_cid - OB_MIN_SHADOW_COLUMN_ID :
storage_cid;
if (is_mlog_reference_column(storage_cid)
&& !das_ctdef.is_access_mlog_as_master_table_) {
ref_cid = ObTableSchema::gen_ref_col_id_from_mlog_col_id(storage_cid);
}
int64_t column_idx = OB_INVALID_INDEX;
int64_t projector_idx = OB_INVALID_INDEX;
new_row_projector.at(i) = OB_INVALID_INDEX;
@ -1403,6 +1428,9 @@ int ObDmlCgService::generate_related_ins_ctdef(ObLogDelUpd &op,
LOG_WARN("generate das ins ctdef failed", K(ret));
} else if (OB_FAIL(ins_ctdefs.push_back(related_ctdef))) {
LOG_WARN("store related ctdef failed", K(ret));
} else {
// for materialized view log
related_ctdef->is_access_mlog_as_master_table_ = false;
}
}
return ret;
@ -1454,6 +1482,9 @@ int ObDmlCgService::generate_related_del_ctdef(ObLogDelUpd &op,
LOG_WARN("generate das ins ctdef failed", K(ret));
} else if (OB_FAIL(del_ctdefs.push_back(related_ctdef))) {
LOG_WARN("store related ctdef failed", K(ret));
} else {
// for materialized view log
related_ctdef->is_access_mlog_as_master_table_ = false;
}
}
return ret;
@ -1473,6 +1504,7 @@ int ObDmlCgService::generate_das_upd_ctdef(ObLogDelUpd &op,
if (OB_FAIL(generate_das_dml_ctdef(op, index_tid, index_dml_info, das_upd_ctdef))) {
LOG_WARN("generate das dml base ctdef failed", K(ret), K(index_dml_info));
} else if (OB_FAIL(generate_updated_column_ids(op, assigns, das_upd_ctdef.column_ids_,
das_upd_ctdef,
das_upd_ctdef.updated_column_ids_))) {
LOG_WARN("add updated column ids failed", K(ret), K(assigns));
} else if (OB_FAIL(generate_dml_column_ids(op, index_dml_info.column_exprs_, dml_column_ids))) {
@ -1521,6 +1553,9 @@ int ObDmlCgService::generate_related_upd_ctdef(ObLogDelUpd &op,
//ignore invalid update ctdef
} else if (OB_FAIL(upd_ctdefs.push_back(related_ctdef))) {
LOG_WARN("store related ctdef failed", K(ret));
} else {
// for materialized view log
related_ctdef->is_access_mlog_as_master_table_ = false;
}
}
return ret;
@ -1684,6 +1719,11 @@ int ObDmlCgService::generate_dml_base_ctdef(ObLogicalOperator &op,
dml_base_ctdef.das_base_ctdef_.is_insert_up_ = true;
}
}
if (OB_SUCC(ret)) {
// for materialized view log
dml_base_ctdef.das_base_ctdef_.is_access_mlog_as_master_table_ = true;
}
return ret;
}
@ -1984,7 +2024,7 @@ int ObDmlCgService::convert_normal_triggers(ObLogDelUpd &log_op,
if (OB_FAIL(ret)) {
} else if (OB_FAIL(generate_dml_column_ids(log_op, dml_info.column_exprs_, column_ids))) {
LOG_WARN("add column ids failed", K(ret));
} else if (OB_FAIL(generate_updated_column_ids(log_op, assigns, column_ids, updated_column_ids))) {
} else if (OB_FAIL(generate_updated_column_ids(log_op, assigns, column_ids, das_ctdef, updated_column_ids))) {
LOG_WARN("add updated column ids failed", K(ret), K(assigns));
} else if (ObTriggerEvents::has_insert_event(dml_event)) {
OZ(trig_ctdef.new_row_exprs_.init(expectd_col_cnt));
@ -2630,7 +2670,7 @@ int ObDmlCgService::generate_fk_arg(ObForeignKeyArg &fk_arg,
if (OB_FAIL(generate_dml_column_ids(op, index_dml_info.column_exprs_, column_ids))) {
LOG_WARN("add column ids failed", K(ret));
} else if (OB_FAIL(generate_updated_column_ids(op, index_dml_info.assignments_, column_ids, updated_column_ids))) {
} else if (OB_FAIL(generate_updated_column_ids(op, index_dml_info.assignments_, column_ids, das_ctdef, updated_column_ids))) {
LOG_WARN("add updated column ids failed", K(ret), K(index_dml_info.assignments_));
} else if (OB_FAIL(need_foreign_key_handle(fk_arg, updated_column_ids,
value_column_ids, das_ctdef.op_type_,

View File

@ -115,6 +115,7 @@ private:
int generate_updated_column_ids(const ObLogDelUpd &log_op,
const ObAssignments &assigns,
const common::ObIArray<uint64_t> &column_ids,
const ObDASDMLBaseCtDef &das_ctdef,
common::ObIArray<uint64_t> &updated_column_ids);
int convert_dml_column_info(common::ObTableID index_tid,
bool only_rowkey,

View File

@ -4059,7 +4059,9 @@ int ObStaticEngineCG::generate_normal_tsc(ObLogTableScan &op, ObTableScanSpec &s
}
if (OB_SUCC(ret)) {
if (opt_ctx_->is_online_ddl() && stmt::T_INSERT == opt_ctx_->get_session_info()->get_stmt_type()) {
if (opt_ctx_->is_online_ddl() &&
stmt::T_INSERT == opt_ctx_->get_session_info()->get_stmt_type() &&
!opt_ctx_->get_session_info()->get_ddl_info().is_mview_complete_refresh()) {
spec.report_col_checksum_ = true;
}
}