aboutsummaryrefslogtreecommitdiff
path: root/src/backend/nodes
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-05-12 23:43:04 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-05-12 23:43:04 +0000
commit3389a110d40a505951e7c7babdfb8681173bb2ca (patch)
tree438acebac5cfd161cf920bcda6ad168affcb96a7 /src/backend/nodes
parentf9e4f611a18f64fd9106a72ec9af9e2220075780 (diff)
downloadpostgresql-3389a110d40a505951e7c7babdfb8681173bb2ca.tar.gz
postgresql-3389a110d40a505951e7c7babdfb8681173bb2ca.zip
Get rid of long-since-vestigial Iter node type, in favor of adding a
returns-set boolean field in Func and Oper nodes. This allows cleaner, more reliable tests for expressions returning sets in the planner and parser. For example, a WHERE clause returning a set is now detected and complained of in the parser, not only at runtime.
Diffstat (limited to 'src/backend/nodes')
-rw-r--r--src/backend/nodes/copyfuncs.c20
-rw-r--r--src/backend/nodes/equalfuncs.c20
-rw-r--r--src/backend/nodes/makefuncs.c6
-rw-r--r--src/backend/nodes/outfuncs.c23
-rw-r--r--src/backend/nodes/readfuncs.c36
5 files changed, 35 insertions, 70 deletions
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index cfcf00a4d47..3801d409cf1 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.183 2002/05/12 20:10:02 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.184 2002/05/12 23:43:02 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -764,6 +764,7 @@ _copyOper(Oper *from)
newnode->opno = from->opno;
newnode->opid = from->opid;
newnode->opresulttype = from->opresulttype;
+ newnode->opretset = from->opretset;
/* Do not copy the run-time state, if any */
newnode->op_fcache = NULL;
@@ -852,7 +853,8 @@ _copyFunc(Func *from)
* copy remainder of node
*/
newnode->funcid = from->funcid;
- newnode->functype = from->functype;
+ newnode->funcresulttype = from->funcresulttype;
+ newnode->funcretset = from->funcretset;
/* Do not copy the run-time state, if any */
newnode->func_fcache = NULL;
@@ -1433,17 +1435,6 @@ _copyJoinInfo(JoinInfo *from)
return newnode;
}
-static Iter *
-_copyIter(Iter *from)
-{
- Iter *newnode = makeNode(Iter);
-
- Node_Copy(from, newnode, iterexpr);
- newnode->itertype = from->itertype;
-
- return newnode;
-}
-
static Stream *
_copyStream(Stream *from)
{
@@ -2729,9 +2720,6 @@ copyObject(void *from)
case T_ArrayRef:
retval = _copyArrayRef(from);
break;
- case T_Iter:
- retval = _copyIter(from);
- break;
case T_FieldSelect:
retval = _copyFieldSelect(from);
break;
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 185a16beb5a..cf203243f11 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.131 2002/05/12 20:10:03 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.132 2002/05/12 23:43:02 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -130,6 +130,8 @@ _equalOper(Oper *a, Oper *b)
return false;
if (a->opresulttype != b->opresulttype)
return false;
+ if (a->opretset != b->opretset)
+ return false;
/*
* We do not examine opid or op_fcache, since these are logically
@@ -139,7 +141,8 @@ _equalOper(Oper *a, Oper *b)
* (Besides, op_fcache is executor state, which we don't check --- see
* notes at head of file.)
*
- * It's probably not really necessary to check opresulttype either...
+ * It's probably not really necessary to check opresulttype or opretset,
+ * either...
*/
return true;
@@ -210,7 +213,9 @@ _equalFunc(Func *a, Func *b)
{
if (a->funcid != b->funcid)
return false;
- if (a->functype != b->functype)
+ if (a->funcresulttype != b->funcresulttype)
+ return false;
+ if (a->funcretset != b->funcretset)
return false;
/* Note we do not look at func_fcache; see notes for _equalOper */
@@ -539,12 +544,6 @@ _equalJoinInfo(JoinInfo *a, JoinInfo *b)
}
static bool
-_equalIter(Iter *a, Iter *b)
-{
- return equal(a->iterexpr, b->iterexpr);
-}
-
-static bool
_equalStream(Stream *a, Stream *b)
{
if (a->clausetype != b->clausetype)
@@ -1884,9 +1883,6 @@ equal(void *a, void *b)
case T_ArrayRef:
retval = _equalArrayRef(a, b);
break;
- case T_Iter:
- retval = _equalIter(a, b);
- break;
case T_RelabelType:
retval = _equalRelabelType(a, b);
break;
diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c
index 65f4ffcca37..54d9e061908 100644
--- a/src/backend/nodes/makefuncs.c
+++ b/src/backend/nodes/makefuncs.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/makefuncs.c,v 1.31 2002/04/16 23:08:10 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/makefuncs.c,v 1.32 2002/05/12 23:43:02 tgl Exp $
*/
#include "postgres.h"
@@ -56,13 +56,15 @@ makeSimpleA_Expr(int oper, const char *name,
Oper *
makeOper(Oid opno,
Oid opid,
- Oid opresulttype)
+ Oid opresulttype,
+ bool opretset)
{
Oper *oper = makeNode(Oper);
oper->opno = opno;
oper->opid = opid;
oper->opresulttype = opresulttype;
+ oper->opretset = opretset;
oper->op_fcache = NULL;
return oper;
}
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 698beb5d999..8ee69d1a702 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -5,7 +5,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.158 2002/05/12 20:10:03 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.159 2002/05/12 23:43:02 tgl Exp $
*
* NOTES
* Every (plan) node in POSTGRES has an associated "out" routine which
@@ -850,9 +850,11 @@ _outArrayRef(StringInfo str, ArrayRef *node)
static void
_outFunc(StringInfo str, Func *node)
{
- appendStringInfo(str, " FUNC :funcid %u :functype %u ",
+ appendStringInfo(str,
+ " FUNC :funcid %u :funcresulttype %u :funcretset %s ",
node->funcid,
- node->functype);
+ node->funcresulttype,
+ booltostr(node->funcretset));
}
/*
@@ -862,10 +864,11 @@ static void
_outOper(StringInfo str, Oper *node)
{
appendStringInfo(str,
- " OPER :opno %u :opid %u :opresulttype %u ",
+ " OPER :opno %u :opid %u :opresulttype %u :opretset %s ",
node->opno,
node->opid,
- node->opresulttype);
+ node->opresulttype,
+ booltostr(node->opretset));
}
/*
@@ -1247,13 +1250,6 @@ _outDatum(StringInfo str, Datum value, int typlen, bool typbyval)
}
static void
-_outIter(StringInfo str, Iter *node)
-{
- appendStringInfo(str, " ITER :iterexpr ");
- _outNode(str, node->iterexpr);
-}
-
-static void
_outStream(StringInfo str, Stream *node)
{
appendStringInfo(str,
@@ -1731,9 +1727,6 @@ _outNode(StringInfo str, void *obj)
case T_JoinInfo:
_outJoinInfo(str, obj);
break;
- case T_Iter:
- _outIter(str, obj);
- break;
case T_Stream:
_outStream(str, obj);
break;
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 27604dcb4be..98aab14b911 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.121 2002/05/12 20:10:03 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.122 2002/05/12 23:43:02 tgl Exp $
*
* NOTES
* Most of the read functions for plan nodes are tested. (In fact, they
@@ -1083,9 +1083,13 @@ _readFunc(void)
token = pg_strtok(&length); /* now read it */
local_node->funcid = atooid(token);
- token = pg_strtok(&length); /* get :functype */
+ token = pg_strtok(&length); /* get :funcresulttype */
token = pg_strtok(&length); /* now read it */
- local_node->functype = atooid(token);
+ local_node->funcresulttype = atooid(token);
+
+ token = pg_strtok(&length); /* get :funcretset */
+ token = pg_strtok(&length); /* now read it */
+ local_node->funcretset = strtobool(token);
local_node->func_fcache = NULL;
@@ -1119,6 +1123,10 @@ _readOper(void)
token = pg_strtok(&length); /* now read it */
local_node->opresulttype = atooid(token);
+ token = pg_strtok(&length); /* get :opretset */
+ token = pg_strtok(&length); /* now read it */
+ local_node->opretset = strtobool(token);
+
local_node->op_fcache = NULL;
return local_node;
@@ -1991,26 +1999,6 @@ _readJoinInfo(void)
return local_node;
}
-/* ----------------
- * _readIter()
- *
- * ----------------
- */
-static Iter *
-_readIter(void)
-{
- Iter *local_node;
- char *token;
- int length;
-
- local_node = makeNode(Iter);
-
- token = pg_strtok(&length); /* eat :iterexpr */
- local_node->iterexpr = nodeRead(true); /* now read it */
-
- return local_node;
-}
-
/* ----------------
* parsePlanString
@@ -2124,8 +2112,6 @@ parsePlanString(void)
return_value = _readRestrictInfo();
else if (length == 8 && strncmp(token, "JOININFO", length) == 0)
return_value = _readJoinInfo();
- else if (length == 4 && strncmp(token, "ITER", length) == 0)
- return_value = _readIter();
else if (length == 5 && strncmp(token, "QUERY", length) == 0)
return_value = _readQuery();
else if (length == 6 && strncmp(token, "NOTIFY", length) == 0)