diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2021-12-30 19:24:26 -0300 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2021-12-30 19:24:26 -0300 |
commit | c9105dd3660f4a801e6f87a1ed68189bd30576bf (patch) | |
tree | b0edaababb4d2a501670b28e971c9c15e8d0eb14 /src | |
parent | c7cf73eb7b9e7911748ebe117a7219f21e504121 (diff) | |
download | postgresql-c9105dd3660f4a801e6f87a1ed68189bd30576bf.tar.gz |
Small cleanups related to PUBLICATION framework code
Discussion: https://postgr.es/m/202112302021.ca7ihogysgh3@alvherre.pgsql
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/catalog/pg_publication.c | 11 | ||||
-rw-r--r-- | src/backend/commands/publicationcmds.c | 26 | ||||
-rw-r--r-- | src/backend/commands/tablecmds.c | 3 | ||||
-rw-r--r-- | src/backend/parser/gram.y | 20 | ||||
-rw-r--r-- | src/include/nodes/parsenodes.h | 8 | ||||
-rw-r--r-- | src/test/regress/expected/publication.out | 6 |
6 files changed, 40 insertions, 34 deletions
diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 62f10bcbd2..b307bc2ed5 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -287,7 +287,7 @@ publication_add_relation(Oid pubid, PublicationRelInfo *targetrel, Datum values[Natts_pg_publication_rel]; bool nulls[Natts_pg_publication_rel]; Oid relid = RelationGetRelid(targetrel->relation); - Oid prrelid; + Oid pubreloid; Publication *pub = GetPublication(pubid); ObjectAddress myself, referenced; @@ -320,9 +320,9 @@ publication_add_relation(Oid pubid, PublicationRelInfo *targetrel, memset(values, 0, sizeof(values)); memset(nulls, false, sizeof(nulls)); - prrelid = GetNewOidWithIndex(rel, PublicationRelObjectIndexId, - Anum_pg_publication_rel_oid); - values[Anum_pg_publication_rel_oid - 1] = ObjectIdGetDatum(prrelid); + pubreloid = GetNewOidWithIndex(rel, PublicationRelObjectIndexId, + Anum_pg_publication_rel_oid); + values[Anum_pg_publication_rel_oid - 1] = ObjectIdGetDatum(pubreloid); values[Anum_pg_publication_rel_prpubid - 1] = ObjectIdGetDatum(pubid); values[Anum_pg_publication_rel_prrelid - 1] = @@ -334,7 +334,8 @@ publication_add_relation(Oid pubid, PublicationRelInfo *targetrel, CatalogTupleInsert(rel, tup); heap_freetuple(tup); - ObjectAddressSet(myself, PublicationRelRelationId, prrelid); + /* Register dependencies as needed */ + ObjectAddressSet(myself, PublicationRelRelationId, pubreloid); /* Add dependency on the publication */ ObjectAddressSet(referenced, PublicationRelationId, pubid); diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index 404bb5d0c8..f932f47a08 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -48,7 +48,7 @@ #include "utils/syscache.h" #include "utils/varlena.h" -static List *OpenReliIdList(List *relids); +static List *OpenRelIdList(List *relids); static List *OpenTableList(List *tables); static void CloseTableList(List *rels); static void LockSchemaList(List *schemalist); @@ -169,13 +169,13 @@ ObjectsInPublicationToOids(List *pubobjspec_list, ParseState *pstate, case PUBLICATIONOBJ_TABLE: *rels = lappend(*rels, pubobj->pubtable); break; - case PUBLICATIONOBJ_TABLE_IN_SCHEMA: + case PUBLICATIONOBJ_TABLES_IN_SCHEMA: schemaid = get_namespace_oid(pubobj->name, false); /* Filter out duplicates if user specifies "sch1, sch1" */ *schemas = list_append_unique_oid(*schemas, schemaid); break; - case PUBLICATIONOBJ_TABLE_IN_CUR_SCHEMA: + case PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA: search_path = fetch_search_path(false); if (search_path == NIL) /* nothing valid in search_path? */ ereport(ERROR, @@ -214,7 +214,7 @@ CheckObjSchemaNotAlreadyInPublication(List *rels, List *schemaidlist, if (list_member_oid(schemaidlist, relSchemaId)) { - if (checkobjtype == PUBLICATIONOBJ_TABLE_IN_SCHEMA) + if (checkobjtype == PUBLICATIONOBJ_TABLES_IN_SCHEMA) ereport(ERROR, errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("cannot add schema \"%s\" to publication", @@ -499,8 +499,9 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, Oid pubid = pubform->oid; /* - * It is quite possible that for the SET case user has not specified any - * tables in which case we need to remove all the existing tables. + * Nothing to do if no objects, except in SET: for that it is quite + * possible that user has not specified any tables in which case we need + * to remove all the existing tables. */ if (!tables && stmt->action != DEFELEM_SET) return; @@ -593,8 +594,9 @@ AlterPublicationSchemas(AlterPublicationStmt *stmt, Form_pg_publication pubform = (Form_pg_publication) GETSTRUCT(tup); /* - * It is quite possible that for the SET case user has not specified any - * schemas in which case we need to remove all the existing schemas. + * Nothing to do if no objects, except in SET: for that it is quite + * possible that user has not specified any schemas in which case we need + * to remove all the existing schemas. */ if (!schemaidlist && stmt->action != DEFELEM_SET) return; @@ -610,10 +612,10 @@ AlterPublicationSchemas(AlterPublicationStmt *stmt, List *reloids; reloids = GetPublicationRelations(pubform->oid, PUBLICATION_PART_ROOT); - rels = OpenReliIdList(reloids); + rels = OpenRelIdList(reloids); CheckObjSchemaNotAlreadyInPublication(rels, schemaidlist, - PUBLICATIONOBJ_TABLE_IN_SCHEMA); + PUBLICATIONOBJ_TABLES_IN_SCHEMA); CloseTableList(rels); PublicationAddSchemas(pubform->oid, schemaidlist, false, stmt); @@ -813,7 +815,7 @@ RemovePublicationById(Oid pubid) if (!HeapTupleIsValid(tup)) elog(ERROR, "cache lookup failed for publication %u", pubid); - pubform = (Form_pg_publication)GETSTRUCT(tup); + pubform = (Form_pg_publication) GETSTRUCT(tup); /* Invalidate relcache so that publication info is rebuilt. */ if (pubform->puballtables) @@ -868,7 +870,7 @@ RemovePublicationSchemaById(Oid psoid) * add them to a publication. */ static List * -OpenReliIdList(List *relids) +OpenRelIdList(List *relids) { ListCell *lc; List *rels = NIL; diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 45e59e3d5c..3631b8a929 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -40,8 +40,8 @@ #include "catalog/pg_inherits.h" #include "catalog/pg_namespace.h" #include "catalog/pg_opclass.h" -#include "catalog/pg_tablespace.h" #include "catalog/pg_statistic_ext.h" +#include "catalog/pg_tablespace.h" #include "catalog/pg_trigger.h" #include "catalog/pg_type.h" #include "catalog/storage.h" @@ -15626,7 +15626,6 @@ ATExecReplicaIdentity(Relation rel, ReplicaIdentityStmt *stmt, LOCKMODE lockmode else elog(ERROR, "unexpected identity type %u", stmt->identity_type); - /* Check that the index exists */ indexOid = get_relname_relid(stmt->name, rel->rd_rel->relnamespace); if (!OidIsValid(indexOid)) diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 2a319eecda..f3c232842d 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -9750,14 +9750,14 @@ PublicationObjSpec: | ALL TABLES IN_P SCHEMA ColId { $$ = makeNode(PublicationObjSpec); - $$->pubobjtype = PUBLICATIONOBJ_TABLE_IN_SCHEMA; + $$->pubobjtype = PUBLICATIONOBJ_TABLES_IN_SCHEMA; $$->name = $5; $$->location = @5; } | ALL TABLES IN_P SCHEMA CURRENT_SCHEMA { $$ = makeNode(PublicationObjSpec); - $$->pubobjtype = PUBLICATIONOBJ_TABLE_IN_CUR_SCHEMA; + $$->pubobjtype = PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA; $$->location = @5; } | ColId @@ -17411,7 +17411,8 @@ preprocess_pubobj_list(List *pubobjspec_list, core_yyscan_t yyscanner) if (pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION) ereport(ERROR, errcode(ERRCODE_SYNTAX_ERROR), - errmsg("TABLE/ALL TABLES IN SCHEMA should be specified before the table/schema name(s)"), + errmsg("invalid publication object list"), + errdetail("One of TABLE or ALL TABLES IN SCHEMA must be specified before a standalone table or schema name."), parser_errposition(pubobj->location)); foreach(cell, pubobjspec_list) @@ -17433,23 +17434,24 @@ preprocess_pubobj_list(List *pubobjspec_list, core_yyscan_t yyscanner) { /* convert it to PublicationTable */ PublicationTable *pubtable = makeNode(PublicationTable); - pubtable->relation = makeRangeVar(NULL, pubobj->name, - pubobj->location); + + pubtable->relation = + makeRangeVar(NULL, pubobj->name, pubobj->location); pubobj->pubtable = pubtable; pubobj->name = NULL; } } - else if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLE_IN_SCHEMA || - pubobj->pubobjtype == PUBLICATIONOBJ_TABLE_IN_CUR_SCHEMA) + else if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLES_IN_SCHEMA || + pubobj->pubobjtype == PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA) { /* * We can distinguish between the different type of schema * objects based on whether name and pubtable is set. */ if (pubobj->name) - pubobj->pubobjtype = PUBLICATIONOBJ_TABLE_IN_SCHEMA; + pubobj->pubobjtype = PUBLICATIONOBJ_TABLES_IN_SCHEMA; else if (!pubobj->name && !pubobj->pubtable) - pubobj->pubobjtype = PUBLICATIONOBJ_TABLE_IN_CUR_SCHEMA; + pubobj->pubobjtype = PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA; else ereport(ERROR, errcode(ERRCODE_SYNTAX_ERROR), diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 4c5a8a39bf..784164b32a 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3649,10 +3649,10 @@ typedef struct PublicationTable */ typedef enum PublicationObjSpecType { - PUBLICATIONOBJ_TABLE, /* Table type */ - PUBLICATIONOBJ_TABLE_IN_SCHEMA, /* Tables in schema type */ - PUBLICATIONOBJ_TABLE_IN_CUR_SCHEMA, /* Get the first element from - * search_path */ + PUBLICATIONOBJ_TABLE, /* A table */ + PUBLICATIONOBJ_TABLES_IN_SCHEMA, /* All tables in schema */ + PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA, /* All tables in first element of + * search_path */ PUBLICATIONOBJ_CONTINUATION /* Continuation of previous type */ } PublicationObjSpecType; diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index 5ac2d666a2..12c5f67080 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -509,9 +509,10 @@ RESET SEARCH_PATH; -- check create publication on CURRENT_SCHEMA where TABLE/ALL TABLES in SCHEMA -- is not specified CREATE PUBLICATION testpub_forschema1 FOR CURRENT_SCHEMA; -ERROR: TABLE/ALL TABLES IN SCHEMA should be specified before the table/schema name(s) +ERROR: invalid publication object list LINE 1: CREATE PUBLICATION testpub_forschema1 FOR CURRENT_SCHEMA; ^ +DETAIL: One of TABLE or ALL TABLES IN SCHEMA must be specified before a standalone table or schema name. -- check create publication on CURRENT_SCHEMA along with FOR TABLE CREATE PUBLICATION testpub_forschema1 FOR TABLE CURRENT_SCHEMA; ERROR: syntax error at or near "CURRENT_SCHEMA" @@ -778,9 +779,10 @@ Tables from schemas: -- fail specifying table without any of 'FOR ALL TABLES IN SCHEMA' or --'FOR TABLE' or 'FOR ALL TABLES' CREATE PUBLICATION testpub_error FOR pub_test2.tbl1; -ERROR: TABLE/ALL TABLES IN SCHEMA should be specified before the table/schema name(s) +ERROR: invalid publication object list LINE 1: CREATE PUBLICATION testpub_error FOR pub_test2.tbl1; ^ +DETAIL: One of TABLE or ALL TABLES IN SCHEMA must be specified before a standalone table or schema name. DROP VIEW testpub_view; DROP PUBLICATION testpub_default; DROP PUBLICATION testpib_ins_trunct; |