Hello this is relative simple patch that add possibility to skip noexisting tables. It is necessary for silent cleaning when dump is loaded.
Regards Pavel Stehule
*** ./doc/src/sgml/ref/alter_table.sgml.orig 2011-12-01 22:47:20.000000000 +0100 --- ./doc/src/sgml/ref/alter_table.sgml 2012-01-02 13:59:16.390363069 +0100 *************** *** 21,33 **** <refsynopsisdiv> <synopsis> ! ALTER TABLE [ ONLY ] <replaceable class="PARAMETER">name</replaceable> [ * ] <replaceable class="PARAMETER">action</replaceable> [, ... ] ! ALTER TABLE [ ONLY ] <replaceable class="PARAMETER">name</replaceable> [ * ] RENAME [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> TO <replaceable class="PARAMETER">new_column</replaceable> ! ALTER TABLE <replaceable class="PARAMETER">name</replaceable> RENAME TO <replaceable class="PARAMETER">new_name</replaceable> ! ALTER TABLE <replaceable class="PARAMETER">name</replaceable> SET SCHEMA <replaceable class="PARAMETER">new_schema</replaceable> <phrase>where <replaceable class="PARAMETER">action</replaceable> is one of:</phrase> --- 21,33 ---- <refsynopsisdiv> <synopsis> ! ALTER TABLE [ IF EXISTS ] [ ONLY ] <replaceable class="PARAMETER">name</replaceable> [ * ] <replaceable class="PARAMETER">action</replaceable> [, ... ] ! ALTER TABLE [ IF EXISTS ] [ ONLY ] <replaceable class="PARAMETER">name</replaceable> [ * ] RENAME [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> TO <replaceable class="PARAMETER">new_column</replaceable> ! ALTER TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> RENAME TO <replaceable class="PARAMETER">new_name</replaceable> ! ALTER TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> SET SCHEMA <replaceable class="PARAMETER">new_schema</replaceable> <phrase>where <replaceable class="PARAMETER">action</replaceable> is one of:</phrase> *** ./src/backend/nodes/copyfuncs.c.orig 2011-12-01 22:47:20.000000000 +0100 --- ./src/backend/nodes/copyfuncs.c 2012-01-02 11:16:05.521002912 +0100 *************** *** 2517,2522 **** --- 2517,2523 ---- COPY_NODE_FIELD(relation); COPY_NODE_FIELD(cmds); COPY_SCALAR_FIELD(relkind); + COPY_SCALAR_FIELD(missing_ok); return newnode; } *** ./src/backend/nodes/equalfuncs.c.orig 2011-12-01 22:47:20.000000000 +0100 --- ./src/backend/nodes/equalfuncs.c 2012-01-02 11:16:33.871001059 +0100 *************** *** 1009,1014 **** --- 1009,1015 ---- COMPARE_NODE_FIELD(relation); COMPARE_NODE_FIELD(cmds); COMPARE_SCALAR_FIELD(relkind); + COMPARE_SCALAR_FIELD(missing_ok); return true; } *** ./src/backend/parser/gram.y.orig 2011-12-01 22:47:20.000000000 +0100 --- ./src/backend/parser/gram.y 2012-01-02 13:53:13.001386815 +0100 *************** *** 1621,1626 **** --- 1621,1636 ---- 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 *************** *** 1629,1634 **** --- 1639,1645 ---- n->relation = $3; n->cmds = $4; n->relkind = OBJECT_INDEX; + n->missing_ok = false; $$ = (Node *)n; } | ALTER SEQUENCE qualified_name alter_table_cmds *************** *** 1637,1642 **** --- 1648,1654 ---- n->relation = $3; n->cmds = $4; n->relkind = OBJECT_SEQUENCE; + n->missing_ok = false; $$ = (Node *)n; } | ALTER VIEW qualified_name alter_table_cmds *************** *** 1645,1650 **** --- 1657,1663 ---- n->relation = $3; n->cmds = $4; n->relkind = OBJECT_VIEW; + n->missing_ok = false; $$ = (Node *)n; } ; *** ./src/backend/parser/parse_utilcmd.c.orig 2011-12-01 22:47:20.000000000 +0100 --- ./src/backend/parser/parse_utilcmd.c 2012-01-02 13:47:11.937410429 +0100 *************** *** 2256,2262 **** * new commands we add after this must not upgrade the lock level * requested here. */ ! rel = relation_openrv(stmt->relation, lockmode); /* Set up pstate and CreateStmtContext */ pstate = make_parsestate(NULL); --- 2256,2278 ---- * new commands we add after this must not upgrade the lock level * requested here. */ ! ! if (stmt->missing_ok) ! { ! rel = try_relation_openrv(stmt->relation, lockmode); ! ! /* leave when relation doesn't exists */ ! if (rel == NULL) ! { ! ereport(NOTICE, ! (errcode(ERRCODE_DUPLICATE_TABLE), ! errmsg("table \"%s\" does not exists, skipping", ! stmt->relation->relname))); ! return NIL; ! } ! } ! else ! rel = relation_openrv(stmt->relation, lockmode); /* Set up pstate and CreateStmtContext */ pstate = make_parsestate(NULL); *** ./src/include/nodes/parsenodes.h.orig 2011-12-01 22:47:20.000000000 +0100 --- ./src/include/nodes/parsenodes.h 2012-01-02 11:15:04.643006891 +0100 *************** *** 1169,1174 **** --- 1169,1175 ---- 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 *** ./src/test/regress/expected/alter_table.out.orig 2011-12-01 22:47:20.000000000 +0100 --- ./src/test/regress/expected/alter_table.out 2012-01-02 14:04:03.000000000 +0100 *************** *** 2002,2004 **** --- 2002,2018 ---- x | integer | y | numeric(8,2) | + -- + -- IF EXISTS test + -- + ALTER TABLE IF EXISTS tt8 ADD COLUMN f int; + NOTICE: table "tt8" does not exists, skipping + CREATE TABLE tt8(a int); + ALTER TABLE IF EXISTS tt8 ADD COLUMN f int; + \d tt8 + Table "public.tt8" + Column | Type | Modifiers + --------+---------+----------- + a | integer | + f | integer | + *** ./src/test/regress/sql/alter_table.sql.orig 2011-12-01 22:47:20.000000000 +0100 --- ./src/test/regress/sql/alter_table.sql 2012-01-02 14:03:34.319346213 +0100 *************** *** 1410,1412 **** --- 1410,1421 ---- ALTER TABLE tt7 OF tt_t1; -- reassign an already-typed table ALTER TABLE tt7 NOT OF; \d tt7 + + -- + -- IF EXISTS test + -- + ALTER TABLE IF EXISTS tt8 ADD COLUMN f int; + + CREATE TABLE tt8(a int); + ALTER TABLE IF EXISTS tt8 ADD COLUMN f int; + \d tt8
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers