Commit b8a91d9d authored by Simon Riggs's avatar Simon Riggs

ALTER <thing> [IF EXISTS] ... allows silent DDL if required,

e.g. ALTER FOREIGN TABLE IF EXISTS foo RENAME TO bar

Pavel Stehule
parent 4993a49b
...@@ -21,13 +21,13 @@ PostgreSQL documentation ...@@ -21,13 +21,13 @@ PostgreSQL documentation
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <synopsis>
ALTER FOREIGN TABLE <replaceable class="PARAMETER">name</replaceable> ALTER FOREIGN TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable>
<replaceable class="PARAMETER">action</replaceable> [, ... ] <replaceable class="PARAMETER">action</replaceable> [, ... ]
ALTER FOREIGN TABLE <replaceable class="PARAMETER">name</replaceable> ALTER FOREIGN TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable>
RENAME [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> TO <replaceable class="PARAMETER">new_column</replaceable> RENAME [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> TO <replaceable class="PARAMETER">new_column</replaceable>
ALTER FOREIGN TABLE <replaceable class="PARAMETER">name</replaceable> ALTER FOREIGN TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable>
RENAME TO <replaceable class="PARAMETER">new_name</replaceable> RENAME TO <replaceable class="PARAMETER">new_name</replaceable>
ALTER FOREIGN TABLE <replaceable class="PARAMETER">name</replaceable> ALTER FOREIGN TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable>
SET SCHEMA <replaceable class="PARAMETER">new_schema</replaceable> SET SCHEMA <replaceable class="PARAMETER">new_schema</replaceable>
<phrase>where <replaceable class="PARAMETER">action</replaceable> is one of:</phrase> <phrase>where <replaceable class="PARAMETER">action</replaceable> is one of:</phrase>
...@@ -75,6 +75,16 @@ ALTER FOREIGN TABLE <replaceable class="PARAMETER">name</replaceable> ...@@ -75,6 +75,16 @@ ALTER FOREIGN TABLE <replaceable class="PARAMETER">name</replaceable>
</listitem> </listitem>
</varlistentry> </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> <varlistentry>
<term><literal>SET DATA TYPE</literal></term> <term><literal>SET DATA TYPE</literal></term>
<listitem> <listitem>
......
...@@ -21,10 +21,10 @@ PostgreSQL documentation ...@@ -21,10 +21,10 @@ PostgreSQL documentation
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <synopsis>
ALTER INDEX <replaceable class="PARAMETER">name</replaceable> RENAME TO <replaceable class="PARAMETER">new_name</replaceable> ALTER INDEX [ IF EXISTS ] <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 [ IF EXISTS ] <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 [ IF EXISTS ] <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> [, ... ] ) ALTER INDEX [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> RESET ( <replaceable class="PARAMETER">storage_parameter</replaceable> [, ... ] )
</synopsis> </synopsis>
</refsynopsisdiv> </refsynopsisdiv>
...@@ -37,6 +37,16 @@ ALTER INDEX <replaceable class="PARAMETER">name</replaceable> RESET ( <replaceab ...@@ -37,6 +37,16 @@ ALTER INDEX <replaceable class="PARAMETER">name</replaceable> RESET ( <replaceab
<variablelist> <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> <varlistentry>
<term><literal>RENAME</literal></term> <term><literal>RENAME</literal></term>
<listitem> <listitem>
......
...@@ -23,15 +23,15 @@ PostgreSQL documentation ...@@ -23,15 +23,15 @@ PostgreSQL documentation
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <synopsis>
ALTER SEQUENCE <replaceable class="parameter">name</replaceable> [ INCREMENT [ BY ] <replaceable class="parameter">increment</replaceable> ] 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 ] [ MINVALUE <replaceable class="parameter">minvalue</replaceable> | NO MINVALUE ] [ MAXVALUE <replaceable class="parameter">maxvalue</replaceable> | NO MAXVALUE ]
[ START [ WITH ] <replaceable class="parameter">start</replaceable> ] [ START [ WITH ] <replaceable class="parameter">start</replaceable> ]
[ RESTART [ [ WITH ] <replaceable class="parameter">restart</replaceable> ] ] [ RESTART [ [ WITH ] <replaceable class="parameter">restart</replaceable> ] ]
[ CACHE <replaceable class="parameter">cache</replaceable> ] [ [ NO ] CYCLE ] [ CACHE <replaceable class="parameter">cache</replaceable> ] [ [ NO ] CYCLE ]
[ OWNED BY { <replaceable class="parameter">table</replaceable>.<replaceable class="parameter">column</replaceable> | NONE } ] [ 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 [ IF EXISTS ] <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 [ IF EXISTS ] <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> ALTER SEQUENCE [ IF EXISTS ] <replaceable class="parameter">name</replaceable> SET SCHEMA <replaceable class="parameter">new_schema</replaceable>
</synopsis> </synopsis>
</refsynopsisdiv> </refsynopsisdiv>
...@@ -70,6 +70,16 @@ ALTER SEQUENCE <replaceable class="parameter">name</replaceable> SET SCHEMA <rep ...@@ -70,6 +70,16 @@ ALTER SEQUENCE <replaceable class="parameter">name</replaceable> SET SCHEMA <rep
</listitem> </listitem>
</varlistentry> </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> <varlistentry>
<term><replaceable class="parameter">increment</replaceable></term> <term><replaceable class="parameter">increment</replaceable></term>
<listitem> <listitem>
......
...@@ -21,13 +21,13 @@ PostgreSQL documentation ...@@ -21,13 +21,13 @@ PostgreSQL documentation
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <synopsis>
ALTER TABLE [ ONLY ] <replaceable class="PARAMETER">name</replaceable> [ * ] ALTER TABLE [ IF EXISTS ] [ ONLY ] <replaceable class="PARAMETER">name</replaceable> [ * ]
<replaceable class="PARAMETER">action</replaceable> [, ... ] <replaceable class="PARAMETER">action</replaceable> [, ... ]
ALTER TABLE [ ONLY ] <replaceable class="PARAMETER">name</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> RENAME [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> TO <replaceable class="PARAMETER">new_column</replaceable>
ALTER TABLE <replaceable class="PARAMETER">name</replaceable> ALTER TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable>
RENAME TO <replaceable class="PARAMETER">new_name</replaceable> RENAME TO <replaceable class="PARAMETER">new_name</replaceable>
ALTER TABLE <replaceable class="PARAMETER">name</replaceable> ALTER TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable>
SET SCHEMA <replaceable class="PARAMETER">new_schema</replaceable> SET SCHEMA <replaceable class="PARAMETER">new_schema</replaceable>
<phrase>where <replaceable class="PARAMETER">action</replaceable> is one of:</phrase> <phrase>where <replaceable class="PARAMETER">action</replaceable> is one of:</phrase>
...@@ -109,6 +109,16 @@ ALTER TABLE <replaceable class="PARAMETER">name</replaceable> ...@@ -109,6 +109,16 @@ ALTER TABLE <replaceable class="PARAMETER">name</replaceable>
</listitem> </listitem>
</varlistentry> </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> <varlistentry>
<term><literal>SET DATA TYPE</literal></term> <term><literal>SET DATA TYPE</literal></term>
<listitem> <listitem>
......
...@@ -21,13 +21,13 @@ PostgreSQL documentation ...@@ -21,13 +21,13 @@ PostgreSQL documentation
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <synopsis>
ALTER VIEW <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> 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 [ IF EXISTS ] <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 [ IF EXISTS ] <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 [ IF EXISTS ] <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 [ IF EXISTS ] <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 [ IF EXISTS ] <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> [, ... ] ) ALTER VIEW [ IF EXISTS ] <replaceable class="parameter">name</replaceable> RESET ( <replaceable class="parameter">view_option_name</replaceable> [, ... ] )
</synopsis> </synopsis>
</refsynopsisdiv> </refsynopsisdiv>
...@@ -65,6 +65,16 @@ ALTER VIEW <replaceable class="parameter">name</replaceable> RESET ( <replaceabl ...@@ -65,6 +65,16 @@ ALTER VIEW <replaceable class="parameter">name</replaceable> RESET ( <replaceabl
</listitem> </listitem>
</varlistentry> </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> <varlistentry>
<term><literal>SET</literal>/<literal>DROP DEFAULT</literal></term> <term><literal>SET</literal>/<literal>DROP DEFAULT</literal></term>
<listitem> <listitem>
......
...@@ -425,7 +425,15 @@ AlterSequence(AlterSeqStmt *stmt) ...@@ -425,7 +425,15 @@ AlterSequence(AlterSeqStmt *stmt)
List *owned_by; List *owned_by;
/* Open and lock sequence. */ /* 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); init_sequence(relid, &elm, &seqrel);
/* allow ALTER to sequence owner only */ /* allow ALTER to sequence owner only */
......
...@@ -2310,9 +2310,18 @@ renameatt(RenameStmt *stmt) ...@@ -2310,9 +2310,18 @@ renameatt(RenameStmt *stmt)
/* lock level taken here should match renameatt_internal */ /* lock level taken here should match renameatt_internal */
relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock,
false, false, stmt->missing_ok, false,
RangeVarCallbackForRenameAttribute, RangeVarCallbackForRenameAttribute,
NULL); NULL);
if (!OidIsValid(relid))
{
ereport(NOTICE,
(errmsg("relation \"%s\" does not exist, skipping",
stmt->relation->relname)));
return;
}
renameatt_internal(relid, renameatt_internal(relid,
stmt->subname, /* old att name */ stmt->subname, /* old att name */
stmt->newname, /* new att name */ stmt->newname, /* new att name */
...@@ -2338,10 +2347,18 @@ RenameRelation(RenameStmt *stmt) ...@@ -2338,10 +2347,18 @@ RenameRelation(RenameStmt *stmt)
* lock escalation. * lock escalation.
*/ */
relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock,
false, false, stmt->missing_ok, false,
RangeVarCallbackForAlterRelation, RangeVarCallbackForAlterRelation,
(void *) stmt); (void *) stmt);
if (!OidIsValid(relid))
{
ereport(NOTICE,
(errmsg("relation \"%s\" does not exist, skipping",
stmt->relation->relname)));
return;
}
/* Do the work */ /* Do the work */
RenameRelationInternal(relid, stmt->newname); RenameRelationInternal(relid, stmt->newname);
} }
...@@ -2482,7 +2499,7 @@ CheckTableNotInUse(Relation rel, const char *stmt) ...@@ -2482,7 +2499,7 @@ CheckTableNotInUse(Relation rel, const char *stmt)
Oid Oid
AlterTableLookupRelation(AlterTableStmt *stmt, LOCKMODE lockmode) AlterTableLookupRelation(AlterTableStmt *stmt, LOCKMODE lockmode)
{ {
return RangeVarGetRelidExtended(stmt->relation, lockmode, false, false, return RangeVarGetRelidExtended(stmt->relation, lockmode, stmt->missing_ok, false,
RangeVarCallbackForAlterRelation, RangeVarCallbackForAlterRelation,
(void *) stmt); (void *) stmt);
} }
...@@ -9434,9 +9451,18 @@ AlterTableNamespace(AlterObjectSchemaStmt *stmt) ...@@ -9434,9 +9451,18 @@ AlterTableNamespace(AlterObjectSchemaStmt *stmt)
RangeVar *newrv; RangeVar *newrv;
relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock,
false, false, stmt->missing_ok, false,
RangeVarCallbackForAlterRelation, RangeVarCallbackForAlterRelation,
(void *) stmt); (void *) stmt);
if (!OidIsValid(relid))
{
ereport(NOTICE,
(errmsg("relation \"%s\" does not exist, skipping",
stmt->relation->relname)));
return;
}
rel = relation_open(relid, NoLock); rel = relation_open(relid, NoLock);
oldNspOid = RelationGetNamespace(rel); oldNspOid = RelationGetNamespace(rel);
......
...@@ -2540,6 +2540,7 @@ _copyAlterTableStmt(const AlterTableStmt *from) ...@@ -2540,6 +2540,7 @@ _copyAlterTableStmt(const AlterTableStmt *from)
COPY_NODE_FIELD(relation); COPY_NODE_FIELD(relation);
COPY_NODE_FIELD(cmds); COPY_NODE_FIELD(cmds);
COPY_SCALAR_FIELD(relkind); COPY_SCALAR_FIELD(relkind);
COPY_SCALAR_FIELD(missing_ok);
return newnode; return newnode;
} }
...@@ -2904,6 +2905,7 @@ _copyRenameStmt(const RenameStmt *from) ...@@ -2904,6 +2905,7 @@ _copyRenameStmt(const RenameStmt *from)
COPY_STRING_FIELD(subname); COPY_STRING_FIELD(subname);
COPY_STRING_FIELD(newname); COPY_STRING_FIELD(newname);
COPY_SCALAR_FIELD(behavior); COPY_SCALAR_FIELD(behavior);
COPY_SCALAR_FIELD(missing_ok);
return newnode; return newnode;
} }
...@@ -2919,6 +2921,7 @@ _copyAlterObjectSchemaStmt(const AlterObjectSchemaStmt *from) ...@@ -2919,6 +2921,7 @@ _copyAlterObjectSchemaStmt(const AlterObjectSchemaStmt *from)
COPY_NODE_FIELD(objarg); COPY_NODE_FIELD(objarg);
COPY_STRING_FIELD(addname); COPY_STRING_FIELD(addname);
COPY_STRING_FIELD(newschema); COPY_STRING_FIELD(newschema);
COPY_SCALAR_FIELD(missing_ok);
return newnode; return newnode;
} }
...@@ -3222,6 +3225,7 @@ _copyAlterSeqStmt(const AlterSeqStmt *from) ...@@ -3222,6 +3225,7 @@ _copyAlterSeqStmt(const AlterSeqStmt *from)
COPY_NODE_FIELD(sequence); COPY_NODE_FIELD(sequence);
COPY_NODE_FIELD(options); COPY_NODE_FIELD(options);
COPY_SCALAR_FIELD(missing_ok);
return newnode; return newnode;
} }
......
...@@ -1010,6 +1010,7 @@ _equalAlterTableStmt(const AlterTableStmt *a, const AlterTableStmt *b) ...@@ -1010,6 +1010,7 @@ _equalAlterTableStmt(const AlterTableStmt *a, const AlterTableStmt *b)
COMPARE_NODE_FIELD(relation); COMPARE_NODE_FIELD(relation);
COMPARE_NODE_FIELD(cmds); COMPARE_NODE_FIELD(cmds);
COMPARE_SCALAR_FIELD(relkind); COMPARE_SCALAR_FIELD(relkind);
COMPARE_SCALAR_FIELD(missing_ok);
return true; return true;
} }
...@@ -1310,6 +1311,7 @@ _equalRenameStmt(const RenameStmt *a, const RenameStmt *b) ...@@ -1310,6 +1311,7 @@ _equalRenameStmt(const RenameStmt *a, const RenameStmt *b)
COMPARE_STRING_FIELD(subname); COMPARE_STRING_FIELD(subname);
COMPARE_STRING_FIELD(newname); COMPARE_STRING_FIELD(newname);
COMPARE_SCALAR_FIELD(behavior); COMPARE_SCALAR_FIELD(behavior);
COMPARE_SCALAR_FIELD(missing_ok);
return true; return true;
} }
...@@ -1323,6 +1325,7 @@ _equalAlterObjectSchemaStmt(const AlterObjectSchemaStmt *a, const AlterObjectSch ...@@ -1323,6 +1325,7 @@ _equalAlterObjectSchemaStmt(const AlterObjectSchemaStmt *a, const AlterObjectSch
COMPARE_NODE_FIELD(objarg); COMPARE_NODE_FIELD(objarg);
COMPARE_STRING_FIELD(addname); COMPARE_STRING_FIELD(addname);
COMPARE_STRING_FIELD(newschema); COMPARE_STRING_FIELD(newschema);
COMPARE_SCALAR_FIELD(missing_ok);
return true; return true;
} }
...@@ -1576,6 +1579,7 @@ _equalAlterSeqStmt(const AlterSeqStmt *a, const AlterSeqStmt *b) ...@@ -1576,6 +1579,7 @@ _equalAlterSeqStmt(const AlterSeqStmt *a, const AlterSeqStmt *b)
{ {
COMPARE_NODE_FIELD(sequence); COMPARE_NODE_FIELD(sequence);
COMPARE_NODE_FIELD(options); COMPARE_NODE_FIELD(options);
COMPARE_SCALAR_FIELD(missing_ok);
return true; return true;
} }
......
This diff is collapsed.
...@@ -2283,7 +2283,15 @@ transformAlterTableStmt(AlterTableStmt *stmt, const char *queryString) ...@@ -2283,7 +2283,15 @@ transformAlterTableStmt(AlterTableStmt *stmt, const char *queryString)
* new commands we add after this must not upgrade the lock level * new commands we add after this must not upgrade the lock level
* requested here. * 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 */ /* Set up pstate and CreateStmtContext */
pstate = make_parsestate(NULL); pstate = make_parsestate(NULL);
......
...@@ -714,6 +714,8 @@ standard_ProcessUtility(Node *parsetree, ...@@ -714,6 +714,8 @@ standard_ProcessUtility(Node *parsetree,
lockmode = AlterTableGetLockLevel(atstmt->cmds); lockmode = AlterTableGetLockLevel(atstmt->cmds);
relid = AlterTableLookupRelation(atstmt, lockmode); relid = AlterTableLookupRelation(atstmt, lockmode);
if (OidIsValid(relid))
{
/* Run parse analysis ... */ /* Run parse analysis ... */
stmts = transformAlterTableStmt(atstmt, queryString); stmts = transformAlterTableStmt(atstmt, queryString);
...@@ -743,6 +745,11 @@ standard_ProcessUtility(Node *parsetree, ...@@ -743,6 +745,11 @@ standard_ProcessUtility(Node *parsetree,
CommandCounterIncrement(); CommandCounterIncrement();
} }
} }
else
ereport(NOTICE,
(errmsg("relation \"%s\" does not exist, skipping",
atstmt->relation->relname)));
}
break; break;
case T_AlterDomainStmt: case T_AlterDomainStmt:
......
...@@ -1171,6 +1171,7 @@ typedef struct AlterTableStmt ...@@ -1171,6 +1171,7 @@ typedef struct AlterTableStmt
RangeVar *relation; /* table to work on */ RangeVar *relation; /* table to work on */
List *cmds; /* list of subcommands */ List *cmds; /* list of subcommands */
ObjectType relkind; /* type of object */ ObjectType relkind; /* type of object */
bool missing_ok; /* skip error if table missing */
} AlterTableStmt; } AlterTableStmt;
typedef enum AlterTableType typedef enum AlterTableType
...@@ -1807,6 +1808,7 @@ typedef struct AlterSeqStmt ...@@ -1807,6 +1808,7 @@ typedef struct AlterSeqStmt
NodeTag type; NodeTag type;
RangeVar *sequence; /* the sequence to alter */ RangeVar *sequence; /* the sequence to alter */
List *options; List *options;
bool missing_ok; /* skip error if a role is missing? */
} AlterSeqStmt; } AlterSeqStmt;
/* ---------------------- /* ----------------------
...@@ -2117,6 +2119,7 @@ typedef struct RenameStmt ...@@ -2117,6 +2119,7 @@ typedef struct RenameStmt
* trigger, etc) */ * trigger, etc) */
char *newname; /* the new name */ char *newname; /* the new name */
DropBehavior behavior; /* RESTRICT or CASCADE behavior */ DropBehavior behavior; /* RESTRICT or CASCADE behavior */
bool missing_ok; /* skip error if missing? */
} RenameStmt; } RenameStmt;
/* ---------------------- /* ----------------------
...@@ -2132,6 +2135,7 @@ typedef struct AlterObjectSchemaStmt ...@@ -2132,6 +2135,7 @@ typedef struct AlterObjectSchemaStmt
List *objarg; /* argument types, if applicable */ List *objarg; /* argument types, if applicable */
char *addname; /* additional name if needed */ char *addname; /* additional name if needed */
char *newschema; /* the new schema */ char *newschema; /* the new schema */
bool missing_ok; /* skip error if missing? */
} AlterObjectSchemaStmt; } AlterObjectSchemaStmt;
/* ---------------------- /* ----------------------
......
...@@ -128,6 +128,10 @@ DROP TABLE tmp_new; ...@@ -128,6 +128,10 @@ DROP TABLE tmp_new;
DROP TABLE tmp_new2; DROP TABLE tmp_new2;
-- ALTER TABLE ... RENAME on non-table relations -- ALTER TABLE ... RENAME on non-table relations
-- renaming indexes (FIXME: this should probably test the index's functionality) -- 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 onek_unique1 RENAME TO tmp_onek_unique1;
ALTER INDEX tmp_onek_unique1 RENAME TO onek_unique1; ALTER INDEX tmp_onek_unique1 RENAME TO onek_unique1;
-- renaming views -- renaming views
...@@ -1185,6 +1189,11 @@ ERROR: inherited column "a" must be renamed in child tables too ...@@ -1185,6 +1189,11 @@ ERROR: inherited column "a" must be renamed in child tables too
-- these should work -- these should work
alter table renameColumn rename column a to d; alter table renameColumn rename column a to d;
alter table renameColumnChild rename column b to a; 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 -- this should work
alter table renameColumn add column w int; alter table renameColumn add column w int;
-- this should fail -- this should fail
...@@ -2130,3 +2139,40 @@ ERROR: new row for relation "test_drop_constr_child" violates check constraint ...@@ -2130,3 +2139,40 @@ ERROR: new row for relation "test_drop_constr_child" violates check constraint
DETAIL: Failing row contains (null). DETAIL: Failing row contains (null).
DROP TABLE test_drop_constr_parent CASCADE; DROP TABLE test_drop_constr_parent CASCADE;
NOTICE: drop cascades to table test_drop_constr_child 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;
...@@ -789,6 +789,50 @@ ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1; ...@@ -789,6 +789,50 @@ ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1;
Server: s0 Server: s0
FDW Options: (quote '~', "be quoted" 'value', escape '@') 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 -- Information schema
SELECT * FROM information_schema.foreign_data_wrappers ORDER BY 1, 2; 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 foreign_data_wrapper_catalog | foreign_data_wrapper_name | authorization_identifier | library_name | foreign_data_wrapper_language
......
...@@ -241,6 +241,9 @@ DROP SEQUENCE myseq2; ...@@ -241,6 +241,9 @@ DROP SEQUENCE myseq2;
-- --
-- Alter sequence -- 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; CREATE SEQUENCE sequence_test2 START WITH 32;
SELECT nextval('sequence_test2'); SELECT nextval('sequence_test2');
nextval nextval
......
...@@ -166,6 +166,9 @@ DROP TABLE tmp_new2; ...@@ -166,6 +166,9 @@ DROP TABLE tmp_new2;
-- ALTER TABLE ... RENAME on non-table relations -- ALTER TABLE ... RENAME on non-table relations
-- renaming indexes (FIXME: this should probably test the index's functionality) -- 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 onek_unique1 RENAME TO tmp_onek_unique1;
ALTER INDEX tmp_onek_unique1 RENAME TO onek_unique1; ALTER INDEX tmp_onek_unique1 RENAME TO onek_unique1;
-- renaming views -- renaming views
...@@ -898,6 +901,10 @@ alter table only renameColumn rename column a to d; ...@@ -898,6 +901,10 @@ alter table only renameColumn rename column a to d;
alter table renameColumn rename column a to d; alter table renameColumn rename column a to d;
alter table renameColumnChild rename column b to a; 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 -- this should work
alter table renameColumn add column w int; alter table renameColumn add column w int;
...@@ -1463,3 +1470,28 @@ ALTER TABLE ONLY test_drop_constr_parent DROP CONSTRAINT "test_drop_constr_paren ...@@ -1463,3 +1470,28 @@ ALTER TABLE ONLY test_drop_constr_parent DROP CONSTRAINT "test_drop_constr_paren
-- should fail -- should fail
INSERT INTO test_drop_constr_child (c) VALUES (NULL); INSERT INTO test_drop_constr_child (c) VALUES (NULL);
DROP TABLE test_drop_constr_parent CASCADE; 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;
...@@ -328,6 +328,32 @@ ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1; ...@@ -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; ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1;
\d foreign_schema.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 -- Information schema
SELECT * FROM information_schema.foreign_data_wrappers ORDER BY 1, 2; SELECT * FROM information_schema.foreign_data_wrappers ORDER BY 1, 2;
......
...@@ -113,6 +113,10 @@ DROP SEQUENCE myseq2; ...@@ -113,6 +113,10 @@ DROP SEQUENCE myseq2;
-- --
-- Alter sequence -- 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; CREATE SEQUENCE sequence_test2 START WITH 32;
SELECT nextval('sequence_test2'); SELECT nextval('sequence_test2');
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment