Commit a060d5ff authored by Tom Lane's avatar Tom Lane

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.
parent 52ba24a1
......@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.105 2007/06/15 20:56:49 tgl Exp $
* $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.106 2007/06/20 18:15:49 tgl Exp $
*
* DESCRIPTION
* The "DefineFoo" routines take the parse tree and pick out the
......@@ -605,9 +605,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;
int32 typNDims = list_length(stmt->typename->arrayBounds);
......@@ -719,7 +719,6 @@ DefineDomain(CreateDomainStmt *stmt)
{
Node *newConstraint = lfirst(listptr);
Constraint *constr;
ParseState *pstate;
/* Check for unsupported constraint types */
if (IsA(newConstraint, FkConstraint))
......@@ -740,19 +739,25 @@ 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;
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
* Cook the constr->raw_expr into an expression.
* Note: name is strictly for error message
*/
defaultExpr = cookDefault(pstate, constr->raw_expr,
basetypeoid,
......@@ -760,15 +765,23 @@ DefineDomain(CreateDomainStmt *stmt)
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).
* 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,
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:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment