aboutsummaryrefslogtreecommitdiff
path: root/src/backend/nodes/copyfuncs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/nodes/copyfuncs.c')
-rw-r--r--src/backend/nodes/copyfuncs.c466
1 files changed, 37 insertions, 429 deletions
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index d11b5ed201f..1fe7efd1636 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -3,27 +3,28 @@
* copyfuncs.c
* Copy functions for Postgres tree nodes.
*
- * NOTE: a general convention when copying or comparing plan nodes is
- * that we ignore the executor state subnode. We do not need to look
- * at it because no current uses of copyObject() or equal() need to
- * deal with already-executing plan trees. By leaving the state subnodes
- * out, we avoid needing to write copy/compare routines for all the
- * different executor state node types.
+ * NOTE: we currently support copying all node types found in parse and
+ * plan trees. We do not support copying executor state trees; there
+ * is no need for that, and no point in maintaining all the code that
+ * would be needed. We also do not support copying Path trees, mainly
+ * because the circular linkages between RelOptInfo and Path nodes can't
+ * be handled easily in a simple depth-first traversal.
*
*
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.225 2002/11/30 05:21:01 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.226 2002/12/05 15:50:34 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
-#include "optimizer/clauses.h"
-#include "optimizer/planmain.h"
+#include "nodes/parsenodes.h"
+#include "nodes/plannodes.h"
+#include "nodes/relation.h"
#include "utils/datum.h"
@@ -58,15 +59,6 @@
memcpy(newnode->fldname, from->fldname, _size); \
} while (0)
-/* Special hack for fixing subplan lists of Plan nodes (ick) */
-#define FIX_SUBPLAN_LINKS(subplanfldname, fldname) \
- do { \
- if (from->subplanfldname != NIL) \
- newnode->subplanfldname = \
- nconc(newnode->subplanfldname, \
- pull_subplans((Node *) (newnode->fldname))); \
- } while (0)
-
/*
* listCopy
@@ -119,19 +111,13 @@ CopyPlanFields(Plan *from, Plan *newnode)
COPY_SCALAR_FIELD(total_cost);
COPY_SCALAR_FIELD(plan_rows);
COPY_SCALAR_FIELD(plan_width);
- /* execution state is NOT copied */
COPY_NODE_FIELD(targetlist);
COPY_NODE_FIELD(qual);
COPY_NODE_FIELD(lefttree);
COPY_NODE_FIELD(righttree);
+ COPY_NODE_FIELD(initPlan);
COPY_INTLIST_FIELD(extParam);
COPY_INTLIST_FIELD(locParam);
- COPY_INTLIST_FIELD(chgParam);
- COPY_NODE_FIELD(initPlan);
- /* subPlan list must point to subplans in the new subtree, not the old */
- newnode->subPlan = NIL;
- FIX_SUBPLAN_LINKS(subPlan, targetlist);
- FIX_SUBPLAN_LINKS(subPlan, qual);
COPY_SCALAR_FIELD(nParamExec);
}
@@ -170,9 +156,6 @@ _copyResult(Result *from)
*/
COPY_NODE_FIELD(resconstantqual);
- /* subPlan list must point to subplans in the new subtree, not the old */
- FIX_SUBPLAN_LINKS(plan.subPlan, resconstantqual);
-
return newnode;
}
@@ -266,10 +249,6 @@ _copyIndexScan(IndexScan *from)
COPY_NODE_FIELD(indxqualorig);
COPY_SCALAR_FIELD(indxorderdir);
- /* subPlan list must point to subplans in the new subtree, not the old */
- FIX_SUBPLAN_LINKS(scan.plan.subPlan, indxqual);
- FIX_SUBPLAN_LINKS(scan.plan.subPlan, indxqualorig);
-
return newnode;
}
@@ -289,12 +268,8 @@ _copyTidScan(TidScan *from)
/*
* copy remainder of node
*/
- COPY_SCALAR_FIELD(needRescan);
COPY_NODE_FIELD(tideval);
- /* subPlan list must point to subplans in the new subtree, not the old */
- FIX_SUBPLAN_LINKS(scan.plan.subPlan, tideval);
-
return newnode;
}
@@ -348,9 +323,6 @@ CopyJoinFields(Join *from, Join *newnode)
COPY_SCALAR_FIELD(jointype);
COPY_NODE_FIELD(joinqual);
-
- /* subPlan list must point to subplans in the new subtree, not the old */
- FIX_SUBPLAN_LINKS(plan.subPlan, joinqual);
}
@@ -406,9 +378,6 @@ _copyMergeJoin(MergeJoin *from)
*/
COPY_NODE_FIELD(mergeclauses);
- /* subPlan list must point to subplans in the new subtree, not the old */
- FIX_SUBPLAN_LINKS(join.plan.subPlan, mergeclauses);
-
return newnode;
}
@@ -430,9 +399,6 @@ _copyHashJoin(HashJoin *from)
*/
COPY_NODE_FIELD(hashclauses);
- /* subPlan list must point to subplans in the new subtree, not the old */
- FIX_SUBPLAN_LINKS(join.plan.subPlan, hashclauses);
-
return newnode;
}
@@ -531,12 +497,12 @@ _copyUnique(Unique *from)
}
/*
- * _copySetOp
+ * _copyHash
*/
-static SetOp *
-_copySetOp(SetOp *from)
+static Hash *
+_copyHash(Hash *from)
{
- SetOp *newnode = makeNode(SetOp);
+ Hash *newnode = makeNode(Hash);
/*
* copy node superclass fields
@@ -546,21 +512,18 @@ _copySetOp(SetOp *from)
/*
* copy remainder of node
*/
- COPY_SCALAR_FIELD(cmd);
- COPY_SCALAR_FIELD(numCols);
- COPY_POINTER_FIELD(dupColIdx, from->numCols * sizeof(AttrNumber));
- COPY_SCALAR_FIELD(flagColIdx);
+ COPY_NODE_FIELD(hashkeys);
return newnode;
}
/*
- * _copyLimit
+ * _copySetOp
*/
-static Limit *
-_copyLimit(Limit *from)
+static SetOp *
+_copySetOp(SetOp *from)
{
- Limit *newnode = makeNode(Limit);
+ SetOp *newnode = makeNode(SetOp);
/*
* copy node superclass fields
@@ -570,19 +533,21 @@ _copyLimit(Limit *from)
/*
* copy remainder of node
*/
- COPY_NODE_FIELD(limitOffset);
- COPY_NODE_FIELD(limitCount);
+ COPY_SCALAR_FIELD(cmd);
+ COPY_SCALAR_FIELD(numCols);
+ COPY_POINTER_FIELD(dupColIdx, from->numCols * sizeof(AttrNumber));
+ COPY_SCALAR_FIELD(flagColIdx);
return newnode;
}
/*
- * _copyHash
+ * _copyLimit
*/
-static Hash *
-_copyHash(Hash *from)
+static Limit *
+_copyLimit(Limit *from)
{
- Hash *newnode = makeNode(Hash);
+ Limit *newnode = makeNode(Limit);
/*
* copy node superclass fields
@@ -592,9 +557,8 @@ _copyHash(Hash *from)
/*
* copy remainder of node
*/
- COPY_NODE_FIELD(hashkeys);
-
- /* XXX could the hashkeys contain subplans? Not at present... */
+ COPY_NODE_FIELD(limitOffset);
+ COPY_NODE_FIELD(limitCount);
return newnode;
}
@@ -611,10 +575,6 @@ _copySubPlan(SubPlan *from)
COPY_INTLIST_FIELD(parParam);
COPY_NODE_FIELD(sublink);
- /* do not copy execution state */
- newnode->needShutdown = false;
- newnode->curTuple = NULL;
-
return newnode;
}
@@ -933,314 +893,12 @@ _copyArrayRef(ArrayRef *from)
/* ****************************************************************
* relation.h copy functions
*
- * XXX the code to copy RelOptInfo and Path nodes is really completely bogus,
- * because it makes no attempt to deal with multiple links from RelOptInfo
- * to Paths, nor with back-links from Paths to their parent RelOptInfo.
- * Currently, since we never actually try to copy a RelOptInfo, this is okay.
+ * We don't support copying RelOptInfo, IndexOptInfo, or Path nodes.
+ * There are some subsidiary structs that are useful to copy, though.
* ****************************************************************
*/
/*
- * _copyRelOptInfo
- */
-static RelOptInfo *
-_copyRelOptInfo(RelOptInfo *from)
-{
- RelOptInfo *newnode = makeNode(RelOptInfo);
-
- COPY_SCALAR_FIELD(reloptkind);
- COPY_INTLIST_FIELD(relids);
- COPY_SCALAR_FIELD(rows);
- COPY_SCALAR_FIELD(width);
- COPY_NODE_FIELD(targetlist);
- COPY_NODE_FIELD(pathlist);
- /* XXX cheapest-path fields should point to members of pathlist? */
- COPY_NODE_FIELD(cheapest_startup_path);
- COPY_NODE_FIELD(cheapest_total_path);
- COPY_SCALAR_FIELD(pruneable);
- COPY_SCALAR_FIELD(rtekind);
- COPY_NODE_FIELD(indexlist);
- COPY_SCALAR_FIELD(pages);
- COPY_SCALAR_FIELD(tuples);
- COPY_NODE_FIELD(subplan);
- COPY_SCALAR_FIELD(joinrti);
- COPY_INTLIST_FIELD(joinrteids);
- COPY_NODE_FIELD(baserestrictinfo);
- COPY_SCALAR_FIELD(baserestrictcost);
- COPY_INTLIST_FIELD(outerjoinset);
- COPY_NODE_FIELD(joininfo);
- COPY_INTLIST_FIELD(index_outer_relids);
- COPY_NODE_FIELD(index_inner_paths);
-
- return newnode;
-}
-
-/*
- * _copyIndexOptInfo
- */
-static IndexOptInfo *
-_copyIndexOptInfo(IndexOptInfo *from)
-{
- IndexOptInfo *newnode = makeNode(IndexOptInfo);
-
- COPY_SCALAR_FIELD(indexoid);
- COPY_SCALAR_FIELD(pages);
- COPY_SCALAR_FIELD(tuples);
- COPY_SCALAR_FIELD(ncolumns);
- COPY_SCALAR_FIELD(nkeys);
-
- if (from->classlist)
- {
- /* copy the trailing zero too */
- COPY_POINTER_FIELD(classlist, (from->ncolumns + 1) * sizeof(Oid));
- }
-
- if (from->indexkeys)
- {
- /* copy the trailing zero too */
- COPY_POINTER_FIELD(indexkeys, (from->nkeys + 1) * sizeof(int));
- }
-
- if (from->ordering)
- {
- /* copy the trailing zero too */
- COPY_POINTER_FIELD(ordering, (from->ncolumns + 1) * sizeof(Oid));
- }
-
- COPY_SCALAR_FIELD(relam);
- COPY_SCALAR_FIELD(amcostestimate);
- COPY_SCALAR_FIELD(indproc);
- COPY_NODE_FIELD(indpred);
- COPY_SCALAR_FIELD(unique);
- COPY_INTLIST_FIELD(outer_relids);
- COPY_NODE_FIELD(inner_paths);
-
- return newnode;
-}
-
-/*
- * CopyPathFields
- *
- * This function copies the fields of the Path node. It is used by
- * all the copy functions for classes which inherit from Path.
- */
-static void
-CopyPathFields(Path *from, Path *newnode)
-{
- /*
- * Modify the next line, since it causes the copying to cycle (i.e.
- * the parent points right back here! -- JMH, 7/7/92. Old version:
- * COPY_NODE_FIELD(parent);
- */
- COPY_SCALAR_FIELD(parent);
-
- COPY_SCALAR_FIELD(startup_cost);
- COPY_SCALAR_FIELD(total_cost);
- COPY_SCALAR_FIELD(pathtype);
- COPY_NODE_FIELD(pathkeys);
-}
-
-/*
- * _copyPath
- */
-static Path *
-_copyPath(Path *from)
-{
- Path *newnode = makeNode(Path);
-
- CopyPathFields(from, newnode);
-
- return newnode;
-}
-
-/*
- * _copyIndexPath
- */
-static IndexPath *
-_copyIndexPath(IndexPath *from)
-{
- IndexPath *newnode = makeNode(IndexPath);
-
- /*
- * copy node superclass fields
- */
- CopyPathFields((Path *) from, (Path *) newnode);
-
- /*
- * copy remainder of node
- */
- COPY_NODE_FIELD(indexinfo);
- COPY_NODE_FIELD(indexqual);
- COPY_SCALAR_FIELD(indexscandir);
- COPY_SCALAR_FIELD(rows);
-
- return newnode;
-}
-
-/*
- * _copyTidPath
- */
-static TidPath *
-_copyTidPath(TidPath *from)
-{
- TidPath *newnode = makeNode(TidPath);
-
- /*
- * copy node superclass fields
- */
- CopyPathFields((Path *) from, (Path *) newnode);
-
- /*
- * copy remainder of node
- */
- COPY_NODE_FIELD(tideval);
- COPY_INTLIST_FIELD(unjoined_relids);
-
- return newnode;
-}
-
-/*
- * _copyAppendPath
- */
-static AppendPath *
-_copyAppendPath(AppendPath *from)
-{
- AppendPath *newnode = makeNode(AppendPath);
-
- /*
- * copy node superclass fields
- */
- CopyPathFields((Path *) from, (Path *) newnode);
-
- /*
- * copy remainder of node
- */
- COPY_NODE_FIELD(subpaths);
-
- return newnode;
-}
-
-/*
- * _copyResultPath
- */
-static ResultPath *
-_copyResultPath(ResultPath *from)
-{
- ResultPath *newnode = makeNode(ResultPath);
-
- /*
- * copy node superclass fields
- */
- CopyPathFields((Path *) from, (Path *) newnode);
-
- /*
- * copy remainder of node
- */
- COPY_NODE_FIELD(subpath);
- COPY_NODE_FIELD(constantqual);
-
- return newnode;
-}
-
-/*
- * _copyMaterialPath
- */
-static MaterialPath *
-_copyMaterialPath(MaterialPath *from)
-{
- MaterialPath *newnode = makeNode(MaterialPath);
-
- /*
- * copy node superclass fields
- */
- CopyPathFields((Path *) from, (Path *) newnode);
-
- /*
- * copy remainder of node
- */
- COPY_NODE_FIELD(subpath);
-
- return newnode;
-}
-
-/*
- * CopyJoinPathFields
- *
- * This function copies the fields of the JoinPath node. It is used by
- * all the copy functions for classes which inherit from JoinPath.
- */
-static void
-CopyJoinPathFields(JoinPath *from, JoinPath *newnode)
-{
- CopyPathFields((Path *) from, (Path *) newnode);
-
- COPY_SCALAR_FIELD(jointype);
- COPY_NODE_FIELD(outerjoinpath);
- COPY_NODE_FIELD(innerjoinpath);
- COPY_NODE_FIELD(joinrestrictinfo);
-}
-
-/*
- * _copyNestPath
- */
-static NestPath *
-_copyNestPath(NestPath *from)
-{
- NestPath *newnode = makeNode(NestPath);
-
- /*
- * copy node superclass fields
- */
- CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode);
-
- return newnode;
-}
-
-/*
- * _copyMergePath
- */
-static MergePath *
-_copyMergePath(MergePath *from)
-{
- MergePath *newnode = makeNode(MergePath);
-
- /*
- * copy node superclass fields
- */
- CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode);
-
- /*
- * copy remainder of node
- */
- COPY_NODE_FIELD(path_mergeclauses);
- COPY_NODE_FIELD(outersortkeys);
- COPY_NODE_FIELD(innersortkeys);
-
- return newnode;
-}
-
-/*
- * _copyHashPath
- */
-static HashPath *
-_copyHashPath(HashPath *from)
-{
- HashPath *newnode = makeNode(HashPath);
-
- /*
- * copy node superclass fields
- */
- CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode);
-
- /*
- * copy remainder of node
- */
- COPY_NODE_FIELD(path_hashclauses);
-
- return newnode;
-}
-
-/*
* _copyPathKeyItem
*/
static PathKeyItem *
@@ -1301,21 +959,6 @@ _copyJoinInfo(JoinInfo *from)
return newnode;
}
-/*
- * _copyInnerIndexscanInfo
- */
-static InnerIndexscanInfo *
-_copyInnerIndexscanInfo(InnerIndexscanInfo *from)
-{
- InnerIndexscanInfo *newnode = makeNode(InnerIndexscanInfo);
-
- COPY_INTLIST_FIELD(other_relids);
- COPY_SCALAR_FIELD(isouterjoin);
- COPY_NODE_FIELD(best_innerpath);
-
- return newnode;
-}
-
/* ****************************************************************
* parsenodes.h copy functions
* ****************************************************************
@@ -1737,7 +1380,8 @@ _copyQuery(Query *from)
/*
* We do not copy the planner internal fields: base_rel_list,
* other_rel_list, join_rel_list, equi_key_list, query_pathkeys,
- * hasJoinRTEs. Not entirely clear if this is right?
+ * hasJoinRTEs. That would get us into copying RelOptInfo/Path
+ * trees, which we don't want to do.
*/
return newnode;
@@ -2683,15 +2327,15 @@ copyObject(void *from)
case T_Unique:
retval = _copyUnique(from);
break;
+ case T_Hash:
+ retval = _copyHash(from);
+ break;
case T_SetOp:
retval = _copySetOp(from);
break;
case T_Limit:
retval = _copyLimit(from);
break;
- case T_Hash:
- retval = _copyHash(from);
- break;
case T_SubPlan:
retval = _copySubPlan(from);
break;
@@ -2757,39 +2401,6 @@ copyObject(void *from)
/*
* RELATION NODES
*/
- case T_RelOptInfo:
- retval = _copyRelOptInfo(from);
- break;
- case T_IndexOptInfo:
- retval = _copyIndexOptInfo(from);
- break;
- case T_Path:
- retval = _copyPath(from);
- break;
- case T_IndexPath:
- retval = _copyIndexPath(from);
- break;
- case T_TidPath:
- retval = _copyTidPath(from);
- break;
- case T_AppendPath:
- retval = _copyAppendPath(from);
- break;
- case T_ResultPath:
- retval = _copyResultPath(from);
- break;
- case T_MaterialPath:
- retval = _copyMaterialPath(from);
- break;
- case T_NestPath:
- retval = _copyNestPath(from);
- break;
- case T_MergePath:
- retval = _copyMergePath(from);
- break;
- case T_HashPath:
- retval = _copyHashPath(from);
- break;
case T_PathKeyItem:
retval = _copyPathKeyItem(from);
break;
@@ -2799,9 +2410,6 @@ copyObject(void *from)
case T_JoinInfo:
retval = _copyJoinInfo(from);
break;
- case T_InnerIndexscanInfo:
- retval = _copyInnerIndexscanInfo(from);
- break;
/*
* VALUE NODES