1 /*-------------------------------------------------------------------------
4 * Copy functions for Postgres tree nodes.
6 * Copyright (c) 1994, Regents of the University of California
10 * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.95 1999/11/15 02:00:01 tgl Exp $
12 *-------------------------------------------------------------------------
17 #include "optimizer/planmain.h"
18 #include "optimizer/subselect.h"
23 * a macro to simplify calling of copyObject on the specified field
25 #define Node_Copy(from, newnode, field) \
26 ((newnode)->field = copyObject((from)->field))
31 * This copy function only copies the "cons-cells" of the list, not the
32 * pointed-to objects. (Use copyObject if you want a "deep" copy.)
34 * We also use this function for copying lists of integers, which is
35 * grotty but unlikely to break --- it could fail if sizeof(pointer)
36 * is less than sizeof(int), but I don't know any such machines...
38 * Note that copyObject will surely coredump if applied to a list
48 /* rather ugly coding for speed... */
52 newlist = nl = lcons(lfirst(list), NIL);
54 foreach(l, lnext(list))
56 lnext(nl) = lcons(lfirst(l), NIL);
62 /* ****************************************************************
63 * plannodes.h copy functions
64 * ****************************************************************
70 * This function copies the fields of the Plan node. It is used by
71 * all the copy functions for classes which inherit from Plan.
75 CopyPlanFields(Plan *from, Plan *newnode)
77 newnode->cost = from->cost;
78 newnode->plan_size = from->plan_size;
79 newnode->plan_width = from->plan_width;
80 newnode->plan_tupperpage = from->plan_tupperpage;
81 newnode->targetlist = copyObject(from->targetlist);
82 newnode->qual = copyObject(from->qual);
83 newnode->lefttree = copyObject(from->lefttree);
84 newnode->righttree = copyObject(from->righttree);
85 newnode->extParam = listCopy(from->extParam);
86 newnode->locParam = listCopy(from->locParam);
87 newnode->chgParam = listCopy(from->chgParam);
88 Node_Copy(from, newnode, initPlan);
89 if (from->subPlan != NIL)
90 newnode->subPlan = nconc(SS_pull_subplan((Node *) newnode->targetlist),
91 SS_pull_subplan((Node *) newnode->qual));
93 newnode->subPlan = NIL;
94 newnode->nParamExec = from->nParamExec;
102 _copyPlan(Plan *from)
104 Plan *newnode = makeNode(Plan);
107 * copy the node superclass fields
110 CopyPlanFields(from, newnode);
121 _copyResult(Result *from)
123 Result *newnode = makeNode(Result);
126 * copy node superclass fields
129 CopyPlanFields((Plan *) from, (Plan *) newnode);
132 * copy remainder of node
135 Node_Copy(from, newnode, resconstantqual);
138 * We must add subplans in resconstantqual to the new plan's subPlan
141 if (from->plan.subPlan != NIL)
142 newnode->plan.subPlan = nconc(newnode->plan.subPlan,
143 SS_pull_subplan(newnode->resconstantqual));
153 _copyAppend(Append *from)
155 Append *newnode = makeNode(Append);
158 * copy node superclass fields
161 CopyPlanFields((Plan *) from, (Plan *) newnode);
164 * copy remainder of node
167 Node_Copy(from, newnode, appendplans);
168 Node_Copy(from, newnode, unionrtables);
169 newnode->inheritrelid = from->inheritrelid;
170 Node_Copy(from, newnode, inheritrtable);
179 * This function copies the fields of the Scan node. It is used by
180 * all the copy functions for classes which inherit from Scan.
184 CopyScanFields(Scan *from, Scan *newnode)
186 newnode->scanrelid = from->scanrelid;
195 _copyScan(Scan *from)
197 Scan *newnode = makeNode(Scan);
200 * copy node superclass fields
203 CopyPlanFields((Plan *) from, (Plan *) newnode);
204 CopyScanFields((Scan *) from, (Scan *) newnode);
214 _copySeqScan(SeqScan *from)
216 SeqScan *newnode = makeNode(SeqScan);
219 * copy node superclass fields
222 CopyPlanFields((Plan *) from, (Plan *) newnode);
223 CopyScanFields((Scan *) from, (Scan *) newnode);
233 _copyIndexScan(IndexScan *from)
235 IndexScan *newnode = makeNode(IndexScan);
238 * copy node superclass fields
241 CopyPlanFields((Plan *) from, (Plan *) newnode);
242 CopyScanFields((Scan *) from, (Scan *) newnode);
245 * copy remainder of node
248 newnode->indxid = listCopy(from->indxid);
249 Node_Copy(from, newnode, indxqual);
250 Node_Copy(from, newnode, indxqualorig);
251 newnode->indxorderdir = from->indxorderdir;
259 * This function copies the fields of the Join node. It is used by
260 * all the copy functions for classes which inherit from Join.
264 CopyJoinFields(Join *from, Join *newnode)
276 _copyJoin(Join *from)
278 Join *newnode = makeNode(Join);
281 * copy node superclass fields
284 CopyPlanFields((Plan *) from, (Plan *) newnode);
285 CopyJoinFields(from, newnode);
296 _copyNestLoop(NestLoop *from)
298 NestLoop *newnode = makeNode(NestLoop);
301 * copy node superclass fields
304 CopyPlanFields((Plan *) from, (Plan *) newnode);
305 CopyJoinFields((Join *) from, (Join *) newnode);
316 _copyMergeJoin(MergeJoin *from)
318 MergeJoin *newnode = makeNode(MergeJoin);
321 * copy node superclass fields
324 CopyPlanFields((Plan *) from, (Plan *) newnode);
325 CopyJoinFields((Join *) from, (Join *) newnode);
328 * copy remainder of node
331 Node_Copy(from, newnode, mergeclauses);
341 _copyHashJoin(HashJoin *from)
343 HashJoin *newnode = makeNode(HashJoin);
346 * copy node superclass fields
349 CopyPlanFields((Plan *) from, (Plan *) newnode);
350 CopyJoinFields((Join *) from, (Join *) newnode);
353 * copy remainder of node
356 Node_Copy(from, newnode, hashclauses);
358 newnode->hashjoinop = from->hashjoinop;
367 * This function copies the fields of the Noname node. It is used by
368 * all the copy functions for classes which inherit from Noname.
372 CopyNonameFields(Noname *from, Noname *newnode)
374 newnode->nonameid = from->nonameid;
375 newnode->keycount = from->keycount;
385 _copyNoname(Noname *from)
387 Noname *newnode = makeNode(Noname);
390 * copy node superclass fields
393 CopyPlanFields((Plan *) from, (Plan *) newnode);
394 CopyNonameFields(from, newnode);
404 _copyMaterial(Material *from)
406 Material *newnode = makeNode(Material);
409 * copy node superclass fields
412 CopyPlanFields((Plan *) from, (Plan *) newnode);
413 CopyNonameFields((Noname *) from, (Noname *) newnode);
424 _copySort(Sort *from)
426 Sort *newnode = makeNode(Sort);
429 * copy node superclass fields
432 CopyPlanFields((Plan *) from, (Plan *) newnode);
433 CopyNonameFields((Noname *) from, (Noname *) newnode);
444 _copyGroup(Group *from)
446 Group *newnode = makeNode(Group);
448 CopyPlanFields((Plan *) from, (Plan *) newnode);
450 newnode->tuplePerGroup = from->tuplePerGroup;
451 newnode->numCols = from->numCols;
452 newnode->grpColIdx = palloc(from->numCols * sizeof(AttrNumber));
453 memcpy(newnode->grpColIdx, from->grpColIdx, from->numCols * sizeof(AttrNumber));
465 Agg *newnode = makeNode(Agg);
467 CopyPlanFields((Plan *) from, (Plan *) newnode);
477 _copyGroupClause(GroupClause *from)
479 GroupClause *newnode = makeNode(GroupClause);
481 newnode->tleSortGroupRef = from->tleSortGroupRef;
482 newnode->sortop = from->sortop;
493 _copyUnique(Unique *from)
495 Unique *newnode = makeNode(Unique);
498 * copy node superclass fields
501 CopyPlanFields((Plan *) from, (Plan *) newnode);
502 CopyNonameFields((Noname *) from, (Noname *) newnode);
505 * copy remainder of node
508 if (from->uniqueAttr)
509 newnode->uniqueAttr = pstrdup(from->uniqueAttr);
511 newnode->uniqueAttr = NULL;
512 newnode->uniqueAttrNum = from->uniqueAttrNum;
523 _copyHash(Hash *from)
525 Hash *newnode = makeNode(Hash);
528 * copy node superclass fields
531 CopyPlanFields((Plan *) from, (Plan *) newnode);
534 * copy remainder of node
537 Node_Copy(from, newnode, hashkey);
543 _copySubPlan(SubPlan *from)
545 SubPlan *newnode = makeNode(SubPlan);
547 Node_Copy(from, newnode, plan);
548 newnode->plan_id = from->plan_id;
549 Node_Copy(from, newnode, rtable);
550 newnode->setParam = listCopy(from->setParam);
551 newnode->parParam = listCopy(from->parParam);
552 Node_Copy(from, newnode, sublink);
557 /* ****************************************************************
558 * primnodes.h copy functions
559 * ****************************************************************
567 _copyResdom(Resdom *from)
569 Resdom *newnode = makeNode(Resdom);
571 newnode->resno = from->resno;
572 newnode->restype = from->restype;
573 newnode->restypmod = from->restypmod;
574 if (from->resname != NULL)
575 newnode->resname = pstrdup(from->resname);
576 newnode->ressortgroupref = from->ressortgroupref;
577 newnode->reskey = from->reskey;
578 newnode->reskeyop = from->reskeyop;
579 newnode->resjunk = from->resjunk;
585 _copyFjoin(Fjoin *from)
587 Fjoin *newnode = makeNode(Fjoin);
590 * copy node superclass fields
594 newnode->fj_initialized = from->fj_initialized;
595 newnode->fj_nNodes = from->fj_nNodes;
597 Node_Copy(from, newnode, fj_innerNode);
599 newnode->fj_results = (DatumPtr)
600 palloc((from->fj_nNodes) * sizeof(Datum));
601 memmove(from->fj_results,
603 (from->fj_nNodes) * sizeof(Datum));
605 newnode->fj_alwaysDone = (BoolPtr)
606 palloc((from->fj_nNodes) * sizeof(bool));
607 memmove(from->fj_alwaysDone,
608 newnode->fj_alwaysDone,
609 (from->fj_nNodes) * sizeof(bool));
620 _copyExpr(Expr *from)
622 Expr *newnode = makeNode(Expr);
625 * copy node superclass fields
628 newnode->typeOid = from->typeOid;
629 newnode->opType = from->opType;
631 Node_Copy(from, newnode, oper);
632 Node_Copy(from, newnode, args);
644 Var *newnode = makeNode(Var);
647 * copy remainder of node
650 newnode->varno = from->varno;
651 newnode->varattno = from->varattno;
652 newnode->vartype = from->vartype;
653 newnode->vartypmod = from->vartypmod;
654 newnode->varlevelsup = from->varlevelsup;
656 newnode->varnoold = from->varnoold;
657 newnode->varoattno = from->varoattno;
667 _copyOper(Oper *from)
669 Oper *newnode = makeNode(Oper);
672 * copy remainder of node
675 newnode->opno = from->opno;
676 newnode->opid = from->opid;
677 newnode->opresulttype = from->opresulttype;
678 newnode->opsize = from->opsize;
681 * NOTE: shall we copy the cache structure or just the pointer ?
682 * Alternatively we can set 'op_fcache' to NULL, in which case the
683 * executor will initialize it when it needs it...
685 newnode->op_fcache = from->op_fcache;
695 _copyConst(Const *from)
697 Const *newnode = makeNode(Const);
700 * copy remainder of node
703 newnode->consttype = from->consttype;
704 newnode->constlen = from->constlen;
706 if (from->constbyval || from->constisnull)
709 * passed by value so just copy the datum.
710 * Also, don't try to copy struct when value is null!
713 newnode->constvalue = from->constvalue;
718 * not passed by value. datum contains a pointer.
721 int length = from->constlen;
723 if (length == -1) /* variable-length type? */
724 length = VARSIZE(from->constvalue);
725 newnode->constvalue = PointerGetDatum(palloc(length));
726 memcpy(DatumGetPointer(newnode->constvalue),
727 DatumGetPointer(from->constvalue),
731 newnode->constisnull = from->constisnull;
732 newnode->constbyval = from->constbyval;
733 newnode->constisset = from->constisset;
734 newnode->constiscast = from->constiscast;
744 _copyParam(Param *from)
746 Param *newnode = makeNode(Param);
749 * copy remainder of node
752 newnode->paramkind = from->paramkind;
753 newnode->paramid = from->paramid;
755 if (from->paramname != NULL)
756 newnode->paramname = pstrdup(from->paramname);
757 newnode->paramtype = from->paramtype;
758 Node_Copy(from, newnode, param_tlist);
768 _copyFunc(Func *from)
770 Func *newnode = makeNode(Func);
773 * copy remainder of node
776 newnode->funcid = from->funcid;
777 newnode->functype = from->functype;
778 newnode->funcisindex = from->funcisindex;
779 newnode->funcsize = from->funcsize;
780 newnode->func_fcache = from->func_fcache;
781 Node_Copy(from, newnode, func_tlist);
782 Node_Copy(from, newnode, func_planlist);
792 _copyAggref(Aggref *from)
794 Aggref *newnode = makeNode(Aggref);
797 * copy remainder of node
800 newnode->aggname = pstrdup(from->aggname);
801 newnode->basetype = from->basetype;
802 newnode->aggtype = from->aggtype;
803 Node_Copy(from, newnode, target);
804 newnode->usenulls = from->usenulls;
805 newnode->aggno = from->aggno; /* probably not needed */
815 _copySubLink(SubLink *from)
817 SubLink *newnode = makeNode(SubLink);
820 * copy remainder of node
823 newnode->subLinkType = from->subLinkType;
824 newnode->useor = from->useor;
825 Node_Copy(from, newnode, lefthand);
826 Node_Copy(from, newnode, oper);
827 Node_Copy(from, newnode, subselect);
837 _copyCaseExpr(CaseExpr *from)
839 CaseExpr *newnode = makeNode(CaseExpr);
842 * copy remainder of node
845 newnode->casetype = from->casetype;
847 Node_Copy(from, newnode, arg);
848 Node_Copy(from, newnode, args);
849 Node_Copy(from, newnode, defresult);
859 _copyCaseWhen(CaseWhen *from)
861 CaseWhen *newnode = makeNode(CaseWhen);
864 * copy remainder of node
867 Node_Copy(from, newnode, expr);
868 Node_Copy(from, newnode, result);
874 _copyArray(Array *from)
876 Array *newnode = makeNode(Array);
879 * copy remainder of node
882 newnode->arrayelemtype = from->arrayelemtype;
883 newnode->arrayelemlength = from->arrayelemlength;
884 newnode->arrayelembyval = from->arrayelembyval;
885 newnode->arrayndim = from->arrayndim;
886 newnode->arraylow = from->arraylow;
887 newnode->arrayhigh = from->arrayhigh;
888 newnode->arraylen = from->arraylen;
894 _copyArrayRef(ArrayRef *from)
896 ArrayRef *newnode = makeNode(ArrayRef);
899 * copy remainder of node
902 newnode->refattrlength = from->refattrlength;
903 newnode->refelemlength = from->refelemlength;
904 newnode->refelemtype = from->refelemtype;
905 newnode->refelembyval = from->refelembyval;
907 Node_Copy(from, newnode, refupperindexpr);
908 Node_Copy(from, newnode, reflowerindexpr);
909 Node_Copy(from, newnode, refexpr);
910 Node_Copy(from, newnode, refassgnexpr);
915 /* ****************************************************************
916 * relation.h copy functions
917 * ****************************************************************
925 * when you change this, also make sure to fix up xfunc_copyRelOptInfo in
926 * planner/path/xfunc.c accordingly!!!
930 _copyRelOptInfo(RelOptInfo *from)
932 RelOptInfo *newnode = makeNode(RelOptInfo);
937 * copy remainder of node
940 newnode->relids = listCopy(from->relids);
942 newnode->indexed = from->indexed;
943 newnode->pages = from->pages;
944 newnode->tuples = from->tuples;
945 newnode->size = from->size;
946 newnode->width = from->width;
947 Node_Copy(from, newnode, targetlist);
948 Node_Copy(from, newnode, pathlist);
949 Node_Copy(from, newnode, cheapestpath);
950 newnode->pruneable = from->pruneable;
954 for (len = 0; from->classlist[len] != 0; len++)
956 newnode->classlist = (Oid *) palloc(sizeof(Oid) * (len + 1));
957 for (i = 0; i < len; i++)
958 newnode->classlist[i] = from->classlist[i];
959 newnode->classlist[len] = 0;
964 for (len = 0; from->indexkeys[len] != 0; len++)
966 newnode->indexkeys = (int *) palloc(sizeof(int) * (len + 1));
967 for (i = 0; i < len; i++)
968 newnode->indexkeys[i] = from->indexkeys[i];
969 newnode->indexkeys[len] = 0;
974 for (len = 0; from->ordering[len] != 0; len++)
976 newnode->ordering = (Oid *) palloc(sizeof(Oid) * (len + 1));
977 for (i = 0; i < len; i++)
978 newnode->ordering[i] = from->ordering[i];
979 newnode->ordering[len] = 0;
982 newnode->relam = from->relam;
983 newnode->indproc = from->indproc;
984 Node_Copy(from, newnode, indpred);
986 Node_Copy(from, newnode, restrictinfo);
987 Node_Copy(from, newnode, joininfo);
988 Node_Copy(from, newnode, innerjoin);
996 * This function copies the fields of the Path node. It is used by
997 * all the copy functions for classes which inherit from Path.
1001 CopyPathFields(Path *from, Path *newnode)
1004 * Modify the next line, since it causes the copying to cycle (i.e.
1005 * the parent points right back here! -- JMH, 7/7/92. Old version:
1006 * Node_Copy(from, newnode, parent);
1008 newnode->parent = from->parent;
1010 newnode->path_cost = from->path_cost;
1012 newnode->pathtype = from->pathtype;
1014 Node_Copy(from, newnode, pathkeys);
1022 _copyPath(Path *from)
1024 Path *newnode = makeNode(Path);
1026 CopyPathFields(from, newnode);
1036 _copyIndexPath(IndexPath *from)
1038 IndexPath *newnode = makeNode(IndexPath);
1041 * copy the node superclass fields
1044 CopyPathFields((Path *) from, (Path *) newnode);
1047 * copy remainder of node
1050 newnode->indexid = listCopy(from->indexid);
1051 Node_Copy(from, newnode, indexqual);
1052 newnode->joinrelids = listCopy(from->joinrelids);
1058 * CopyJoinPathFields
1060 * This function copies the fields of the JoinPath node. It is used by
1061 * all the copy functions for classes which inherit from JoinPath.
1065 CopyJoinPathFields(JoinPath *from, JoinPath *newnode)
1067 Node_Copy(from, newnode, pathinfo);
1068 Node_Copy(from, newnode, outerjoinpath);
1069 Node_Copy(from, newnode, innerjoinpath);
1077 _copyNestPath(NestPath *from)
1079 NestPath *newnode = makeNode(NestPath);
1082 * copy the node superclass fields
1085 CopyPathFields((Path *) from, (Path *) newnode);
1086 CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode);
1096 _copyMergePath(MergePath *from)
1098 MergePath *newnode = makeNode(MergePath);
1101 * copy the node superclass fields
1104 CopyPathFields((Path *) from, (Path *) newnode);
1105 CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode);
1108 * copy the remainder of the node
1111 Node_Copy(from, newnode, path_mergeclauses);
1112 Node_Copy(from, newnode, outersortkeys);
1113 Node_Copy(from, newnode, innersortkeys);
1123 _copyHashPath(HashPath *from)
1125 HashPath *newnode = makeNode(HashPath);
1128 * copy the node superclass fields
1131 CopyPathFields((Path *) from, (Path *) newnode);
1132 CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode);
1135 * copy remainder of node
1138 Node_Copy(from, newnode, path_hashclauses);
1147 static PathKeyItem *
1148 _copyPathKeyItem(PathKeyItem *from)
1150 PathKeyItem *newnode = makeNode(PathKeyItem);
1153 * copy remainder of node
1156 Node_Copy(from, newnode, key);
1157 newnode->sortop = from->sortop;
1166 static RestrictInfo *
1167 _copyRestrictInfo(RestrictInfo *from)
1169 RestrictInfo *newnode = makeNode(RestrictInfo);
1172 * copy remainder of node
1175 Node_Copy(from, newnode, clause);
1176 newnode->selectivity = from->selectivity;
1177 Node_Copy(from, newnode, subclauseindices);
1178 newnode->mergejoinoperator = from->mergejoinoperator;
1179 newnode->left_sortop = from->left_sortop;
1180 newnode->right_sortop = from->right_sortop;
1181 newnode->hashjoinoperator = from->hashjoinoperator;
1191 _copyJoinInfo(JoinInfo *from)
1193 JoinInfo *newnode = makeNode(JoinInfo);
1196 * copy remainder of node
1199 newnode->unjoined_relids = listCopy(from->unjoined_relids);
1200 Node_Copy(from, newnode, jinfo_restrictinfo);
1206 _copyIter(Iter *from)
1208 Iter *newnode = makeNode(Iter);
1210 Node_Copy(from, newnode, iterexpr);
1211 newnode->itertype = from->itertype;
1217 _copyStream(Stream *from)
1219 Stream *newnode = makeNode(Stream);
1221 newnode->pathptr = from->pathptr;
1222 newnode->cinfo = from->cinfo;
1223 newnode->clausetype = from->clausetype;
1225 newnode->upstream = (StreamPtr) NULL; /* only copy nodes
1227 Node_Copy(from, newnode, downstream);
1228 if (newnode->downstream)
1229 ((Stream *) newnode->downstream)->upstream = (Stream *) newnode;
1231 newnode->groupup = from->groupup;
1232 newnode->groupcost = from->groupcost;
1233 newnode->groupsel = from->groupsel;
1239 * parsenodes.h routines have no copy functions
1242 static TargetEntry *
1243 _copyTargetEntry(TargetEntry *from)
1245 TargetEntry *newnode = makeNode(TargetEntry);
1247 Node_Copy(from, newnode, resdom);
1248 Node_Copy(from, newnode, fjoin);
1249 Node_Copy(from, newnode, expr);
1253 static RangeTblEntry *
1254 _copyRangeTblEntry(RangeTblEntry *from)
1256 RangeTblEntry *newnode = makeNode(RangeTblEntry);
1259 newnode->relname = pstrdup(from->relname);
1261 newnode->refname = pstrdup(from->refname);
1262 newnode->relid = from->relid;
1263 newnode->inh = from->inh;
1264 newnode->inFromCl = from->inFromCl;
1265 newnode->inJoinSet = from->inJoinSet;
1266 newnode->skipAcl = from->skipAcl;
1272 _copyRowMark(RowMark *from)
1274 RowMark *newnode = makeNode(RowMark);
1276 newnode->rti = from->rti;
1277 newnode->info = from->info;
1283 _copySortClause(SortClause *from)
1285 SortClause *newnode = makeNode(SortClause);
1287 newnode->tleSortGroupRef = from->tleSortGroupRef;
1288 newnode->sortop = from->sortop;
1294 _copyAConst(A_Const *from)
1296 A_Const *newnode = makeNode(A_Const);
1298 newnode->val = *((Value *) (copyObject(&(from->val))));
1299 Node_Copy(from, newnode, typename);
1305 _copyTypeName(TypeName *from)
1307 TypeName *newnode = makeNode(TypeName);
1310 newnode->name = pstrdup(from->name);
1311 newnode->timezone = from->timezone;
1312 newnode->setof = from->setof;
1313 newnode->typmod = from->typmod;
1314 Node_Copy(from, newnode, arrayBounds);
1320 _copyQuery(Query *from)
1322 Query *newnode = makeNode(Query);
1324 newnode->commandType = from->commandType;
1325 if (from->utilityStmt && nodeTag(from->utilityStmt) == T_NotifyStmt)
1327 NotifyStmt *from_notify = (NotifyStmt *) from->utilityStmt;
1328 NotifyStmt *n = makeNode(NotifyStmt);
1330 n->relname = pstrdup(from_notify->relname);
1331 newnode->utilityStmt = (Node *) n;
1333 newnode->resultRelation = from->resultRelation;
1335 newnode->into = pstrdup(from->into);
1336 newnode->isPortal = from->isPortal;
1337 newnode->isBinary = from->isBinary;
1338 newnode->isTemp = from->isTemp;
1339 newnode->unionall = from->unionall;
1340 newnode->hasAggs = from->hasAggs;
1341 newnode->hasSubLinks = from->hasSubLinks;
1343 Node_Copy(from, newnode, rtable);
1344 Node_Copy(from, newnode, targetList);
1345 Node_Copy(from, newnode, qual);
1346 Node_Copy(from, newnode, rowMark);
1348 if (from->uniqueFlag)
1349 newnode->uniqueFlag = pstrdup(from->uniqueFlag);
1350 Node_Copy(from, newnode, sortClause);
1351 Node_Copy(from, newnode, groupClause);
1352 Node_Copy(from, newnode, havingQual);
1354 /* why is intersectClause missing? */
1355 Node_Copy(from, newnode, unionClause);
1357 Node_Copy(from, newnode, limitOffset);
1358 Node_Copy(from, newnode, limitCount);
1360 /* we do not copy the planner internal fields: base_rel_list,
1361 * join_rel_list, query_pathkeys. Not entirely clear if this is right?
1369 * mnodes.h routines have no copy functions
1372 /* ****************************************************************
1373 * pg_list.h copy functions
1374 * ****************************************************************
1378 _copyValue(Value *from)
1380 Value *newnode = makeNode(Value);
1382 newnode->type = from->type;
1386 newnode->val.str = pstrdup(from->val.str);
1389 newnode->val.ival = from->val.ival;
1392 newnode->val.dval = from->val.dval;
1401 * copyObject returns a copy of the node or list. If it is a list, it
1402 * recursively copies its items.
1406 copyObject(void *from)
1412 switch (nodeTag(from))
1419 retval = _copyPlan(from);
1422 retval = _copyResult(from);
1425 retval = _copyAppend(from);
1428 retval = _copyScan(from);
1431 retval = _copySeqScan(from);
1434 retval = _copyIndexScan(from);
1437 retval = _copyJoin(from);
1440 retval = _copyNestLoop(from);
1443 retval = _copyMergeJoin(from);
1446 retval = _copyHashJoin(from);
1449 retval = _copyNoname(from);
1452 retval = _copyMaterial(from);
1455 retval = _copySort(from);
1458 retval = _copyGroup(from);
1461 retval = _copyAgg(from);
1464 retval = _copyGroupClause(from);
1467 retval = _copyUnique(from);
1470 retval = _copyHash(from);
1473 retval = _copySubPlan(from);
1480 retval = _copyResdom(from);
1483 retval = _copyFjoin(from);
1486 retval = _copyExpr(from);
1489 retval = _copyVar(from);
1492 retval = _copyOper(from);
1495 retval = _copyConst(from);
1498 retval = _copyParam(from);
1501 retval = _copyFunc(from);
1504 retval = _copyArray(from);
1507 retval = _copyArrayRef(from);
1510 retval = _copyAggref(from);
1513 retval = _copySubLink(from);
1516 retval = _copyCaseExpr(from);
1519 retval = _copyCaseWhen(from);
1526 retval = _copyRelOptInfo(from);
1529 retval = _copyPath(from);
1532 retval = _copyIndexPath(from);
1535 retval = _copyNestPath(from);
1538 retval = _copyMergePath(from);
1541 retval = _copyHashPath(from);
1544 retval = _copyPathKeyItem(from);
1546 case T_RestrictInfo:
1547 retval = _copyRestrictInfo(from);
1550 retval = _copyJoinInfo(from);
1553 retval = _copyIter(from);
1556 retval = _copyStream(from);
1563 retval = _copyQuery(from);
1566 retval = _copyTargetEntry(from);
1568 case T_RangeTblEntry:
1569 retval = _copyRangeTblEntry(from);
1572 retval = _copyRowMark(from);
1575 retval = _copySortClause(from);
1578 retval = _copyAConst(from);
1581 retval = _copyTypeName(from);
1590 retval = _copyValue(from);
1598 /* rather ugly coding for speed... */
1599 /* Note the input list cannot be NIL if we got here. */
1600 nl = lcons(copyObject(lfirst(list)), NIL);
1603 foreach(l, lnext(list))
1605 lnext(nl) = lcons(copyObject(lfirst(l)), NIL);
1611 elog(ERROR, "copyObject: don't know how to copy %d", nodeTag(from));