Cause ALTER TABLE to perform ALTER COLUMN DROP DEFAULT operations during
authorTom Lane
Thu, 3 Aug 2006 20:57:06 +0000 (20:57 +0000)
committerTom Lane
Thu, 3 Aug 2006 20:57:06 +0000 (20:57 +0000)
the DROP pass rather than the ADD_CONSTR pass.  On examining the code I
think this was just an oversight rather than intentional, and it seems
to satisfy the principle of least surprise better than the alternative
solution that was discussed.  Add an example to the ref page showing how
to do ALTER TYPE and update the default in one command.  Per gripe from
Markus Bertheau that that wasn't possible.

doc/src/sgml/ref/alter_table.sgml
src/backend/commands/tablecmds.c

index c753eb6300735e682403e51966744dfb74c8eafd..17b0f3667dabaa1df5c6142bb36dc7f1b483373d 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -741,6 +741,19 @@ ALTER TABLE foo
 
   
 
+  
+   The same, when the column has a default expression that won't automatically
+   cast to the new datatype:
+
+ALTER TABLE foo
+    ALTER COLUMN foo_timestamp DROP DEFAULT,
+    ALTER COLUMN foo_timestamp TYPE timestamp with time zone
+    USING
+        timestamp with time zone 'epoch' + foo_timestamp * interval '1 second',
+    ALTER COLUMN foo_timestamp SET DEFAULT now();
+
+  
+
   
    To rename an existing column:
 
index 3b408b411a6acd9d1c26743f019262cb6724ea5d..cd4c4eb2304deca6a08529986e3621cc66cda322 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.198 2006/07/31 20:09:00 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.199 2006/08/03 20:57:06 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2000,7 +2000,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd,
            ATSimplePermissions(rel, true);
            ATSimpleRecursion(wqueue, rel, cmd, recurse);
            /* No command-specific prep needed */
-           pass = AT_PASS_ADD_CONSTR;
+           pass = cmd->def ? AT_PASS_ADD_CONSTR : AT_PASS_DROP;
            break;
        case AT_DropNotNull:    /* ALTER COLUMN DROP NOT NULL */
            ATSimplePermissions(rel, false);