diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-02-09 11:55:32 -0500 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-02-09 11:56:37 -0500 |
| commit | 5bc178b89f3ab93fb3845a941769c212f5eeaf1a (patch) | |
| tree | 30f60f6497e97bf4c792bd581a3296aff5a6c5e5 /src/backend/parser | |
| parent | 70802e0dbef0af4bf73ce25489b8be6e40eca2be (diff) | |
Implement "ALTER EXTENSION ADD object".
This is an essential component of making the extension feature usable;
first because it's needed in the process of converting an existing
installation containing "loose" objects of an old contrib module into
the extension-based world, and second because we'll have to use it
in pg_dump --binary-upgrade, as per recent discussion.
Loosely based on part of Dimitri Fontaine's ALTER EXTENSION UPGRADE
patch.
Diffstat (limited to 'src/backend/parser')
| -rw-r--r-- | src/backend/parser/gram.y | 186 |
1 files changed, 185 insertions, 1 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 4c4536b9be3..a61f3dc7ba4 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -185,7 +185,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_ AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterEnumStmt AlterFdwStmt AlterForeignServerStmt AlterGroupStmt AlterObjectSchemaStmt AlterOwnerStmt AlterSeqStmt AlterTableStmt - AlterForeignTableStmt + AlterExtensionAddStmt AlterForeignTableStmt AlterCompositeTypeStmt AlterUserStmt AlterUserMappingStmt AlterUserSetStmt AlterRoleStmt AlterRoleSetStmt AlterDefaultPrivilegesStmt DefACLAction @@ -664,6 +664,7 @@ stmt : | AlterDefaultPrivilegesStmt | AlterDomainStmt | AlterEnumStmt + | AlterExtensionAddStmt | AlterFdwStmt | AlterForeignServerStmt | AlterForeignTableStmt @@ -3250,6 +3251,189 @@ create_extension_opt_item: /***************************************************************************** * + * ALTER EXTENSION name ADD object-identifier + * + *****************************************************************************/ + +AlterExtensionAddStmt: + ALTER EXTENSION name ADD_P AGGREGATE func_name aggr_args + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_AGGREGATE; + n->objname = $6; + n->objargs = $7; + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P CAST '(' Typename AS Typename ')' + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_CAST; + n->objname = list_make1($7); + n->objargs = list_make1($9); + $$ = (Node *) n; + } + | ALTER EXTENSION name ADD_P CONVERSION_P any_name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_CONVERSION; + n->objname = $6; + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P DOMAIN_P any_name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_DOMAIN; + n->objname = $6; + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P FUNCTION function_with_argtypes + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_FUNCTION; + n->objname = $6->funcname; + n->objargs = $6->funcargs; + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P opt_procedural LANGUAGE name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_LANGUAGE; + n->objname = list_make1(makeString($7)); + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P OPERATOR any_operator oper_argtypes + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_OPERATOR; + n->objname = $6; + n->objargs = $7; + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P OPERATOR CLASS any_name USING access_method + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_OPCLASS; + n->objname = $7; + n->objargs = list_make1(makeString($9)); + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P OPERATOR FAMILY any_name USING access_method + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_OPFAMILY; + n->objname = $7; + n->objargs = list_make1(makeString($9)); + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P SCHEMA name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_SCHEMA; + n->objname = list_make1(makeString($6)); + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P TABLE any_name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_TABLE; + n->objname = $6; + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P TEXT_P SEARCH PARSER any_name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_TSPARSER; + n->objname = $8; + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P TEXT_P SEARCH DICTIONARY any_name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_TSDICTIONARY; + n->objname = $8; + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P TEXT_P SEARCH TEMPLATE any_name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_TSTEMPLATE; + n->objname = $8; + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P TEXT_P SEARCH CONFIGURATION any_name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_TSCONFIGURATION; + n->objname = $8; + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P SEQUENCE any_name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_SEQUENCE; + n->objname = $6; + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P VIEW any_name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_VIEW; + n->objname = $6; + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P FOREIGN TABLE any_name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_FOREIGN_TABLE; + n->objname = $7; + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P FOREIGN DATA_P WRAPPER name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_FDW; + n->objname = list_make1(makeString($8)); + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P SERVER name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_FOREIGN_SERVER; + n->objname = list_make1(makeString($6)); + $$ = (Node *)n; + } + | ALTER EXTENSION name ADD_P TYPE_P any_name + { + AlterExtensionAddStmt *n = makeNode(AlterExtensionAddStmt); + n->extname = $3; + n->objtype = OBJECT_TYPE; + n->objname = $6; + $$ = (Node *)n; + } + ; + +/***************************************************************************** + * * QUERY: * CREATE FOREIGN DATA WRAPPER name [ VALIDATOR name ] * |
