to issue<51026002>:fix synonym linked pl issue
This commit is contained in:
@ -1392,6 +1392,7 @@ int ObResolverUtils::resolve_synonym_object_recursively(ObSchemaChecker &schema_
|
|||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
uint64_t synonym_id = OB_INVALID_ID;
|
uint64_t synonym_id = OB_INVALID_ID;
|
||||||
bool exist_with_synonym = false;
|
bool exist_with_synonym = false;
|
||||||
|
bool exist_non_syn_object = false;
|
||||||
if (OB_FAIL(schema_checker.get_synonym_schema(
|
if (OB_FAIL(schema_checker.get_synonym_schema(
|
||||||
tenant_id, database_id, synonym_name, object_database_id,
|
tenant_id, database_id, synonym_name, object_database_id,
|
||||||
synonym_id, object_name, exist_with_synonym, search_public_schema))) {
|
synonym_id, object_name, exist_with_synonym, search_public_schema))) {
|
||||||
@ -1406,7 +1407,10 @@ int ObResolverUtils::resolve_synonym_object_recursively(ObSchemaChecker &schema_
|
|||||||
LOG_WARN("failed to add synonym id to synonym checker",
|
LOG_WARN("failed to add synonym id to synonym checker",
|
||||||
K(ret), K(tenant_id), K(database_id), K(synonym_name));
|
K(ret), K(tenant_id), K(database_id), K(synonym_name));
|
||||||
}
|
}
|
||||||
} else {
|
} else if (OB_FAIL(schema_checker.check_exist_same_name_object_with_synonym(tenant_id,
|
||||||
|
database_id,
|
||||||
|
object_name,
|
||||||
|
exist_non_syn_object)) || !exist_non_syn_object) {
|
||||||
OZ (SMART_CALL(resolve_synonym_object_recursively(
|
OZ (SMART_CALL(resolve_synonym_object_recursively(
|
||||||
schema_checker, synonym_checker, tenant_id,
|
schema_checker, synonym_checker, tenant_id,
|
||||||
object_database_id, object_name, object_database_id, object_name, exist_with_synonym,
|
object_database_id, object_name, object_database_id, object_name, exist_with_synonym,
|
||||||
|
|||||||
@ -2364,6 +2364,102 @@ int ObSchemaChecker::get_object_type_with_view_info(ObIAllocator* allocator,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ObSchemaChecker::check_exist_same_name_object_with_synonym(const uint64_t tenant_id,
|
||||||
|
uint64_t database_id,
|
||||||
|
const common::ObString &object_name,
|
||||||
|
bool &exist)
|
||||||
|
{
|
||||||
|
int ret = OB_SUCCESS;
|
||||||
|
exist = false;
|
||||||
|
common::ObString database_name;
|
||||||
|
const ObDatabaseSchema *db_schema = NULL;
|
||||||
|
const share::schema::ObTableSchema *table_schema = NULL;
|
||||||
|
if (OB_FAIL(get_database_schema(tenant_id, database_id, db_schema))) {
|
||||||
|
LOG_WARN("fail to get db schema", K(ret));
|
||||||
|
} else if (OB_NOT_NULL(db_schema)) {
|
||||||
|
database_name = db_schema->get_database_name();
|
||||||
|
ret = get_table_schema(tenant_id, database_name, object_name, false, table_schema);
|
||||||
|
if (OB_TABLE_NOT_EXIST == ret) {
|
||||||
|
if (lib::is_oracle_mode()) {
|
||||||
|
ret = get_idx_schema_by_origin_idx_name(tenant_id, database_id, object_name, table_schema);
|
||||||
|
if (OB_SUCC(ret)) {
|
||||||
|
if (table_schema == NULL) {
|
||||||
|
ret = OB_TABLE_NOT_EXIST;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (OB_SUCC(ret) && OB_NOT_NULL(table_schema)) {
|
||||||
|
exist = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//check sequence
|
||||||
|
if (OB_TABLE_NOT_EXIST == ret) {
|
||||||
|
uint64_t sequence_id = 0;
|
||||||
|
if (OB_FAIL(get_sequence_id(tenant_id, database_name, object_name, sequence_id))) {
|
||||||
|
if (OB_ERR_SEQ_NOT_EXIST == ret) {
|
||||||
|
ret = OB_TABLE_NOT_EXIST;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
exist = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//check procedure/function
|
||||||
|
if (OB_TABLE_NOT_EXIST == ret) {
|
||||||
|
uint64_t routine_id = 0;
|
||||||
|
bool is_proc = false;
|
||||||
|
if (OB_FAIL(get_routine_id(tenant_id, database_name, object_name, routine_id, is_proc))) {
|
||||||
|
if (OB_ERR_SP_DOES_NOT_EXIST == ret) {
|
||||||
|
ret = OB_TABLE_NOT_EXIST;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
exist = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//check package
|
||||||
|
if (OB_TABLE_NOT_EXIST == ret) {
|
||||||
|
uint64_t package_id = 0;
|
||||||
|
int64_t compatible_mode = lib::is_oracle_mode() ? COMPATIBLE_ORACLE_MODE
|
||||||
|
: COMPATIBLE_MYSQL_MODE;
|
||||||
|
if (OB_FAIL(get_package_id(tenant_id, database_name, object_name,
|
||||||
|
compatible_mode, package_id))) {
|
||||||
|
if (OB_ERR_PACKAGE_DOSE_NOT_EXIST == ret) {
|
||||||
|
if (OB_FAIL(get_package_id(OB_SYS_TENANT_ID,
|
||||||
|
OB_SYS_DATABASE_ID,
|
||||||
|
object_name,
|
||||||
|
compatible_mode,
|
||||||
|
package_id))) {
|
||||||
|
if (OB_ERR_PACKAGE_DOSE_NOT_EXIST == ret) {
|
||||||
|
ret = OB_TABLE_NOT_EXIST;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
exist = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
exist = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//check type
|
||||||
|
if (OB_TABLE_NOT_EXIST == ret) {
|
||||||
|
uint64_t udt_id = 0;
|
||||||
|
if (OB_FAIL(get_udt_id(tenant_id, database_name, object_name, udt_id))) {
|
||||||
|
if (OB_ERR_SP_DOES_NOT_EXIST == ret) {
|
||||||
|
ret = OB_TABLE_NOT_EXIST;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
exist = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (OB_TABLE_NOT_EXIST == ret) {
|
||||||
|
ret = OB_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int ObSchemaChecker::get_object_type(const uint64_t tenant_id,
|
int ObSchemaChecker::get_object_type(const uint64_t tenant_id,
|
||||||
const common::ObString &database_name,
|
const common::ObString &database_name,
|
||||||
const common::ObString &table_name,
|
const common::ObString &table_name,
|
||||||
|
|||||||
@ -417,6 +417,10 @@ public:
|
|||||||
int get_profile_id(const uint64_t tenant_id,
|
int get_profile_id(const uint64_t tenant_id,
|
||||||
const common::ObString &profile_name,
|
const common::ObString &profile_name,
|
||||||
uint64_t &profile_id);
|
uint64_t &profile_id);
|
||||||
|
int check_exist_same_name_object_with_synonym(const uint64_t tenant_id,
|
||||||
|
uint64_t database_id,
|
||||||
|
const common::ObString &object_name,
|
||||||
|
bool &exist);
|
||||||
int get_object_type(const uint64_t tenant_id,
|
int get_object_type(const uint64_t tenant_id,
|
||||||
const common::ObString &database_name,
|
const common::ObString &database_name,
|
||||||
const common::ObString &table_name,
|
const common::ObString &table_name,
|
||||||
|
|||||||
Reference in New Issue
Block a user