diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2010-09-26 14:41:03 +0300 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2010-09-26 14:41:03 +0300 |
commit | e440e12c562432a2a695b8054964fb34e3bd823e (patch) | |
tree | 9f075dbc9e292746f81390f0f44803090bf73d07 /src/backend/parser | |
parent | 899beb78941aa955aac2e19cb82458c6f4c7dd52 (diff) | |
download | postgresql-e440e12c562432a2a695b8054964fb34e3bd823e.tar.gz postgresql-e440e12c562432a2a695b8054964fb34e3bd823e.zip |
Add ALTER TYPE ... ADD/DROP/ALTER/RENAME ATTRIBUTE
Like with tables, this also requires allowing the existence of
composite types with zero attributes.
reviewed by KaiGai Kohei
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/gram.y | 165 | ||||
-rw-r--r-- | src/backend/parser/parse_utilcmd.c | 3 |
2 files changed, 134 insertions, 34 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 22ce35382bc..40bd7a39325 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -131,6 +131,7 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args, int location); static List *mergeTableFuncParameters(List *func_args, List *columns); static TypeName *TableFuncTypeName(List *columns); +static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner); %} @@ -184,7 +185,7 @@ static TypeName *TableFuncTypeName(List *columns); AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterFdwStmt AlterForeignServerStmt AlterGroupStmt AlterObjectSchemaStmt AlterOwnerStmt AlterSeqStmt AlterTableStmt - AlterUserStmt AlterUserMappingStmt AlterUserSetStmt + AlterCompositeTypeStmt AlterUserStmt AlterUserMappingStmt AlterUserSetStmt AlterRoleStmt AlterRoleSetStmt AlterDefaultPrivilegesStmt DefACLAction AnalyzeStmt ClosePortalStmt ClusterStmt CommentStmt @@ -218,8 +219,8 @@ static TypeName *TableFuncTypeName(List *columns); %type <node> alter_column_default opclass_item opclass_drop alter_using %type <ival> add_drop opt_asc_desc opt_nulls_order -%type <node> alter_table_cmd -%type <list> alter_table_cmds +%type <node> alter_table_cmd alter_type_cmd +%type <list> alter_table_cmds alter_type_cmds %type <dbehavior> opt_drop_behavior @@ -295,7 +296,7 @@ static TypeName *TableFuncTypeName(List *columns); reloption_list group_clause TriggerFuncArgs select_limit opt_select_limit opclass_item_list opclass_drop_list opt_opfamily transaction_mode_list_or_empty - TableFuncElementList opt_type_modifiers + OptTableFuncElementList TableFuncElementList opt_type_modifiers prep_type_clause execute_param_clause using_clause returning_clause opt_enum_val_list enum_val_list table_func_column_list @@ -462,7 +463,7 @@ static TypeName *TableFuncTypeName(List *columns); /* ordinary key words in alphabetical order */ %token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER AGGREGATE ALL ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARRAY AS ASC - ASSERTION ASSIGNMENT ASYMMETRIC AT AUTHORIZATION + ASSERTION ASSIGNMENT ASYMMETRIC AT ATTRIBUTE AUTHORIZATION BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT BOOLEAN_P BOTH BY @@ -657,6 +658,7 @@ stmt : | AlterOwnerStmt | AlterSeqStmt | AlterTableStmt + | AlterCompositeTypeStmt | AlterRoleSetStmt | AlterRoleStmt | AlterTSConfigurationStmt @@ -1970,6 +1972,72 @@ reloption_elem: /***************************************************************************** * + * ALTER TYPE + * + * really variants of the ALTER TABLE subcommands with different spellings + *****************************************************************************/ + +AlterCompositeTypeStmt: + ALTER TYPE_P any_name alter_type_cmds + { + AlterTableStmt *n = makeNode(AlterTableStmt); + + /* can't use qualified_name, sigh */ + n->relation = makeRangeVarFromAnyName($3, @3, yyscanner); + n->cmds = $4; + n->relkind = OBJECT_TYPE; + $$ = (Node *)n; + } + ; + +alter_type_cmds: + alter_type_cmd { $$ = list_make1($1); } + | alter_type_cmds ',' alter_type_cmd { $$ = lappend($1, $3); } + ; + +alter_type_cmd: + /* ALTER TYPE <name> ADD ATTRIBUTE <coldef> */ + ADD_P ATTRIBUTE TableFuncElement + { + AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_AddColumn; + n->def = $3; + $$ = (Node *)n; + } + /* ALTER TYPE <name> DROP ATTRIBUTE IF EXISTS <attname> */ + | DROP ATTRIBUTE IF_P EXISTS ColId + { + AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropColumn; + n->name = $5; + n->behavior = DROP_RESTRICT; /* currently no effect */ + n->missing_ok = TRUE; + $$ = (Node *)n; + } + /* ALTER TYPE <name> DROP ATTRIBUTE <attname> */ + | DROP ATTRIBUTE ColId opt_drop_behavior + { + AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropColumn; + n->name = $3; + n->behavior = DROP_RESTRICT; /* currently no effect */ + n->missing_ok = FALSE; + $$ = (Node *)n; + } + /* ALTER TYPE <name> ALTER ATTRIBUTE <attname> [SET DATA] TYPE <typename> */ + | ALTER ATTRIBUTE ColId opt_set_data TYPE_P Typename + { + AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_AlterColumnType; + n->name = $3; + n->def = (Node *) $6; + $$ = (Node *)n; + } + ; + + +/***************************************************************************** + * * QUERY : * close <portalname> * @@ -3678,39 +3746,12 @@ DefineStmt: n->definition = NIL; $$ = (Node *)n; } - | CREATE TYPE_P any_name AS '(' TableFuncElementList ')' + | CREATE TYPE_P any_name AS '(' OptTableFuncElementList ')' { CompositeTypeStmt *n = makeNode(CompositeTypeStmt); - RangeVar *r = makeNode(RangeVar); /* can't use qualified_name, sigh */ - switch (list_length($3)) - { - case 1: - r->catalogname = NULL; - r->schemaname = NULL; - r->relname = strVal(linitial($3)); - break; - case 2: - r->catalogname = NULL; - r->schemaname = strVal(linitial($3)); - r->relname = strVal(lsecond($3)); - break; - case 3: - r->catalogname = strVal(linitial($3)); - r->schemaname = strVal(lsecond($3)); - r->relname = strVal(lthird($3)); - break; - default: - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("improper qualified name (too many dotted names): %s", - NameListToString($3)), - parser_errposition(@3))); - break; - } - r->location = @3; - n->typevar = r; + n->typevar = makeRangeVarFromAnyName($3, @3, yyscanner); n->coldeflist = $6; $$ = (Node *)n; } @@ -5836,6 +5877,15 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->newname = $6; $$ = (Node *)n; } + | ALTER TYPE_P any_name RENAME ATTRIBUTE name TO name + { + RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_ATTRIBUTE; + n->relation = makeRangeVarFromAnyName($3, @3, yyscanner); + n->subname = $6; + n->newname = $8; + $$ = (Node *)n; + } ; opt_column: COLUMN { $$ = COLUMN; } @@ -8216,6 +8266,11 @@ where_or_current_clause: ; +OptTableFuncElementList: + TableFuncElementList { $$ = $1; } + | /*EMPTY*/ { $$ = NIL; } + ; + TableFuncElementList: TableFuncElement { @@ -10897,6 +10952,7 @@ unreserved_keyword: | ASSERTION | ASSIGNMENT | AT + | ATTRIBUTE | BACKWARD | BEFORE | BEGIN_P @@ -11858,6 +11914,47 @@ TableFuncTypeName(List *columns) } /* + * Convert a list of (dotted) names to a RangeVar (like + * makeRangeVarFromNameList, but with position support). The + * "AnyName" refers to the any_name production in the grammar. + */ +static RangeVar * +makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner) +{ + RangeVar *r = makeNode(RangeVar); + + switch (list_length(names)) + { + case 1: + r->catalogname = NULL; + r->schemaname = NULL; + r->relname = strVal(linitial(names)); + break; + case 2: + r->catalogname = NULL; + r->schemaname = strVal(linitial(names)); + r->relname = strVal(lsecond(names)); + break; + case 3: + r->catalogname = strVal(linitial(names));; + r->schemaname = strVal(lsecond(names)); + r->relname = strVal(lthird(names)); + break; + default: + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("improper qualified name (too many dotted names): %s", + NameListToString(names)), + parser_errposition(position))); + break; + } + + r->location = position; + + return r; +} + +/* * Must undefine this stuff before including scan.c, since it has different * definitions for these macros. */ diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index 552a6af8f87..37ca331c215 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -839,6 +839,9 @@ transformOfType(ParseState *pstate, CreateStmtContext *cxt, TypeName *ofTypename Form_pg_attribute attr = tupdesc->attrs[i]; ColumnDef *n = makeNode(ColumnDef); + if (attr->attisdropped) + continue; + n->colname = pstrdup(NameStr(attr->attname)); n->typeName = makeTypeNameFromOid(attr->atttypid, attr->atttypmod); n->constraints = NULL; |