aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/typecmds.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2017-01-07 16:02:16 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2017-01-07 16:02:16 -0500
commit7c3abe3c92fd3a14a70bc2f888f936cd6fe28c0f (patch)
treead42bd2d3dfa871ec753a0457b9bc9ee776cd159 /src/backend/commands/typecmds.c
parent3c40594e6eeabb3a8ad22aee93de3a19c41efdc2 (diff)
downloadpostgresql-7c3abe3c92fd3a14a70bc2f888f936cd6fe28c0f.tar.gz
postgresql-7c3abe3c92fd3a14a70bc2f888f936cd6fe28c0f.zip
Get rid of ParseState.p_value_substitute; use a columnref hook instead.
I noticed that p_value_substitute, which is a single-purpose kluge I added in 2002 (commit b0422b215), could be replaced by having domainAddConstraint install a parser hook that looks for the name "value". The parser hook code only dates back to 2009, so it's not surprising that we had to kluge this in 2002, but we can do it more cleanly now.
Diffstat (limited to 'src/backend/commands/typecmds.c')
-rw-r--r--src/backend/commands/typecmds.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index c07babbe972..3ff6cbca56f 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -104,6 +104,8 @@ static char *domainAddConstraint(Oid domainOid, Oid domainNamespace,
Oid baseTypeOid,
int typMod, Constraint *constr,
char *domainName, ObjectAddress *constrAddr);
+static Node *replace_domain_constraint_value(ParseState *pstate,
+ ColumnRef *cref);
/*
@@ -3022,7 +3024,8 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
domVal->collation = get_typcollation(baseTypeOid);
domVal->location = -1; /* will be set when/if used */
- pstate->p_value_substitute = (Node *) domVal;
+ pstate->p_pre_columnref_hook = replace_domain_constraint_value;
+ pstate->p_ref_hook_state = (void *) domVal;
expr = transformExpr(pstate, constr->raw_expr, EXPR_KIND_DOMAIN_CHECK);
@@ -3099,6 +3102,35 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
return ccbin;
}
+/* Parser pre_columnref_hook for domain CHECK constraint parsing */
+static Node *
+replace_domain_constraint_value(ParseState *pstate, ColumnRef *cref)
+{
+ /*
+ * Check for a reference to "value", and if that's what it is, replace
+ * with a CoerceToDomainValue as prepared for us by domainAddConstraint.
+ * (We handle VALUE as a name, not a keyword, to avoid breaking a lot of
+ * applications that have used VALUE as a column name in the past.)
+ */
+ if (list_length(cref->fields) == 1)
+ {
+ Node *field1 = (Node *) linitial(cref->fields);
+ char *colname;
+
+ Assert(IsA(field1, String));
+ colname = strVal(field1);
+ if (strcmp(colname, "value") == 0)
+ {
+ CoerceToDomainValue *domVal = copyObject(pstate->p_ref_hook_state);
+
+ /* Propagate location knowledge, if any */
+ domVal->location = cref->location;
+ return (Node *) domVal;
+ }
+ }
+ return NULL;
+}
+
/*
* Execute ALTER TYPE RENAME