aboutsummaryrefslogtreecommitdiff
path: root/src/backend/nodes
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2002-11-15 02:50:21 +0000
committerBruce Momjian <bruce@momjian.us>2002-11-15 02:50:21 +0000
commit6b603e67dcd1a93a56f3c6b5f36fd8f08e2ee35d (patch)
tree5d4a4a590f20c0516bb380e6169114120be3d58f /src/backend/nodes
parent2986aa6a668bce3cfb83606bb52e9d01ae66ad6c (diff)
downloadpostgresql-6b603e67dcd1a93a56f3c6b5f36fd8f08e2ee35d.tar.gz
postgresql-6b603e67dcd1a93a56f3c6b5f36fd8f08e2ee35d.zip
Add DOMAIN check constraints.
Rod Taylor
Diffstat (limited to 'src/backend/nodes')
-rw-r--r--src/backend/nodes/copyfuncs.c32
-rw-r--r--src/backend/nodes/equalfuncs.c27
-rw-r--r--src/backend/nodes/outfuncs.c30
-rw-r--r--src/backend/nodes/readfuncs.c50
4 files changed, 134 insertions, 5 deletions
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index c354abf5dad..9dc29584e82 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -15,7 +15,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.217 2002/11/11 22:19:22 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.218 2002/11/15 02:50:06 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1056,11 +1056,35 @@ _copyConstraintTest(ConstraintTest *from)
newnode->testtype = from->testtype;
if (from->name)
newnode->name = pstrdup(from->name);
+ if (from->domname)
+ newnode->domname = pstrdup(from->domname);
Node_Copy(from, newnode, check_expr);
return newnode;
}
+static ConstraintTestValue *
+_copyConstraintTestValue(ConstraintTestValue *from)
+{
+ ConstraintTestValue *newnode = makeNode(ConstraintTestValue);
+
+ /*
+ * copy remainder of node
+ */
+ newnode->typeId = from->typeId;
+ newnode->typeMod = from->typeMod;
+
+ return newnode;
+}
+
+static DomainConstraintValue *
+_copyDomainConstraintValue(DomainConstraintValue *from)
+{
+ DomainConstraintValue *newnode = makeNode(DomainConstraintValue);
+
+ return newnode;
+}
+
static ArrayRef *
_copyArrayRef(ArrayRef *from)
{
@@ -3252,6 +3276,9 @@ copyObject(void *from)
case T_ConstraintTest:
retval = _copyConstraintTest(from);
break;
+ case T_ConstraintTestValue:
+ retval = _copyConstraintTestValue(from);
+ break;
case T_FkConstraint:
retval = _copyFkConstraint(from);
break;
@@ -3264,6 +3291,9 @@ copyObject(void *from)
case T_InsertDefault:
retval = _copyInsertDefault(from);
break;
+ case T_DomainConstraintValue:
+ retval = _copyDomainConstraintValue(from);
+ break;
default:
elog(ERROR, "copyObject: don't know how to copy node type %d",
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index ab84f5d3d20..68e93e48b08 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -20,7 +20,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.163 2002/11/11 22:19:22 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.164 2002/11/15 02:50:06 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1971,15 +1971,32 @@ _equalConstraintTest(ConstraintTest *a, ConstraintTest *b)
return false;
if (!equalstr(a->name, b->name))
return false;
+ if (!equalstr(a->domname, b->domname))
+ return false;
if (!equal(a->check_expr, b->check_expr))
return false;
return true;
}
+static bool
+_equalConstraintTestValue(ConstraintTestValue *a, ConstraintTestValue *b)
+{
+ if (a->typeId != b->typeId)
+ return false;
+ if (a->typeMod != b->typeMod)
+ return false;
+ return true;
+}
+
+static bool
+_equalDomainConstraintValue(DomainConstraintValue *a, DomainConstraintValue *b)
+{
+ return true;
+}
+
/*
* Stuff from pg_list.h
*/
-
static bool
_equalValue(Value *a, Value *b)
{
@@ -2438,6 +2455,9 @@ equal(void *a, void *b)
case T_ConstraintTest:
retval = _equalConstraintTest(a, b);
break;
+ case T_ConstraintTestValue:
+ retval = _equalConstraintTestValue(a, b);
+ break;
case T_FkConstraint:
retval = _equalFkConstraint(a, b);
break;
@@ -2450,6 +2470,9 @@ equal(void *a, void *b)
case T_InsertDefault:
retval = _equalInsertDefault(a, b);
break;
+ case T_DomainConstraintValue:
+ retval = _equalDomainConstraintValue(a, b);
+ break;
default:
elog(WARNING, "equal: don't know whether nodes of type %d are equal",
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index c5b5a493583..2d1f2236c9b 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -5,7 +5,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.179 2002/11/11 22:19:22 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.180 2002/11/15 02:50:07 momjian Exp $
*
* NOTES
* Every (plan) node in POSTGRES has an associated "out" routine which
@@ -1525,11 +1525,33 @@ _outConstraintTest(StringInfo str, ConstraintTest *node)
appendStringInfo(str, " :testtype %d :name ",
(int) node->testtype);
_outToken(str, node->name);
+ appendStringInfo(str, " :domain ");
+ _outToken(str, node->domname);
appendStringInfo(str, " :check_expr ");
_outNode(str, node->check_expr);
}
/*
+ * ConstraintTestValue
+ */
+static void
+_outConstraintTestValue(StringInfo str, ConstraintTestValue *node)
+{
+ appendStringInfo(str, " CONSTRAINTTESTVALUE :typeid %u :typemod %d ",
+ node->typeId,
+ node->typeMod);
+}
+
+/*
+ * DomainConstraintValue
+ */
+static void
+_outDomainConstraintValue(StringInfo str, DomainConstraintValue *node)
+{
+ appendStringInfo(str, " DOMAINCONSTRAINTVALUE ");
+}
+
+/*
* _outNode -
* converts a Node into ascii string and append it to 'str'
*/
@@ -1796,9 +1818,15 @@ _outNode(StringInfo str, void *obj)
case T_ConstraintTest:
_outConstraintTest(str, obj);
break;
+ case T_ConstraintTestValue:
+ _outConstraintTestValue(str, obj);
+ break;
case T_FuncCall:
_outFuncCall(str, obj);
break;
+ case T_DomainConstraintValue:
+ _outDomainConstraintValue(str, obj);
+ break;
default:
elog(WARNING, "_outNode: don't know how to print type %d ",
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 568bf8ee1e4..9b2198ec5a5 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.136 2002/11/06 00:00:44 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.137 2002/11/15 02:50:07 momjian Exp $
*
* NOTES
* Most of the read functions for plan nodes are tested. (In fact, they
@@ -949,6 +949,10 @@ _readConstraintTest(void)
token = pg_strtok(&length); /* now read it */
local_node->name = nullable_string(token, length);
+ token = pg_strtok(&length); /* get :domname */
+ token = pg_strtok(&length); /* get domname */
+ local_node->domname = nullable_string(token, length);
+
token = pg_strtok(&length); /* eat :check_expr */
local_node->check_expr = nodeRead(true); /* now read it */
@@ -956,6 +960,46 @@ _readConstraintTest(void)
}
/* ----------------
+ * _readConstraintTestValue
+ *
+ * ConstraintTestValue is a subclass of Node
+ * ----------------
+ */
+static ConstraintTestValue *
+_readConstraintTestValue(void)
+{
+ ConstraintTestValue *local_node;
+ char *token;
+ int length;
+
+ local_node = makeNode(ConstraintTestValue);
+ token = pg_strtok(&length); /* eat :typeid */
+ token = pg_strtok(&length); /* get typeid */
+ local_node->typeId = atooid(token);
+ token = pg_strtok(&length); /* eat :typemod */
+ token = pg_strtok(&length); /* get typemod */
+ local_node->typeMod = atoi(token);
+
+ return local_node;
+}
+
+/* ----------------
+ * _readDomainConstraintValue
+ *
+ * DomainConstraintValue is a subclass of Node
+ * ----------------
+ */
+static DomainConstraintValue *
+_readDomainConstraintValue(void)
+{
+ DomainConstraintValue *local_node;
+
+ local_node = makeNode(DomainConstraintValue);
+
+ return local_node;
+}
+
+/* ----------------
* _readVar
*
* Var is a subclass of Expr
@@ -2300,6 +2344,10 @@ parsePlanString(void)
return_value = _readBooleanTest();
else if (length == 14 && strncmp(token, "CONSTRAINTTEST", length) == 0)
return_value = _readConstraintTest();
+ else if (length == 21 && strncmp(token, "DOMAINCONSTRAINTVALUE", length) == 0)
+ return_value = _readDomainConstraintValue();
+ else if (length == 19 && strncmp(token, "CONSTRAINTTESTVALUE", length) == 0)
+ return_value = _readConstraintTestValue();
else
elog(ERROR, "badly formatted planstring \"%.10s\"...", token);