]> granicus.if.org Git - postgresql/commitdiff
transformColumnDefinition failed to complain about
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 20 Jun 2007 18:21:08 +0000 (18:21 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 20 Jun 2007 18:21:08 +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 0df3bec1694722312612e85d6eca35adf2a07f40..e1be8a89467290d1cf8cc9cfe8845d37379f2c88 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *     $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.353 2006/10/11 16:42:59 tgl Exp $
+ *     $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.353.2.1 2007/06/20 18:21:08 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1033,6 +1033,7 @@ transformColumnDefinition(ParseState *pstate, CreateStmtContext *cxt,
 {
        bool            is_serial;
        bool            saw_nullable;
+       bool            saw_default;
        Constraint *constraint;
        ListCell   *clist;
 
@@ -1163,6 +1164,7 @@ transformColumnDefinition(ParseState *pstate, CreateStmtContext *cxt,
        transformConstraintAttrs(column->constraints);
 
        saw_nullable = false;
+       saw_default = false;
 
        foreach(clist, column->constraints)
        {
@@ -1207,13 +1209,15 @@ transformColumnDefinition(ParseState *pstate, CreateStmtContext *cxt,
                                break;
 
                        case CONSTR_DEFAULT:
-                               if (column->raw_default != NULL)
+                               if (saw_default)
                                        ereport(ERROR,
                                                        (errcode(ERRCODE_SYNTAX_ERROR),
                                                         errmsg("multiple default values specified for column \"%s\" of table \"%s\"",
                                                                  column->colname, cxt->relation->relname)));
+                               /* 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: