Hello
2012/1/3 Robert Haas <[email protected]>:
> On Tue, Jan 3, 2012 at 10:38 AM, Pavel Stehule <[email protected]>
> wrote:
>> Hello
>>
>> 2012/1/3 Robert Haas <[email protected]>:
>>> On Mon, Jan 2, 2012 at 12:01 PM, Pavel Stehule <[email protected]>
>>> 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 ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers