[FEAT MERGE] 4.1 PL/SQL enhence & development

This commit is contained in:
obdev
2023-01-09 08:47:31 +00:00
committed by ob-robot
parent 322032b9ca
commit 08802d94f6
98 changed files with 5260 additions and 2676 deletions

View File

@ -14309,8 +14309,11 @@ int ObDDLService::rebuild_triggers_on_hidden_table(
OX (new_trigger_info.set_tenant_id(hidden_table_schema.get_tenant_id()));
OZ (ddl_operator.drop_trigger(*trigger_info, trans,
nullptr, false/*is_update_table_schema_version*/));
OZ (ddl_operator.create_trigger(new_trigger_info, trans, error_info,
nullptr, false/*for_insert_errors*/, false/*is_update_table_schema_version*/));
if (OB_SUCC(ret)) {
ObSEArray<ObDependencyInfo, 1> dep_infos;
OZ (ddl_operator.create_trigger(new_trigger_info, trans, error_info, dep_infos,
nullptr, false/*for_insert_errors*/, false/*is_update_table_schema_version*/));
}
}
}
return ret;
@ -26865,18 +26868,21 @@ int ObDDLService::create_trigger(const ObCreateTriggerArg &arg)
{
int ret = OB_SUCCESS;
ObSchemaGetterGuard schema_guard;
ObTriggerInfo new_trigger_info = arg.trigger_info_;
ObTriggerInfo new_trigger_info;
//for_insert_errors_ is false, Indicates that the trigger is created normally
//true Indicates that the error message is inserted into the system table after the trigger is created
//So the following steps can be skipped
uint64_t tenant_id = new_trigger_info.get_tenant_id();
uint64_t tenant_id = OB_INVALID_ID;
uint64_t trigger_database_id = OB_INVALID_ID;
uint64_t base_object_id = OB_INVALID_ID;
ObSchemaType base_object_type = OB_MAX_SCHEMA;
const ObString &trigger_database = arg.trigger_database_;
const ObString &base_object_database = arg.base_object_database_;
const ObString &base_object_name = arg.base_object_name_;
if (OB_FAIL(get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
if (OB_FAIL(new_trigger_info.assign(arg.trigger_info_))) {
LOG_WARN("assign trigger_info failed", K(ret));
} else if (FALSE_IT(tenant_id = new_trigger_info.get_tenant_id())) {
} else if (OB_FAIL(get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) {
LOG_WARN("o get schema guard in inner table failed", KR(ret), K(tenant_id));
} else if (!arg.for_insert_errors_) {
const ObTriggerInfo *old_trigger_info = NULL;
@ -26904,6 +26910,7 @@ int ObDDLService::create_trigger(const ObCreateTriggerArg &arg)
if (OB_SUCC(ret) &&
OB_FAIL(create_trigger_in_trans(new_trigger_info,
const_cast<ObErrorInfo &>(arg.error_info_),
const_cast<ObSArray<ObDependencyInfo> &>(arg.dependency_infos_),
&arg.ddl_stmt_str_,
arg.for_insert_errors_,
schema_guard))) {
@ -26914,6 +26921,7 @@ int ObDDLService::create_trigger(const ObCreateTriggerArg &arg)
int ObDDLService::create_trigger_in_trans(ObTriggerInfo &trigger_info,
ObErrorInfo &error_info,
ObIArray<ObDependencyInfo> &dep_infos,
const ObString *ddl_stmt_str,
bool for_insert_errors,
share::schema::ObSchemaGetterGuard &schema_guard)
@ -26927,7 +26935,7 @@ int ObDDLService::create_trigger_in_trans(ObTriggerInfo &trigger_info,
LOG_WARN("failed to get tenant schema version", KR(ret), K(tenant_id));
} else if (OB_FAIL(trans.start(sql_proxy_, tenant_id, refreshed_schema_version))) {
LOG_WARN("start transaction failed", KR(ret), K(tenant_id), K(refreshed_schema_version));
} else if (OB_FAIL(ddl_operator.create_trigger(trigger_info, trans, error_info,
} else if (OB_FAIL(ddl_operator.create_trigger(trigger_info, trans, error_info, dep_infos,
ddl_stmt_str, for_insert_errors))) {
LOG_WARN("create trigger failed", K(ret), K(trigger_info));
}
@ -27047,12 +27055,27 @@ int ObDDLService::alter_trigger(const ObAlterTriggerArg &arg)
OZ (trans.start(sql_proxy_, tenant_id, refreshed_schema_version), refreshed_schema_version);
for (int64_t i = 0; OB_SUCC(ret) && i < arg.trigger_infos_.count(); ++i) {
const ObTriggerInfo *old_tg_info = NULL;
ObTriggerInfo new_tg_info = arg.trigger_infos_.at(i);
ObTriggerInfo new_tg_info;
OZ (new_tg_info.assign(arg.trigger_infos_.at(i)));
OZ (schema_guard.get_trigger_info(tenant_id, new_tg_info.get_trigger_id(), old_tg_info));
CK (OB_NOT_NULL(old_tg_info), OB_ERR_TRIGGER_NOT_EXIST);
OZ (new_tg_info.deep_copy(*old_tg_info));
OX (new_tg_info.set_is_enable(is_enable));
OZ (ddl_operator.alter_trigger(new_tg_info, trans, &arg.ddl_stmt_str_));
if (OB_SUCC(ret)) {
if (!arg.is_set_status_) {
const ObTriggerInfo *other_trg_info = NULL;
ObString new_trg_name = new_tg_info.get_trigger_name();
ObString new_trg_body = new_tg_info.get_trigger_body();
OZ (schema_guard.get_trigger_info(new_tg_info.get_tenant_id(), new_tg_info.get_database_id(),
new_trg_name, other_trg_info));
OV (OB_ISNULL(other_trg_info), OB_OBJ_ALREADY_EXIST, new_tg_info);
OZ (new_tg_info.deep_copy(*old_tg_info));
OZ (new_tg_info.set_trigger_name(new_trg_name));
OZ (new_tg_info.set_trigger_body(new_trg_body));
} else {
OZ (new_tg_info.deep_copy(*old_tg_info));
OX (new_tg_info.set_is_enable(is_enable));
}
OZ (ddl_operator.alter_trigger(new_tg_info, trans, &arg.ddl_stmt_str_));
}
}
if (trans.is_started()) {
int temp_ret = OB_SUCCESS;
@ -27166,16 +27189,15 @@ int ObDDLService::create_trigger_for_truncate_table(ObSchemaGetterGuard &schema_
new_trigger_info.set_trigger_id(new_trigger_id);
new_trigger_info.set_base_object_id(new_table_schema.get_table_id());
new_table_schema.get_trigger_list().push_back(new_trigger_id);
OZ (ObTriggerInfo::gen_package_source(new_trigger_info, db_schema->get_database_name(),
new_table_schema.get_table_name(),
spec_source, body_source, inner_alloc));
if (OB_SUCC(ret) && OB_FAIL(ddl_operator
.create_trigger(new_trigger_info, trans, error_info,
&origin_trigger_info->get_trigger_body(),
false, /* for_insert_error */
is_update_table_schema_version,
true))) {
LOG_WARN("failed to create trigger for truncate table", K(ret));
if (OB_SUCC(ret)) {
ObSEArray<ObDependencyInfo, 1> dep_infos;
if (OB_FAIL(ddl_operator.create_trigger(new_trigger_info, trans, error_info, dep_infos,
&origin_trigger_info->get_trigger_body(),
false, /* for_insert_error */
is_update_table_schema_version,
true))) {
LOG_WARN("failed to create trigger for truncate table", K(ret));
}
}
}
}