1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-09 17:03:00 +03:00

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.
This commit is contained in:
Tom Lane
2007-06-20 18:16:30 +00:00
parent 72cbfa4fcc
commit cbe8af81b2

View File

@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/typecmds.c,v 1.15 2002/09/21 18:39:25 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/typecmds.c,v 1.15.2.1 2007/06/20 18:16:30 tgl Exp $
* *
* DESCRIPTION * DESCRIPTION
* The "DefineFoo" routines take the parse tree and pick out the * The "DefineFoo" routines take the parse tree and pick out the
@@ -397,6 +397,7 @@ DefineDomain(CreateDomainStmt *stmt)
Node *defaultExpr = NULL; Node *defaultExpr = NULL;
char *defaultValue = NULL; char *defaultValue = NULL;
char *defaultValueBin = NULL; char *defaultValueBin = NULL;
bool saw_default = false;
bool typNotNull = false; bool typNotNull = false;
bool nullDefined = false; bool nullDefined = false;
Oid basetypelem; Oid basetypelem;
@@ -493,42 +494,52 @@ DefineDomain(CreateDomainStmt *stmt)
foreach(listptr, schema) foreach(listptr, schema)
{ {
Constraint *colDef = lfirst(listptr); Constraint *colDef = lfirst(listptr);
ParseState *pstate;
switch (colDef->contype) switch (colDef->contype)
{ {
case CONSTR_DEFAULT:
/* /*
* The inherited default value may be overridden by the * The inherited default value may be overridden by the
* user with the DEFAULT <expr> statement. * user with the DEFAULT <expr> clause ... but only once.
*
* We have to search the entire constraint tree returned as
* we don't want to cook or fiddle too much.
*/ */
case CONSTR_DEFAULT: if (saw_default)
if (defaultExpr)
elog(ERROR, "CREATE DOMAIN has multiple DEFAULT expressions"); elog(ERROR, "CREATE DOMAIN has multiple DEFAULT expressions");
/* Create a dummy ParseState for transformExpr */ saw_default = true;
pstate = make_parsestate(NULL);
/* if (colDef->raw_expr)
* Cook the colDef->raw_expr into an expression. Note: {
* Name is strictly for error message ParseState *pstate;
*/
defaultExpr = cookDefault(pstate, colDef->raw_expr,
basetypeoid,
stmt->typename->typmod,
domainName);
/* /* Create a dummy ParseState for transformExpr */
* Expression must be stored as a nodeToString result, but pstate = make_parsestate(NULL);
* we also require a valid textual representation (mainly
* to make life easier for pg_dump). /*
*/ * Cook the colDef->raw_expr into an expression.
defaultValue = deparse_expression(defaultExpr, * Note: name is strictly for error message
deparse_context_for(domainName, */
InvalidOid), defaultExpr = cookDefault(pstate, colDef->raw_expr,
false, false); basetypeoid,
defaultValueBin = nodeToString(defaultExpr); 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; break;
/* /*