From 1d6fbc38d9ed03dc7fd297119d7949b6531aed5a Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 18 Sep 2018 12:00:18 +0900 Subject: [PATCH] Refactor routines for subscription and publication lookups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Those routines gain a missing_ok argument, allowing a caller to get a NULL result instead of an error if set to true. This is part of a larger refactoring effort for objectaddress.c where trying to check for non-existing objects does not result in cache lookup failures. Author: Michael Paquier Reviewed-by: Aleksander Alekseev, Álvaro Herrera Discussion: https://postgr.es/m/CAB7nPqSZxrSmdHK-rny7z8mi=EAFXJ5J-0RbzDw6aus=wB5azQ@mail.gmail.com --- src/backend/catalog/objectaddress.c | 14 ++++++++------ src/backend/catalog/pg_publication.c | 11 +++++++++-- src/backend/catalog/pg_subscription.c | 11 +++++++++-- src/include/catalog/pg_publication.h | 2 +- src/include/catalog/pg_subscription.h | 2 +- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index 7db942dcba..593e6f7022 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -3508,7 +3508,8 @@ getObjectDescription(const ObjectAddress *object) case OCLASS_PUBLICATION: { appendStringInfo(&buffer, _("publication %s"), - get_publication_name(object->objectId)); + get_publication_name(object->objectId, + false)); break; } @@ -3526,7 +3527,7 @@ getObjectDescription(const ObjectAddress *object) object->objectId); prform = (Form_pg_publication_rel) GETSTRUCT(tup); - pubname = get_publication_name(prform->prpubid); + pubname = get_publication_name(prform->prpubid, false); initStringInfo(&rel); getRelationDescription(&rel, prform->prrelid); @@ -3542,7 +3543,8 @@ getObjectDescription(const ObjectAddress *object) case OCLASS_SUBSCRIPTION: { appendStringInfo(&buffer, _("subscription %s"), - get_subscription_name(object->objectId)); + get_subscription_name(object->objectId, + false)); break; } @@ -5042,7 +5044,7 @@ getObjectIdentityParts(const ObjectAddress *object, { char *pubname; - pubname = get_publication_name(object->objectId); + pubname = get_publication_name(object->objectId, false); appendStringInfoString(&buffer, quote_identifier(pubname)); if (objname) @@ -5063,7 +5065,7 @@ getObjectIdentityParts(const ObjectAddress *object, object->objectId); prform = (Form_pg_publication_rel) GETSTRUCT(tup); - pubname = get_publication_name(prform->prpubid); + pubname = get_publication_name(prform->prpubid, false); getRelationIdentity(&buffer, prform->prrelid, objname); appendStringInfo(&buffer, " in publication %s", pubname); @@ -5079,7 +5081,7 @@ getObjectIdentityParts(const ObjectAddress *object, { char *subname; - subname = get_subscription_name(object->objectId); + subname = get_subscription_name(object->objectId, false); appendStringInfoString(&buffer, quote_identifier(subname)); if (objname) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index ec3bd1d22d..3ecf6d57bf 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -427,9 +427,12 @@ get_publication_oid(const char *pubname, bool missing_ok) /* * get_publication_name - given a publication Oid, look up the name + * + * If missing_ok is false, throw an error if name not found. If true, just + * return NULL. */ char * -get_publication_name(Oid pubid) +get_publication_name(Oid pubid, bool missing_ok) { HeapTuple tup; char *pubname; @@ -438,7 +441,11 @@ get_publication_name(Oid pubid) tup = SearchSysCache1(PUBLICATIONOID, ObjectIdGetDatum(pubid)); if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for publication %u", pubid); + { + if (!missing_ok) + elog(ERROR, "cache lookup failed for publication %u", pubid); + return NULL; + } pubform = (Form_pg_publication) GETSTRUCT(tup); pubname = pstrdup(NameStr(pubform->pubname)); diff --git a/src/backend/catalog/pg_subscription.c b/src/backend/catalog/pg_subscription.c index 8705d8b1d3..f891ff8054 100644 --- a/src/backend/catalog/pg_subscription.c +++ b/src/backend/catalog/pg_subscription.c @@ -179,9 +179,12 @@ get_subscription_oid(const char *subname, bool missing_ok) /* * get_subscription_name - given a subscription OID, look up the name + * + * If missing_ok is false, throw an error if name not found. If true, just + * return NULL. */ char * -get_subscription_name(Oid subid) +get_subscription_name(Oid subid, bool missing_ok) { HeapTuple tup; char *subname; @@ -190,7 +193,11 @@ get_subscription_name(Oid subid) tup = SearchSysCache1(SUBSCRIPTIONOID, ObjectIdGetDatum(subid)); if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for subscription %u", subid); + { + if (!missing_ok) + elog(ERROR, "cache lookup failed for subscription %u", subid); + return NULL; + } subform = (Form_pg_subscription) GETSTRUCT(tup); subname = pstrdup(NameStr(subform->subname)); diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h index 83c59cb10d..a5d5570f76 100644 --- a/src/include/catalog/pg_publication.h +++ b/src/include/catalog/pg_publication.h @@ -88,7 +88,7 @@ extern ObjectAddress publication_add_relation(Oid pubid, Relation targetrel, bool if_not_exists); extern Oid get_publication_oid(const char *pubname, bool missing_ok); -extern char *get_publication_name(Oid pubid); +extern char *get_publication_name(Oid pubid, bool missing_ok); extern Datum pg_get_publication_tables(PG_FUNCTION_ARGS); diff --git a/src/include/catalog/pg_subscription.h b/src/include/catalog/pg_subscription.h index 82dd6faf23..e4dc771cf5 100644 --- a/src/include/catalog/pg_subscription.h +++ b/src/include/catalog/pg_subscription.h @@ -80,7 +80,7 @@ typedef struct Subscription extern Subscription *GetSubscription(Oid subid, bool missing_ok); extern void FreeSubscription(Subscription *sub); extern Oid get_subscription_oid(const char *subname, bool missing_ok); -extern char *get_subscription_name(Oid subid); +extern char *get_subscription_name(Oid subid, bool missing_ok); extern int CountDBSubscriptions(Oid dbid);