summaryrefslogtreecommitdiff
path: root/src/backend/nodes
diff options
context:
space:
mode:
authorBruce Momjian2002-07-18 04:41:46 +0000
committerBruce Momjian2002-07-18 04:41:46 +0000
commit3e22406ec63b60ed50d3d0c593f9e84b5e1d058b (patch)
tree9cd544d8f473a766e21629227f615bd536d0359d /src/backend/nodes
parent7ea5f1d7f16e9771e90c020db93d7e8a9a3b22f5 (diff)
Finished the Between patch Christopher started.
Implements between (symmetric / asymmetric) as a node. Executes the left or right expression once, makes a Const out of the resulting Datum and executes the >=, <= portions out of the Const sets. Of course, the parser does a fair amount of preparatory work for this to happen. Rod Taylor
Diffstat (limited to 'src/backend/nodes')
-rw-r--r--src/backend/nodes/copyfuncs.c31
-rw-r--r--src/backend/nodes/equalfuncs.c32
-rw-r--r--src/backend/nodes/outfuncs.c37
-rw-r--r--src/backend/nodes/readfuncs.c51
4 files changed, 147 insertions, 4 deletions
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 426180dc11..46cd872063 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.194 2002/07/16 22:12:19 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.195 2002/07/18 04:41:44 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1000,6 +1000,32 @@ _copyCaseExpr(CaseExpr *from)
}
/* ----------------
+ * _copyBetweenExpr
+ * ----------------
+ */
+static BetweenExpr *
+_copyBetweenExpr(BetweenExpr *from)
+{
+ BetweenExpr *newnode = makeNode(BetweenExpr);
+
+ /*
+ * copy remainder of node
+ */
+ Node_Copy(from, newnode, expr);
+ Node_Copy(from, newnode, lexpr);
+ Node_Copy(from, newnode, rexpr);
+ Node_Copy(from, newnode, lthan);
+ Node_Copy(from, newnode, gthan);
+ newnode->symmetric = from->symmetric;
+ newnode->not = from->not;
+ newnode->typeId = from->typeId;
+ newnode->typeLen = from->typeLen;
+ newnode->typeByVal = from->typeByVal;
+
+ return newnode;
+}
+
+/* ----------------
* _copyCaseWhen
* ----------------
*/
@@ -3052,6 +3078,9 @@ copyObject(void *from)
case T_CaseExpr:
retval = _copyCaseExpr(from);
break;
+ case T_BetweenExpr:
+ retval = _copyBetweenExpr(from);
+ break;
case T_CaseWhen:
retval = _copyCaseWhen(from);
break;
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index ed5d638f0c..9213294294 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.141 2002/07/16 22:12:19 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.142 2002/07/18 04:41:44 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1770,6 +1770,33 @@ _equalCaseExpr(CaseExpr *a, CaseExpr *b)
}
static bool
+_equalBetweenExpr(BetweenExpr *a, BetweenExpr *b)
+{
+ if (!equal(a->expr, b->expr))
+ return false;
+ if (!equal(a->lexpr, b->lexpr))
+ return false;
+ if (!equal(a->rexpr, b->rexpr))
+ return false;
+ if (!equal(a->lthan, b->lthan))
+ return false;
+ if (!equal(a->gthan, b->gthan))
+ return false;
+ if (a->symmetric != b->symmetric)
+ return false;
+ if (a->not != b->not)
+ return false;
+ if (a->typeId != b->typeId)
+ return false;
+ if (a->typeLen != b->typeLen)
+ return false;
+ if (a->typeByVal != b->typeByVal)
+ return false;
+
+ return true;
+}
+
+static bool
_equalCaseWhen(CaseWhen *a, CaseWhen *b)
{
if (!equal(a->expr, b->expr))
@@ -2217,6 +2244,9 @@ equal(void *a, void *b)
case T_CaseExpr:
retval = _equalCaseExpr(a, b);
break;
+ case T_BetweenExpr:
+ retval = _equalBetweenExpr(a, b);
+ break;
case T_CaseWhen:
retval = _equalCaseWhen(a, b);
break;
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index a9e6a8382d..04721d6475 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.163 2002/07/16 22:12:19 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.164 2002/07/18 04:41:44 momjian Exp $
*
* NOTES
* Every (plan) node in POSTGRES has an associated "out" routine which
@@ -1484,6 +1484,38 @@ _outCaseWhen(StringInfo str, CaseWhen *node)
}
/*
+ * BetweenExpr
+ */
+static void
+_outBetweenExpr(StringInfo str, BetweenExpr *node)
+{
+ appendStringInfo(str, " BETWEENEXPR :expr ");
+ _outNode(str, node->expr);
+
+ appendStringInfo(str, " :not %s",
+ booltostr(node->not));
+
+ appendStringInfo(str, " :symmetric %s",
+ booltostr(node->symmetric));
+
+ appendStringInfo(str, " :lexpr ");
+ _outNode(str, node->lexpr);
+
+ appendStringInfo(str, " :rexpr ");
+ _outNode(str, node->rexpr);
+
+ appendStringInfo(str, " :gthan ");
+ _outNode(str, node->gthan);
+
+ appendStringInfo(str, " :lthan ");
+ _outNode(str, node->lthan);
+
+ appendStringInfo(str, " :typeid %u :typelen %d :typebyval %s",
+ node->typeId, node->typeLen,
+ booltostr(node->typeByVal));
+}
+
+/*
* NullTest
*/
static void
@@ -1767,6 +1799,9 @@ _outNode(StringInfo str, void *obj)
case T_CaseExpr:
_outCaseExpr(str, obj);
break;
+ case T_BetweenExpr:
+ _outBetweenExpr(str, obj);
+ break;
case T_CaseWhen:
_outCaseWhen(str, obj);
break;
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 0a22194e47..9598d8311e 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.124 2002/07/04 15:23:54 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.125 2002/07/18 04:41:45 momjian Exp $
*
* NOTES
* Most of the read functions for plan nodes are tested. (In fact, they
@@ -881,6 +881,53 @@ _readCaseWhen(void)
return local_node;
}
+static BetweenExpr *
+_readBetweenExpr(void)
+{
+ BetweenExpr *local_node;
+ char *token;
+ int length;
+
+ local_node = makeNode(BetweenExpr);
+
+ token = pg_strtok(&length); /* eat :expr */
+ local_node->expr = nodeRead(true);
+
+ token = pg_strtok(&length); /* eat :not */
+ token = pg_strtok(&length); /* get not */
+ local_node->not = strtobool(token);
+
+ token = pg_strtok(&length); /* eat :symmetric */
+ token = pg_strtok(&length); /* get symmetric */
+ local_node->symmetric = strtobool(token);
+
+ token = pg_strtok(&length); /* eat :lexpr */
+ local_node->lexpr = nodeRead(true);
+
+ token = pg_strtok(&length); /* eat :rexpr */
+ local_node->rexpr = nodeRead(true);
+
+ token = pg_strtok(&length); /* eat :gthan */
+ local_node->gthan = nodeRead(true);
+
+ token = pg_strtok(&length); /* eat :lthan */
+ local_node->lthan = nodeRead(true);
+
+ token = pg_strtok(&length); /* eat :typeid */
+ token = pg_strtok(&length); /* get typeid */
+ local_node->typeId = atooid(token);
+
+ token = pg_strtok(&length); /* eat :typelen */
+ token = pg_strtok(&length); /* get typelen */
+ local_node->typeLen = atoui(token);
+
+ token = pg_strtok(&length); /* eat :typebyval */
+ token = pg_strtok(&length); /* get typebyval */
+ local_node->typeByVal = strtobool(token);
+
+ return local_node;
+}
+
/* ----------------
* _readNullTest
*
@@ -2132,6 +2179,8 @@ parsePlanString(void)
return_value = _readNullTest();
else if (length == 11 && strncmp(token, "BOOLEANTEST", length) == 0)
return_value = _readBooleanTest();
+ else if (length == 11 && strncmp(token, "BETWEENEXPR", length) == 0)
+ return_value = _readBetweenExpr();
else
elog(ERROR, "badly formatted planstring \"%.10s\"...", token);