From b8a91d9d1c7ec75aaecf13df687ec7b5b0ed35a6 Mon Sep 17 00:00:00 2001 From: Simon Riggs Date: Mon, 23 Jan 2012 23:25:04 +0000 Subject: [PATCH] ALTER [IF EXISTS] ... allows silent DDL if required, e.g. ALTER FOREIGN TABLE IF EXISTS foo RENAME TO bar Pavel Stehule --- doc/src/sgml/ref/alter_foreign_table.sgml | 18 +- doc/src/sgml/ref/alter_index.sgml | 18 +- doc/src/sgml/ref/alter_sequence.sgml | 18 +- doc/src/sgml/ref/alter_table.sgml | 18 +- doc/src/sgml/ref/alter_view.sgml | 24 ++- src/backend/commands/sequence.c | 10 +- src/backend/commands/tablecmds.c | 34 +++- src/backend/nodes/copyfuncs.c | 4 + src/backend/nodes/equalfuncs.c | 4 + src/backend/parser/gram.y | 216 +++++++++++++++++++++ src/backend/parser/parse_utilcmd.c | 10 +- src/backend/tcop/utility.c | 53 ++--- src/include/nodes/parsenodes.h | 4 + src/test/regress/expected/alter_table.out | 46 +++++ src/test/regress/expected/foreign_data.out | 44 +++++ src/test/regress/expected/sequence.out | 3 + src/test/regress/sql/alter_table.sql | 32 +++ src/test/regress/sql/foreign_data.sql | 26 +++ src/test/regress/sql/sequence.sql | 4 + 19 files changed, 534 insertions(+), 52 deletions(-) diff --git a/doc/src/sgml/ref/alter_foreign_table.sgml b/doc/src/sgml/ref/alter_foreign_table.sgml index 99e8e906d2..455527c5bf 100644 --- a/doc/src/sgml/ref/alter_foreign_table.sgml +++ b/doc/src/sgml/ref/alter_foreign_table.sgml @@ -21,13 +21,13 @@ PostgreSQL documentation -ALTER FOREIGN TABLE name +ALTER FOREIGN TABLE [ IF EXISTS ] name action [, ... ] -ALTER FOREIGN TABLE name +ALTER FOREIGN TABLE [ IF EXISTS ] name RENAME [ COLUMN ] column TO new_column -ALTER FOREIGN TABLE name +ALTER FOREIGN TABLE [ IF EXISTS ] name RENAME TO new_name -ALTER FOREIGN TABLE name +ALTER FOREIGN TABLE [ IF EXISTS ] name SET SCHEMA new_schema where action is one of: @@ -75,6 +75,16 @@ ALTER FOREIGN TABLE name + + IF EXISTS + + + Do not throw an error if the sequence does not exist. A notice is issued + in this case. + + + + SET DATA TYPE diff --git a/doc/src/sgml/ref/alter_index.sgml b/doc/src/sgml/ref/alter_index.sgml index c701d165b8..d210077036 100644 --- a/doc/src/sgml/ref/alter_index.sgml +++ b/doc/src/sgml/ref/alter_index.sgml @@ -21,10 +21,10 @@ PostgreSQL documentation -ALTER INDEX name RENAME TO new_name -ALTER INDEX name SET TABLESPACE tablespace_name -ALTER INDEX name SET ( storage_parameter = value [, ... ] ) -ALTER INDEX name RESET ( storage_parameter [, ... ] ) +ALTER INDEX [ IF EXISTS ] name RENAME TO new_name +ALTER INDEX [ IF EXISTS ] name SET TABLESPACE tablespace_name +ALTER INDEX [ IF EXISTS ] name SET ( storage_parameter = value [, ... ] ) +ALTER INDEX [ IF EXISTS ] name RESET ( storage_parameter [, ... ] ) @@ -37,6 +37,16 @@ ALTER INDEX name RESET ( + + IF EXISTS + + + Do not throw an error if the index does not exist. A notice is issued + in this case. + + + + RENAME diff --git a/doc/src/sgml/ref/alter_sequence.sgml b/doc/src/sgml/ref/alter_sequence.sgml index 79795d9db0..6ddd461fe9 100644 --- a/doc/src/sgml/ref/alter_sequence.sgml +++ b/doc/src/sgml/ref/alter_sequence.sgml @@ -23,15 +23,15 @@ PostgreSQL documentation -ALTER SEQUENCE name [ INCREMENT [ BY ] increment ] +ALTER SEQUENCE [ IF EXISTS ] name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] [ START [ WITH ] start ] [ RESTART [ [ WITH ] restart ] ] [ CACHE cache ] [ [ NO ] CYCLE ] [ OWNED BY { table.column | NONE } ] -ALTER SEQUENCE name OWNER TO new_owner -ALTER SEQUENCE name RENAME TO new_name -ALTER SEQUENCE name SET SCHEMA new_schema +ALTER SEQUENCE [ IF EXISTS ] name OWNER TO new_owner +ALTER SEQUENCE [ IF EXISTS ] name RENAME TO new_name +ALTER SEQUENCE [ IF EXISTS ] name SET SCHEMA new_schema @@ -70,6 +70,16 @@ ALTER SEQUENCE name SET SCHEMA + + IF EXISTS + + + Do not throw an error if the sequence does not exist. A notice is issued + in this case. + + + + increment diff --git a/doc/src/sgml/ref/alter_table.sgml b/doc/src/sgml/ref/alter_table.sgml index 6f1917f5c4..951b63b5b4 100644 --- a/doc/src/sgml/ref/alter_table.sgml +++ b/doc/src/sgml/ref/alter_table.sgml @@ -21,13 +21,13 @@ PostgreSQL documentation -ALTER TABLE [ ONLY ] name [ * ] +ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] action [, ... ] -ALTER TABLE [ ONLY ] name [ * ] +ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] RENAME [ COLUMN ] column TO new_column -ALTER TABLE name +ALTER TABLE [ IF EXISTS ] name RENAME TO new_name -ALTER TABLE name +ALTER TABLE [ IF EXISTS ] name SET SCHEMA new_schema where action is one of: @@ -109,6 +109,16 @@ ALTER TABLE name + + IF EXISTS + + + Do not throw an error if the table does not exist. A notice is issued + in this case. + + + + SET DATA TYPE diff --git a/doc/src/sgml/ref/alter_view.sgml b/doc/src/sgml/ref/alter_view.sgml index e78176bce8..c518d93649 100644 --- a/doc/src/sgml/ref/alter_view.sgml +++ b/doc/src/sgml/ref/alter_view.sgml @@ -21,13 +21,13 @@ PostgreSQL documentation -ALTER VIEW name ALTER [ COLUMN ] column SET DEFAULT expression -ALTER VIEW name ALTER [ COLUMN ] column DROP DEFAULT -ALTER VIEW name OWNER TO new_owner -ALTER VIEW name RENAME TO new_name -ALTER VIEW name SET SCHEMA new_schema -ALTER VIEW name SET ( view_option_name [= view_option_value] [, ... ] ) -ALTER VIEW name RESET ( view_option_name [, ... ] ) +ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column SET DEFAULT expression +ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column DROP DEFAULT +ALTER VIEW [ IF EXISTS ] name OWNER TO new_owner +ALTER VIEW [ IF EXISTS ] name RENAME TO new_name +ALTER VIEW [ IF EXISTS ] name SET SCHEMA new_schema +ALTER VIEW [ IF EXISTS ] name SET ( view_option_name [= view_option_value] [, ... ] ) +ALTER VIEW [ IF EXISTS ] name RESET ( view_option_name [, ... ] ) @@ -65,6 +65,16 @@ ALTER VIEW name RESET ( + + IF EXISTS + + + Do not throw an error if the view does not exist. A notice is issued + in this case. + + + + SET/DROP DEFAULT diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index f7712a9655..d3739cb095 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -425,7 +425,15 @@ AlterSequence(AlterSeqStmt *stmt) List *owned_by; /* Open and lock sequence. */ - relid = RangeVarGetRelid(stmt->sequence, AccessShareLock, false); + 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 */ diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index cc210f06d3..cb8ac67812 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -2310,9 +2310,18 @@ renameatt(RenameStmt *stmt) /* lock level taken here should match renameatt_internal */ relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, - false, false, + stmt->missing_ok, false, RangeVarCallbackForRenameAttribute, NULL); + + if (!OidIsValid(relid)) + { + ereport(NOTICE, + (errmsg("relation \"%s\" does not exist, skipping", + stmt->relation->relname))); + return; + } + renameatt_internal(relid, stmt->subname, /* old att name */ stmt->newname, /* new att name */ @@ -2338,10 +2347,18 @@ RenameRelation(RenameStmt *stmt) * lock escalation. */ relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, - false, false, + stmt->missing_ok, false, RangeVarCallbackForAlterRelation, (void *) stmt); + if (!OidIsValid(relid)) + { + ereport(NOTICE, + (errmsg("relation \"%s\" does not exist, skipping", + stmt->relation->relname))); + return; + } + /* Do the work */ RenameRelationInternal(relid, stmt->newname); } @@ -2482,7 +2499,7 @@ CheckTableNotInUse(Relation rel, const char *stmt) Oid AlterTableLookupRelation(AlterTableStmt *stmt, LOCKMODE lockmode) { - return RangeVarGetRelidExtended(stmt->relation, lockmode, false, false, + return RangeVarGetRelidExtended(stmt->relation, lockmode, stmt->missing_ok, false, RangeVarCallbackForAlterRelation, (void *) stmt); } @@ -9434,9 +9451,18 @@ AlterTableNamespace(AlterObjectSchemaStmt *stmt) RangeVar *newrv; relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, - false, false, + stmt->missing_ok, false, RangeVarCallbackForAlterRelation, (void *) stmt); + + if (!OidIsValid(relid)) + { + ereport(NOTICE, + (errmsg("relation \"%s\" does not exist, skipping", + stmt->relation->relname))); + return; + } + rel = relation_open(relid, NoLock); oldNspOid = RelationGetNamespace(rel); diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 71da0d8564..cc3168d906 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -2540,6 +2540,7 @@ _copyAlterTableStmt(const AlterTableStmt *from) COPY_NODE_FIELD(relation); COPY_NODE_FIELD(cmds); COPY_SCALAR_FIELD(relkind); + COPY_SCALAR_FIELD(missing_ok); return newnode; } @@ -2904,6 +2905,7 @@ _copyRenameStmt(const RenameStmt *from) COPY_STRING_FIELD(subname); COPY_STRING_FIELD(newname); COPY_SCALAR_FIELD(behavior); + COPY_SCALAR_FIELD(missing_ok); return newnode; } @@ -2919,6 +2921,7 @@ _copyAlterObjectSchemaStmt(const AlterObjectSchemaStmt *from) COPY_NODE_FIELD(objarg); COPY_STRING_FIELD(addname); COPY_STRING_FIELD(newschema); + COPY_SCALAR_FIELD(missing_ok); return newnode; } @@ -3222,6 +3225,7 @@ _copyAlterSeqStmt(const AlterSeqStmt *from) COPY_NODE_FIELD(sequence); COPY_NODE_FIELD(options); + COPY_SCALAR_FIELD(missing_ok); return newnode; } diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index ba949db91f..2295195fab 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -1010,6 +1010,7 @@ _equalAlterTableStmt(const AlterTableStmt *a, const AlterTableStmt *b) COMPARE_NODE_FIELD(relation); COMPARE_NODE_FIELD(cmds); COMPARE_SCALAR_FIELD(relkind); + COMPARE_SCALAR_FIELD(missing_ok); return true; } @@ -1310,6 +1311,7 @@ _equalRenameStmt(const RenameStmt *a, const RenameStmt *b) COMPARE_STRING_FIELD(subname); COMPARE_STRING_FIELD(newname); COMPARE_SCALAR_FIELD(behavior); + COMPARE_SCALAR_FIELD(missing_ok); return true; } @@ -1323,6 +1325,7 @@ _equalAlterObjectSchemaStmt(const AlterObjectSchemaStmt *a, const AlterObjectSch COMPARE_NODE_FIELD(objarg); COMPARE_STRING_FIELD(addname); COMPARE_STRING_FIELD(newschema); + COMPARE_SCALAR_FIELD(missing_ok); return true; } @@ -1576,6 +1579,7 @@ _equalAlterSeqStmt(const AlterSeqStmt *a, const AlterSeqStmt *b) { COMPARE_NODE_FIELD(sequence); COMPARE_NODE_FIELD(options); + COMPARE_SCALAR_FIELD(missing_ok); return true; } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 0ec039b9a9..62fde67bd9 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -1629,6 +1629,16 @@ AlterTableStmt: 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,6 +1647,16 @@ AlterTableStmt: 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,6 +1665,16 @@ AlterTableStmt: 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,6 +1683,16 @@ AlterTableStmt: 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; } ; @@ -3068,8 +3108,18 @@ AlterSeqStmt: 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; } @@ -3906,6 +3956,16 @@ AlterForeignTableStmt: n->relation = $4; n->cmds = $5; n->relkind = OBJECT_FOREIGN_TABLE; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER FOREIGN TABLE IF_P EXISTS relation_expr alter_table_cmds + { + AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $6; + n->cmds = $7; + n->relkind = OBJECT_FOREIGN_TABLE; + n->missing_ok = true; $$ = (Node *)n; } ; @@ -6417,6 +6477,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->object = $3; n->objarg = $4; n->newname = $7; + n->missing_ok = false; $$ = (Node *)n; } | ALTER COLLATION any_name RENAME TO name @@ -6425,6 +6486,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->renameType = OBJECT_COLLATION; n->object = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER CONVERSION_P any_name RENAME TO name @@ -6433,6 +6495,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->renameType = OBJECT_CONVERSION; n->object = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER DATABASE database_name RENAME TO database_name @@ -6441,6 +6504,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->renameType = OBJECT_DATABASE; n->subname = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER DOMAIN_P any_name RENAME TO name @@ -6449,6 +6513,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name 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 @@ -6457,6 +6522,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->renameType = OBJECT_FDW; n->subname = $5; n->newname = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER FUNCTION function_with_argtypes RENAME TO name @@ -6466,6 +6532,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->object = $3->funcname; n->objarg = $3->funcargs; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER GROUP_P RoleId RENAME TO RoleId @@ -6474,6 +6541,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->renameType = OBJECT_ROLE; n->subname = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER opt_procedural LANGUAGE name RENAME TO name @@ -6482,6 +6550,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name 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 @@ -6491,6 +6560,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name 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 @@ -6500,6 +6570,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->object = $4; n->subname = $6; n->newname = $9; + n->missing_ok = false; $$ = (Node *)n; } | ALTER SCHEMA name RENAME TO name @@ -6508,6 +6579,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->renameType = OBJECT_SCHEMA; n->subname = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER SERVER name RENAME TO name @@ -6516,6 +6588,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->renameType = OBJECT_FOREIGN_SERVER; n->subname = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TABLE relation_expr RENAME TO name @@ -6525,6 +6598,17 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name 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 @@ -6534,6 +6618,17 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name 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 @@ -6543,6 +6638,17 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name 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 @@ -6552,6 +6658,17 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name 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 @@ -6561,6 +6678,17 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->relation = $4; n->subname = NULL; n->newname = $7; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME TO name + { + RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_FOREIGN_TABLE; + n->relation = $6; + n->subname = NULL; + n->newname = $9; + n->missing_ok = true; $$ = (Node *)n; } | ALTER TABLE relation_expr RENAME opt_column name TO name @@ -6571,6 +6699,18 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->relation = $3; n->subname = $6; n->newname = $8; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name + { + RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_COLUMN; + n->relationType = OBJECT_TABLE; + n->relation = $5; + n->subname = $8; + n->newname = $10; + n->missing_ok = true; $$ = (Node *)n; } | ALTER FOREIGN TABLE relation_expr RENAME opt_column name TO name @@ -6581,6 +6721,18 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->relation = $4; n->subname = $7; n->newname = $9; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name + { + RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_COLUMN; + n->relationType = OBJECT_FOREIGN_TABLE; + n->relation = $6; + n->subname = $9; + n->newname = $11; + n->missing_ok = true; $$ = (Node *)n; } | ALTER TRIGGER name ON qualified_name RENAME TO name @@ -6590,6 +6742,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->relation = $5; n->subname = $3; n->newname = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER ROLE RoleId RENAME TO RoleId @@ -6598,6 +6751,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->renameType = OBJECT_ROLE; n->subname = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER USER RoleId RENAME TO RoleId @@ -6606,6 +6760,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->renameType = OBJECT_ROLE; n->subname = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TABLESPACE name RENAME TO name @@ -6614,6 +6769,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->renameType = OBJECT_TABLESPACE; n->subname = $3; n->newname = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TABLESPACE name SET reloptions @@ -6640,6 +6796,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name 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 @@ -6648,6 +6805,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name 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 @@ -6656,6 +6814,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name 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 @@ -6664,6 +6823,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->renameType = OBJECT_TSCONFIGURATION; n->object = $5; n->newname = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TYPE_P any_name RENAME TO name @@ -6672,6 +6832,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name 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 @@ -6683,6 +6844,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->subname = $6; n->newname = $8; n->behavior = $9; + n->missing_ok = false; $$ = (Node *)n; } ; @@ -6709,6 +6871,7 @@ AlterObjectSchemaStmt: n->object = $3; n->objarg = $4; n->newschema = $7; + n->missing_ok = false; $$ = (Node *)n; } | ALTER COLLATION any_name SET SCHEMA name @@ -6717,6 +6880,7 @@ AlterObjectSchemaStmt: n->objectType = OBJECT_COLLATION; n->object = $3; n->newschema = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER CONVERSION_P any_name SET SCHEMA name @@ -6725,6 +6889,7 @@ AlterObjectSchemaStmt: n->objectType = OBJECT_CONVERSION; n->object = $3; n->newschema = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER DOMAIN_P any_name SET SCHEMA name @@ -6733,6 +6898,7 @@ AlterObjectSchemaStmt: n->objectType = OBJECT_DOMAIN; n->object = $3; n->newschema = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER EXTENSION any_name SET SCHEMA name @@ -6741,6 +6907,7 @@ AlterObjectSchemaStmt: n->objectType = OBJECT_EXTENSION; n->object = $3; n->newschema = $6; + n->missing_ok = false; $$ = (Node *)n; } | ALTER FUNCTION function_with_argtypes SET SCHEMA name @@ -6750,6 +6917,7 @@ AlterObjectSchemaStmt: 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 @@ -6759,6 +6927,7 @@ AlterObjectSchemaStmt: 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 @@ -6768,6 +6937,7 @@ AlterObjectSchemaStmt: 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 @@ -6777,6 +6947,7 @@ AlterObjectSchemaStmt: n->object = $4; n->addname = $6; n->newschema = $9; + n->missing_ok = false; $$ = (Node *)n; } | ALTER TABLE relation_expr SET SCHEMA name @@ -6785,6 +6956,16 @@ AlterObjectSchemaStmt: 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 @@ -6793,6 +6974,7 @@ AlterObjectSchemaStmt: 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 @@ -6801,6 +6983,7 @@ AlterObjectSchemaStmt: 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 @@ -6809,6 +6992,7 @@ AlterObjectSchemaStmt: 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 @@ -6817,6 +7001,7 @@ AlterObjectSchemaStmt: n->objectType = OBJECT_TSCONFIGURATION; n->object = $5; n->newschema = $8; + n->missing_ok = false; $$ = (Node *)n; } | ALTER SEQUENCE qualified_name SET SCHEMA name @@ -6825,6 +7010,16 @@ AlterObjectSchemaStmt: 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 @@ -6833,6 +7028,16 @@ AlterObjectSchemaStmt: 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 @@ -6841,6 +7046,16 @@ AlterObjectSchemaStmt: n->objectType = OBJECT_FOREIGN_TABLE; n->relation = $4; n->newschema = $7; + n->missing_ok = false; + $$ = (Node *)n; + } + | ALTER FOREIGN TABLE IF_P EXISTS relation_expr SET SCHEMA name + { + AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_FOREIGN_TABLE; + n->relation = $6; + n->newschema = $9; + n->missing_ok = true; $$ = (Node *)n; } | ALTER TYPE_P any_name SET SCHEMA name @@ -6849,6 +7064,7 @@ AlterObjectSchemaStmt: n->objectType = OBJECT_TYPE; n->object = $3; n->newschema = $6; + n->missing_ok = false; $$ = (Node *)n; } ; diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index 99157c5349..f1a108a982 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -2283,7 +2283,15 @@ transformAlterTableStmt(AlterTableStmt *stmt, const char *queryString) * new commands we add after this must not upgrade the lock level * requested here. */ - rel = relation_openrv(stmt->relation, lockmode); + 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); diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index de16a61454..5b81c0bbed 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -714,34 +714,41 @@ standard_ProcessUtility(Node *parsetree, lockmode = AlterTableGetLockLevel(atstmt->cmds); relid = AlterTableLookupRelation(atstmt, lockmode); - /* Run parse analysis ... */ - stmts = transformAlterTableStmt(atstmt, queryString); - - /* ... and do it */ - foreach(l, stmts) + if (OidIsValid(relid)) { - Node *stmt = (Node *) lfirst(l); + /* Run parse analysis ... */ + stmts = transformAlterTableStmt(atstmt, queryString); - if (IsA(stmt, AlterTableStmt)) + /* ... and do it */ + foreach(l, stmts) { - /* Do the table alteration proper */ - AlterTable(relid, lockmode, (AlterTableStmt *) stmt); - } - else - { - /* Recurse for anything else */ - ProcessUtility(stmt, - queryString, - params, - false, - None_Receiver, - NULL); - } + Node *stmt = (Node *) lfirst(l); - /* Need CCI between commands */ - if (lnext(l) != NULL) - CommandCounterIncrement(); + if (IsA(stmt, AlterTableStmt)) + { + /* Do the table alteration proper */ + AlterTable(relid, lockmode, (AlterTableStmt *) stmt); + } + else + { + /* Recurse for anything else */ + ProcessUtility(stmt, + queryString, + params, + false, + None_Receiver, + NULL); + } + + /* Need CCI between commands */ + if (lnext(l) != NULL) + CommandCounterIncrement(); + } } + else + ereport(NOTICE, + (errmsg("relation \"%s\" does not exist, skipping", + atstmt->relation->relname))); } break; diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index dce0e7270d..1d33cebc9b 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1171,6 +1171,7 @@ typedef struct AlterTableStmt 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 @@ -1807,6 +1808,7 @@ typedef struct AlterSeqStmt NodeTag type; RangeVar *sequence; /* the sequence to alter */ List *options; + bool missing_ok; /* skip error if a role is missing? */ } AlterSeqStmt; /* ---------------------- @@ -2117,6 +2119,7 @@ typedef struct RenameStmt * trigger, etc) */ char *newname; /* the new name */ DropBehavior behavior; /* RESTRICT or CASCADE behavior */ + bool missing_ok; /* skip error if missing? */ } RenameStmt; /* ---------------------- @@ -2132,6 +2135,7 @@ typedef struct AlterObjectSchemaStmt 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; /* ---------------------- diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 57096f230e..e992549504 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -128,6 +128,10 @@ DROP TABLE tmp_new; 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 @@ -1185,6 +1189,11 @@ ERROR: inherited column "a" must be renamed in child tables too -- these should work alter table renameColumn rename column a to d; alter table renameColumnChild rename column b to a; +-- these should work +alter table if exists doesnt_exist_tab rename column a to d; +NOTICE: relation "doesnt_exist_tab" does not exist, skipping +alter table if exists doesnt_exist_tab rename column b to a; +NOTICE: relation "doesnt_exist_tab" does not exist, skipping -- this should work alter table renameColumn add column w int; -- this should fail @@ -2130,3 +2139,40 @@ ERROR: new row for relation "test_drop_constr_child" violates check constraint 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 +ALTER TABLE IF EXISTS tt8 ADD CONSTRAINT xxx PRIMARY KEY(f); +NOTICE: relation "tt8" does not exist, skipping +ALTER TABLE IF EXISTS tt8 ADD CHECK (f BETWEEN 0 AND 10); +NOTICE: relation "tt8" does not exist, skipping +ALTER TABLE IF EXISTS tt8 ALTER COLUMN f SET DEFAULT 0; +NOTICE: relation "tt8" does not exist, skipping +ALTER TABLE IF EXISTS tt8 RENAME COLUMN f TO f1; +NOTICE: relation "tt8" does not exist, skipping +ALTER TABLE IF EXISTS tt8 SET SCHEMA alter2; +NOTICE: relation "tt8" does not exist, skipping +CREATE TABLE tt8(a int); +CREATE SCHEMA alter2; +ALTER TABLE IF EXISTS tt8 ADD COLUMN f int; +ALTER TABLE IF EXISTS tt8 ADD CONSTRAINT xxx PRIMARY KEY(f); +NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "xxx" for table "tt8" +ALTER TABLE IF EXISTS tt8 ADD CHECK (f BETWEEN 0 AND 10); +ALTER TABLE IF EXISTS tt8 ALTER COLUMN f SET DEFAULT 0; +ALTER TABLE IF EXISTS tt8 RENAME COLUMN f TO f1; +ALTER TABLE IF EXISTS tt8 SET SCHEMA alter2; +\d alter2.tt8 + Table "alter2.tt8" + Column | Type | Modifiers +--------+---------+-------------------- + a | integer | + f1 | integer | not null default 0 +Indexes: + "xxx" PRIMARY KEY, btree (f1) +Check constraints: + "tt8_f_check" CHECK (f1 >= 0 AND f1 <= 10) + +DROP TABLE alter2.tt8; +DROP SCHEMA alter2; diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out index 2a6e8766b8..c12e0d0b8d 100644 --- a/src/test/regress/expected/foreign_data.out +++ b/src/test/regress/expected/foreign_data.out @@ -789,6 +789,50 @@ ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1; Server: s0 FDW Options: (quote '~', "be quoted" 'value', escape '@') +-- alter noexisting table +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c4 integer; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c6 integer; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c7 integer NOT NULL; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c8 integer; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c9 integer; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c10 integer OPTIONS (p1 'v1'); +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c6 SET NOT NULL; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c7 DROP NOT NULL; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 TYPE char(10); +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 SET DATA TYPE text; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c7 OPTIONS (ADD p1 'v1', ADD p2 'v2'), + ALTER COLUMN c8 OPTIONS (ADD p1 'v1', ADD p2 'v2'); +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 OPTIONS (SET p2 'V2', DROP p1); +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP CONSTRAINT IF EXISTS no_const; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP CONSTRAINT ft1_c1_check; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 OWNER TO regress_test_role; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 OPTIONS (DROP delimiter, SET quote '~', ADD escape '@'); +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP COLUMN IF EXISTS no_column; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP COLUMN c9; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 SET SCHEMA foreign_schema; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 RENAME c1 TO foreign_column_1; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 RENAME TO foreign_table_1; +NOTICE: relation "doesnt_exist_ft1" does not exist, skipping -- Information schema SELECT * FROM information_schema.foreign_data_wrappers ORDER BY 1, 2; foreign_data_wrapper_catalog | foreign_data_wrapper_name | authorization_identifier | library_name | foreign_data_wrapper_language diff --git a/src/test/regress/expected/sequence.out b/src/test/regress/expected/sequence.out index a110a2eaa1..1def070903 100644 --- a/src/test/regress/expected/sequence.out +++ b/src/test/regress/expected/sequence.out @@ -241,6 +241,9 @@ DROP SEQUENCE myseq2; -- -- 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 diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index faafb224ef..d9bf08d6d5 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -166,6 +166,9 @@ 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; +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 @@ -898,6 +901,10 @@ alter table only renameColumn rename column a to d; alter table renameColumn rename column a to d; alter table renameColumnChild rename column b to a; +-- these should work +alter table if exists doesnt_exist_tab rename column a to d; +alter table if exists doesnt_exist_tab rename column b to a; + -- this should work alter table renameColumn add column w int; @@ -1463,3 +1470,28 @@ ALTER TABLE ONLY test_drop_constr_parent DROP CONSTRAINT "test_drop_constr_paren -- 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; +ALTER TABLE IF EXISTS tt8 ADD CONSTRAINT xxx PRIMARY KEY(f); +ALTER TABLE IF EXISTS tt8 ADD CHECK (f BETWEEN 0 AND 10); +ALTER TABLE IF EXISTS tt8 ALTER COLUMN f SET DEFAULT 0; +ALTER TABLE IF EXISTS tt8 RENAME COLUMN f TO f1; +ALTER TABLE IF EXISTS tt8 SET SCHEMA alter2; + +CREATE TABLE tt8(a int); +CREATE SCHEMA alter2; + +ALTER TABLE IF EXISTS tt8 ADD COLUMN f int; +ALTER TABLE IF EXISTS tt8 ADD CONSTRAINT xxx PRIMARY KEY(f); +ALTER TABLE IF EXISTS tt8 ADD CHECK (f BETWEEN 0 AND 10); +ALTER TABLE IF EXISTS tt8 ALTER COLUMN f SET DEFAULT 0; +ALTER TABLE IF EXISTS tt8 RENAME COLUMN f TO f1; +ALTER TABLE IF EXISTS tt8 SET SCHEMA alter2; + +\d alter2.tt8 + +DROP TABLE alter2.tt8; +DROP SCHEMA alter2; diff --git a/src/test/regress/sql/foreign_data.sql b/src/test/regress/sql/foreign_data.sql index 95d02d1ce1..b41a7e4a30 100644 --- a/src/test/regress/sql/foreign_data.sql +++ b/src/test/regress/sql/foreign_data.sql @@ -328,6 +328,32 @@ ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1; ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1; \d foreign_schema.foreign_table_1 +-- alter noexisting table +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c4 integer; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c6 integer; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c7 integer NOT NULL; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c8 integer; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c9 integer; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c10 integer OPTIONS (p1 'v1'); + +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c6 SET NOT NULL; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c7 DROP NOT NULL; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 TYPE char(10); +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 SET DATA TYPE text; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c7 OPTIONS (ADD p1 'v1', ADD p2 'v2'), + ALTER COLUMN c8 OPTIONS (ADD p1 'v1', ADD p2 'v2'); +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 OPTIONS (SET p2 'V2', DROP p1); + +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP CONSTRAINT IF EXISTS no_const; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP CONSTRAINT ft1_c1_check; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 OWNER TO regress_test_role; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 OPTIONS (DROP delimiter, SET quote '~', ADD escape '@'); +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP COLUMN IF EXISTS no_column; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP COLUMN c9; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 SET SCHEMA foreign_schema; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 RENAME c1 TO foreign_column_1; +ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 RENAME TO foreign_table_1; + -- Information schema SELECT * FROM information_schema.foreign_data_wrappers ORDER BY 1, 2; diff --git a/src/test/regress/sql/sequence.sql b/src/test/regress/sql/sequence.sql index 97ffb60385..a32e0494a0 100644 --- a/src/test/regress/sql/sequence.sql +++ b/src/test/regress/sql/sequence.sql @@ -113,6 +113,10 @@ DROP SEQUENCE myseq2; -- -- 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');