[FEAT MERGE]4_1_sql_feature

Co-authored-by: leslieyuchen <leslieyuchen@gmail.com>
Co-authored-by: Charles0429 <xiezhenjiang@gmail.com>
Co-authored-by: raywill <hustos@gmail.com>
This commit is contained in:
obdev
2023-01-28 16:01:26 +08:00
committed by ob-robot
parent 3080f2b66f
commit 2d19a9d8f5
846 changed files with 161957 additions and 116661 deletions

View File

@ -145,8 +145,8 @@ int ObDmlCgService::generate_lock_ctdef(ObLogForUpdate &op,
if (OB_ISNULL(lock_ctdef = lock_ctdef_allocator.alloc())) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("allocate lock ctdef failed", K(ret));
} else if (OB_FAIL(convert_old_row_exprs(index_dml_info.column_exprs_, old_row))) {
LOG_WARN("convert lock old row exprs failed", K(ret), K(index_dml_info.column_exprs_));
} else if (OB_FAIL(old_row.assign(index_dml_info.column_old_values_exprs_))) {
LOG_WARN("fail to assign lock old row", K(ret));
} else if (OB_FAIL(generate_dml_base_ctdef(op,
index_dml_info,
*lock_ctdef,
@ -273,9 +273,8 @@ int ObDmlCgService::generate_delete_ctdef(ObLogDelUpd &op,
int ret = OB_SUCCESS;
ObSEArray<ObRawExpr*, 64> old_row;
ObSEArray<ObRawExpr*, 64> new_row;
LOG_TRACE("begin to generate delete ctdef", K(index_dml_info));
if (OB_FAIL(convert_old_row_exprs(index_dml_info.column_exprs_, old_row))) {
LOG_WARN("convert delete old row exprs failed", K(ret), K(index_dml_info.column_exprs_));
if (OB_FAIL(old_row.assign(index_dml_info.column_old_values_exprs_))) {
LOG_WARN("fail to assign delete old row", K(ret));
} else if (OB_FAIL(generate_dml_base_ctdef(op, index_dml_info,
del_ctdef,
ObTriggerEvents::get_delete_event(),
@ -355,8 +354,8 @@ int ObDmlCgService::generate_update_ctdef(ObLogDelUpd &op,
const ObAssignments &assigns = index_dml_info.assignments_;
bool gen_expand_ctdef = false;
LOG_TRACE("begin to generate update ctdef", K(index_dml_info));
if (OB_FAIL(convert_old_row_exprs(index_dml_info.column_exprs_, old_row))) {
LOG_WARN("convert update old row exprs failed", K(ret), K(index_dml_info.column_exprs_));
if (OB_FAIL(old_row.assign(index_dml_info.column_old_values_exprs_))) {
LOG_WARN("fail to assign update old row", K(ret));
} else if (OB_FAIL(new_row.assign(old_row))) {
LOG_WARN("assign new row failed", K(ret));
} else if (OB_FAIL(append(full_row, old_row))) {
@ -521,6 +520,33 @@ int ObDmlCgService::get_table_rowkey_exprs(const IndexDMLInfo &index_dml_info,
return ret;
}
// for virtual generated column.
int ObDmlCgService::adjust_unique_key_exprs(ObIArray<ObRawExpr*> &unique_key_exprs)
{
int ret = OB_SUCCESS;
ObArray<ObRawExpr*> tmp_exprs;
for (int64_t i = 0; OB_SUCC(ret) && i < unique_key_exprs.count(); ++i) {
ObRawExpr *expr = unique_key_exprs.at(i);
if (expr->is_column_ref_expr() &&
static_cast<ObColumnRefRawExpr *>(expr)->is_virtual_generated_column()) {
// do nothing.
ObRawExpr *tmp_expr = static_cast<ObColumnRefRawExpr *>(expr)->get_dependant_expr();
if (OB_FAIL(add_var_to_array_no_dup(tmp_exprs, tmp_expr))) {
LOG_WARN("failed to add param expr", K(ret));
}
} else {
if (OB_FAIL(add_var_to_array_no_dup(tmp_exprs, expr))) {
LOG_WARN("failed to add param expr", K(ret));
}
}
}
if (OB_FAIL(ret)) {
} else if (OB_FAIL(unique_key_exprs.assign(tmp_exprs))) {
LOG_WARN("failed to remove generated column exprs", K(ret));
}
return ret;
}
int ObDmlCgService::get_table_unique_key_exprs(ObLogDelUpd &op,
const IndexDMLInfo &index_dml_info,
ObIArray<ObRawExpr*> &unique_key_exprs)
@ -534,6 +560,8 @@ int ObDmlCgService::get_table_unique_key_exprs(ObLogDelUpd &op,
} else if (is_heap_table) {
if (OB_FAIL(get_heap_table_part_exprs(op, index_dml_info, unique_key_exprs))) {
LOG_WARN("get heap table part exprs failed", K(ret), K(index_dml_info));
} else if (OB_FAIL(adjust_unique_key_exprs(unique_key_exprs))){
LOG_WARN("fail to adjust unique key exprs", K(ret));
}
}
@ -732,7 +760,7 @@ int ObDmlCgService::generate_conflict_checker_ctdef(ObLogInsert &op,
ObExpr *rt_part_id_expr = NULL;
ObSEArray<ObRawExpr *, 4> constraint_dep_exprs;
ObSEArray<ObRawExpr *, 4> constraint_raw_exprs;
if (OB_ISNULL(part_id_expr_for_lookup = index_dml_info.old_part_id_expr_)) {
if (OB_ISNULL(part_id_expr_for_lookup = index_dml_info.lookup_part_id_expr_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("part_id_expr for lookup is null", K(ret), K(index_dml_info));
} else if (OB_FAIL(cg_.generate_calc_part_id_expr(*part_id_expr_for_lookup, nullptr, rt_part_id_expr))) {
@ -793,7 +821,10 @@ int ObDmlCgService::generate_constraint_infos(ObLogInsert &op,
if (OB_ISNULL(col_expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("col_expr is null", K(ret));
} else if (is_shadow_column(col_expr->get_column_id())) {
} else if (is_shadow_column(col_expr->get_column_id())
|| col_expr->is_virtual_generated_column()) {
LOG_DEBUG("constraint exprs", K(is_shadow_column(col_expr->get_column_id())),
K(col_expr->is_virtual_generated_column()));
// for shadow_pk
ObRawExpr *spk_expr = col_expr->get_dependant_expr();
if (OB_ISNULL(spk_expr)) {
@ -865,8 +896,8 @@ int ObDmlCgService::generate_scan_ctdef(ObLogInsert &op,
} else if (OB_FAIL(schema_guard->get_schema_guard()->get_schema_version(
TABLE_SCHEMA, tenant_id, ref_table_id, scan_ctdef.schema_version_))) {
LOG_WARN("fail to get schema version", K(ret), K(tenant_id), K(ref_table_id));
} else if (OB_FAIL(convert_old_row_exprs(index_dml_info.column_exprs_, access_exprs))) {
LOG_WARN("convert old row exprs failed", K(ret));
} else if (FALSE_IT(access_exprs.assign(index_dml_info.column_old_values_exprs_))) {
// do nothing
} else if (OB_FAIL(cg_.generate_rt_exprs(access_exprs,
scan_ctdef.pd_expr_spec_.access_exprs_))) {
LOG_WARN("fail to generate rt exprs ", K(ret));
@ -1736,17 +1767,33 @@ int ObDmlCgService::convert_normal_triggers(ObLogDelUpd &log_op,
LOG_WARN("failed to get trigger info", K(ret), K(tenant_id));
} else if (OB_ISNULL(trigger_info)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("trigger info is null", K(ret));
LOG_WARN("trigger info is null", K(tenant_id), K(trigger_id), K(ret));
} else if (trigger_info->is_enable()) {
// if disable trigger, use the previous plan cache, whether trigger is enable ???
need_fire = trigger_info->has_event(dml_event);
if (need_fire && !is_instead_of && op_type == PHY_UPDATE) {
if (OB_SUCC(ret) && need_fire && !trigger_info->get_ref_trg_name().empty()) {
const ObTriggerInfo *ref_trigger_info = NULL;
uint64_t ref_db_id = OB_INVALID_ID;
OZ (schema_guard->get_database_id(tenant_id, trigger_info->get_ref_trg_db_name(), ref_db_id));
OZ (schema_guard->get_trigger_info(tenant_id, ref_db_id, trigger_info->get_ref_trg_name(),
ref_trigger_info));
if (OB_SUCC(ret) && NULL == ref_trigger_info) {
ret = OB_ERR_TRIGGER_NOT_EXIST;
LOG_WARN("ref_trigger_info is NULL", K(trigger_info->get_ref_trg_db_name()),
K(trigger_info->get_ref_trg_name()), K(ret));
if (lib::is_oracle_mode()) {
LOG_ORACLE_USER_ERROR(OB_ERR_TRIGGER_NOT_EXIST, trigger_info->get_ref_trg_name().length(),
trigger_info->get_ref_trg_name().ptr());
}
}
}
if (OB_SUCC(ret) && need_fire && !is_instead_of && op_type == PHY_UPDATE) {
OZ (need_fire_update_event(*table_schema, trigger_info->get_update_columns(),
static_cast<ObLogUpdate &>(log_op), *session,
log_plan->get_optimizer_context().get_allocator(),
need_fire));
}
if (need_fire) {
if (OB_SUCC(ret) && need_fire) {
OZ (trigger_infos.push_back(trigger_info));
}
OX (LOG_DEBUG("TRIGGER", K(trigger_info->get_trigger_name()), K(need_fire), K(is_instead_of)));
@ -1761,6 +1808,12 @@ int ObDmlCgService::convert_normal_triggers(ObLogDelUpd &log_op,
expectd_col_cnt = dml_stmt->get_instead_of_trigger_column_count();
}
trig_ctdef.tg_event_ = dml_event;
ObTriggerInfo::ActionOrderComparator action_order_com;
std::sort(trigger_infos.begin(), trigger_infos.end(), action_order_com);
if (OB_FAIL(action_order_com.get_ret())) {
ret = common::OB_ERR_UNEXPECTED;
LOG_WARN("sort error", K(ret));
}
OZ (trig_ctdef.trig_col_info_.init(expectd_col_cnt));
OZ (trig_ctdef.tg_args_.init(trigger_infos.count()));
for (int64_t i = 0; OB_SUCC(ret) && i < trigger_infos.count(); i++) {