From 8f5b5967441f05e56446fa4cdeffd0774c01e553 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sat, 13 Jun 2020 09:03:28 +0200 Subject: [PATCH] Refactor AlterExtensionContentsStmt grammar Make use of the general object support already used by COMMENT, DROP, and SECURITY LABEL. Discussion: https://www.postgresql.org/message-id/flat/163c00a5-f634-ca52-fc7c-0e53deda8735%402ndquadrant.com --- src/backend/commands/extension.c | 19 +++ src/backend/parser/gram.y | 159 ++---------------- .../test_pg_dump/expected/test_pg_dump.out | 4 +- 3 files changed, 32 insertions(+), 150 deletions(-) diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index 9b669d95b80..472e69fdaf9 100644 --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c @@ -3269,6 +3269,25 @@ ExecAlterExtensionContentsStmt(AlterExtensionContentsStmt *stmt, Relation relation; Oid oldExtension; + switch (stmt->objtype) + { + case OBJECT_DATABASE: + case OBJECT_EXTENSION: + case OBJECT_INDEX: + case OBJECT_PUBLICATION: + case OBJECT_ROLE: + case OBJECT_STATISTIC_EXT: + case OBJECT_SUBSCRIPTION: + case OBJECT_TABLESPACE: + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("cannot add an object of this type to an extension"))); + break; + default: + /* OK */ + break; + } + extension.classId = ExtensionRelationId; extension.objectId = get_extension_oid(stmt->extname, false); extension.objectSubId = 0; diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index b0d6ad10608..e669d75a5af 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -4546,13 +4546,22 @@ alter_extension_opt_item: *****************************************************************************/ AlterExtensionContentsStmt: - ALTER EXTENSION name add_drop ACCESS METHOD name + ALTER EXTENSION name add_drop object_type_name name { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); n->extname = $3; n->action = $4; - n->objtype = OBJECT_ACCESS_METHOD; - n->object = (Node *) makeString($7); + n->objtype = $5; + n->object = (Node *) makeString($6); + $$ = (Node *)n; + } + | ALTER EXTENSION name add_drop object_type_any_name any_name + { + AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); + n->extname = $3; + n->action = $4; + n->objtype = $5; + n->object = (Node *) $6; $$ = (Node *)n; } | ALTER EXTENSION name add_drop AGGREGATE aggregate_with_argtypes @@ -4573,24 +4582,6 @@ AlterExtensionContentsStmt: n->object = (Node *) list_make2($7, $9); $$ = (Node *) n; } - | ALTER EXTENSION name add_drop COLLATION any_name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_COLLATION; - n->object = (Node *) $6; - $$ = (Node *)n; - } - | ALTER EXTENSION name add_drop CONVERSION_P any_name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_CONVERSION; - n->object = (Node *) $6; - $$ = (Node *)n; - } | ALTER EXTENSION name add_drop DOMAIN_P Typename { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); @@ -4609,15 +4600,6 @@ AlterExtensionContentsStmt: n->object = (Node *) $6; $$ = (Node *)n; } - | ALTER EXTENSION name add_drop opt_procedural LANGUAGE name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_LANGUAGE; - n->object = (Node *) makeString($7); - $$ = (Node *)n; - } | ALTER EXTENSION name add_drop OPERATOR operator_with_argtypes { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); @@ -4663,123 +4645,6 @@ AlterExtensionContentsStmt: n->object = (Node *) $6; $$ = (Node *)n; } - | ALTER EXTENSION name add_drop SCHEMA name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_SCHEMA; - n->object = (Node *) makeString($6); - $$ = (Node *)n; - } - | ALTER EXTENSION name add_drop EVENT TRIGGER name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_EVENT_TRIGGER; - n->object = (Node *) makeString($7); - $$ = (Node *)n; - } - | ALTER EXTENSION name add_drop TABLE any_name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_TABLE; - n->object = (Node *) $6; - $$ = (Node *)n; - } - | ALTER EXTENSION name add_drop TEXT_P SEARCH PARSER any_name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_TSPARSER; - n->object = (Node *) $8; - $$ = (Node *)n; - } - | ALTER EXTENSION name add_drop TEXT_P SEARCH DICTIONARY any_name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_TSDICTIONARY; - n->object = (Node *) $8; - $$ = (Node *)n; - } - | ALTER EXTENSION name add_drop TEXT_P SEARCH TEMPLATE any_name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_TSTEMPLATE; - n->object = (Node *) $8; - $$ = (Node *)n; - } - | ALTER EXTENSION name add_drop TEXT_P SEARCH CONFIGURATION any_name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_TSCONFIGURATION; - n->object = (Node *) $8; - $$ = (Node *)n; - } - | ALTER EXTENSION name add_drop SEQUENCE any_name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_SEQUENCE; - n->object = (Node *) $6; - $$ = (Node *)n; - } - | ALTER EXTENSION name add_drop VIEW any_name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_VIEW; - n->object = (Node *) $6; - $$ = (Node *)n; - } - | ALTER EXTENSION name add_drop MATERIALIZED VIEW any_name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_MATVIEW; - n->object = (Node *) $7; - $$ = (Node *)n; - } - | ALTER EXTENSION name add_drop FOREIGN TABLE any_name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_FOREIGN_TABLE; - n->object = (Node *) $7; - $$ = (Node *)n; - } - | ALTER EXTENSION name add_drop FOREIGN DATA_P WRAPPER name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_FDW; - n->object = (Node *) makeString($8); - $$ = (Node *)n; - } - | ALTER EXTENSION name add_drop SERVER name - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_FOREIGN_SERVER; - n->object = (Node *) makeString($6); - $$ = (Node *)n; - } | ALTER EXTENSION name add_drop TRANSFORM FOR Typename LANGUAGE name { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); diff --git a/src/test/modules/test_pg_dump/expected/test_pg_dump.out b/src/test/modules/test_pg_dump/expected/test_pg_dump.out index a50eaf6125d..f14f3a66646 100644 --- a/src/test/modules/test_pg_dump/expected/test_pg_dump.out +++ b/src/test/modules/test_pg_dump/expected/test_pg_dump.out @@ -1,9 +1,7 @@ CREATE ROLE regress_dump_test_role; CREATE EXTENSION test_pg_dump; ALTER EXTENSION test_pg_dump ADD DATABASE postgres; -- error -ERROR: syntax error at or near "DATABASE" -LINE 1: ALTER EXTENSION test_pg_dump ADD DATABASE postgres; - ^ +ERROR: cannot add an object of this type to an extension CREATE TABLE test_pg_dump_t1 (c1 int, junk text); ALTER TABLE test_pg_dump_t1 DROP COLUMN junk; -- to exercise dropped-col cases CREATE VIEW test_pg_dump_v1 AS SELECT * FROM test_pg_dump_t1;