transformColumnDefinition failed to complain about
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 20 Jun 2007 18:21:51 +0000 (18:21 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 20 Jun 2007 18:21:51 +0000 (18:21 +0000)
create table foo (bar int default null default 3);
due to not thinking about the special-case handling of DEFAULT NULL.
Problem noticed while investigating bug #3396.

src/backend/parser/analyze.c

index b955b1f49287739fa451e56a3bdc45903204f028..3dbcd520986ef3971b5faf9c854c6676c02f81be 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.253.2.2 2003/02/13 22:50:09 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.253.2.3 2007/06/20 18:21:51 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -793,6 +793,7 @@ transformColumnDefinition(ParseState *pstate, CreateStmtContext *cxt,
 {
    bool        is_serial;
    bool        saw_nullable;
+   bool        saw_default;
    Constraint *constraint;
    List       *clist;
 
@@ -895,6 +896,7 @@ transformColumnDefinition(ParseState *pstate, CreateStmtContext *cxt,
    transformConstraintAttrs(column->constraints);
 
    saw_nullable = false;
+   saw_default = false;
 
    foreach(clist, column->constraints)
    {
@@ -935,11 +937,13 @@ transformColumnDefinition(ParseState *pstate, CreateStmtContext *cxt,
                break;
 
            case CONSTR_DEFAULT:
-               if (column->raw_default != NULL)
+               if (saw_default)
                    elog(ERROR, "%s/DEFAULT multiple values specified for '%s.%s'",
                         cxt->stmtType, cxt->relation->relname, column->colname);
+               /* Note: DEFAULT NULL maps to constraint->raw_expr == NULL */
                column->raw_default = constraint->raw_expr;
                Assert(constraint->cooked_expr == NULL);
+               saw_default = true;
                break;
 
            case CONSTR_PRIMARY: