Move common catalog cache access routines to lsyscache.c
In passing, move pg_relation_is_publishable next to similar functions. Suggested-by: Alvaro Herrera Author: Amit Kapila Reviewed-by: Hou Zhijie Discussion: https://postgr.es/m/CAHut+PupQ5UW9A9ut0Yjt21J9tHhx958z5L0k8-9hTYf_NYqxA@mail.gmail.com
This commit is contained in:
parent
c689baa158
commit
6b24d3f9cc
|
@ -149,6 +149,28 @@ is_publishable_relation(Relation rel)
|
|||
return is_publishable_class(RelationGetRelid(rel), rel->rd_rel);
|
||||
}
|
||||
|
||||
/*
|
||||
* SQL-callable variant of the above
|
||||
*
|
||||
* This returns null when the relation does not exist. This is intended to be
|
||||
* used for example in psql to avoid gratuitous errors when there are
|
||||
* concurrent catalog changes.
|
||||
*/
|
||||
Datum
|
||||
pg_relation_is_publishable(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
HeapTuple tuple;
|
||||
bool result;
|
||||
|
||||
tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
|
||||
if (!HeapTupleIsValid(tuple))
|
||||
PG_RETURN_NULL();
|
||||
result = is_publishable_class(relid, (Form_pg_class) GETSTRUCT(tuple));
|
||||
ReleaseSysCache(tuple);
|
||||
PG_RETURN_BOOL(result);
|
||||
}
|
||||
|
||||
/*
|
||||
* Filter out the partitions whose parent tables were also specified in
|
||||
* the publication.
|
||||
|
@ -219,28 +241,6 @@ is_schema_publication(Oid pubid)
|
|||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* SQL-callable variant of the above
|
||||
*
|
||||
* This returns null when the relation does not exist. This is intended to be
|
||||
* used for example in psql to avoid gratuitous errors when there are
|
||||
* concurrent catalog changes.
|
||||
*/
|
||||
Datum
|
||||
pg_relation_is_publishable(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
HeapTuple tuple;
|
||||
bool result;
|
||||
|
||||
tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
|
||||
if (!HeapTupleIsValid(tuple))
|
||||
PG_RETURN_NULL();
|
||||
result = is_publishable_class(relid, (Form_pg_class) GETSTRUCT(tuple));
|
||||
ReleaseSysCache(tuple);
|
||||
PG_RETURN_BOOL(result);
|
||||
}
|
||||
|
||||
/*
|
||||
* Gets the relations based on the publication partition option for a specified
|
||||
* relation.
|
||||
|
@ -1012,7 +1012,6 @@ GetPublication(Oid pubid)
|
|||
return pub;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Get Publication using name.
|
||||
*/
|
||||
|
@ -1026,56 +1025,6 @@ GetPublicationByName(const char *pubname, bool missing_ok)
|
|||
return OidIsValid(oid) ? GetPublication(oid) : NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* get_publication_oid - given a publication name, look up the OID
|
||||
*
|
||||
* If missing_ok is false, throw an error if name not found. If true, just
|
||||
* return InvalidOid.
|
||||
*/
|
||||
Oid
|
||||
get_publication_oid(const char *pubname, bool missing_ok)
|
||||
{
|
||||
Oid oid;
|
||||
|
||||
oid = GetSysCacheOid1(PUBLICATIONNAME, Anum_pg_publication_oid,
|
||||
CStringGetDatum(pubname));
|
||||
if (!OidIsValid(oid) && !missing_ok)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
||||
errmsg("publication \"%s\" does not exist", pubname)));
|
||||
return oid;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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, bool missing_ok)
|
||||
{
|
||||
HeapTuple tup;
|
||||
char *pubname;
|
||||
Form_pg_publication pubform;
|
||||
|
||||
tup = SearchSysCache1(PUBLICATIONOID, ObjectIdGetDatum(pubid));
|
||||
|
||||
if (!HeapTupleIsValid(tup))
|
||||
{
|
||||
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));
|
||||
|
||||
ReleaseSysCache(tup);
|
||||
|
||||
return pubname;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns information of tables in a publication.
|
||||
*/
|
||||
|
|
|
@ -205,56 +205,6 @@ DisableSubscription(Oid subid)
|
|||
table_close(rel, NoLock);
|
||||
}
|
||||
|
||||
/*
|
||||
* get_subscription_oid - given a subscription name, look up the OID
|
||||
*
|
||||
* If missing_ok is false, throw an error if name not found. If true, just
|
||||
* return InvalidOid.
|
||||
*/
|
||||
Oid
|
||||
get_subscription_oid(const char *subname, bool missing_ok)
|
||||
{
|
||||
Oid oid;
|
||||
|
||||
oid = GetSysCacheOid2(SUBSCRIPTIONNAME, Anum_pg_subscription_oid,
|
||||
MyDatabaseId, CStringGetDatum(subname));
|
||||
if (!OidIsValid(oid) && !missing_ok)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
||||
errmsg("subscription \"%s\" does not exist", subname)));
|
||||
return oid;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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, bool missing_ok)
|
||||
{
|
||||
HeapTuple tup;
|
||||
char *subname;
|
||||
Form_pg_subscription subform;
|
||||
|
||||
tup = SearchSysCache1(SUBSCRIPTIONOID, ObjectIdGetDatum(subid));
|
||||
|
||||
if (!HeapTupleIsValid(tup))
|
||||
{
|
||||
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));
|
||||
|
||||
ReleaseSysCache(tup);
|
||||
|
||||
return subname;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert text array to list of strings.
|
||||
*
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include "catalog/pg_proc.h"
|
||||
#include "catalog/pg_range.h"
|
||||
#include "catalog/pg_statistic.h"
|
||||
#include "catalog/pg_subscription.h"
|
||||
#include "catalog/pg_transform.h"
|
||||
#include "catalog/pg_type.h"
|
||||
#include "miscadmin.h"
|
||||
|
@ -3578,3 +3579,103 @@ get_index_isclustered(Oid index_oid)
|
|||
|
||||
return isclustered;
|
||||
}
|
||||
|
||||
/*
|
||||
* get_publication_oid - given a publication name, look up the OID
|
||||
*
|
||||
* If missing_ok is false, throw an error if name not found. If true, just
|
||||
* return InvalidOid.
|
||||
*/
|
||||
Oid
|
||||
get_publication_oid(const char *pubname, bool missing_ok)
|
||||
{
|
||||
Oid oid;
|
||||
|
||||
oid = GetSysCacheOid1(PUBLICATIONNAME, Anum_pg_publication_oid,
|
||||
CStringGetDatum(pubname));
|
||||
if (!OidIsValid(oid) && !missing_ok)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
||||
errmsg("publication \"%s\" does not exist", pubname)));
|
||||
return oid;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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, bool missing_ok)
|
||||
{
|
||||
HeapTuple tup;
|
||||
char *pubname;
|
||||
Form_pg_publication pubform;
|
||||
|
||||
tup = SearchSysCache1(PUBLICATIONOID, ObjectIdGetDatum(pubid));
|
||||
|
||||
if (!HeapTupleIsValid(tup))
|
||||
{
|
||||
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));
|
||||
|
||||
ReleaseSysCache(tup);
|
||||
|
||||
return pubname;
|
||||
}
|
||||
|
||||
/*
|
||||
* get_subscription_oid - given a subscription name, look up the OID
|
||||
*
|
||||
* If missing_ok is false, throw an error if name not found. If true, just
|
||||
* return InvalidOid.
|
||||
*/
|
||||
Oid
|
||||
get_subscription_oid(const char* subname, bool missing_ok)
|
||||
{
|
||||
Oid oid;
|
||||
|
||||
oid = GetSysCacheOid2(SUBSCRIPTIONNAME, Anum_pg_subscription_oid,
|
||||
MyDatabaseId, CStringGetDatum(subname));
|
||||
if (!OidIsValid(oid) && !missing_ok)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
||||
errmsg("subscription \"%s\" does not exist", subname)));
|
||||
return oid;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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, bool missing_ok)
|
||||
{
|
||||
HeapTuple tup;
|
||||
char* subname;
|
||||
Form_pg_subscription subform;
|
||||
|
||||
tup = SearchSysCache1(SUBSCRIPTIONOID, ObjectIdGetDatum(subid));
|
||||
|
||||
if (!HeapTupleIsValid(tup))
|
||||
{
|
||||
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));
|
||||
|
||||
ReleaseSysCache(tup);
|
||||
|
||||
return subname;
|
||||
}
|
||||
|
|
|
@ -155,7 +155,4 @@ extern ObjectAddress publication_add_schema(Oid pubid, Oid schemaid,
|
|||
extern Bitmapset *pub_collist_to_bitmapset(Bitmapset *columns, Datum pubcols,
|
||||
MemoryContext mcxt);
|
||||
|
||||
extern Oid get_publication_oid(const char *pubname, bool missing_ok);
|
||||
extern char *get_publication_name(Oid pubid, bool missing_ok);
|
||||
|
||||
#endif /* PG_PUBLICATION_H */
|
||||
|
|
|
@ -140,8 +140,6 @@ typedef struct Subscription
|
|||
extern Subscription *GetSubscription(Oid subid, bool missing_ok);
|
||||
extern void FreeSubscription(Subscription *sub);
|
||||
extern void DisableSubscription(Oid subid);
|
||||
extern Oid get_subscription_oid(const char *subname, bool missing_ok);
|
||||
extern char *get_subscription_name(Oid subid, bool missing_ok);
|
||||
|
||||
extern int CountDBSubscriptions(Oid dbid);
|
||||
|
||||
|
|
|
@ -198,6 +198,10 @@ extern Oid get_index_column_opclass(Oid index_oid, int attno);
|
|||
extern bool get_index_isreplident(Oid index_oid);
|
||||
extern bool get_index_isvalid(Oid index_oid);
|
||||
extern bool get_index_isclustered(Oid index_oid);
|
||||
extern Oid get_publication_oid(const char *pubname, bool missing_ok);
|
||||
extern char *get_publication_name(Oid pubid, bool missing_ok);
|
||||
extern Oid get_subscription_oid(const char *subname, bool missing_ok);
|
||||
extern char *get_subscription_name(Oid subid, bool missing_ok);
|
||||
|
||||
#define type_is_array(typid) (get_element_type(typid) != InvalidOid)
|
||||
/* type_is_array_domain accepts both plain arrays and domains over arrays */
|
||||
|
|
Loading…
Reference in New Issue