mirror of
https://github.com/postgres/postgres.git
synced 2025-06-01 00:01:20 -04: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:
parent
838e286247
commit
f5bfaf9546
@ -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);
|
||||
if (constr->raw_expr)
|
||||
{
|
||||
ParseState *pstate;
|
||||
Node *defaultExpr;
|
||||
|
||||
/*
|
||||
* 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);
|
||||
/* Create a dummy ParseState for transformExpr */
|
||||
pstate = make_parsestate(NULL);
|
||||
|
||||
/*
|
||||
* 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);
|
||||
/*
|
||||
* 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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user