From 483fada9676f5c9b48ca5d30e1708fe41928a178 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 14 Feb 2023 13:28:42 +0100 Subject: [PATCH 2/2] Refactor common parts of get_*_oid() functions --- src/backend/catalog/namespace.c | 204 ++++++-------------------------- 1 file changed, 39 insertions(+), 165 deletions(-) diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index 6179c3f678..289b0b7d1a 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -2000,32 +2000,34 @@ CollationIsVisible(Oid collid) } /* - * get_statistics_object_oid - find a statistics object by possibly qualified name + * get_object_oid_common - find an object by possibly qualified name * - * If not found, returns InvalidOid if missing_ok, else throws error + * If not found, returns InvalidOid. The argument missing_ok only applies to + * the namespace lookup. */ -Oid -get_statistics_object_oid(List *names, bool missing_ok) +static Oid +get_object_oid_common(Oid classid, List *names, bool missing_ok) { char *schemaname; - char *stats_name; + char *objectname; Oid namespaceId; - Oid stats_oid = InvalidOid; + Oid objectid = InvalidOid; ListCell *l; /* deconstruct the name list */ - DeconstructQualifiedName(names, &schemaname, &stats_name); + DeconstructQualifiedName(names, &schemaname, &objectname); if (schemaname) { /* use exact schema given */ namespaceId = LookupExplicitNamespace(schemaname, missing_ok); if (missing_ok && !OidIsValid(namespaceId)) - stats_oid = InvalidOid; + objectid = InvalidOid; else - stats_oid = GetSysCacheOid2(STATEXTNAMENSP, Anum_pg_statistic_ext_oid, - PointerGetDatum(stats_name), - ObjectIdGetDatum(namespaceId)); + objectid = GetSysCacheOid2(get_object_catcache_name(classid), + get_object_attnum_oid(classid), + PointerGetDatum(objectname), + ObjectIdGetDatum(namespaceId)); } else { @@ -2038,14 +2040,30 @@ get_statistics_object_oid(List *names, bool missing_ok) if (namespaceId == myTempNamespace) continue; /* do not look in temp namespace */ - stats_oid = GetSysCacheOid2(STATEXTNAMENSP, Anum_pg_statistic_ext_oid, - PointerGetDatum(stats_name), - ObjectIdGetDatum(namespaceId)); - if (OidIsValid(stats_oid)) + objectid = GetSysCacheOid2(get_object_catcache_name(classid), + get_object_attnum_oid(classid), + PointerGetDatum(objectname), + ObjectIdGetDatum(namespaceId)); + if (OidIsValid(objectid)) break; } } + return objectid; +} + +/* + * get_statistics_object_oid - find a statistics object by possibly qualified name + * + * If not found, returns InvalidOid if missing_ok, else throws error + */ +Oid +get_statistics_object_oid(List *names, bool missing_ok) +{ + Oid stats_oid; + + stats_oid = get_object_oid_common(StatisticExtRelationId, names, missing_ok); + if (!OidIsValid(stats_oid) && !missing_ok) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), @@ -2063,45 +2081,9 @@ get_statistics_object_oid(List *names, bool missing_ok) Oid get_ts_parser_oid(List *names, bool missing_ok) { - char *schemaname; - char *parser_name; - Oid namespaceId; - Oid prsoid = InvalidOid; - ListCell *l; - - /* deconstruct the name list */ - DeconstructQualifiedName(names, &schemaname, &parser_name); + Oid prsoid; - if (schemaname) - { - /* use exact schema given */ - namespaceId = LookupExplicitNamespace(schemaname, missing_ok); - if (missing_ok && !OidIsValid(namespaceId)) - prsoid = InvalidOid; - else - prsoid = GetSysCacheOid2(TSPARSERNAMENSP, Anum_pg_ts_parser_oid, - PointerGetDatum(parser_name), - ObjectIdGetDatum(namespaceId)); - } - else - { - /* search for it in search path */ - recomputeNamespacePath(); - - foreach(l, activeSearchPath) - { - namespaceId = lfirst_oid(l); - - if (namespaceId == myTempNamespace) - continue; /* do not look in temp namespace */ - - prsoid = GetSysCacheOid2(TSPARSERNAMENSP, Anum_pg_ts_parser_oid, - PointerGetDatum(parser_name), - ObjectIdGetDatum(namespaceId)); - if (OidIsValid(prsoid)) - break; - } - } + prsoid = get_object_oid_common(TSParserRelationId, names, missing_ok); if (!OidIsValid(prsoid) && !missing_ok) ereport(ERROR, @@ -2120,45 +2102,9 @@ get_ts_parser_oid(List *names, bool missing_ok) Oid get_ts_dict_oid(List *names, bool missing_ok) { - char *schemaname; - char *dict_name; - Oid namespaceId; - Oid dictoid = InvalidOid; - ListCell *l; - - /* deconstruct the name list */ - DeconstructQualifiedName(names, &schemaname, &dict_name); + Oid dictoid; - if (schemaname) - { - /* use exact schema given */ - namespaceId = LookupExplicitNamespace(schemaname, missing_ok); - if (missing_ok && !OidIsValid(namespaceId)) - dictoid = InvalidOid; - else - dictoid = GetSysCacheOid2(TSDICTNAMENSP, Anum_pg_ts_dict_oid, - PointerGetDatum(dict_name), - ObjectIdGetDatum(namespaceId)); - } - else - { - /* search for it in search path */ - recomputeNamespacePath(); - - foreach(l, activeSearchPath) - { - namespaceId = lfirst_oid(l); - - if (namespaceId == myTempNamespace) - continue; /* do not look in temp namespace */ - - dictoid = GetSysCacheOid2(TSDICTNAMENSP, Anum_pg_ts_dict_oid, - PointerGetDatum(dict_name), - ObjectIdGetDatum(namespaceId)); - if (OidIsValid(dictoid)) - break; - } - } + dictoid = get_object_oid_common(TSDictionaryRelationId, names, missing_ok); if (!OidIsValid(dictoid) && !missing_ok) ereport(ERROR, @@ -2177,45 +2123,9 @@ get_ts_dict_oid(List *names, bool missing_ok) Oid get_ts_template_oid(List *names, bool missing_ok) { - char *schemaname; - char *template_name; - Oid namespaceId; Oid tmploid = InvalidOid; - ListCell *l; - - /* deconstruct the name list */ - DeconstructQualifiedName(names, &schemaname, &template_name); - - if (schemaname) - { - /* use exact schema given */ - namespaceId = LookupExplicitNamespace(schemaname, missing_ok); - if (missing_ok && !OidIsValid(namespaceId)) - tmploid = InvalidOid; - else - tmploid = GetSysCacheOid2(TSTEMPLATENAMENSP, Anum_pg_ts_template_oid, - PointerGetDatum(template_name), - ObjectIdGetDatum(namespaceId)); - } - else - { - /* search for it in search path */ - recomputeNamespacePath(); - - foreach(l, activeSearchPath) - { - namespaceId = lfirst_oid(l); - - if (namespaceId == myTempNamespace) - continue; /* do not look in temp namespace */ - tmploid = GetSysCacheOid2(TSTEMPLATENAMENSP, Anum_pg_ts_template_oid, - PointerGetDatum(template_name), - ObjectIdGetDatum(namespaceId)); - if (OidIsValid(tmploid)) - break; - } - } + tmploid = get_object_oid_common(TSTemplateRelationId, names, missing_ok); if (!OidIsValid(tmploid) && !missing_ok) ereport(ERROR, @@ -2234,45 +2144,9 @@ get_ts_template_oid(List *names, bool missing_ok) Oid get_ts_config_oid(List *names, bool missing_ok) { - char *schemaname; - char *config_name; - Oid namespaceId; Oid cfgoid = InvalidOid; - ListCell *l; - - /* deconstruct the name list */ - DeconstructQualifiedName(names, &schemaname, &config_name); - if (schemaname) - { - /* use exact schema given */ - namespaceId = LookupExplicitNamespace(schemaname, missing_ok); - if (missing_ok && !OidIsValid(namespaceId)) - cfgoid = InvalidOid; - else - cfgoid = GetSysCacheOid2(TSCONFIGNAMENSP, Anum_pg_ts_config_oid, - PointerGetDatum(config_name), - ObjectIdGetDatum(namespaceId)); - } - else - { - /* search for it in search path */ - recomputeNamespacePath(); - - foreach(l, activeSearchPath) - { - namespaceId = lfirst_oid(l); - - if (namespaceId == myTempNamespace) - continue; /* do not look in temp namespace */ - - cfgoid = GetSysCacheOid2(TSCONFIGNAMENSP, Anum_pg_ts_config_oid, - PointerGetDatum(config_name), - ObjectIdGetDatum(namespaceId)); - if (OidIsValid(cfgoid)) - break; - } - } + cfgoid = get_object_oid_common(TSConfigRelationId, names, missing_ok); if (!OidIsValid(cfgoid) && !missing_ok) ereport(ERROR, -- 2.39.1