Fix using synonyms across users cannot hit the plan cache
This commit is contained in:
parent
4ae346ef2f
commit
006fc03bf1
@ -135,6 +135,7 @@ int PCVSchemaObj::init_with_version_obj(const ObSchemaObjVersion &schema_obj_ver
|
||||
schema_type_ = schema_obj_version.get_schema_type();
|
||||
schema_id_ = schema_obj_version.object_id_;
|
||||
schema_version_ = schema_obj_version.version_;
|
||||
is_explicit_db_name_ = schema_obj_version.is_db_explicit_;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1958,12 +1959,23 @@ int ObPlanCacheValue::get_all_dep_schema(ObPlanCacheCtx &pc_ctx,
|
||||
tenant_id = get_tenant_id_by_object_id(stored_schema_objs_.at(i)->schema_id_);
|
||||
} else if (SYNONYM_SCHEMA == pcv_schema->schema_type_) {
|
||||
const ObSimpleSynonymSchema *synonym_schema = nullptr;
|
||||
if (OB_FAIL(schema_guard.get_synonym_info(
|
||||
tenant_id, database_id, pcv_schema->table_name_, synonym_schema))) {
|
||||
LOG_WARN("failed to get private synonym", K(ret));
|
||||
} else if (OB_ISNULL(synonym_schema) && OB_FAIL(schema_guard.get_synonym_info(
|
||||
tenant_id, OB_PUBLIC_SCHEMA_ID, pcv_schema->table_name_, synonym_schema))) {
|
||||
LOG_WARN("failed to get public synonym", K(ret));
|
||||
if (pcv_schema->is_explicit_db_name_) {
|
||||
if (OB_FAIL(schema_guard.get_simple_synonym_info(tenant_id, pcv_schema->schema_id_,
|
||||
synonym_schema))) {
|
||||
LOG_WARN("failed to get private synonym", K(ret));
|
||||
}
|
||||
} else {
|
||||
if (OB_FAIL(schema_guard.get_synonym_info(tenant_id, database_id,
|
||||
pcv_schema->table_name_, synonym_schema))) {
|
||||
LOG_WARN("failed to get private synonym", K(ret));
|
||||
} else if (OB_ISNULL(synonym_schema)
|
||||
&& OB_FAIL(schema_guard.get_synonym_info(tenant_id, OB_PUBLIC_SCHEMA_ID,
|
||||
pcv_schema->table_name_,
|
||||
synonym_schema))) {
|
||||
LOG_WARN("failed to get public synonym", K(ret));
|
||||
}
|
||||
}
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (OB_NOT_NULL(synonym_schema)) {
|
||||
tmp_schema_obj.database_id_ = synonym_schema->get_database_id();
|
||||
tmp_schema_obj.schema_version_ = synonym_schema->get_schema_version();
|
||||
|
@ -1451,7 +1451,7 @@ int ObShowResolver::resolve(const ParseNode &parse_tree)
|
||||
}
|
||||
|
||||
if (OB_SUCC(ret) && synonym_checker.has_synonym()) {
|
||||
if (OB_FAIL(add_synonym_obj_id(synonym_checker, false/* error_with_exist */))) {
|
||||
if (OB_FAIL(add_synonym_obj_id(synonym_checker, false/* is_db_expilicit */))) {
|
||||
LOG_WARN("add_synonym_obj_id failed", K(ret), K(synonym_checker.get_synonym_ids()));
|
||||
}
|
||||
}
|
||||
|
@ -8021,14 +8021,15 @@ int ObDMLResolver::resolve_geo_mbr_column()
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObDMLResolver::add_synonym_obj_id(const ObSynonymChecker &synonym_checker, bool error_with_exist)
|
||||
int ObDMLResolver::add_synonym_obj_id(const ObSynonymChecker &synonym_checker, bool is_db_expilicit)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (synonym_checker.has_synonym()) {
|
||||
if (OB_FAIL(add_object_versions_to_dependency(DEPENDENCY_SYNONYM,
|
||||
SYNONYM_SCHEMA,
|
||||
synonym_checker.get_synonym_ids(),
|
||||
synonym_checker.get_database_ids()))) {
|
||||
synonym_checker.get_database_ids(),
|
||||
is_db_expilicit))) {
|
||||
LOG_WARN("add synonym version failed", K(ret));
|
||||
}
|
||||
}
|
||||
@ -8140,7 +8141,8 @@ int ObDMLResolver::add_object_version_to_dependency(share::schema::ObDependencyT
|
||||
share::schema::ObSchemaType schema_type,
|
||||
uint64_t object_id,
|
||||
uint64_t database_id,
|
||||
uint64_t dep_obj_id)
|
||||
uint64_t dep_obj_id,
|
||||
bool is_db_expilicit)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_ISNULL(get_stmt()) || OB_ISNULL(schema_checker_)) {
|
||||
@ -8172,6 +8174,7 @@ int ObDMLResolver::add_object_version_to_dependency(share::schema::ObDependencyT
|
||||
obj_version.object_id_ = object_id;
|
||||
obj_version.object_type_ = table_type,
|
||||
obj_version.version_ = schema_version;
|
||||
obj_version.is_db_explicit_ = is_db_expilicit;
|
||||
uint64_t dep_db_id = database_id;
|
||||
if (OB_FAIL(get_stmt()->add_global_dependency_table(obj_version))) {
|
||||
LOG_WARN("add global dependency table failed",
|
||||
@ -8189,12 +8192,14 @@ int ObDMLResolver::add_object_version_to_dependency(share::schema::ObDependencyT
|
||||
int ObDMLResolver::add_object_versions_to_dependency(ObDependencyTableType table_type,
|
||||
ObSchemaType schema_type,
|
||||
const ObIArray<uint64_t> &object_ids,
|
||||
const ObIArray<uint64_t> &db_ids)
|
||||
const ObIArray<uint64_t> &db_ids,
|
||||
bool is_db_expilicit)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < object_ids.count(); ++i) {
|
||||
uint64_t real_dep_obj_id = (0 == i) ? view_ref_id_ : object_ids.at(i - 1);
|
||||
if (OB_FAIL(add_object_version_to_dependency(table_type, schema_type, object_ids.at(i), db_ids.at(i), real_dep_obj_id))) {
|
||||
if (OB_FAIL(add_object_version_to_dependency(table_type, schema_type, object_ids.at(i),
|
||||
db_ids.at(i), real_dep_obj_id, is_db_expilicit))) {
|
||||
LOG_WARN("add object versions to dependency failed");
|
||||
}
|
||||
}
|
||||
@ -8424,7 +8429,7 @@ int ObDMLResolver::resolve_table_relation_factor_normal(const ParseNode *node,
|
||||
// stmt还未生成,因为还未生成从虚拟表select的语句,所以stmt为NULL
|
||||
//
|
||||
if (OB_NOT_NULL(stmt)) {
|
||||
if (OB_FAIL(add_synonym_obj_id(synonym_checker, false/* error_with_exist */))) {
|
||||
if (OB_FAIL(add_synonym_obj_id(synonym_checker, is_db_explicit/* is_db_expilicit */))) {
|
||||
LOG_WARN("add_synonym_obj_id failed", K(ret));
|
||||
}
|
||||
}
|
||||
|
@ -310,11 +310,13 @@ public:
|
||||
share::schema::ObSchemaType schema_type,
|
||||
uint64_t object_id,
|
||||
uint64_t database_id,
|
||||
uint64_t dep_obj_id);
|
||||
uint64_t dep_obj_id,
|
||||
bool is_db_expilicit = false);
|
||||
int add_object_versions_to_dependency(share::schema::ObDependencyTableType table_type,
|
||||
share::schema::ObSchemaType schema_type,
|
||||
const ObIArray<uint64_t> &object_ids,
|
||||
const ObIArray<uint64_t> &db_ids);
|
||||
const ObIArray<uint64_t> &db_ids,
|
||||
bool is_db_expilicit = false);
|
||||
ObDMLStmt *get_stmt();
|
||||
void set_upper_insert_resolver(ObInsertResolver *insert_resolver) {
|
||||
upper_insert_resolver_ = insert_resolver; }
|
||||
@ -599,7 +601,7 @@ protected:
|
||||
common::ObString &table_name,
|
||||
common::ObString &database_name,
|
||||
bool is_reverse_link);
|
||||
int add_synonym_obj_id(const ObSynonymChecker &synonym_checker, bool error_with_exist);
|
||||
int add_synonym_obj_id(const ObSynonymChecker &synonym_checker, bool is_db_expilicit);
|
||||
|
||||
/*
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user