From 006fc03bf11e0617f2cd656374259b78f9958907 Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 28 Mar 2024 02:45:35 +0000 Subject: [PATCH] Fix using synonyms across users cannot hit the plan cache --- src/sql/plan_cache/ob_plan_cache_value.cpp | 24 ++++++++++++++++------ src/sql/resolver/cmd/ob_show_resolver.cpp | 2 +- src/sql/resolver/dml/ob_dml_resolver.cpp | 17 +++++++++------ src/sql/resolver/dml/ob_dml_resolver.h | 8 +++++--- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/sql/plan_cache/ob_plan_cache_value.cpp b/src/sql/plan_cache/ob_plan_cache_value.cpp index 0adc10718..662edd62f 100644 --- a/src/sql/plan_cache/ob_plan_cache_value.cpp +++ b/src/sql/plan_cache/ob_plan_cache_value.cpp @@ -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(); diff --git a/src/sql/resolver/cmd/ob_show_resolver.cpp b/src/sql/resolver/cmd/ob_show_resolver.cpp index c81c028c0..e14ec371b 100644 --- a/src/sql/resolver/cmd/ob_show_resolver.cpp +++ b/src/sql/resolver/cmd/ob_show_resolver.cpp @@ -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())); } } diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 1831a8aa4..752492f4f 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -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 &object_ids, - const ObIArray &db_ids) + const ObIArray &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)); } } diff --git a/src/sql/resolver/dml/ob_dml_resolver.h b/src/sql/resolver/dml/ob_dml_resolver.h index 6ce15dccd..1f4c09946 100644 --- a/src/sql/resolver/dml/ob_dml_resolver.h +++ b/src/sql/resolver/dml/ob_dml_resolver.h @@ -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 &object_ids, - const ObIArray &db_ids); + const ObIArray &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); /* *