Skip to content

Commit 8f5b596

Browse files
committed
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
1 parent a332b36 commit 8f5b596

File tree

3 files changed

+31
-149
lines changed

3 files changed

+31
-149
lines changed

src/backend/commands/extension.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3269,6 +3269,25 @@ ExecAlterExtensionContentsStmt(AlterExtensionContentsStmt *stmt,
32693269
Relation relation;
32703270
Oid oldExtension;
32713271

3272+
switch (stmt->objtype)
3273+
{
3274+
case OBJECT_DATABASE:
3275+
case OBJECT_EXTENSION:
3276+
case OBJECT_INDEX:
3277+
case OBJECT_PUBLICATION:
3278+
case OBJECT_ROLE:
3279+
case OBJECT_STATISTIC_EXT:
3280+
case OBJECT_SUBSCRIPTION:
3281+
case OBJECT_TABLESPACE:
3282+
ereport(ERROR,
3283+
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
3284+
errmsg("cannot add an object of this type to an extension")));
3285+
break;
3286+
default:
3287+
/* OK */
3288+
break;
3289+
}
3290+
32723291
extension.classId = ExtensionRelationId;
32733292
extension.objectId = get_extension_oid(stmt->extname, false);
32743293
extension.objectSubId = 0;

src/backend/parser/gram.y

Lines changed: 11 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -4546,50 +4546,41 @@ alter_extension_opt_item:
45464546
*****************************************************************************/
45474547

45484548
AlterExtensionContentsStmt:
4549-
ALTER EXTENSION name add_drop ACCESS METHOD name
4549+
ALTER EXTENSION name add_drop object_type_name name
45504550
{
45514551
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
45524552
n->extname = $3;
45534553
n->action = $4;
4554-
n->objtype = OBJECT_ACCESS_METHOD;
4555-
n->object = (Node *) makeString($7);
4554+
n->objtype = $5;
4555+
n->object = (Node *) makeString($6);
45564556
$$ = (Node *)n;
45574557
}
4558-
| ALTER EXTENSION name add_drop AGGREGATE aggregate_with_argtypes
4558+
| ALTER EXTENSION name add_drop object_type_any_name any_name
45594559
{
45604560
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
45614561
n->extname = $3;
45624562
n->action = $4;
4563-
n->objtype = OBJECT_AGGREGATE;
4563+
n->objtype = $5;
45644564
n->object = (Node *) $6;
45654565
$$ = (Node *)n;
45664566
}
4567-
| ALTER EXTENSION name add_drop CAST '(' Typename AS Typename ')'
4568-
{
4569-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4570-
n->extname = $3;
4571-
n->action = $4;
4572-
n->objtype = OBJECT_CAST;
4573-
n->object = (Node *) list_make2($7, $9);
4574-
$$ = (Node *) n;
4575-
}
4576-
| ALTER EXTENSION name add_drop COLLATION any_name
4567+
| ALTER EXTENSION name add_drop AGGREGATE aggregate_with_argtypes
45774568
{
45784569
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
45794570
n->extname = $3;
45804571
n->action = $4;
4581-
n->objtype = OBJECT_COLLATION;
4572+
n->objtype = OBJECT_AGGREGATE;
45824573
n->object = (Node *) $6;
45834574
$$ = (Node *)n;
45844575
}
4585-
| ALTER EXTENSION name add_drop CONVERSION_P any_name
4576+
| ALTER EXTENSION name add_drop CAST '(' Typename AS Typename ')'
45864577
{
45874578
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
45884579
n->extname = $3;
45894580
n->action = $4;
4590-
n->objtype = OBJECT_CONVERSION;
4591-
n->object = (Node *) $6;
4592-
$$ = (Node *)n;
4581+
n->objtype = OBJECT_CAST;
4582+
n->object = (Node *) list_make2($7, $9);
4583+
$$ = (Node *) n;
45934584
}
45944585
| ALTER EXTENSION name add_drop DOMAIN_P Typename
45954586
{
@@ -4609,15 +4600,6 @@ AlterExtensionContentsStmt:
46094600
n->object = (Node *) $6;
46104601
$$ = (Node *)n;
46114602
}
4612-
| ALTER EXTENSION name add_drop opt_procedural LANGUAGE name
4613-
{
4614-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4615-
n->extname = $3;
4616-
n->action = $4;
4617-
n->objtype = OBJECT_LANGUAGE;
4618-
n->object = (Node *) makeString($7);
4619-
$$ = (Node *)n;
4620-
}
46214603
| ALTER EXTENSION name add_drop OPERATOR operator_with_argtypes
46224604
{
46234605
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
@@ -4663,123 +4645,6 @@ AlterExtensionContentsStmt:
46634645
n->object = (Node *) $6;
46644646
$$ = (Node *)n;
46654647
}
4666-
| ALTER EXTENSION name add_drop SCHEMA name
4667-
{
4668-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4669-
n->extname = $3;
4670-
n->action = $4;
4671-
n->objtype = OBJECT_SCHEMA;
4672-
n->object = (Node *) makeString($6);
4673-
$$ = (Node *)n;
4674-
}
4675-
| ALTER EXTENSION name add_drop EVENT TRIGGER name
4676-
{
4677-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4678-
n->extname = $3;
4679-
n->action = $4;
4680-
n->objtype = OBJECT_EVENT_TRIGGER;
4681-
n->object = (Node *) makeString($7);
4682-
$$ = (Node *)n;
4683-
}
4684-
| ALTER EXTENSION name add_drop TABLE any_name
4685-
{
4686-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4687-
n->extname = $3;
4688-
n->action = $4;
4689-
n->objtype = OBJECT_TABLE;
4690-
n->object = (Node *) $6;
4691-
$$ = (Node *)n;
4692-
}
4693-
| ALTER EXTENSION name add_drop TEXT_P SEARCH PARSER any_name
4694-
{
4695-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4696-
n->extname = $3;
4697-
n->action = $4;
4698-
n->objtype = OBJECT_TSPARSER;
4699-
n->object = (Node *) $8;
4700-
$$ = (Node *)n;
4701-
}
4702-
| ALTER EXTENSION name add_drop TEXT_P SEARCH DICTIONARY any_name
4703-
{
4704-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4705-
n->extname = $3;
4706-
n->action = $4;
4707-
n->objtype = OBJECT_TSDICTIONARY;
4708-
n->object = (Node *) $8;
4709-
$$ = (Node *)n;
4710-
}
4711-
| ALTER EXTENSION name add_drop TEXT_P SEARCH TEMPLATE any_name
4712-
{
4713-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4714-
n->extname = $3;
4715-
n->action = $4;
4716-
n->objtype = OBJECT_TSTEMPLATE;
4717-
n->object = (Node *) $8;
4718-
$$ = (Node *)n;
4719-
}
4720-
| ALTER EXTENSION name add_drop TEXT_P SEARCH CONFIGURATION any_name
4721-
{
4722-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4723-
n->extname = $3;
4724-
n->action = $4;
4725-
n->objtype = OBJECT_TSCONFIGURATION;
4726-
n->object = (Node *) $8;
4727-
$$ = (Node *)n;
4728-
}
4729-
| ALTER EXTENSION name add_drop SEQUENCE any_name
4730-
{
4731-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4732-
n->extname = $3;
4733-
n->action = $4;
4734-
n->objtype = OBJECT_SEQUENCE;
4735-
n->object = (Node *) $6;
4736-
$$ = (Node *)n;
4737-
}
4738-
| ALTER EXTENSION name add_drop VIEW any_name
4739-
{
4740-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4741-
n->extname = $3;
4742-
n->action = $4;
4743-
n->objtype = OBJECT_VIEW;
4744-
n->object = (Node *) $6;
4745-
$$ = (Node *)n;
4746-
}
4747-
| ALTER EXTENSION name add_drop MATERIALIZED VIEW any_name
4748-
{
4749-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4750-
n->extname = $3;
4751-
n->action = $4;
4752-
n->objtype = OBJECT_MATVIEW;
4753-
n->object = (Node *) $7;
4754-
$$ = (Node *)n;
4755-
}
4756-
| ALTER EXTENSION name add_drop FOREIGN TABLE any_name
4757-
{
4758-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4759-
n->extname = $3;
4760-
n->action = $4;
4761-
n->objtype = OBJECT_FOREIGN_TABLE;
4762-
n->object = (Node *) $7;
4763-
$$ = (Node *)n;
4764-
}
4765-
| ALTER EXTENSION name add_drop FOREIGN DATA_P WRAPPER name
4766-
{
4767-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4768-
n->extname = $3;
4769-
n->action = $4;
4770-
n->objtype = OBJECT_FDW;
4771-
n->object = (Node *) makeString($8);
4772-
$$ = (Node *)n;
4773-
}
4774-
| ALTER EXTENSION name add_drop SERVER name
4775-
{
4776-
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
4777-
n->extname = $3;
4778-
n->action = $4;
4779-
n->objtype = OBJECT_FOREIGN_SERVER;
4780-
n->object = (Node *) makeString($6);
4781-
$$ = (Node *)n;
4782-
}
47834648
| ALTER EXTENSION name add_drop TRANSFORM FOR Typename LANGUAGE name
47844649
{
47854650
AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);

src/test/modules/test_pg_dump/expected/test_pg_dump.out

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
CREATE ROLE regress_dump_test_role;
22
CREATE EXTENSION test_pg_dump;
33
ALTER EXTENSION test_pg_dump ADD DATABASE postgres; -- error
4-
ERROR: syntax error at or near "DATABASE"
5-
LINE 1: ALTER EXTENSION test_pg_dump ADD DATABASE postgres;
6-
^
4+
ERROR: cannot add an object of this type to an extension
75
CREATE TABLE test_pg_dump_t1 (c1 int, junk text);
86
ALTER TABLE test_pg_dump_t1 DROP COLUMN junk; -- to exercise dropped-col cases
97
CREATE VIEW test_pg_dump_v1 AS SELECT * FROM test_pg_dump_t1;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy