Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/nodes')
-rw-r--r--src/backend/nodes/copyfuncs.c78
-rw-r--r--src/backend/nodes/equalfuncs.c86
-rw-r--r--src/backend/nodes/list.c26
-rw-r--r--src/backend/nodes/outfuncs.c68
-rw-r--r--src/backend/nodes/print.c5
-rw-r--r--src/backend/nodes/readfuncs.c65
6 files changed, 203 insertions, 125 deletions
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 808ffbd075a..1a0f4623978 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.123 2000/09/29 18:21:29 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.124 2000/10/05 19:11:27 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -176,7 +176,6 @@ _copyAppend(Append *from)
* ----------------
*/
Node_Copy(from, newnode, appendplans);
- Node_Copy(from, newnode, unionrtables);
newnode->inheritrelid = from->inheritrelid;
Node_Copy(from, newnode, inheritrtable);
@@ -565,6 +564,33 @@ _copyUnique(Unique *from)
return newnode;
}
+/* ----------------
+ * _copySetOp
+ * ----------------
+ */
+static SetOp *
+_copySetOp(SetOp *from)
+{
+ SetOp *newnode = makeNode(SetOp);
+
+ /* ----------------
+ * copy node superclass fields
+ * ----------------
+ */
+ CopyPlanFields((Plan *) from, (Plan *) newnode);
+
+ /* ----------------
+ * copy remainder of node
+ * ----------------
+ */
+ newnode->cmd = from->cmd;
+ newnode->numCols = from->numCols;
+ newnode->dupColIdx = palloc(from->numCols * sizeof(AttrNumber));
+ memcpy(newnode->dupColIdx, from->dupColIdx, from->numCols * sizeof(AttrNumber));
+ newnode->flagColIdx = from->flagColIdx;
+
+ return newnode;
+}
/* ----------------
* _copyHash
@@ -1696,28 +1722,26 @@ _copyQuery(Query *from)
newnode->isPortal = from->isPortal;
newnode->isBinary = from->isBinary;
newnode->isTemp = from->isTemp;
- newnode->unionall = from->unionall;
newnode->hasAggs = from->hasAggs;
newnode->hasSubLinks = from->hasSubLinks;
Node_Copy(from, newnode, rtable);
Node_Copy(from, newnode, jointree);
- Node_Copy(from, newnode, targetList);
-
newnode->rowMarks = listCopy(from->rowMarks);
- Node_Copy(from, newnode, distinctClause);
- Node_Copy(from, newnode, sortClause);
+ Node_Copy(from, newnode, targetList);
+
Node_Copy(from, newnode, groupClause);
Node_Copy(from, newnode, havingQual);
-
- /* why is intersectClause missing? */
- Node_Copy(from, newnode, unionClause);
+ Node_Copy(from, newnode, distinctClause);
+ Node_Copy(from, newnode, sortClause);
Node_Copy(from, newnode, limitOffset);
Node_Copy(from, newnode, limitCount);
+ Node_Copy(from, newnode, setOperations);
+
/*
* We do not copy the planner internal fields: base_rel_list,
* join_rel_list, equi_key_list, query_pathkeys. Not entirely clear if
@@ -1734,17 +1758,9 @@ _copyInsertStmt(InsertStmt *from)
if (from->relname)
newnode->relname = pstrdup(from->relname);
- Node_Copy(from, newnode, distinctClause);
Node_Copy(from, newnode, cols);
Node_Copy(from, newnode, targetList);
- Node_Copy(from, newnode, fromClause);
- Node_Copy(from, newnode, whereClause);
- Node_Copy(from, newnode, groupClause);
- Node_Copy(from, newnode, havingClause);
- Node_Copy(from, newnode, unionClause);
- newnode->unionall = from->unionall;
- Node_Copy(from, newnode, intersectClause);
- Node_Copy(from, newnode, forUpdate);
+ Node_Copy(from, newnode, selectStmt);
return newnode;
}
@@ -1790,15 +1806,11 @@ _copySelectStmt(SelectStmt *from)
Node_Copy(from, newnode, whereClause);
Node_Copy(from, newnode, groupClause);
Node_Copy(from, newnode, havingClause);
- Node_Copy(from, newnode, intersectClause);
- Node_Copy(from, newnode, exceptClause);
- Node_Copy(from, newnode, unionClause);
Node_Copy(from, newnode, sortClause);
if (from->portalname)
newnode->portalname = pstrdup(from->portalname);
newnode->binary = from->binary;
newnode->istemp = from->istemp;
- newnode->unionall = from->unionall;
Node_Copy(from, newnode, limitOffset);
Node_Copy(from, newnode, limitCount);
Node_Copy(from, newnode, forUpdate);
@@ -1806,6 +1818,20 @@ _copySelectStmt(SelectStmt *from)
return newnode;
}
+static SetOperationStmt *
+_copySetOperationStmt(SetOperationStmt *from)
+{
+ SetOperationStmt *newnode = makeNode(SetOperationStmt);
+
+ newnode->op = from->op;
+ newnode->all = from->all;
+ Node_Copy(from, newnode, larg);
+ Node_Copy(from, newnode, rarg);
+ newnode->colTypes = listCopy(from->colTypes);
+
+ return newnode;
+}
+
static AlterTableStmt *
_copyAlterTableStmt(AlterTableStmt *from)
{
@@ -2553,6 +2579,9 @@ copyObject(void *from)
case T_Unique:
retval = _copyUnique(from);
break;
+ case T_SetOp:
+ retval = _copySetOp(from);
+ break;
case T_Hash:
retval = _copyHash(from);
break;
@@ -2700,6 +2729,9 @@ copyObject(void *from)
case T_SelectStmt:
retval = _copySelectStmt(from);
break;
+ case T_SetOperationStmt:
+ retval = _copySetOperationStmt(from);
+ break;
case T_AlterTableStmt:
retval = _copyAlterTableStmt(from);
break;
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index bcb8e396ede..ab8779cb375 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.74 2000/09/29 18:21:29 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.75 2000/10/05 19:11:27 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -33,8 +33,6 @@
#include "utils/datum.h"
-static bool equali(List *a, List *b);
-
/* Macro for comparing string fields that might be NULL */
#define equalstr(a, b) \
(((a) != NULL && (b) != NULL) ? (strcmp(a, b) == 0) : (a) == (b))
@@ -600,8 +598,6 @@ _equalQuery(Query *a, Query *b)
return false;
if (a->isTemp != b->isTemp)
return false;
- if (a->unionall != b->unionall)
- return false;
if (a->hasAggs != b->hasAggs)
return false;
if (a->hasSubLinks != b->hasSubLinks)
@@ -610,26 +606,24 @@ _equalQuery(Query *a, Query *b)
return false;
if (!equal(a->jointree, b->jointree))
return false;
- if (!equal(a->targetList, b->targetList))
- return false;
if (!equali(a->rowMarks, b->rowMarks))
return false;
- if (!equal(a->distinctClause, b->distinctClause))
- return false;
- if (!equal(a->sortClause, b->sortClause))
+ if (!equal(a->targetList, b->targetList))
return false;
if (!equal(a->groupClause, b->groupClause))
return false;
if (!equal(a->havingQual, b->havingQual))
return false;
- if (!equal(a->intersectClause, b->intersectClause))
+ if (!equal(a->distinctClause, b->distinctClause))
return false;
- if (!equal(a->unionClause, b->unionClause))
+ if (!equal(a->sortClause, b->sortClause))
return false;
if (!equal(a->limitOffset, b->limitOffset))
return false;
if (!equal(a->limitCount, b->limitCount))
return false;
+ if (!equal(a->setOperations, b->setOperations))
+ return false;
/*
* We do not check the internal-to-the-planner fields: base_rel_list,
@@ -645,27 +639,11 @@ _equalInsertStmt(InsertStmt *a, InsertStmt *b)
{
if (!equalstr(a->relname, b->relname))
return false;
- if (!equal(a->distinctClause, b->distinctClause))
- return false;
if (!equal(a->cols, b->cols))
return false;
if (!equal(a->targetList, b->targetList))
return false;
- if (!equal(a->fromClause, b->fromClause))
- return false;
- if (!equal(a->whereClause, b->whereClause))
- return false;
- if (!equal(a->groupClause, b->groupClause))
- return false;
- if (!equal(a->havingClause, b->havingClause))
- return false;
- if (!equal(a->unionClause, b->unionClause))
- return false;
- if (a->unionall != b->unionall)
- return false;
- if (!equal(a->intersectClause, b->intersectClause))
- return false;
- if (!equal(a->forUpdate, b->forUpdate))
+ if (!equal(a->selectStmt, b->selectStmt))
return false;
return true;
@@ -718,12 +696,6 @@ _equalSelectStmt(SelectStmt *a, SelectStmt *b)
return false;
if (!equal(a->havingClause, b->havingClause))
return false;
- if (!equal(a->intersectClause, b->intersectClause))
- return false;
- if (!equal(a->exceptClause, b->exceptClause))
- return false;
- if (!equal(a->unionClause, b->unionClause))
- return false;
if (!equal(a->sortClause, b->sortClause))
return false;
if (!equalstr(a->portalname, b->portalname))
@@ -732,8 +704,6 @@ _equalSelectStmt(SelectStmt *a, SelectStmt *b)
return false;
if (a->istemp != b->istemp)
return false;
- if (a->unionall != b->unionall)
- return false;
if (!equal(a->limitOffset, b->limitOffset))
return false;
if (!equal(a->limitCount, b->limitCount))
@@ -745,6 +715,23 @@ _equalSelectStmt(SelectStmt *a, SelectStmt *b)
}
static bool
+_equalSetOperationStmt(SetOperationStmt *a, SetOperationStmt *b)
+{
+ if (a->op != b->op)
+ return false;
+ if (a->all != b->all)
+ return false;
+ if (!equal(a->larg, b->larg))
+ return false;
+ if (!equal(a->rarg, b->rarg))
+ return false;
+ if (!equali(a->colTypes, b->colTypes))
+ return false;
+
+ return true;
+}
+
+static bool
_equalAlterTableStmt(AlterTableStmt *a, AlterTableStmt *b)
{
if (a->subtype != b->subtype)
@@ -1929,6 +1916,9 @@ equal(void *a, void *b)
case T_SelectStmt:
retval = _equalSelectStmt(a, b);
break;
+ case T_SetOperationStmt:
+ retval = _equalSetOperationStmt(a, b);
+ break;
case T_AlterTableStmt:
retval = _equalAlterTableStmt(a, b);
break;
@@ -2159,25 +2149,3 @@ equal(void *a, void *b)
return retval;
}
-
-/*
- * equali
- * compares two lists of integers
- */
-static bool
-equali(List *a, List *b)
-{
- List *l;
-
- foreach(l, a)
- {
- if (b == NIL)
- return false;
- if (lfirsti(l) != lfirsti(b))
- return false;
- b = lnext(b);
- }
- if (b != NIL)
- return false;
- return true;
-}
diff --git a/src/backend/nodes/list.c b/src/backend/nodes/list.c
index 358e6a7eb6f..66674b5c364 100644
--- a/src/backend/nodes/list.c
+++ b/src/backend/nodes/list.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/list.c,v 1.34 2000/09/29 18:21:29 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/list.c,v 1.35 2000/10/05 19:11:27 tgl Exp $
*
* NOTES
* XXX a few of the following functions are duplicated to handle
@@ -237,10 +237,32 @@ freeList(List *list)
}
/*
+ * equali
+ * compares two lists of integers
+ */
+bool
+equali(List *list1, List *list2)
+{
+ List *l;
+
+ foreach(l, list1)
+ {
+ if (list2 == NIL)
+ return false;
+ if (lfirsti(l) != lfirsti(list2))
+ return false;
+ list2 = lnext(list2);
+ }
+ if (list2 != NIL)
+ return false;
+ return true;
+}
+
+/*
* sameseti
*
* Returns t if two integer lists contain the same elements
- * (but unlike equal(), they need not be in the same order)
+ * (but unlike equali(), they need not be in the same order)
*
* Caution: this routine could be fooled if list1 contains
* duplicate elements. It is intended to be used on lists
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 39bc497343b..cf8c90ecad6 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.127 2000/09/29 18:21:29 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.128 2000/10/05 19:11:27 tgl Exp $
*
* NOTES
* Every (plan) node in POSTGRES has an associated "out" routine which
@@ -147,6 +147,7 @@ _outIndexStmt(StringInfo str, IndexStmt *node)
static void
_outSelectStmt(StringInfo str, SelectStmt *node)
{
+ /* XXX this is pretty durn incomplete */
appendStringInfo(str, "SELECT :where ");
_outNode(str, node->whereClause);
}
@@ -258,11 +259,10 @@ _outQuery(StringInfo str, Query *node)
_outToken(str, node->into);
appendStringInfo(str, " :isPortal %s :isBinary %s :isTemp %s"
- " :unionall %s :hasAggs %s :hasSubLinks %s :rtable ",
+ " :hasAggs %s :hasSubLinks %s :rtable ",
node->isPortal ? "true" : "false",
node->isBinary ? "true" : "false",
node->isTemp ? "true" : "false",
- node->unionall ? "true" : "false",
node->hasAggs ? "true" : "false",
node->hasSubLinks ? "true" : "false");
_outNode(str, node->rtable);
@@ -270,17 +270,11 @@ _outQuery(StringInfo str, Query *node)
appendStringInfo(str, " :jointree ");
_outNode(str, node->jointree);
- appendStringInfo(str, " :targetList ");
- _outNode(str, node->targetList);
-
appendStringInfo(str, " :rowMarks ");
_outIntList(str, node->rowMarks);
- appendStringInfo(str, " :distinctClause ");
- _outNode(str, node->distinctClause);
-
- appendStringInfo(str, " :sortClause ");
- _outNode(str, node->sortClause);
+ appendStringInfo(str, " :targetList ");
+ _outNode(str, node->targetList);
appendStringInfo(str, " :groupClause ");
_outNode(str, node->groupClause);
@@ -288,17 +282,20 @@ _outQuery(StringInfo str, Query *node)
appendStringInfo(str, " :havingQual ");
_outNode(str, node->havingQual);
- appendStringInfo(str, " :intersectClause ");
- _outNode(str, node->intersectClause);
+ appendStringInfo(str, " :distinctClause ");
+ _outNode(str, node->distinctClause);
- appendStringInfo(str, " :unionClause ");
- _outNode(str, node->unionClause);
+ appendStringInfo(str, " :sortClause ");
+ _outNode(str, node->sortClause);
appendStringInfo(str, " :limitOffset ");
_outNode(str, node->limitOffset);
appendStringInfo(str, " :limitCount ");
_outNode(str, node->limitCount);
+
+ appendStringInfo(str, " :setOperations ");
+ _outNode(str, node->setOperations);
}
static void
@@ -315,6 +312,19 @@ _outGroupClause(StringInfo str, GroupClause *node)
node->tleSortGroupRef, node->sortop);
}
+static void
+_outSetOperationStmt(StringInfo str, SetOperationStmt *node)
+{
+ appendStringInfo(str, " SETOPERATIONSTMT :op %d :all %s :larg ",
+ (int) node->op,
+ node->all ? "true" : "false");
+ _outNode(str, node->larg);
+ appendStringInfo(str, " :rarg ");
+ _outNode(str, node->rarg);
+ appendStringInfo(str, " :colTypes ");
+ _outIntList(str, node->colTypes);
+}
+
/*
* print the basic stuff of all nodes that inherit from Plan
*/
@@ -384,11 +394,7 @@ _outAppend(StringInfo str, Append *node)
appendStringInfo(str, " :appendplans ");
_outNode(str, node->appendplans);
- appendStringInfo(str, " :unionrtables ");
- _outNode(str, node->unionrtables);
-
- appendStringInfo(str,
- " :inheritrelid %u :inheritrtable ",
+ appendStringInfo(str, " :inheritrelid %u :inheritrtable ",
node->inheritrelid);
_outNode(str, node->inheritrtable);
}
@@ -601,6 +607,22 @@ _outUnique(StringInfo str, Unique *node)
appendStringInfo(str, "%d ", (int) node->uniqColIdx[i]);
}
+static void
+_outSetOp(StringInfo str, SetOp *node)
+{
+ int i;
+
+ appendStringInfo(str, " SETOP ");
+ _outPlanInfo(str, (Plan *) node);
+
+ appendStringInfo(str, " :cmd %d :numCols %d :dupColIdx ",
+ (int) node->cmd, node->numCols);
+ for (i = 0; i < node->numCols; i++)
+ appendStringInfo(str, "%d ", (int) node->dupColIdx[i]);
+ appendStringInfo(str, " :flagColIdx %d ",
+ (int) node->flagColIdx);
+}
+
/*
* Hash is a subclass of Plan
*/
@@ -1480,6 +1502,9 @@ _outNode(StringInfo str, void *obj)
case T_GroupClause:
_outGroupClause(str, obj);
break;
+ case T_SetOperationStmt:
+ _outSetOperationStmt(str, obj);
+ break;
case T_Plan:
_outPlan(str, obj);
break;
@@ -1531,6 +1556,9 @@ _outNode(StringInfo str, void *obj)
case T_Unique:
_outUnique(str, obj);
break;
+ case T_SetOp:
+ _outSetOp(str, obj);
+ break;
case T_Hash:
_outHash(str, obj);
break;
diff --git a/src/backend/nodes/print.c b/src/backend/nodes/print.c
index a0417f8108b..c507cea3c45 100644
--- a/src/backend/nodes/print.c
+++ b/src/backend/nodes/print.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.42 2000/09/29 18:21:29 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.43 2000/10/05 19:11:27 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -338,6 +338,9 @@ plannode_type(Plan *p)
case T_Unique:
return "UNIQUE";
break;
+ case T_SetOp:
+ return "SETOP";
+ break;
case T_Hash:
return "HASH";
break;
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index da0ba22684f..57174bfb60e 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.97 2000/09/29 18:21:29 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.98 2000/10/05 19:11:27 tgl Exp $
*
* NOTES
* Most of the read functions for plan nodes are tested. (In fact, they
@@ -109,10 +109,6 @@ _readQuery()
token = lsptok(NULL, &length); /* get isTemp */
local_node->isTemp = (token[0] == 't') ? true : false;
- token = lsptok(NULL, &length); /* skip :unionall */
- token = lsptok(NULL, &length); /* get unionall */
- local_node->unionall = (token[0] == 't') ? true : false;
-
token = lsptok(NULL, &length); /* skip the :hasAggs */
token = lsptok(NULL, &length); /* get hasAggs */
local_node->hasAggs = (token[0] == 't') ? true : false;
@@ -127,17 +123,11 @@ _readQuery()
token = lsptok(NULL, &length); /* skip :jointree */
local_node->jointree = nodeRead(true);
- token = lsptok(NULL, &length); /* skip :targetlist */
- local_node->targetList = nodeRead(true);
-
token = lsptok(NULL, &length); /* skip :rowMarks */
local_node->rowMarks = toIntList(nodeRead(true));
- token = lsptok(NULL, &length); /* skip :distinctClause */
- local_node->distinctClause = nodeRead(true);
-
- token = lsptok(NULL, &length); /* skip :sortClause */
- local_node->sortClause = nodeRead(true);
+ token = lsptok(NULL, &length); /* skip :targetlist */
+ local_node->targetList = nodeRead(true);
token = lsptok(NULL, &length); /* skip :groupClause */
local_node->groupClause = nodeRead(true);
@@ -145,11 +135,11 @@ _readQuery()
token = lsptok(NULL, &length); /* skip :havingQual */
local_node->havingQual = nodeRead(true);
- token = lsptok(NULL, &length); /* skip :intersectClause */
- local_node->intersectClause = nodeRead(true);
+ token = lsptok(NULL, &length); /* skip :distinctClause */
+ local_node->distinctClause = nodeRead(true);
- token = lsptok(NULL, &length); /* skip :unionClause */
- local_node->unionClause = nodeRead(true);
+ token = lsptok(NULL, &length); /* skip :sortClause */
+ local_node->sortClause = nodeRead(true);
token = lsptok(NULL, &length); /* skip :limitOffset */
local_node->limitOffset = nodeRead(true);
@@ -157,6 +147,9 @@ _readQuery()
token = lsptok(NULL, &length); /* skip :limitCount */
local_node->limitCount = nodeRead(true);
+ token = lsptok(NULL, &length); /* skip :setOperations */
+ local_node->setOperations = nodeRead(true);
+
return local_node;
}
@@ -209,6 +202,39 @@ _readGroupClause()
}
/* ----------------
+ * _readSetOperationStmt
+ * ----------------
+ */
+static SetOperationStmt *
+_readSetOperationStmt()
+{
+ SetOperationStmt *local_node;
+ char *token;
+ int length;
+
+ local_node = makeNode(SetOperationStmt);
+
+ token = lsptok(NULL, &length); /* eat :op */
+ token = lsptok(NULL, &length); /* get op */
+ local_node->op = (SetOperation) atoi(token);
+
+ token = lsptok(NULL, &length); /* eat :all */
+ token = lsptok(NULL, &length); /* get all */
+ local_node->all = (token[0] == 't') ? true : false;
+
+ token = lsptok(NULL, &length); /* eat :larg */
+ local_node->larg = nodeRead(true); /* get larg */
+
+ token = lsptok(NULL, &length); /* eat :rarg */
+ local_node->rarg = nodeRead(true); /* get rarg */
+
+ token = lsptok(NULL, &length); /* eat :colTypes */
+ local_node->colTypes = toIntList(nodeRead(true));
+
+ return local_node;
+}
+
+/* ----------------
* _getPlan
* ----------------
*/
@@ -322,9 +348,6 @@ _readAppend()
token = lsptok(NULL, &length); /* eat :appendplans */
local_node->appendplans = nodeRead(true); /* now read it */
- token = lsptok(NULL, &length); /* eat :unionrtables */
- local_node->unionrtables = nodeRead(true); /* now read it */
-
token = lsptok(NULL, &length); /* eat :inheritrelid */
token = lsptok(NULL, &length); /* get inheritrelid */
local_node->inheritrelid = strtoul(token, NULL, 10);
@@ -1995,6 +2018,8 @@ parsePlanString(void)
return_value = _readSortClause();
else if (length == 11 && strncmp(token, "GROUPCLAUSE", length) == 0)
return_value = _readGroupClause();
+ else if (length == 16 && strncmp(token, "SETOPERATIONSTMT", length) == 0)
+ return_value = _readSetOperationStmt();
else if (length == 4 && strncmp(token, "CASE", length) == 0)
return_value = _readCaseExpr();
else if (length == 4 && strncmp(token, "WHEN", length) == 0)