From 9623d8999603dff84e7cb85caca2af82c5f67c8b Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Mon, 3 Jan 2022 10:48:48 -0300 Subject: [PATCH] Avoid using DefElemAction in AlterPublicationStmt Create a new enum type for it. This allows to add new values for future functionality without disrupting unrelated uses of DefElem. Discussion: https://postgr.es/m/202112302021.ca7ihogysgh3@alvherre.pgsql --- src/backend/commands/publicationcmds.c | 18 +++++++++--------- src/backend/parser/gram.y | 6 +++--- src/include/nodes/parsenodes.h | 11 +++++++++-- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index f932f47a08..0f04969fd6 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -503,12 +503,12 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, * 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) + if (!tables && stmt->action != AP_SetObjects) return; rels = OpenTableList(tables); - if (stmt->action == DEFELEM_ADD) + if (stmt->action == AP_AddObjects) { List *schemas = NIL; @@ -521,9 +521,9 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, PUBLICATIONOBJ_TABLE); PublicationAddTables(pubid, rels, false, stmt); } - else if (stmt->action == DEFELEM_DROP) + else if (stmt->action == AP_DropObjects) PublicationDropTables(pubid, rels, false); - else /* DEFELEM_SET */ + else /* AP_SetObjects */ { List *oldrelids = GetPublicationRelations(pubid, PUBLICATION_PART_ROOT); @@ -598,7 +598,7 @@ AlterPublicationSchemas(AlterPublicationStmt *stmt, * 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) + if (!schemaidlist && stmt->action != AP_SetObjects) return; /* @@ -606,7 +606,7 @@ AlterPublicationSchemas(AlterPublicationStmt *stmt, * concurrent schema deletion. */ LockSchemaList(schemaidlist); - if (stmt->action == DEFELEM_ADD) + if (stmt->action == AP_AddObjects) { List *rels; List *reloids; @@ -620,9 +620,9 @@ AlterPublicationSchemas(AlterPublicationStmt *stmt, CloseTableList(rels); PublicationAddSchemas(pubform->oid, schemaidlist, false, stmt); } - else if (stmt->action == DEFELEM_DROP) + else if (stmt->action == AP_DropObjects) PublicationDropSchemas(pubform->oid, schemaidlist, false); - else /* DEFELEM_SET */ + else /* AP_SetObjects */ { List *oldschemaids = GetPublicationSchemas(pubform->oid); List *delschemas = NIL; @@ -657,7 +657,7 @@ CheckAlterPublication(AlterPublicationStmt *stmt, HeapTuple tup, { Form_pg_publication pubform = (Form_pg_publication) GETSTRUCT(tup); - if ((stmt->action == DEFELEM_ADD || stmt->action == DEFELEM_SET) && + if ((stmt->action == AP_AddObjects || stmt->action == AP_SetObjects) && schemaidlist && !superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index f3c232842d..6dddc07947 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -9828,7 +9828,7 @@ AlterPublicationStmt: n->pubname = $3; n->pubobjects = $5; preprocess_pubobj_list(n->pubobjects, yyscanner); - n->action = DEFELEM_ADD; + n->action = AP_AddObjects; $$ = (Node *)n; } | ALTER PUBLICATION name SET pub_obj_list @@ -9837,7 +9837,7 @@ AlterPublicationStmt: n->pubname = $3; n->pubobjects = $5; preprocess_pubobj_list(n->pubobjects, yyscanner); - n->action = DEFELEM_SET; + n->action = AP_SetObjects; $$ = (Node *)n; } | ALTER PUBLICATION name DROP pub_obj_list @@ -9846,7 +9846,7 @@ AlterPublicationStmt: n->pubname = $3; n->pubobjects = $5; preprocess_pubobj_list(n->pubobjects, yyscanner); - n->action = DEFELEM_DROP; + n->action = AP_DropObjects; $$ = (Node *)n; } ; diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 784164b32a..593e301f7a 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3674,6 +3674,13 @@ typedef struct CreatePublicationStmt bool for_all_tables; /* Special publication for all tables in db */ } CreatePublicationStmt; +typedef enum AlterPublicationAction +{ + AP_AddObjects, /* add objects to publication */ + AP_DropObjects, /* remove objects from publication */ + AP_SetObjects /* set list of objects */ +} AlterPublicationAction; + typedef struct AlterPublicationStmt { NodeTag type; @@ -3688,8 +3695,8 @@ typedef struct AlterPublicationStmt */ List *pubobjects; /* Optional list of publication objects */ bool for_all_tables; /* Special publication for all tables in db */ - DefElemAction action; /* What action to perform with the - * tables/schemas */ + AlterPublicationAction action; /* What action to perform with the given + * objects */ } AlterPublicationStmt; typedef struct CreateSubscriptionStmt