Hello 2012/1/3 Robert Haas <robertmh...@gmail.com>: > On Tue, Jan 3, 2012 at 10:38 AM, Pavel Stehule <pavel.steh...@gmail.com> > wrote: >> Hello >> >> 2012/1/3 Robert Haas <robertmh...@gmail.com>: >>> On Mon, Jan 2, 2012 at 12:01 PM, Pavel Stehule <pavel.steh...@gmail.com> >>> wrote: >>>> here is updated patch >>> >>> I think the comments in parse_utilcmd.c probably need a bit of adjustment. >> >> I don't see it - there is only one comment and it is adjusted with >> "if" statement. >> >> please, show it > > Well, basically, the comment preceding the part you altered say "the > lock level requested here", but "here" is getting spread out quite a > bit more with this code change. Maybe that doesn't matter. > > However, on further examination, this is a pretty awkward way to write > the code. Why not something like this: > > rel = relation_openrv_extended(stmt->relation, lockmode, stmt->missing_ok); > if (rel == NULL) > { > ereport(...); > return NIL; > } > > Maybe the intent of sticking heap_openrv_extended() into the upper > branch of the if statement is to try to bounce relations that aren't > tables, but that's not actually what that function does (e.g. a > foreign table will slip through). And I think if we're going to have > IF EXISTS support for ALTER TABLE at all, we ought to have it for the > whole family of related statements: ALTER VIEW, ALTER SEQUENCE, ALTER > FOREIGN TABLE, etc., not just ALTER TABLE itself. >
jup, we can continue in enhancing step by step. I change a patch and now ALTER TABLE, ALTER INDEX, ALTER SEQUENCE and ALTER VIEW has IF EXISTS clause Regards Pavel > -- > Robert Haas > EnterpriseDB: http://www.enterprisedb.com > The Enterprise PostgreSQL Company
*** ./doc/src/sgml/ref/alter_index.sgml.orig 2012-01-02 17:01:00.000000000 +0100 --- ./doc/src/sgml/ref/alter_index.sgml 2012-01-03 19:45:24.210189185 +0100 *************** *** 21,30 **** <refsynopsisdiv> <synopsis> ! ALTER INDEX <replaceable class="PARAMETER">name</replaceable> RENAME TO <replaceable class="PARAMETER">new_name</replaceable> ! ALTER INDEX <replaceable class="PARAMETER">name</replaceable> SET TABLESPACE <replaceable class="PARAMETER">tablespace_name</replaceable> ! ALTER INDEX <replaceable class="PARAMETER">name</replaceable> SET ( <replaceable class="PARAMETER">storage_parameter</replaceable> = <replaceable class="PARAMETER">value</replaceable> [, ... ] ) ! ALTER INDEX <replaceable class="PARAMETER">name</replaceable> RESET ( <replaceable class="PARAMETER">storage_parameter</replaceable> [, ... ] ) </synopsis> </refsynopsisdiv> --- 21,30 ---- <refsynopsisdiv> <synopsis> ! ALTER INDEX [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> RENAME TO <replaceable class="PARAMETER">new_name</replaceable> ! ALTER INDEX [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> SET TABLESPACE <replaceable class="PARAMETER">tablespace_name</replaceable> ! ALTER INDEX [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> SET ( <replaceable class="PARAMETER">storage_parameter</replaceable> = <replaceable class="PARAMETER">value</replaceable> [, ... ] ) ! ALTER INDEX [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> RESET ( <replaceable class="PARAMETER">storage_parameter</replaceable> [, ... ] ) </synopsis> </refsynopsisdiv> *************** *** 38,43 **** --- 38,53 ---- <variablelist> <varlistentry> + <term><literal>IF EXISTS</literal></term> + <listitem> + <para> + Do not throw an error if the index does not exist. A notice is issued + in this case. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term><literal>RENAME</literal></term> <listitem> <para> *** ./doc/src/sgml/ref/alter_sequence.sgml.orig 2012-01-02 17:01:00.000000000 +0100 --- ./doc/src/sgml/ref/alter_sequence.sgml 2012-01-03 18:44:14.397429013 +0100 *************** *** 23,37 **** <refsynopsisdiv> <synopsis> ! ALTER SEQUENCE <replaceable class="parameter">name</replaceable> [ INCREMENT [ BY ] <replaceable class="parameter">increment</replaceable> ] [ MINVALUE <replaceable class="parameter">minvalue</replaceable> | NO MINVALUE ] [ MAXVALUE <replaceable class="parameter">maxvalue</replaceable> | NO MAXVALUE ] [ START [ WITH ] <replaceable class="parameter">start</replaceable> ] [ RESTART [ [ WITH ] <replaceable class="parameter">restart</replaceable> ] ] [ CACHE <replaceable class="parameter">cache</replaceable> ] [ [ NO ] CYCLE ] [ OWNED BY { <replaceable class="parameter">table</replaceable>.<replaceable class="parameter">column</replaceable> | NONE } ] ! ALTER SEQUENCE <replaceable class="parameter">name</replaceable> OWNER TO <replaceable class="PARAMETER">new_owner</replaceable> ! ALTER SEQUENCE <replaceable class="parameter">name</replaceable> RENAME TO <replaceable class="parameter">new_name</replaceable> ! ALTER SEQUENCE <replaceable class="parameter">name</replaceable> SET SCHEMA <replaceable class="parameter">new_schema</replaceable> </synopsis> </refsynopsisdiv> --- 23,37 ---- <refsynopsisdiv> <synopsis> ! ALTER SEQUENCE [ IF EXISTS ] <replaceable class="parameter">name</replaceable> [ INCREMENT [ BY ] <replaceable class="parameter">increment</replaceable> ] [ MINVALUE <replaceable class="parameter">minvalue</replaceable> | NO MINVALUE ] [ MAXVALUE <replaceable class="parameter">maxvalue</replaceable> | NO MAXVALUE ] [ START [ WITH ] <replaceable class="parameter">start</replaceable> ] [ RESTART [ [ WITH ] <replaceable class="parameter">restart</replaceable> ] ] [ CACHE <replaceable class="parameter">cache</replaceable> ] [ [ NO ] CYCLE ] [ OWNED BY { <replaceable class="parameter">table</replaceable>.<replaceable class="parameter">column</replaceable> | NONE } ] ! ALTER SEQUENCE [ IF EXISTS ] <replaceable class="parameter">name</replaceable> OWNER TO <replaceable class="PARAMETER">new_owner</replaceable> ! ALTER SEQUENCE [ IF EXISTS ] <replaceable class="parameter">name</replaceable> RENAME TO <replaceable class="parameter">new_name</replaceable> ! ALTER SEQUENCE [ IF EXISTS ] <replaceable class="parameter">name</replaceable> SET SCHEMA <replaceable class="parameter">new_schema</replaceable> </synopsis> </refsynopsisdiv> *************** *** 71,76 **** --- 71,86 ---- </varlistentry> <varlistentry> + <term><literal>IF EXISTS</literal></term> + <listitem> + <para> + Do not throw an error if the sequence does not exist. A notice is issued + in this case. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term><replaceable class="parameter">increment</replaceable></term> <listitem> <para> *** ./doc/src/sgml/ref/alter_table.sgml.orig 2012-01-02 17:04:00.295638725 +0100 --- ./doc/src/sgml/ref/alter_table.sgml 2012-01-02 17:52:24.153449002 +0100 *************** *** 21,33 **** <refsynopsisdiv> <synopsis> ! ALTER TABLE [ ONLY ] <replaceable class="PARAMETER">name</replaceable> [ * ] <replaceable class="PARAMETER">action</replaceable> [, ... ] ! ALTER TABLE [ ONLY ] <replaceable class="PARAMETER">name</replaceable> [ * ] RENAME [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> TO <replaceable class="PARAMETER">new_column</replaceable> ! ALTER TABLE <replaceable class="PARAMETER">name</replaceable> RENAME TO <replaceable class="PARAMETER">new_name</replaceable> ! ALTER TABLE <replaceable class="PARAMETER">name</replaceable> SET SCHEMA <replaceable class="PARAMETER">new_schema</replaceable> <phrase>where <replaceable class="PARAMETER">action</replaceable> is one of:</phrase> --- 21,33 ---- <refsynopsisdiv> <synopsis> ! ALTER TABLE [ IF EXISTS ] [ ONLY ] <replaceable class="PARAMETER">name</replaceable> [ * ] <replaceable class="PARAMETER">action</replaceable> [, ... ] ! ALTER TABLE [ IF EXISTS ] [ ONLY ] <replaceable class="PARAMETER">name</replaceable> [ * ] RENAME [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> TO <replaceable class="PARAMETER">new_column</replaceable> ! ALTER TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> RENAME TO <replaceable class="PARAMETER">new_name</replaceable> ! ALTER TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> SET SCHEMA <replaceable class="PARAMETER">new_schema</replaceable> <phrase>where <replaceable class="PARAMETER">action</replaceable> is one of:</phrase> *************** *** 110,115 **** --- 110,125 ---- </varlistentry> <varlistentry> + <term><literal>IF EXISTS</literal></term> + <listitem> + <para> + Do not throw an error if the table does not exist. A notice is issued + in this case. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term><literal>SET DATA TYPE</literal></term> <listitem> <para> *** ./doc/src/sgml/ref/alter_view.sgml.orig 2012-01-02 17:01:00.000000000 +0100 --- ./doc/src/sgml/ref/alter_view.sgml 2012-01-03 19:46:23.473185308 +0100 *************** *** 21,33 **** <refsynopsisdiv> <synopsis> ! ALTER VIEW <replaceable class="parameter">name</replaceable> ALTER [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> SET DEFAULT <replaceable class="PARAMETER">expression</replaceable> ! ALTER VIEW <replaceable class="parameter">name</replaceable> ALTER [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> DROP DEFAULT ! ALTER VIEW <replaceable class="parameter">name</replaceable> OWNER TO <replaceable class="PARAMETER">new_owner</replaceable> ! ALTER VIEW <replaceable class="parameter">name</replaceable> RENAME TO <replaceable class="parameter">new_name</replaceable> ! ALTER VIEW <replaceable class="parameter">name</replaceable> SET SCHEMA <replaceable class="parameter">new_schema</replaceable> ! ALTER VIEW <replaceable class="parameter">name</replaceable> SET ( <replaceable class="parameter">view_option_name</replaceable> [= <replaceable class="parameter">view_option_value</replaceable>] [, ... ] ) ! ALTER VIEW <replaceable class="parameter">name</replaceable> RESET ( <replaceable class="parameter">view_option_name</replaceable> [, ... ] ) </synopsis> </refsynopsisdiv> --- 21,33 ---- <refsynopsisdiv> <synopsis> ! ALTER VIEW [ IF EXISTS ] <replaceable class="parameter">name</replaceable> ALTER [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> SET DEFAULT <replaceable class="PARAMETER">expression</replaceable> ! ALTER VIEW [ IF EXISTS ] <replaceable class="parameter">name</replaceable> ALTER [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> DROP DEFAULT ! ALTER VIEW [ IF EXISTS ] <replaceable class="parameter">name</replaceable> OWNER TO <replaceable class="PARAMETER">new_owner</replaceable> ! ALTER VIEW [ IF EXISTS ] <replaceable class="parameter">name</replaceable> RENAME TO <replaceable class="parameter">new_name</replaceable> ! ALTER VIEW [ IF EXISTS ] <replaceable class="parameter">name</replaceable> SET SCHEMA <replaceable class="parameter">new_schema</replaceable> ! ALTER VIEW [ IF EXISTS ] <replaceable class="parameter">name</replaceable> SET ( <replaceable class="parameter">view_option_name</replaceable> [= <replaceable class="parameter">view_option_value</replaceable>] [, ... ] ) ! ALTER VIEW [ IF EXISTS ] <replaceable class="parameter">name</replaceable> RESET ( <replaceable class="parameter">view_option_name</replaceable> [, ... ] ) </synopsis> </refsynopsisdiv> *************** *** 66,71 **** --- 66,81 ---- </varlistentry> <varlistentry> + <term><literal>IF EXISTS</literal></term> + <listitem> + <para> + Do not throw an error if the view does not exist. A notice is issued + in this case. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term><literal>SET</literal>/<literal>DROP DEFAULT</literal></term> <listitem> <para> *** ./src/backend/commands/alter.c.orig 2012-01-02 17:01:00.000000000 +0100 --- ./src/backend/commands/alter.c 2012-01-03 20:00:08.007131425 +0100 *************** *** 193,199 **** case OBJECT_VIEW: case OBJECT_FOREIGN_TABLE: AlterTableNamespace(stmt->relation, stmt->newschema, ! stmt->objectType, AccessExclusiveLock); break; case OBJECT_TSPARSER: --- 193,200 ---- case OBJECT_VIEW: case OBJECT_FOREIGN_TABLE: AlterTableNamespace(stmt->relation, stmt->newschema, ! stmt->objectType, AccessExclusiveLock, ! stmt->missing_ok); break; case OBJECT_TSPARSER: *** ./src/backend/commands/sequence.c.orig 2012-01-02 17:01:00.000000000 +0100 --- ./src/backend/commands/sequence.c 2012-01-03 20:27:50.235022797 +0100 *************** *** 425,431 **** List *owned_by; /* Open and lock sequence. */ ! relid = RangeVarGetRelid(stmt->sequence, AccessShareLock, false); init_sequence(relid, &elm, &seqrel); /* allow ALTER to sequence owner only */ --- 425,439 ---- List *owned_by; /* Open and lock sequence. */ ! relid = RangeVarGetRelid(stmt->sequence, AccessShareLock, stmt->missing_ok); ! if (relid == InvalidOid) ! { ! ereport(NOTICE, ! (errmsg("relation \"%s\" does not exist, skipping", ! stmt->sequence->relname))); ! return; ! } ! init_sequence(relid, &elm, &seqrel); /* allow ALTER to sequence owner only */ *** ./src/backend/commands/tablecmds.c.orig 2012-01-02 17:01:00.000000000 +0100 --- ./src/backend/commands/tablecmds.c 2012-01-03 20:01:52.232124614 +0100 *************** *** 2409,2417 **** * lock escalation. */ relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, ! false, false, RangeVarCallbackForRenameRelation, (void *) stmt); /* Do the work */ RenameRelationInternal(relid, stmt->newname); --- 2409,2424 ---- * lock escalation. */ relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, ! stmt->missing_ok, false, RangeVarCallbackForRenameRelation, (void *) stmt); + if (relid == InvalidOid) + { + ereport(NOTICE, + (errmsg("relation \"%s\" does not exist, skipping", + stmt->relation->relname))); + return; + } /* Do the work */ RenameRelationInternal(relid, stmt->newname); *************** *** 9627,9633 **** */ void AlterTableNamespace(RangeVar *relation, const char *newschema, ! ObjectType stmttype, LOCKMODE lockmode) { Relation rel; Oid relid; --- 9634,9641 ---- */ void AlterTableNamespace(RangeVar *relation, const char *newschema, ! ObjectType stmttype, LOCKMODE lockmode, ! bool missing_ok) { Relation rel; Oid relid; *************** *** 9635,9643 **** Oid nspOid; Relation classRel; ! relid = RangeVarGetRelidExtended(relation, lockmode, false, false, RangeVarCallbackForAlterTableNamespace, (void *) &stmttype); rel = relation_open(relid, NoLock); oldNspOid = RelationGetNamespace(rel); --- 9643,9658 ---- Oid nspOid; Relation classRel; ! relid = RangeVarGetRelidExtended(relation, lockmode, missing_ok, false, RangeVarCallbackForAlterTableNamespace, (void *) &stmttype); + if (relid == InvalidOid) + { + ereport(NOTICE, + (errmsg("relation \"%s\" does not exist, skipping", + relation->relname))); + return; + } rel = relation_open(relid, NoLock); oldNspOid = RelationGetNamespace(rel); *** ./src/backend/nodes/copyfuncs.c.orig 2012-01-02 17:01:00.373650482 +0100 --- ./src/backend/nodes/copyfuncs.c 2012-01-03 20:15:14.371072201 +0100 *************** *** 2540,2545 **** --- 2540,2546 ---- COPY_NODE_FIELD(relation); COPY_NODE_FIELD(cmds); COPY_SCALAR_FIELD(relkind); + COPY_SCALAR_FIELD(missing_ok); return newnode; } *************** *** 2903,2908 **** --- 2904,2910 ---- COPY_STRING_FIELD(subname); COPY_STRING_FIELD(newname); COPY_SCALAR_FIELD(behavior); + COPY_SCALAR_FIELD(missing_ok); return newnode; } *************** *** 2918,2923 **** --- 2920,2926 ---- COPY_NODE_FIELD(objarg); COPY_STRING_FIELD(addname); COPY_STRING_FIELD(newschema); + COPY_SCALAR_FIELD(missing_ok); return newnode; } *************** *** 3221,3226 **** --- 3224,3230 ---- COPY_NODE_FIELD(sequence); COPY_NODE_FIELD(options); + COPY_SCALAR_FIELD(missing_ok); return newnode; } *** ./src/backend/nodes/equalfuncs.c.orig 2012-01-02 17:01:00.374650482 +0100 --- ./src/backend/nodes/equalfuncs.c 2012-01-03 20:15:30.763071125 +0100 *************** *** 1010,1015 **** --- 1010,1016 ---- COMPARE_NODE_FIELD(relation); COMPARE_NODE_FIELD(cmds); COMPARE_SCALAR_FIELD(relkind); + COMPARE_SCALAR_FIELD(missing_ok); return true; } *************** *** 1309,1314 **** --- 1310,1316 ---- COMPARE_STRING_FIELD(subname); COMPARE_STRING_FIELD(newname); COMPARE_SCALAR_FIELD(behavior); + COMPARE_SCALAR_FIELD(missing_ok); return true; } *************** *** 1322,1327 **** --- 1324,1330 ---- COMPARE_NODE_FIELD(objarg); COMPARE_STRING_FIELD(addname); COMPARE_STRING_FIELD(newschema); + COMPARE_SCALAR_FIELD(missing_ok); return true; } *************** *** 1575,1580 **** --- 1578,1584 ---- { COMPARE_NODE_FIELD(sequence); COMPARE_NODE_FIELD(options); + COMPARE_SCALAR_FIELD(missing_ok); return true; } *** ./src/backend/parser/gram.y.orig 2012-01-02 17:01:00.391650482 +0100 --- ./src/backend/parser/gram.y 2012-01-03 20:28:28.330020308 +0100 *************** *** 1629,1634 **** --- 1629,1644 ---- n->relation = $3; n->cmds = $4; n->relkind = OBJECT_TABLE; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER TABLE IF_P EXISTS relation_expr alter_table_cmds + { + AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $5; + n->cmds = $6; + n->relkind = OBJECT_TABLE; + n->missing_ok = true; $$ = (Node *)n; } | ALTER INDEX qualified_name alter_table_cmds *************** *** 1637,1642 **** --- 1647,1662 ---- n->relation = $3; n->cmds = $4; n->relkind = OBJECT_INDEX; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER INDEX IF_P EXISTS qualified_name alter_table_cmds + { + AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $5; + n->cmds = $6; + n->relkind = OBJECT_INDEX; + n->missing_ok = true; $$ = (Node *)n; } | ALTER SEQUENCE qualified_name alter_table_cmds *************** *** 1645,1650 **** --- 1665,1680 ---- n->relation = $3; n->cmds = $4; n->relkind = OBJECT_SEQUENCE; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER SEQUENCE IF_P EXISTS qualified_name alter_table_cmds + { + AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $5; + n->cmds = $6; + n->relkind = OBJECT_SEQUENCE; + n->missing_ok = true; $$ = (Node *)n; } | ALTER VIEW qualified_name alter_table_cmds *************** *** 1653,1658 **** --- 1683,1698 ---- n->relation = $3; n->cmds = $4; n->relkind = OBJECT_VIEW; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER VIEW IF_P EXISTS qualified_name alter_table_cmds + { + AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $5; + n->cmds = $6; + n->relkind = OBJECT_VIEW; + n->missing_ok = true; $$ = (Node *)n; } ; *************** *** 3076,3083 **** --- 3116,3133 ---- AlterSeqStmt *n = makeNode(AlterSeqStmt); n->sequence = $3; n->options = $4; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER SEQUENCE IF_P EXISTS qualified_name SeqOptList + { + AlterSeqStmt *n = makeNode(AlterSeqStmt); + n->sequence = $5; + n->options = $6; + n->missing_ok = true; $$ = (Node *)n; } + ; OptSeqOptList: SeqOptList { $$ = $1; } *************** *** 6425,6430 **** --- 6475,6481 ---- n->object = $3; n->objarg = $4; n->newname = $7; + n->missing_ok = false; $$ = (Node *)n; } | ALTER COLLATION any_name RENAME TO name *************** *** 6433,6438 **** --- 6484,6490 ---- n->renameType = OBJECT_COLLATION; n->object = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER CONVERSION_P any_name RENAME TO name *************** *** 6441,6446 **** --- 6493,6499 ---- n->renameType = OBJECT_CONVERSION; n->object = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER DATABASE database_name RENAME TO database_name *************** *** 6449,6454 **** --- 6502,6508 ---- n->renameType = OBJECT_DATABASE; n->subname = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER DOMAIN_P any_name RENAME TO name *************** *** 6457,6462 **** --- 6511,6517 ---- n->renameType = OBJECT_DOMAIN; n->object = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER FOREIGN DATA_P WRAPPER name RENAME TO name *************** *** 6465,6470 **** --- 6520,6526 ---- n->renameType = OBJECT_FDW; n->subname = $5; n->newname = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER FUNCTION function_with_argtypes RENAME TO name *************** *** 6474,6479 **** --- 6530,6536 ---- n->object = $3->funcname; n->objarg = $3->funcargs; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER GROUP_P RoleId RENAME TO RoleId *************** *** 6482,6487 **** --- 6539,6545 ---- n->renameType = OBJECT_ROLE; n->subname = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER opt_procedural LANGUAGE name RENAME TO name *************** *** 6490,6495 **** --- 6548,6554 ---- n->renameType = OBJECT_LANGUAGE; n->subname = $4; n->newname = $7; + n->missing_ok = false; $$ = (Node *)n; } | ALTER OPERATOR CLASS any_name USING access_method RENAME TO name *************** *** 6499,6504 **** --- 6558,6564 ---- n->object = $4; n->subname = $6; n->newname = $9; + n->missing_ok = false; $$ = (Node *)n; } | ALTER OPERATOR FAMILY any_name USING access_method RENAME TO name *************** *** 6508,6513 **** --- 6568,6574 ---- n->object = $4; n->subname = $6; n->newname = $9; + n->missing_ok = false; $$ = (Node *)n; } | ALTER SCHEMA name RENAME TO name *************** *** 6516,6521 **** --- 6577,6583 ---- n->renameType = OBJECT_SCHEMA; n->subname = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER SERVER name RENAME TO name *************** *** 6524,6529 **** --- 6586,6592 ---- n->renameType = OBJECT_FOREIGN_SERVER; n->subname = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TABLE relation_expr RENAME TO name *************** *** 6533,6538 **** --- 6596,6612 ---- n->relation = $3; n->subname = NULL; n->newname = $6; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER TABLE IF_P EXISTS relation_expr RENAME TO name + { + RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_TABLE; + n->relation = $5; + n->subname = NULL; + n->newname = $8; + n->missing_ok = true; $$ = (Node *)n; } | ALTER SEQUENCE qualified_name RENAME TO name *************** *** 6542,6547 **** --- 6616,6632 ---- n->relation = $3; n->subname = NULL; n->newname = $6; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER SEQUENCE IF_P EXISTS qualified_name RENAME TO name + { + RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_SEQUENCE; + n->relation = $5; + n->subname = NULL; + n->newname = $8; + n->missing_ok = true; $$ = (Node *)n; } | ALTER VIEW qualified_name RENAME TO name *************** *** 6551,6556 **** --- 6636,6652 ---- n->relation = $3; n->subname = NULL; n->newname = $6; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER VIEW IF_P EXISTS qualified_name RENAME TO name + { + RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_VIEW; + n->relation = $5; + n->subname = NULL; + n->newname = $8; + n->missing_ok = true; $$ = (Node *)n; } | ALTER INDEX qualified_name RENAME TO name *************** *** 6560,6565 **** --- 6656,6672 ---- n->relation = $3; n->subname = NULL; n->newname = $6; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER INDEX IF_P EXISTS qualified_name RENAME TO name + { + RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_INDEX; + n->relation = $5; + n->subname = NULL; + n->newname = $8; + n->missing_ok = true; $$ = (Node *)n; } | ALTER FOREIGN TABLE relation_expr RENAME TO name *************** *** 6569,6574 **** --- 6676,6682 ---- n->relation = $4; n->subname = NULL; n->newname = $7; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TABLE relation_expr RENAME opt_column name TO name *************** *** 6579,6584 **** --- 6687,6693 ---- n->relation = $3; n->subname = $6; n->newname = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER FOREIGN TABLE relation_expr RENAME opt_column name TO name *************** *** 6589,6594 **** --- 6698,6704 ---- n->relation = $4; n->subname = $7; n->newname = $9; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TRIGGER name ON qualified_name RENAME TO name *************** *** 6598,6603 **** --- 6708,6714 ---- n->relation = $5; n->subname = $3; n->newname = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER ROLE RoleId RENAME TO RoleId *************** *** 6606,6611 **** --- 6717,6723 ---- n->renameType = OBJECT_ROLE; n->subname = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER USER RoleId RENAME TO RoleId *************** *** 6614,6619 **** --- 6726,6732 ---- n->renameType = OBJECT_ROLE; n->subname = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TABLESPACE name RENAME TO name *************** *** 6622,6627 **** --- 6735,6741 ---- n->renameType = OBJECT_TABLESPACE; n->subname = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TABLESPACE name SET reloptions *************** *** 6648,6653 **** --- 6762,6768 ---- n->renameType = OBJECT_TSPARSER; n->object = $5; n->newname = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TEXT_P SEARCH DICTIONARY any_name RENAME TO name *************** *** 6656,6661 **** --- 6771,6777 ---- n->renameType = OBJECT_TSDICTIONARY; n->object = $5; n->newname = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TEXT_P SEARCH TEMPLATE any_name RENAME TO name *************** *** 6664,6669 **** --- 6780,6786 ---- n->renameType = OBJECT_TSTEMPLATE; n->object = $5; n->newname = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TEXT_P SEARCH CONFIGURATION any_name RENAME TO name *************** *** 6672,6677 **** --- 6789,6795 ---- n->renameType = OBJECT_TSCONFIGURATION; n->object = $5; n->newname = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TYPE_P any_name RENAME TO name *************** *** 6680,6685 **** --- 6798,6804 ---- n->renameType = OBJECT_TYPE; n->object = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TYPE_P any_name RENAME ATTRIBUTE name TO name opt_drop_behavior *************** *** 6691,6696 **** --- 6810,6816 ---- n->subname = $6; n->newname = $8; n->behavior = $9; + n->missing_ok = false; $$ = (Node *)n; } ; *************** *** 6717,6722 **** --- 6837,6843 ---- n->object = $3; n->objarg = $4; n->newschema = $7; + n->missing_ok = false; $$ = (Node *)n; } | ALTER COLLATION any_name SET SCHEMA name *************** *** 6725,6730 **** --- 6846,6852 ---- n->objectType = OBJECT_COLLATION; n->object = $3; n->newschema = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER CONVERSION_P any_name SET SCHEMA name *************** *** 6733,6738 **** --- 6855,6861 ---- n->objectType = OBJECT_CONVERSION; n->object = $3; n->newschema = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER DOMAIN_P any_name SET SCHEMA name *************** *** 6741,6746 **** --- 6864,6870 ---- n->objectType = OBJECT_DOMAIN; n->object = $3; n->newschema = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER EXTENSION any_name SET SCHEMA name *************** *** 6749,6754 **** --- 6873,6879 ---- n->objectType = OBJECT_EXTENSION; n->object = $3; n->newschema = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER FUNCTION function_with_argtypes SET SCHEMA name *************** *** 6758,6763 **** --- 6883,6889 ---- n->object = $3->funcname; n->objarg = $3->funcargs; n->newschema = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER OPERATOR any_operator oper_argtypes SET SCHEMA name *************** *** 6767,6772 **** --- 6893,6899 ---- n->object = $3; n->objarg = $4; n->newschema = $7; + n->missing_ok = false; $$ = (Node *)n; } | ALTER OPERATOR CLASS any_name USING access_method SET SCHEMA name *************** *** 6776,6781 **** --- 6903,6909 ---- n->object = $4; n->addname = $6; n->newschema = $9; + n->missing_ok = false; $$ = (Node *)n; } | ALTER OPERATOR FAMILY any_name USING access_method SET SCHEMA name *************** *** 6785,6790 **** --- 6913,6919 ---- n->object = $4; n->addname = $6; n->newschema = $9; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TABLE relation_expr SET SCHEMA name *************** *** 6793,6798 **** --- 6922,6937 ---- n->objectType = OBJECT_TABLE; n->relation = $3; n->newschema = $6; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER TABLE IF_P EXISTS relation_expr SET SCHEMA name + { + AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_TABLE; + n->relation = $5; + n->newschema = $8; + n->missing_ok = true; $$ = (Node *)n; } | ALTER TEXT_P SEARCH PARSER any_name SET SCHEMA name *************** *** 6801,6806 **** --- 6940,6946 ---- n->objectType = OBJECT_TSPARSER; n->object = $5; n->newschema = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TEXT_P SEARCH DICTIONARY any_name SET SCHEMA name *************** *** 6809,6814 **** --- 6949,6955 ---- n->objectType = OBJECT_TSDICTIONARY; n->object = $5; n->newschema = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TEXT_P SEARCH TEMPLATE any_name SET SCHEMA name *************** *** 6817,6822 **** --- 6958,6964 ---- n->objectType = OBJECT_TSTEMPLATE; n->object = $5; n->newschema = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TEXT_P SEARCH CONFIGURATION any_name SET SCHEMA name *************** *** 6825,6830 **** --- 6967,6973 ---- n->objectType = OBJECT_TSCONFIGURATION; n->object = $5; n->newschema = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER SEQUENCE qualified_name SET SCHEMA name *************** *** 6833,6838 **** --- 6976,6991 ---- n->objectType = OBJECT_SEQUENCE; n->relation = $3; n->newschema = $6; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER SEQUENCE IF_P EXISTS qualified_name SET SCHEMA name + { + AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_SEQUENCE; + n->relation = $5; + n->newschema = $8; + n->missing_ok = true; $$ = (Node *)n; } | ALTER VIEW qualified_name SET SCHEMA name *************** *** 6841,6846 **** --- 6994,7009 ---- n->objectType = OBJECT_VIEW; n->relation = $3; n->newschema = $6; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER VIEW IF_P EXISTS qualified_name SET SCHEMA name + { + AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_VIEW; + n->relation = $5; + n->newschema = $8; + n->missing_ok = true; $$ = (Node *)n; } | ALTER FOREIGN TABLE relation_expr SET SCHEMA name *************** *** 6849,6854 **** --- 7012,7018 ---- n->objectType = OBJECT_FOREIGN_TABLE; n->relation = $4; n->newschema = $7; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TYPE_P any_name SET SCHEMA name *************** *** 6857,6862 **** --- 7021,7027 ---- n->objectType = OBJECT_TYPE; n->object = $3; n->newschema = $6; + n->missing_ok = false; $$ = (Node *)n; } ; *** ./src/backend/parser/parse_utilcmd.c.orig 2012-01-02 17:01:00.395650481 +0100 --- ./src/backend/parser/parse_utilcmd.c 2012-01-03 18:42:36.189435428 +0100 *************** *** 2285,2291 **** * new commands we add after this must not upgrade the lock level * requested here. */ ! rel = relation_openrv(stmt->relation, lockmode); /* Set up pstate and CreateStmtContext */ pstate = make_parsestate(NULL); --- 2285,2299 ---- * new commands we add after this must not upgrade the lock level * requested here. */ ! rel = relation_openrv_extended(stmt->relation, lockmode, stmt->missing_ok); ! if (rel == NULL) ! { ! /* this message is consistent with relation_openrv */ ! ereport(NOTICE, ! (errmsg("relation \"%s\" does not exist, skipping", ! stmt->relation->relname))); ! return NIL; ! } /* Set up pstate and CreateStmtContext */ pstate = make_parsestate(NULL); *** ./src/include/commands/tablecmds.h.orig 2012-01-02 17:01:00.000000000 +0100 --- ./src/include/commands/tablecmds.h 2012-01-03 20:02:37.791121635 +0100 *************** *** 33,39 **** extern void AlterTableInternal(Oid relid, List *cmds, bool recurse); extern void AlterTableNamespace(RangeVar *relation, const char *newschema, ! ObjectType stmttype, LOCKMODE lockmode); extern void AlterRelationNamespaceInternal(Relation classRel, Oid relOid, Oid oldNspOid, Oid newNspOid, --- 33,40 ---- extern void AlterTableInternal(Oid relid, List *cmds, bool recurse); extern void AlterTableNamespace(RangeVar *relation, const char *newschema, ! ObjectType stmttype, LOCKMODE lockmode, ! bool missing_ok); extern void AlterRelationNamespaceInternal(Relation classRel, Oid relOid, Oid oldNspOid, Oid newNspOid, *** ./src/include/nodes/parsenodes.h.orig 2012-01-02 17:01:00.599650468 +0100 --- ./src/include/nodes/parsenodes.h 2012-01-03 20:15:59.041069245 +0100 *************** *** 1171,1176 **** --- 1171,1177 ---- RangeVar *relation; /* table to work on */ List *cmds; /* list of subcommands */ ObjectType relkind; /* type of object */ + bool missing_ok; /* skip error if table missing */ } AlterTableStmt; typedef enum AlterTableType *************** *** 1806,1811 **** --- 1807,1813 ---- NodeTag type; RangeVar *sequence; /* the sequence to alter */ List *options; + bool missing_ok; /* skip error if a role is missing? */ } AlterSeqStmt; /* ---------------------- *************** *** 2116,2121 **** --- 2118,2124 ---- * trigger, etc) */ char *newname; /* the new name */ DropBehavior behavior; /* RESTRICT or CASCADE behavior */ + bool missing_ok; /* skip error if missing? */ } RenameStmt; /* ---------------------- *************** *** 2131,2136 **** --- 2134,2140 ---- List *objarg; /* argument types, if applicable */ char *addname; /* additional name if needed */ char *newschema; /* the new schema */ + bool missing_ok; /* skip error if missing? */ } AlterObjectSchemaStmt; /* ---------------------- *** ./src/test/regress/expected/alter_table.out.orig 2012-01-02 17:01:00.000000000 +0100 --- ./src/test/regress/expected/alter_table.out 2012-01-03 20:41:54.000000000 +0100 *************** *** 128,133 **** --- 128,137 ---- DROP TABLE tmp_new2; -- ALTER TABLE ... RENAME on non-table relations -- renaming indexes (FIXME: this should probably test the index's functionality) + ALTER INDEX IF EXISTS __onek_unique1 RENAME TO tmp_onek_unique1; + NOTICE: relation "__onek_unique1" does not exist, skipping + ALTER INDEX IF EXISTS __tmp_onek_unique1 RENAME TO onek_unique1; + NOTICE: relation "__tmp_onek_unique1" does not exist, skipping ALTER INDEX onek_unique1 RENAME TO tmp_onek_unique1; ALTER INDEX tmp_onek_unique1 RENAME TO onek_unique1; -- renaming views *************** *** 2130,2132 **** --- 2134,2150 ---- DETAIL: Failing row contains (null). DROP TABLE test_drop_constr_parent CASCADE; NOTICE: drop cascades to table test_drop_constr_child + -- + -- IF EXISTS test + -- + ALTER TABLE IF EXISTS tt8 ADD COLUMN f int; + NOTICE: relation "tt8" does not exist, skipping + CREATE TABLE tt8(a int); + ALTER TABLE IF EXISTS tt8 ADD COLUMN f int; + \d tt8 + Table "public.tt8" + Column | Type | Modifiers + --------+---------+----------- + a | integer | + f | integer | + *** ./src/test/regress/expected/sequence.out.orig 2012-01-02 17:01:00.000000000 +0100 --- ./src/test/regress/expected/sequence.out 2012-01-03 20:41:53.000000000 +0100 *************** *** 241,246 **** --- 241,249 ---- -- -- Alter sequence -- + ALTER SEQUENCE IF EXISTS sequence_test2 RESTART WITH 24 + INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE; + NOTICE: relation "sequence_test2" does not exist, skipping CREATE SEQUENCE sequence_test2 START WITH 32; SELECT nextval('sequence_test2'); nextval *** ./src/test/regress/sql/alter_table.sql.orig 2012-01-02 17:01:00.000000000 +0100 --- ./src/test/regress/sql/alter_table.sql 2012-01-03 20:41:35.207968887 +0100 *************** *** 166,171 **** --- 166,174 ---- -- ALTER TABLE ... RENAME on non-table relations -- renaming indexes (FIXME: this should probably test the index's functionality) + ALTER INDEX IF EXISTS __onek_unique1 RENAME TO tmp_onek_unique1; + ALTER INDEX IF EXISTS __tmp_onek_unique1 RENAME TO onek_unique1; + ALTER INDEX onek_unique1 RENAME TO tmp_onek_unique1; ALTER INDEX tmp_onek_unique1 RENAME TO onek_unique1; -- renaming views *************** *** 1463,1465 **** --- 1466,1478 ---- -- should fail INSERT INTO test_drop_constr_child (c) VALUES (NULL); DROP TABLE test_drop_constr_parent CASCADE; + + + -- + -- IF EXISTS test + -- + ALTER TABLE IF EXISTS tt8 ADD COLUMN f int; + + CREATE TABLE tt8(a int); + ALTER TABLE IF EXISTS tt8 ADD COLUMN f int; + \d tt8 *** ./src/test/regress/sql/sequence.sql.orig 2012-01-02 17:01:00.000000000 +0100 --- ./src/test/regress/sql/sequence.sql 2012-01-03 18:12:02.702555250 +0100 *************** *** 113,118 **** --- 113,122 ---- -- -- Alter sequence -- + + ALTER SEQUENCE IF EXISTS sequence_test2 RESTART WITH 24 + INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE; + CREATE SEQUENCE sequence_test2 START WITH 32; SELECT nextval('sequence_test2');
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers