Fix using synonyms across users cannot hit the plan cache

This commit is contained in:
obdev 2024-03-28 02:45:35 +00:00 committed by ob-robot
parent 4ae346ef2f
commit 006fc03bf1
4 changed files with 35 additions and 16 deletions

View File

@ -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();

View File

@ -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()));
}
}

View File

@ -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));
}
}

View File

@ -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);
/*
*