aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2007-06-20 18:16:04 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2007-06-20 18:16:04 +0000
commitf5bfaf9546de18aaeea6ebd4fa08b4b9e98312c7 (patch)
treec0c9b4c3e6339235ed896b446e3c7f75ae9c57f0 /src
parent838e286247f0e1fcb6551f987095097ef2e77232 (diff)
downloadpostgresql-f5bfaf9546de18aaeea6ebd4fa08b4b9e98312c7.tar.gz
postgresql-f5bfaf9546de18aaeea6ebd4fa08b4b9e98312c7.zip
CREATE DOMAIN ... DEFAULT NULL failed because gram.y special-cases DEFAULT
NULL and DefineDomain didn't. Bug goes all the way back to original coding of domains. Per bug #3396 from Sergey Burladyan.
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/typecmds.c67
1 files changed, 40 insertions, 27 deletions
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 8cc58a9f588..dd5b52bc97a 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.82.2.1 2005/11/22 18:23:08 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.82.2.2 2007/06/20 18:16:04 tgl Exp $
*
* DESCRIPTION
* The "DefineFoo" routines take the parse tree and pick out the
@@ -493,9 +493,9 @@ DefineDomain(CreateDomainStmt *stmt)
char typtype;
Datum datum;
bool isnull;
- Node *defaultExpr = NULL;
char *defaultValue = NULL;
char *defaultValueBin = NULL;
+ bool saw_default = false;
bool typNotNull = false;
bool nullDefined = false;
Oid basetypelem;
@@ -602,7 +602,6 @@ DefineDomain(CreateDomainStmt *stmt)
{
Node *newConstraint = lfirst(listptr);
Constraint *constr;
- ParseState *pstate;
/* Check for unsupported constraint types */
if (IsA(newConstraint, FkConstraint))
@@ -623,35 +622,49 @@ DefineDomain(CreateDomainStmt *stmt)
/*
* The inherited default value may be overridden by the user
- * with the DEFAULT <expr> statement.
+ * with the DEFAULT <expr> clause ... but only once.
*/
- if (defaultExpr)
+ if (saw_default)
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("multiple default expressions")));
+ saw_default = true;
- /* Create a dummy ParseState for transformExpr */
- pstate = make_parsestate(NULL);
-
- /*
- * Cook the constr->raw_expr into an expression. Note: Name is
- * strictly for error message
- */
- defaultExpr = cookDefault(pstate, constr->raw_expr,
- basetypeoid,
- stmt->typename->typmod,
- domainName);
-
- /*
- * Expression must be stored as a nodeToString result, but we
- * also require a valid textual representation (mainly to make
- * life easier for pg_dump).
- */
- defaultValue = deparse_expression(defaultExpr,
- deparse_context_for(domainName,
- InvalidOid),
- false, false);
- defaultValueBin = nodeToString(defaultExpr);
+ if (constr->raw_expr)
+ {
+ ParseState *pstate;
+ Node *defaultExpr;
+
+ /* Create a dummy ParseState for transformExpr */
+ pstate = make_parsestate(NULL);
+
+ /*
+ * Cook the constr->raw_expr into an expression.
+ * Note: name is strictly for error message
+ */
+ defaultExpr = cookDefault(pstate, constr->raw_expr,
+ basetypeoid,
+ stmt->typename->typmod,
+ domainName);
+
+ /*
+ * Expression must be stored as a nodeToString result, but
+ * we also require a valid textual representation (mainly
+ * to make life easier for pg_dump).
+ */
+ defaultValue =
+ deparse_expression(defaultExpr,
+ deparse_context_for(domainName,
+ InvalidOid),
+ false, false);
+ defaultValueBin = nodeToString(defaultExpr);
+ }
+ else
+ {
+ /* DEFAULT NULL is same as not having a default */
+ defaultValue = NULL;
+ defaultValueBin = NULL;
+ }
break;
case CONSTR_NOTNULL: