mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-03-13 19:57:53 +08: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
ffa8396eee
commit
db6159bcd9
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.65.4.1 2005/01/24 23:22:13 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.65.4.2 2007/06/20 18:16:10 tgl Exp $
|
||||
*
|
||||
* DESCRIPTION
|
||||
* The "DefineFoo" routines take the parse tree and pick out the
|
||||
@ -497,9 +497,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;
|
||||
@ -608,7 +608,6 @@ DefineDomain(CreateDomainStmt *stmt)
|
||||
{
|
||||
Node *newConstraint = lfirst(listptr);
|
||||
Constraint *constr;
|
||||
ParseState *pstate;
|
||||
|
||||
/* Check for unsupported constraint types */
|
||||
if (IsA(newConstraint, FkConstraint))
|
||||
@ -629,35 +628,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…
Reference in New Issue
Block a user