From dbbba36ba506c44baa90feabf3857ced3de87c78 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 14 Feb 2023 12:16:36 +0100 Subject: [PATCH 1/2] Refactor "is visible" functions --- contrib/dblink/dblink.c | 2 +- src/backend/catalog/namespace.c | 545 ++-------------------------- src/backend/catalog/objectaddress.c | 14 +- src/backend/utils/adt/format_type.c | 2 +- src/backend/utils/adt/regproc.c | 6 +- src/backend/utils/adt/ruleutils.c | 2 +- src/include/catalog/namespace.h | 12 +- 7 files changed, 50 insertions(+), 533 deletions(-) diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index 78a8bcee6e..3f345ea540 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -2491,7 +2491,7 @@ generate_relation_name(Relation rel) char *result; /* Qualify the name if not visible in search path */ - if (RelationIsVisible(RelationGetRelid(rel))) + if (ObjectIsVisible(RelationRelationId, RelationGetRelid(rel))) nspname = NULL; else nspname = get_namespace_name(rel->rd_rel->relnamespace); diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index 14e57adee2..6179c3f678 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -701,71 +701,6 @@ RelnameGetRelid(const char *relname) } -/* - * RelationIsVisible - * Determine whether a relation (identified by OID) is visible in the - * current search path. Visible means "would be found by searching - * for the unqualified relation name". - */ -bool -RelationIsVisible(Oid relid) -{ - HeapTuple reltup; - Form_pg_class relform; - Oid relnamespace; - bool visible; - - reltup = SearchSysCache1(RELOID, ObjectIdGetDatum(relid)); - if (!HeapTupleIsValid(reltup)) - elog(ERROR, "cache lookup failed for relation %u", relid); - relform = (Form_pg_class) GETSTRUCT(reltup); - - recomputeNamespacePath(); - - /* - * Quick check: if it ain't in the path at all, it ain't visible. Items in - * the system namespace are surely in the path and so we needn't even do - * list_member_oid() for them. - */ - relnamespace = relform->relnamespace; - if (relnamespace != PG_CATALOG_NAMESPACE && - !list_member_oid(activeSearchPath, relnamespace)) - visible = false; - else - { - /* - * If it is in the path, it might still not be visible; it could be - * hidden by another relation of the same name earlier in the path. So - * we must do a slow check for conflicting relations. - */ - char *relname = NameStr(relform->relname); - ListCell *l; - - visible = false; - foreach(l, activeSearchPath) - { - Oid namespaceId = lfirst_oid(l); - - if (namespaceId == relnamespace) - { - /* Found it first in path */ - visible = true; - break; - } - if (OidIsValid(get_relname_relid(relname, namespaceId))) - { - /* Found something else first in path */ - break; - } - } - } - - ReleaseSysCache(reltup); - - return visible; -} - - /* * TypenameGetTypid * Wrapper for binary compatibility. @@ -809,72 +744,6 @@ TypenameGetTypidExtended(const char *typname, bool temp_ok) return InvalidOid; } -/* - * TypeIsVisible - * Determine whether a type (identified by OID) is visible in the - * current search path. Visible means "would be found by searching - * for the unqualified type name". - */ -bool -TypeIsVisible(Oid typid) -{ - HeapTuple typtup; - Form_pg_type typform; - Oid typnamespace; - bool visible; - - typtup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid)); - if (!HeapTupleIsValid(typtup)) - elog(ERROR, "cache lookup failed for type %u", typid); - typform = (Form_pg_type) GETSTRUCT(typtup); - - recomputeNamespacePath(); - - /* - * Quick check: if it ain't in the path at all, it ain't visible. Items in - * the system namespace are surely in the path and so we needn't even do - * list_member_oid() for them. - */ - typnamespace = typform->typnamespace; - if (typnamespace != PG_CATALOG_NAMESPACE && - !list_member_oid(activeSearchPath, typnamespace)) - visible = false; - else - { - /* - * If it is in the path, it might still not be visible; it could be - * hidden by another type of the same name earlier in the path. So we - * must do a slow check for conflicting types. - */ - char *typname = NameStr(typform->typname); - ListCell *l; - - visible = false; - foreach(l, activeSearchPath) - { - Oid namespaceId = lfirst_oid(l); - - if (namespaceId == typnamespace) - { - /* Found it first in path */ - visible = true; - break; - } - if (SearchSysCacheExists2(TYPENAMENSP, - PointerGetDatum(typname), - ObjectIdGetDatum(namespaceId))) - { - /* Found something else first in path */ - break; - } - } - } - - ReleaseSysCache(typtup); - - return visible; -} - /* * FuncnameGetCandidates @@ -2130,88 +1999,6 @@ CollationIsVisible(Oid collid) return visible; } - -/* - * ConversionGetConid - * Try to resolve an unqualified conversion name. - * Returns OID if conversion found in search path, else InvalidOid. - * - * This is essentially the same as RelnameGetRelid. - */ -Oid -ConversionGetConid(const char *conname) -{ - Oid conid; - ListCell *l; - - recomputeNamespacePath(); - - foreach(l, activeSearchPath) - { - Oid namespaceId = lfirst_oid(l); - - if (namespaceId == myTempNamespace) - continue; /* do not look in temp namespace */ - - conid = GetSysCacheOid2(CONNAMENSP, Anum_pg_conversion_oid, - PointerGetDatum(conname), - ObjectIdGetDatum(namespaceId)); - if (OidIsValid(conid)) - return conid; - } - - /* Not found in path */ - return InvalidOid; -} - -/* - * ConversionIsVisible - * Determine whether a conversion (identified by OID) is visible in the - * current search path. Visible means "would be found by searching - * for the unqualified conversion name". - */ -bool -ConversionIsVisible(Oid conid) -{ - HeapTuple contup; - Form_pg_conversion conform; - Oid connamespace; - bool visible; - - contup = SearchSysCache1(CONVOID, ObjectIdGetDatum(conid)); - if (!HeapTupleIsValid(contup)) - elog(ERROR, "cache lookup failed for conversion %u", conid); - conform = (Form_pg_conversion) GETSTRUCT(contup); - - recomputeNamespacePath(); - - /* - * Quick check: if it ain't in the path at all, it ain't visible. Items in - * the system namespace are surely in the path and so we needn't even do - * list_member_oid() for them. - */ - connamespace = conform->connamespace; - if (connamespace != PG_CATALOG_NAMESPACE && - !list_member_oid(activeSearchPath, connamespace)) - visible = false; - else - { - /* - * If it is in the path, it might still not be visible; it could be - * hidden by another conversion of the same name earlier in the path. - * So we must do a slow check to see if this conversion would be found - * by ConversionGetConid. - */ - char *conname = NameStr(conform->conname); - - visible = (ConversionGetConid(conname) == conid); - } - - ReleaseSysCache(contup); - - return visible; -} - /* * get_statistics_object_oid - find a statistics object by possibly qualified name * @@ -2268,72 +2055,6 @@ get_statistics_object_oid(List *names, bool missing_ok) return stats_oid; } -/* - * StatisticsObjIsVisible - * Determine whether a statistics object (identified by OID) is visible in - * the current search path. Visible means "would be found by searching - * for the unqualified statistics object name". - */ -bool -StatisticsObjIsVisible(Oid relid) -{ - HeapTuple stxtup; - Form_pg_statistic_ext stxform; - Oid stxnamespace; - bool visible; - - stxtup = SearchSysCache1(STATEXTOID, ObjectIdGetDatum(relid)); - if (!HeapTupleIsValid(stxtup)) - elog(ERROR, "cache lookup failed for statistics object %u", relid); - stxform = (Form_pg_statistic_ext) GETSTRUCT(stxtup); - - recomputeNamespacePath(); - - /* - * Quick check: if it ain't in the path at all, it ain't visible. Items in - * the system namespace are surely in the path and so we needn't even do - * list_member_oid() for them. - */ - stxnamespace = stxform->stxnamespace; - if (stxnamespace != PG_CATALOG_NAMESPACE && - !list_member_oid(activeSearchPath, stxnamespace)) - visible = false; - else - { - /* - * If it is in the path, it might still not be visible; it could be - * hidden by another statistics object of the same name earlier in the - * path. So we must do a slow check for conflicting objects. - */ - char *stxname = NameStr(stxform->stxname); - ListCell *l; - - visible = false; - foreach(l, activeSearchPath) - { - Oid namespaceId = lfirst_oid(l); - - if (namespaceId == stxnamespace) - { - /* Found it first in path */ - visible = true; - break; - } - if (SearchSysCacheExists2(STATEXTNAMENSP, - PointerGetDatum(stxname), - ObjectIdGetDatum(namespaceId))) - { - /* Found something else first in path */ - break; - } - } - } - - ReleaseSysCache(stxtup); - - return visible; -} - /* * get_ts_parser_oid - find a TS parser by possibly qualified name * @@ -2391,75 +2112,6 @@ get_ts_parser_oid(List *names, bool missing_ok) return prsoid; } -/* - * TSParserIsVisible - * Determine whether a parser (identified by OID) is visible in the - * current search path. Visible means "would be found by searching - * for the unqualified parser name". - */ -bool -TSParserIsVisible(Oid prsId) -{ - HeapTuple tup; - Form_pg_ts_parser form; - Oid namespace; - bool visible; - - tup = SearchSysCache1(TSPARSEROID, ObjectIdGetDatum(prsId)); - if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for text search parser %u", prsId); - form = (Form_pg_ts_parser) GETSTRUCT(tup); - - recomputeNamespacePath(); - - /* - * Quick check: if it ain't in the path at all, it ain't visible. Items in - * the system namespace are surely in the path and so we needn't even do - * list_member_oid() for them. - */ - namespace = form->prsnamespace; - if (namespace != PG_CATALOG_NAMESPACE && - !list_member_oid(activeSearchPath, namespace)) - visible = false; - else - { - /* - * If it is in the path, it might still not be visible; it could be - * hidden by another parser of the same name earlier in the path. So - * we must do a slow check for conflicting parsers. - */ - char *name = NameStr(form->prsname); - ListCell *l; - - visible = false; - foreach(l, activeSearchPath) - { - Oid namespaceId = lfirst_oid(l); - - if (namespaceId == myTempNamespace) - continue; /* do not look in temp namespace */ - - if (namespaceId == namespace) - { - /* Found it first in path */ - visible = true; - break; - } - if (SearchSysCacheExists2(TSPARSERNAMENSP, - PointerGetDatum(name), - ObjectIdGetDatum(namespaceId))) - { - /* Found something else first in path */ - break; - } - } - } - - ReleaseSysCache(tup); - - return visible; -} - /* * get_ts_dict_oid - find a TS dictionary by possibly qualified name * @@ -2517,76 +2169,6 @@ get_ts_dict_oid(List *names, bool missing_ok) return dictoid; } -/* - * TSDictionaryIsVisible - * Determine whether a dictionary (identified by OID) is visible in the - * current search path. Visible means "would be found by searching - * for the unqualified dictionary name". - */ -bool -TSDictionaryIsVisible(Oid dictId) -{ - HeapTuple tup; - Form_pg_ts_dict form; - Oid namespace; - bool visible; - - tup = SearchSysCache1(TSDICTOID, ObjectIdGetDatum(dictId)); - if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for text search dictionary %u", - dictId); - form = (Form_pg_ts_dict) GETSTRUCT(tup); - - recomputeNamespacePath(); - - /* - * Quick check: if it ain't in the path at all, it ain't visible. Items in - * the system namespace are surely in the path and so we needn't even do - * list_member_oid() for them. - */ - namespace = form->dictnamespace; - if (namespace != PG_CATALOG_NAMESPACE && - !list_member_oid(activeSearchPath, namespace)) - visible = false; - else - { - /* - * If it is in the path, it might still not be visible; it could be - * hidden by another dictionary of the same name earlier in the path. - * So we must do a slow check for conflicting dictionaries. - */ - char *name = NameStr(form->dictname); - ListCell *l; - - visible = false; - foreach(l, activeSearchPath) - { - Oid namespaceId = lfirst_oid(l); - - if (namespaceId == myTempNamespace) - continue; /* do not look in temp namespace */ - - if (namespaceId == namespace) - { - /* Found it first in path */ - visible = true; - break; - } - if (SearchSysCacheExists2(TSDICTNAMENSP, - PointerGetDatum(name), - ObjectIdGetDatum(namespaceId))) - { - /* Found something else first in path */ - break; - } - } - } - - ReleaseSysCache(tup); - - return visible; -} - /* * get_ts_template_oid - find a TS template by possibly qualified name * @@ -2644,75 +2226,6 @@ get_ts_template_oid(List *names, bool missing_ok) return tmploid; } -/* - * TSTemplateIsVisible - * Determine whether a template (identified by OID) is visible in the - * current search path. Visible means "would be found by searching - * for the unqualified template name". - */ -bool -TSTemplateIsVisible(Oid tmplId) -{ - HeapTuple tup; - Form_pg_ts_template form; - Oid namespace; - bool visible; - - tup = SearchSysCache1(TSTEMPLATEOID, ObjectIdGetDatum(tmplId)); - if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for text search template %u", tmplId); - form = (Form_pg_ts_template) GETSTRUCT(tup); - - recomputeNamespacePath(); - - /* - * Quick check: if it ain't in the path at all, it ain't visible. Items in - * the system namespace are surely in the path and so we needn't even do - * list_member_oid() for them. - */ - namespace = form->tmplnamespace; - if (namespace != PG_CATALOG_NAMESPACE && - !list_member_oid(activeSearchPath, namespace)) - visible = false; - else - { - /* - * If it is in the path, it might still not be visible; it could be - * hidden by another template of the same name earlier in the path. So - * we must do a slow check for conflicting templates. - */ - char *name = NameStr(form->tmplname); - ListCell *l; - - visible = false; - foreach(l, activeSearchPath) - { - Oid namespaceId = lfirst_oid(l); - - if (namespaceId == myTempNamespace) - continue; /* do not look in temp namespace */ - - if (namespaceId == namespace) - { - /* Found it first in path */ - visible = true; - break; - } - if (SearchSysCacheExists2(TSTEMPLATENAMENSP, - PointerGetDatum(name), - ObjectIdGetDatum(namespaceId))) - { - /* Found something else first in path */ - break; - } - } - } - - ReleaseSysCache(tup); - - return visible; -} - /* * get_ts_config_oid - find a TS config by possibly qualified name * @@ -2770,25 +2283,25 @@ get_ts_config_oid(List *names, bool missing_ok) return cfgoid; } + /* - * TSConfigIsVisible - * Determine whether a text search configuration (identified by OID) + * ObjectIsVisible + * Determine whether an object (identified by class ID and OID) * is visible in the current search path. Visible means "would be found - * by searching for the unqualified text search configuration name". + * by searching for the unqualified object name". */ bool -TSConfigIsVisible(Oid cfgid) +ObjectIsVisible(Oid classid, Oid objectid) { + int oid_cacheid = get_object_catcache_oid(classid); HeapTuple tup; - Form_pg_ts_config form; + bool isnull; Oid namespace; bool visible; - tup = SearchSysCache1(TSCONFIGOID, ObjectIdGetDatum(cfgid)); + tup = SearchSysCache1(oid_cacheid, ObjectIdGetDatum(objectid)); if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for text search configuration %u", - cfgid); - form = (Form_pg_ts_config) GETSTRUCT(tup); + elog(ERROR, "cache lookup failed for %s %u", get_object_class_descr(classid), objectid); recomputeNamespacePath(); @@ -2797,7 +2310,11 @@ TSConfigIsVisible(Oid cfgid) * the system namespace are surely in the path and so we needn't even do * list_member_oid() for them. */ - namespace = form->cfgnamespace; + namespace = DatumGetObjectId(SysCacheGetAttr(oid_cacheid, + tup, + get_object_attnum_namespace(classid), + &isnull)); + Assert(!isnull); if (namespace != PG_CATALOG_NAMESPACE && !list_member_oid(activeSearchPath, namespace)) visible = false; @@ -2808,16 +2325,24 @@ TSConfigIsVisible(Oid cfgid) * hidden by another configuration of the same name earlier in the * path. So we must do a slow check for conflicting configurations. */ - char *name = NameStr(form->cfgname); + Datum name_datum; ListCell *l; + name_datum = SysCacheGetAttr(oid_cacheid, tup, get_object_attnum_name(classid), &isnull); + Assert(!isnull); + visible = false; foreach(l, activeSearchPath) { Oid namespaceId = lfirst_oid(l); - if (namespaceId == myTempNamespace) - continue; /* do not look in temp namespace */ + /* + * Do not look in temp namespace for object types that don't + * support temporary objects + */ + if (!(classid == RelationRelationId || classid == TypeRelationId) && + namespaceId == myTempNamespace) + continue; if (namespaceId == namespace) { @@ -2825,8 +2350,8 @@ TSConfigIsVisible(Oid cfgid) visible = true; break; } - if (SearchSysCacheExists2(TSCONFIGNAMENSP, - PointerGetDatum(name), + if (SearchSysCacheExists2(get_object_catcache_name(classid), + name_datum, ObjectIdGetDatum(namespaceId))) { /* Found something else first in path */ @@ -4509,7 +4034,7 @@ pg_table_is_visible(PG_FUNCTION_ARGS) if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(oid))) PG_RETURN_NULL(); - PG_RETURN_BOOL(RelationIsVisible(oid)); + PG_RETURN_BOOL(ObjectIsVisible(RelationRelationId, oid)); } Datum @@ -4520,7 +4045,7 @@ pg_type_is_visible(PG_FUNCTION_ARGS) if (!SearchSysCacheExists1(TYPEOID, ObjectIdGetDatum(oid))) PG_RETURN_NULL(); - PG_RETURN_BOOL(TypeIsVisible(oid)); + PG_RETURN_BOOL(ObjectIsVisible(TypeRelationId, oid)); } Datum @@ -4586,7 +4111,7 @@ pg_conversion_is_visible(PG_FUNCTION_ARGS) if (!SearchSysCacheExists1(CONVOID, ObjectIdGetDatum(oid))) PG_RETURN_NULL(); - PG_RETURN_BOOL(ConversionIsVisible(oid)); + PG_RETURN_BOOL(ObjectIsVisible(ConversionRelationId, oid)); } Datum @@ -4597,7 +4122,7 @@ pg_statistics_obj_is_visible(PG_FUNCTION_ARGS) if (!SearchSysCacheExists1(STATEXTOID, ObjectIdGetDatum(oid))) PG_RETURN_NULL(); - PG_RETURN_BOOL(StatisticsObjIsVisible(oid)); + PG_RETURN_BOOL(ObjectIsVisible(StatisticExtRelationId, oid)); } Datum @@ -4608,7 +4133,7 @@ pg_ts_parser_is_visible(PG_FUNCTION_ARGS) if (!SearchSysCacheExists1(TSPARSEROID, ObjectIdGetDatum(oid))) PG_RETURN_NULL(); - PG_RETURN_BOOL(TSParserIsVisible(oid)); + PG_RETURN_BOOL(ObjectIsVisible(TSParserRelationId, oid)); } Datum @@ -4619,7 +4144,7 @@ pg_ts_dict_is_visible(PG_FUNCTION_ARGS) if (!SearchSysCacheExists1(TSDICTOID, ObjectIdGetDatum(oid))) PG_RETURN_NULL(); - PG_RETURN_BOOL(TSDictionaryIsVisible(oid)); + PG_RETURN_BOOL(ObjectIsVisible(TSDictionaryRelationId, oid)); } Datum @@ -4630,7 +4155,7 @@ pg_ts_template_is_visible(PG_FUNCTION_ARGS) if (!SearchSysCacheExists1(TSTEMPLATEOID, ObjectIdGetDatum(oid))) PG_RETURN_NULL(); - PG_RETURN_BOOL(TSTemplateIsVisible(oid)); + PG_RETURN_BOOL(ObjectIsVisible(TSTemplateRelationId, oid)); } Datum @@ -4641,7 +4166,7 @@ pg_ts_config_is_visible(PG_FUNCTION_ARGS) if (!SearchSysCacheExists1(TSCONFIGOID, ObjectIdGetDatum(oid))) PG_RETURN_NULL(); - PG_RETURN_BOOL(TSConfigIsVisible(oid)); + PG_RETURN_BOOL(ObjectIsVisible(TSConfigRelationId, oid)); } Datum diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index 2f688166e1..15ba7ee316 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -3097,7 +3097,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) conv = (Form_pg_conversion) GETSTRUCT(conTup); /* Qualify the name if not visible in search path */ - if (ConversionIsVisible(object->objectId)) + if (ObjectIsVisible(ConversionRelationId, object->objectId)) nspname = NULL; else nspname = get_namespace_name(conv->connamespace); @@ -3468,7 +3468,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) stxForm = (Form_pg_statistic_ext) GETSTRUCT(stxTup); /* Qualify the name if not visible in search path */ - if (StatisticsObjIsVisible(object->objectId)) + if (ObjectIsVisible(StatisticExtRelationId, object->objectId)) nspname = NULL; else nspname = get_namespace_name(stxForm->stxnamespace); @@ -3499,7 +3499,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) prsForm = (Form_pg_ts_parser) GETSTRUCT(tup); /* Qualify the name if not visible in search path */ - if (TSParserIsVisible(object->objectId)) + if (ObjectIsVisible(TSParserRelationId, object->objectId)) nspname = NULL; else nspname = get_namespace_name(prsForm->prsnamespace); @@ -3530,7 +3530,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) dictForm = (Form_pg_ts_dict) GETSTRUCT(tup); /* Qualify the name if not visible in search path */ - if (TSDictionaryIsVisible(object->objectId)) + if (ObjectIsVisible(TSDictionaryRelationId, object->objectId)) nspname = NULL; else nspname = get_namespace_name(dictForm->dictnamespace); @@ -3561,7 +3561,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) tmplForm = (Form_pg_ts_template) GETSTRUCT(tup); /* Qualify the name if not visible in search path */ - if (TSTemplateIsVisible(object->objectId)) + if (ObjectIsVisible(TSTemplateRelationId, object->objectId)) nspname = NULL; else nspname = get_namespace_name(tmplForm->tmplnamespace); @@ -3592,7 +3592,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) cfgForm = (Form_pg_ts_config) GETSTRUCT(tup); /* Qualify the name if not visible in search path */ - if (TSConfigIsVisible(object->objectId)) + if (ObjectIsVisible(TSConfigRelationId, object->objectId)) nspname = NULL; else nspname = get_namespace_name(cfgForm->cfgnamespace); @@ -4102,7 +4102,7 @@ getRelationDescription(StringInfo buffer, Oid relid, bool missing_ok) relForm = (Form_pg_class) GETSTRUCT(relTup); /* Qualify the name if not visible in search path */ - if (RelationIsVisible(relid)) + if (ObjectIsVisible(RelationRelationId, relid)) nspname = NULL; else nspname = get_namespace_name(relForm->relnamespace); diff --git a/src/backend/utils/adt/format_type.c b/src/backend/utils/adt/format_type.c index 12402a0637..1e880d4dec 100644 --- a/src/backend/utils/adt/format_type.c +++ b/src/backend/utils/adt/format_type.c @@ -308,7 +308,7 @@ format_type_extended(Oid type_oid, int32 typemod, bits16 flags) char *typname; if ((flags & FORMAT_TYPE_FORCE_QUALIFY) == 0 && - TypeIsVisible(type_oid)) + ObjectIsVisible(TypeRelationId, type_oid)) nspname = NULL; else nspname = get_namespace_name_or_temp(typeform->typnamespace); diff --git a/src/backend/utils/adt/regproc.c b/src/backend/utils/adt/regproc.c index 296930eb3b..4e65dfe10a 100644 --- a/src/backend/utils/adt/regproc.c +++ b/src/backend/utils/adt/regproc.c @@ -973,7 +973,7 @@ regclassout(PG_FUNCTION_ARGS) /* * Would this class be found by regclassin? If not, qualify it. */ - if (RelationIsVisible(classid)) + if (ObjectIsVisible(RelationRelationId, classid)) nspname = NULL; else nspname = get_namespace_name(classform->relnamespace); @@ -1359,7 +1359,7 @@ regconfigout(PG_FUNCTION_ARGS) /* * Would this config be found by regconfigin? If not, qualify it. */ - if (TSConfigIsVisible(cfgid)) + if (ObjectIsVisible(TSConfigRelationId, cfgid)) nspname = NULL; else nspname = get_namespace_name(cfgform->cfgnamespace); @@ -1470,7 +1470,7 @@ regdictionaryout(PG_FUNCTION_ARGS) * Would this dictionary be found by regdictionaryin? If not, qualify * it. */ - if (TSDictionaryIsVisible(dictid)) + if (ObjectIsVisible(TSDictionaryRelationId, dictid)) nspname = NULL; else nspname = get_namespace_name(dictform->dictnamespace); diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 9ac42efdbc..3ad0f45454 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -11689,7 +11689,7 @@ generate_relation_name(Oid relid, List *namespaces) /* Otherwise, qualify the name if not visible in search path */ if (!need_qual) - need_qual = !RelationIsVisible(relid); + need_qual = !ObjectIsVisible(RelationRelationId, relid); if (need_qual) nspname = get_namespace_name_or_temp(reltup->relnamespace); diff --git a/src/include/catalog/namespace.h b/src/include/catalog/namespace.h index f64a0ec26b..eb23b35e4b 100644 --- a/src/include/catalog/namespace.h +++ b/src/include/catalog/namespace.h @@ -90,11 +90,9 @@ extern Oid RangeVarGetAndCheckCreationNamespace(RangeVar *relation, Oid *existing_relation_id); extern void RangeVarAdjustRelationPersistence(RangeVar *newRelation, Oid nspid); extern Oid RelnameGetRelid(const char *relname); -extern bool RelationIsVisible(Oid relid); extern Oid TypenameGetTypid(const char *typname); extern Oid TypenameGetTypidExtended(const char *typname, bool temp_ok); -extern bool TypeIsVisible(Oid typid); extern FuncCandidateList FuncnameGetCandidates(List *names, int nargs, List *argnames, @@ -118,23 +116,17 @@ extern bool OpfamilyIsVisible(Oid opfid); extern Oid CollationGetCollid(const char *collname); extern bool CollationIsVisible(Oid collid); -extern Oid ConversionGetConid(const char *conname); -extern bool ConversionIsVisible(Oid conid); - extern Oid get_statistics_object_oid(List *names, bool missing_ok); -extern bool StatisticsObjIsVisible(Oid relid); extern Oid get_ts_parser_oid(List *names, bool missing_ok); -extern bool TSParserIsVisible(Oid prsId); extern Oid get_ts_dict_oid(List *names, bool missing_ok); -extern bool TSDictionaryIsVisible(Oid dictId); extern Oid get_ts_template_oid(List *names, bool missing_ok); -extern bool TSTemplateIsVisible(Oid tmplId); extern Oid get_ts_config_oid(List *names, bool missing_ok); -extern bool TSConfigIsVisible(Oid cfgid); + +extern bool ObjectIsVisible(Oid classid, Oid objectid); extern void DeconstructQualifiedName(List *names, char **nspname_p, base-commit: 3b12e68a5c4609deb9fc69607e0aec072700c0a9 -- 2.39.1