From 4360cec037c868301c82dbbc244fa8b3c8b22615 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 13 Apr 2020 18:35:20 +0200 Subject: [PATCH v1 6/6] Refactor AlterExtensionContentsStmt grammar Make use of the general object support already used by COMMENT, DROP, and SECURITY LABEL. --- src/backend/commands/extension.c | 19 +++ src/backend/parser/gram.y | 157 ++---------------- .../test_pg_dump/expected/test_pg_dump.out | 4 +- 3 files changed, 31 insertions(+), 149 deletions(-) diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index 9b669d95b8..472e69fdaf 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 a1229ebddf..8fb7c24a4e 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -4551,50 +4551,41 @@ 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 AGGREGATE aggregate_with_argtypes + | ALTER EXTENSION name add_drop object_type_any_name any_name { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); n->extname = $3; n->action = $4; - n->objtype = OBJECT_AGGREGATE; + n->objtype = $5; n->object = (Node *) $6; $$ = (Node *)n; } - | ALTER EXTENSION name add_drop CAST '(' Typename AS Typename ')' - { - AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); - n->extname = $3; - n->action = $4; - n->objtype = OBJECT_CAST; - n->object = (Node *) list_make2($7, $9); - $$ = (Node *) n; - } - | ALTER EXTENSION name add_drop COLLATION any_name + | ALTER EXTENSION name add_drop AGGREGATE aggregate_with_argtypes { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); n->extname = $3; n->action = $4; - n->objtype = OBJECT_COLLATION; + n->objtype = OBJECT_AGGREGATE; n->object = (Node *) $6; $$ = (Node *)n; } - | ALTER EXTENSION name add_drop CONVERSION_P any_name + | ALTER EXTENSION name add_drop CAST '(' Typename AS Typename ')' { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); n->extname = $3; n->action = $4; - n->objtype = OBJECT_CONVERSION; - n->object = (Node *) $6; - $$ = (Node *)n; + n->objtype = OBJECT_CAST; + n->object = (Node *) list_make2($7, $9); + $$ = (Node *) n; } | ALTER EXTENSION name add_drop DOMAIN_P Typename { @@ -4614,15 +4605,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); @@ -4668,123 +4650,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 a50eaf6125..f14f3a6664 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; -- 2.26.2