aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon Riggs <simon@2ndQuadrant.com>2012-01-23 23:25:04 +0000
committerSimon Riggs <simon@2ndQuadrant.com>2012-01-23 23:25:04 +0000
commitb8a91d9d1c7ec75aaecf13df687ec7b5b0ed35a6 (patch)
treef49bd1ea95c2e141cb8fadd0495f682134053d38 /src
parent4993a49b7cf1d23dfe1f9e1a85d9411b8ff57454 (diff)
downloadpostgresql-b8a91d9d1c7ec75aaecf13df687ec7b5b0ed35a6.tar.gz
postgresql-b8a91d9d1c7ec75aaecf13df687ec7b5b0ed35a6.zip
ALTER <thing> [IF EXISTS] ... allows silent DDL if required,
e.g. ALTER FOREIGN TABLE IF EXISTS foo RENAME TO bar Pavel Stehule
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/sequence.c10
-rw-r--r--src/backend/commands/tablecmds.c34
-rw-r--r--src/backend/nodes/copyfuncs.c4
-rw-r--r--src/backend/nodes/equalfuncs.c4
-rw-r--r--src/backend/parser/gram.y216
-rw-r--r--src/backend/parser/parse_utilcmd.c10
-rw-r--r--src/backend/tcop/utility.c53
-rw-r--r--src/include/nodes/parsenodes.h4
-rw-r--r--src/test/regress/expected/alter_table.out46
-rw-r--r--src/test/regress/expected/foreign_data.out44
-rw-r--r--src/test/regress/expected/sequence.out3
-rw-r--r--src/test/regress/sql/alter_table.sql32
-rw-r--r--src/test/regress/sql/foreign_data.sql26
-rw-r--r--src/test/regress/sql/sequence.sql4
14 files changed, 461 insertions, 29 deletions
diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c
index f7712a96556..d3739cb0952 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 cc210f06d30..cb8ac67812a 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 71da0d8564b..cc3168d9066 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 ba949db91f2..2295195fabc 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 0ec039b9a96..62fde67bd94 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 99157c53493..f1a108a9828 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 de16a61454b..5b81c0bbedc 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))
- {
- /* Do the table alteration proper */
- AlterTable(relid, lockmode, (AlterTableStmt *) stmt);
- }
- else
+ /* ... and do it */
+ foreach(l, stmts)
{
- /* 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 dce0e7270d1..1d33cebc9b8 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 57096f230eb..e9925495042 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 2a6e8766b81..c12e0d0b8d3 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 a110a2eaa12..1def070903b 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 faafb224ef4..d9bf08d6d50 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 95d02d1ce12..b41a7e4a306 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 97ffb60385c..a32e0494a02 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');