1 /*-------------------------------------------------------------------------
4 * Copy functions for Postgres tree nodes.
6 * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.103 2000/01/27 18:11:27 tgl Exp $
13 *-------------------------------------------------------------------------
18 #include "optimizer/planmain.h"
19 #include "optimizer/subselect.h"
24 * a macro to simplify calling of copyObject on the specified field
26 #define Node_Copy(from, newnode, field) \
27 ((newnode)->field = copyObject((from)->field))
32 * This copy function only copies the "cons-cells" of the list, not the
33 * pointed-to objects. (Use copyObject if you want a "deep" copy.)
35 * We also use this function for copying lists of integers, which is
36 * grotty but unlikely to break --- it could fail if sizeof(pointer)
37 * is less than sizeof(int), but I don't know any such machines...
39 * Note that copyObject will surely coredump if applied to a list
49 /* rather ugly coding for speed... */
53 newlist = nl = lcons(lfirst(list), NIL);
55 foreach(l, lnext(list))
57 lnext(nl) = lcons(lfirst(l), NIL);
63 /* ****************************************************************
64 * plannodes.h copy functions
65 * ****************************************************************
71 * This function copies the fields of the Plan node. It is used by
72 * all the copy functions for classes which inherit from Plan.
76 CopyPlanFields(Plan *from, Plan *newnode)
78 newnode->cost = from->cost;
79 newnode->plan_rows = from->plan_rows;
80 newnode->plan_width = from->plan_width;
81 /* state is NOT copied */
82 newnode->targetlist = copyObject(from->targetlist);
83 newnode->qual = copyObject(from->qual);
84 newnode->lefttree = copyObject(from->lefttree);
85 newnode->righttree = copyObject(from->righttree);
86 newnode->extParam = listCopy(from->extParam);
87 newnode->locParam = listCopy(from->locParam);
88 newnode->chgParam = listCopy(from->chgParam);
89 Node_Copy(from, newnode, initPlan);
90 if (from->subPlan != NIL)
91 newnode->subPlan = nconc(SS_pull_subplan((Node *) newnode->targetlist),
92 SS_pull_subplan((Node *) newnode->qual));
94 newnode->subPlan = NIL;
95 newnode->nParamExec = from->nParamExec;
103 _copyPlan(Plan *from)
105 Plan *newnode = makeNode(Plan);
108 * copy the node superclass fields
111 CopyPlanFields(from, newnode);
122 _copyResult(Result *from)
124 Result *newnode = makeNode(Result);
127 * copy node superclass fields
130 CopyPlanFields((Plan *) from, (Plan *) newnode);
133 * copy remainder of node
136 Node_Copy(from, newnode, resconstantqual);
139 * We must add subplans in resconstantqual to the new plan's subPlan
142 if (from->plan.subPlan != NIL)
143 newnode->plan.subPlan = nconc(newnode->plan.subPlan,
144 SS_pull_subplan(newnode->resconstantqual));
154 _copyAppend(Append *from)
156 Append *newnode = makeNode(Append);
159 * copy node superclass fields
162 CopyPlanFields((Plan *) from, (Plan *) newnode);
165 * copy remainder of node
168 Node_Copy(from, newnode, appendplans);
169 Node_Copy(from, newnode, unionrtables);
170 newnode->inheritrelid = from->inheritrelid;
171 Node_Copy(from, newnode, inheritrtable);
180 * This function copies the fields of the Scan node. It is used by
181 * all the copy functions for classes which inherit from Scan.
185 CopyScanFields(Scan *from, Scan *newnode)
187 newnode->scanrelid = from->scanrelid;
196 _copyScan(Scan *from)
198 Scan *newnode = makeNode(Scan);
201 * copy node superclass fields
204 CopyPlanFields((Plan *) from, (Plan *) newnode);
205 CopyScanFields((Scan *) from, (Scan *) newnode);
215 _copySeqScan(SeqScan *from)
217 SeqScan *newnode = makeNode(SeqScan);
220 * copy node superclass fields
223 CopyPlanFields((Plan *) from, (Plan *) newnode);
224 CopyScanFields((Scan *) from, (Scan *) newnode);
234 _copyIndexScan(IndexScan *from)
236 IndexScan *newnode = makeNode(IndexScan);
239 * copy node superclass fields
242 CopyPlanFields((Plan *) from, (Plan *) newnode);
243 CopyScanFields((Scan *) from, (Scan *) newnode);
246 * copy remainder of node
249 newnode->indxid = listCopy(from->indxid);
250 Node_Copy(from, newnode, indxqual);
251 Node_Copy(from, newnode, indxqualorig);
252 newnode->indxorderdir = from->indxorderdir;
262 _copyTidScan(TidScan *from)
264 TidScan *newnode = makeNode(TidScan);
267 * copy node superclass fields
270 CopyPlanFields((Plan *) from, (Plan *) newnode);
271 CopyScanFields((Scan *) from, (Scan *) newnode);
273 * copy remainder of node
276 newnode->needRescan = from->needRescan;
277 Node_Copy(from, newnode, tideval);
286 * This function copies the fields of the Join node. It is used by
287 * all the copy functions for classes which inherit from Join.
291 CopyJoinFields(Join *from, Join *newnode)
303 _copyJoin(Join *from)
305 Join *newnode = makeNode(Join);
308 * copy node superclass fields
311 CopyPlanFields((Plan *) from, (Plan *) newnode);
312 CopyJoinFields(from, newnode);
323 _copyNestLoop(NestLoop *from)
325 NestLoop *newnode = makeNode(NestLoop);
328 * copy node superclass fields
331 CopyPlanFields((Plan *) from, (Plan *) newnode);
332 CopyJoinFields((Join *) from, (Join *) newnode);
343 _copyMergeJoin(MergeJoin *from)
345 MergeJoin *newnode = makeNode(MergeJoin);
348 * copy node superclass fields
351 CopyPlanFields((Plan *) from, (Plan *) newnode);
352 CopyJoinFields((Join *) from, (Join *) newnode);
355 * copy remainder of node
358 Node_Copy(from, newnode, mergeclauses);
368 _copyHashJoin(HashJoin *from)
370 HashJoin *newnode = makeNode(HashJoin);
373 * copy node superclass fields
376 CopyPlanFields((Plan *) from, (Plan *) newnode);
377 CopyJoinFields((Join *) from, (Join *) newnode);
380 * copy remainder of node
383 Node_Copy(from, newnode, hashclauses);
385 newnode->hashjoinop = from->hashjoinop;
394 * This function copies the fields of the Noname node. It is used by
395 * all the copy functions for classes which inherit from Noname.
399 CopyNonameFields(Noname *from, Noname *newnode)
401 newnode->nonameid = from->nonameid;
402 newnode->keycount = from->keycount;
412 _copyNoname(Noname *from)
414 Noname *newnode = makeNode(Noname);
417 * copy node superclass fields
420 CopyPlanFields((Plan *) from, (Plan *) newnode);
421 CopyNonameFields(from, newnode);
431 _copyMaterial(Material *from)
433 Material *newnode = makeNode(Material);
436 * copy node superclass fields
439 CopyPlanFields((Plan *) from, (Plan *) newnode);
440 CopyNonameFields((Noname *) from, (Noname *) newnode);
451 _copySort(Sort *from)
453 Sort *newnode = makeNode(Sort);
456 * copy node superclass fields
459 CopyPlanFields((Plan *) from, (Plan *) newnode);
460 CopyNonameFields((Noname *) from, (Noname *) newnode);
471 _copyGroup(Group *from)
473 Group *newnode = makeNode(Group);
475 CopyPlanFields((Plan *) from, (Plan *) newnode);
477 newnode->tuplePerGroup = from->tuplePerGroup;
478 newnode->numCols = from->numCols;
479 newnode->grpColIdx = palloc(from->numCols * sizeof(AttrNumber));
480 memcpy(newnode->grpColIdx, from->grpColIdx, from->numCols * sizeof(AttrNumber));
492 Agg *newnode = makeNode(Agg);
494 CopyPlanFields((Plan *) from, (Plan *) newnode);
504 _copyGroupClause(GroupClause *from)
506 GroupClause *newnode = makeNode(GroupClause);
508 newnode->tleSortGroupRef = from->tleSortGroupRef;
509 newnode->sortop = from->sortop;
520 _copyUnique(Unique *from)
522 Unique *newnode = makeNode(Unique);
525 * copy node superclass fields
528 CopyPlanFields((Plan *) from, (Plan *) newnode);
529 CopyNonameFields((Noname *) from, (Noname *) newnode);
532 * copy remainder of node
535 newnode->numCols = from->numCols;
536 newnode->uniqColIdx = palloc(from->numCols * sizeof(AttrNumber));
537 memcpy(newnode->uniqColIdx, from->uniqColIdx, from->numCols * sizeof(AttrNumber));
548 _copyHash(Hash *from)
550 Hash *newnode = makeNode(Hash);
553 * copy node superclass fields
556 CopyPlanFields((Plan *) from, (Plan *) newnode);
559 * copy remainder of node
562 Node_Copy(from, newnode, hashkey);
568 _copySubPlan(SubPlan *from)
570 SubPlan *newnode = makeNode(SubPlan);
572 Node_Copy(from, newnode, plan);
573 newnode->plan_id = from->plan_id;
574 Node_Copy(from, newnode, rtable);
575 newnode->setParam = listCopy(from->setParam);
576 newnode->parParam = listCopy(from->parParam);
577 Node_Copy(from, newnode, sublink);
579 /* do not copy execution state */
580 newnode->shutdown = false;
581 newnode->curTuple = NULL;
586 /* ****************************************************************
587 * primnodes.h copy functions
588 * ****************************************************************
596 _copyResdom(Resdom *from)
598 Resdom *newnode = makeNode(Resdom);
600 newnode->resno = from->resno;
601 newnode->restype = from->restype;
602 newnode->restypmod = from->restypmod;
603 if (from->resname != NULL)
604 newnode->resname = pstrdup(from->resname);
605 newnode->ressortgroupref = from->ressortgroupref;
606 newnode->reskey = from->reskey;
607 newnode->reskeyop = from->reskeyop;
608 newnode->resjunk = from->resjunk;
614 _copyFjoin(Fjoin *from)
616 Fjoin *newnode = makeNode(Fjoin);
619 * copy node superclass fields
623 newnode->fj_initialized = from->fj_initialized;
624 newnode->fj_nNodes = from->fj_nNodes;
626 Node_Copy(from, newnode, fj_innerNode);
628 newnode->fj_results = (DatumPtr)
629 palloc((from->fj_nNodes) * sizeof(Datum));
630 memmove(from->fj_results,
632 (from->fj_nNodes) * sizeof(Datum));
634 newnode->fj_alwaysDone = (BoolPtr)
635 palloc((from->fj_nNodes) * sizeof(bool));
636 memmove(from->fj_alwaysDone,
637 newnode->fj_alwaysDone,
638 (from->fj_nNodes) * sizeof(bool));
649 _copyExpr(Expr *from)
651 Expr *newnode = makeNode(Expr);
654 * copy node superclass fields
657 newnode->typeOid = from->typeOid;
658 newnode->opType = from->opType;
660 Node_Copy(from, newnode, oper);
661 Node_Copy(from, newnode, args);
673 Var *newnode = makeNode(Var);
676 * copy remainder of node
679 newnode->varno = from->varno;
680 newnode->varattno = from->varattno;
681 newnode->vartype = from->vartype;
682 newnode->vartypmod = from->vartypmod;
683 newnode->varlevelsup = from->varlevelsup;
685 newnode->varnoold = from->varnoold;
686 newnode->varoattno = from->varoattno;
696 _copyOper(Oper *from)
698 Oper *newnode = makeNode(Oper);
701 * copy remainder of node
704 newnode->opno = from->opno;
705 newnode->opid = from->opid;
706 newnode->opresulttype = from->opresulttype;
707 newnode->opsize = from->opsize;
710 * NOTE: shall we copy the cache structure or just the pointer ?
711 * Alternatively we can set 'op_fcache' to NULL, in which case the
712 * executor will initialize it when it needs it...
714 newnode->op_fcache = from->op_fcache;
724 _copyConst(Const *from)
726 Const *newnode = makeNode(Const);
729 * copy remainder of node
732 newnode->consttype = from->consttype;
733 newnode->constlen = from->constlen;
735 if (from->constbyval || from->constisnull)
738 * passed by value so just copy the datum.
739 * Also, don't try to copy struct when value is null!
742 newnode->constvalue = from->constvalue;
747 * not passed by value. datum contains a pointer.
750 int length = from->constlen;
752 if (length == -1) /* variable-length type? */
753 length = VARSIZE(from->constvalue);
754 newnode->constvalue = PointerGetDatum(palloc(length));
755 memcpy(DatumGetPointer(newnode->constvalue),
756 DatumGetPointer(from->constvalue),
760 newnode->constisnull = from->constisnull;
761 newnode->constbyval = from->constbyval;
762 newnode->constisset = from->constisset;
763 newnode->constiscast = from->constiscast;
773 _copyParam(Param *from)
775 Param *newnode = makeNode(Param);
778 * copy remainder of node
781 newnode->paramkind = from->paramkind;
782 newnode->paramid = from->paramid;
784 if (from->paramname != NULL)
785 newnode->paramname = pstrdup(from->paramname);
786 newnode->paramtype = from->paramtype;
787 Node_Copy(from, newnode, param_tlist);
797 _copyFunc(Func *from)
799 Func *newnode = makeNode(Func);
802 * copy remainder of node
805 newnode->funcid = from->funcid;
806 newnode->functype = from->functype;
807 newnode->funcisindex = from->funcisindex;
808 newnode->funcsize = from->funcsize;
809 newnode->func_fcache = from->func_fcache;
810 Node_Copy(from, newnode, func_tlist);
811 Node_Copy(from, newnode, func_planlist);
821 _copyAggref(Aggref *from)
823 Aggref *newnode = makeNode(Aggref);
826 * copy remainder of node
829 newnode->aggname = pstrdup(from->aggname);
830 newnode->basetype = from->basetype;
831 newnode->aggtype = from->aggtype;
832 Node_Copy(from, newnode, target);
833 newnode->usenulls = from->usenulls;
834 newnode->aggstar = from->aggstar;
835 newnode->aggdistinct = from->aggdistinct;
836 newnode->aggno = from->aggno; /* probably not needed */
846 _copySubLink(SubLink *from)
848 SubLink *newnode = makeNode(SubLink);
851 * copy remainder of node
854 newnode->subLinkType = from->subLinkType;
855 newnode->useor = from->useor;
856 Node_Copy(from, newnode, lefthand);
857 Node_Copy(from, newnode, oper);
858 Node_Copy(from, newnode, subselect);
868 _copyCaseExpr(CaseExpr *from)
870 CaseExpr *newnode = makeNode(CaseExpr);
873 * copy remainder of node
876 newnode->casetype = from->casetype;
878 Node_Copy(from, newnode, arg);
879 Node_Copy(from, newnode, args);
880 Node_Copy(from, newnode, defresult);
890 _copyCaseWhen(CaseWhen *from)
892 CaseWhen *newnode = makeNode(CaseWhen);
895 * copy remainder of node
898 Node_Copy(from, newnode, expr);
899 Node_Copy(from, newnode, result);
905 _copyArray(Array *from)
907 Array *newnode = makeNode(Array);
910 * copy remainder of node
913 newnode->arrayelemtype = from->arrayelemtype;
914 newnode->arrayelemlength = from->arrayelemlength;
915 newnode->arrayelembyval = from->arrayelembyval;
916 newnode->arrayndim = from->arrayndim;
917 newnode->arraylow = from->arraylow;
918 newnode->arrayhigh = from->arrayhigh;
919 newnode->arraylen = from->arraylen;
925 _copyArrayRef(ArrayRef *from)
927 ArrayRef *newnode = makeNode(ArrayRef);
930 * copy remainder of node
933 newnode->refattrlength = from->refattrlength;
934 newnode->refelemlength = from->refelemlength;
935 newnode->refelemtype = from->refelemtype;
936 newnode->refelembyval = from->refelembyval;
938 Node_Copy(from, newnode, refupperindexpr);
939 Node_Copy(from, newnode, reflowerindexpr);
940 Node_Copy(from, newnode, refexpr);
941 Node_Copy(from, newnode, refassgnexpr);
946 /* ****************************************************************
947 * relation.h copy functions
948 * ****************************************************************
956 * when you change this, also make sure to fix up xfunc_copyRelOptInfo in
957 * planner/path/xfunc.c accordingly!!!
961 _copyRelOptInfo(RelOptInfo *from)
963 RelOptInfo *newnode = makeNode(RelOptInfo);
965 newnode->relids = listCopy(from->relids);
967 newnode->rows = from->rows;
968 newnode->width = from->width;
970 Node_Copy(from, newnode, targetlist);
971 Node_Copy(from, newnode, pathlist);
972 /* XXX cheapestpath should point to a member of pathlist? */
973 Node_Copy(from, newnode, cheapestpath);
974 newnode->pruneable = from->pruneable;
976 newnode->indexed = from->indexed;
977 newnode->pages = from->pages;
978 newnode->tuples = from->tuples;
980 Node_Copy(from, newnode, restrictinfo);
981 Node_Copy(from, newnode, joininfo);
982 Node_Copy(from, newnode, innerjoin);
991 static IndexOptInfo *
992 _copyIndexOptInfo(IndexOptInfo *from)
994 IndexOptInfo *newnode = makeNode(IndexOptInfo);
998 newnode->indexoid = from->indexoid;
999 newnode->pages = from->pages;
1000 newnode->tuples = from->tuples;
1002 if (from->classlist)
1004 for (len = 0; from->classlist[len] != 0; len++)
1006 newnode->classlist = (Oid *) palloc(sizeof(Oid) * (len + 1));
1007 for (i = 0; i < len; i++)
1008 newnode->classlist[i] = from->classlist[i];
1009 newnode->classlist[len] = 0;
1012 if (from->indexkeys)
1014 for (len = 0; from->indexkeys[len] != 0; len++)
1016 newnode->indexkeys = (int *) palloc(sizeof(int) * (len + 1));
1017 for (i = 0; i < len; i++)
1018 newnode->indexkeys[i] = from->indexkeys[i];
1019 newnode->indexkeys[len] = 0;
1024 for (len = 0; from->ordering[len] != 0; len++)
1026 newnode->ordering = (Oid *) palloc(sizeof(Oid) * (len + 1));
1027 for (i = 0; i < len; i++)
1028 newnode->ordering[i] = from->ordering[i];
1029 newnode->ordering[len] = 0;
1032 newnode->relam = from->relam;
1033 newnode->amcostestimate = from->amcostestimate;
1034 newnode->indproc = from->indproc;
1035 Node_Copy(from, newnode, indpred);
1043 * This function copies the fields of the Path node. It is used by
1044 * all the copy functions for classes which inherit from Path.
1048 CopyPathFields(Path *from, Path *newnode)
1051 * Modify the next line, since it causes the copying to cycle (i.e.
1052 * the parent points right back here! -- JMH, 7/7/92. Old version:
1053 * Node_Copy(from, newnode, parent);
1055 newnode->parent = from->parent;
1057 newnode->path_cost = from->path_cost;
1059 newnode->pathtype = from->pathtype;
1061 Node_Copy(from, newnode, pathkeys);
1069 _copyPath(Path *from)
1071 Path *newnode = makeNode(Path);
1073 CopyPathFields(from, newnode);
1083 _copyIndexPath(IndexPath *from)
1085 IndexPath *newnode = makeNode(IndexPath);
1088 * copy the node superclass fields
1091 CopyPathFields((Path *) from, (Path *) newnode);
1094 * copy remainder of node
1097 newnode->indexid = listCopy(from->indexid);
1098 Node_Copy(from, newnode, indexqual);
1099 newnode->joinrelids = listCopy(from->joinrelids);
1109 _copyTidPath(TidPath *from)
1111 TidPath *newnode = makeNode(TidPath);
1114 * copy the node superclass fields
1117 CopyPathFields((Path *) from, (Path *) newnode);
1120 * copy remainder of node
1123 Node_Copy(from, newnode, tideval);
1124 newnode->unjoined_relids = listCopy(from->unjoined_relids);
1129 * CopyJoinPathFields
1131 * This function copies the fields of the JoinPath node. It is used by
1132 * all the copy functions for classes which inherit from JoinPath.
1136 CopyJoinPathFields(JoinPath *from, JoinPath *newnode)
1138 Node_Copy(from, newnode, outerjoinpath);
1139 Node_Copy(from, newnode, innerjoinpath);
1147 _copyNestPath(NestPath *from)
1149 NestPath *newnode = makeNode(NestPath);
1152 * copy the node superclass fields
1155 CopyPathFields((Path *) from, (Path *) newnode);
1156 CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode);
1166 _copyMergePath(MergePath *from)
1168 MergePath *newnode = makeNode(MergePath);
1171 * copy the node superclass fields
1174 CopyPathFields((Path *) from, (Path *) newnode);
1175 CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode);
1178 * copy the remainder of the node
1181 Node_Copy(from, newnode, path_mergeclauses);
1182 Node_Copy(from, newnode, outersortkeys);
1183 Node_Copy(from, newnode, innersortkeys);
1193 _copyHashPath(HashPath *from)
1195 HashPath *newnode = makeNode(HashPath);
1198 * copy the node superclass fields
1201 CopyPathFields((Path *) from, (Path *) newnode);
1202 CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode);
1205 * copy remainder of node
1208 Node_Copy(from, newnode, path_hashclauses);
1217 static PathKeyItem *
1218 _copyPathKeyItem(PathKeyItem *from)
1220 PathKeyItem *newnode = makeNode(PathKeyItem);
1223 * copy remainder of node
1226 Node_Copy(from, newnode, key);
1227 newnode->sortop = from->sortop;
1236 static RestrictInfo *
1237 _copyRestrictInfo(RestrictInfo *from)
1239 RestrictInfo *newnode = makeNode(RestrictInfo);
1242 * copy remainder of node
1245 Node_Copy(from, newnode, clause);
1246 Node_Copy(from, newnode, subclauseindices);
1247 newnode->mergejoinoperator = from->mergejoinoperator;
1248 newnode->left_sortop = from->left_sortop;
1249 newnode->right_sortop = from->right_sortop;
1250 newnode->hashjoinoperator = from->hashjoinoperator;
1260 _copyJoinInfo(JoinInfo *from)
1262 JoinInfo *newnode = makeNode(JoinInfo);
1265 * copy remainder of node
1268 newnode->unjoined_relids = listCopy(from->unjoined_relids);
1269 Node_Copy(from, newnode, jinfo_restrictinfo);
1275 _copyIter(Iter *from)
1277 Iter *newnode = makeNode(Iter);
1279 Node_Copy(from, newnode, iterexpr);
1280 newnode->itertype = from->itertype;
1286 _copyStream(Stream *from)
1288 Stream *newnode = makeNode(Stream);
1290 newnode->pathptr = from->pathptr;
1291 newnode->cinfo = from->cinfo;
1292 newnode->clausetype = from->clausetype;
1294 newnode->upstream = (StreamPtr) NULL; /* only copy nodes
1296 Node_Copy(from, newnode, downstream);
1297 if (newnode->downstream)
1298 ((Stream *) newnode->downstream)->upstream = (Stream *) newnode;
1300 newnode->groupup = from->groupup;
1301 newnode->groupcost = from->groupcost;
1302 newnode->groupsel = from->groupsel;
1308 * parsenodes.h routines have no copy functions
1311 static TargetEntry *
1312 _copyTargetEntry(TargetEntry *from)
1314 TargetEntry *newnode = makeNode(TargetEntry);
1316 Node_Copy(from, newnode, resdom);
1317 Node_Copy(from, newnode, fjoin);
1318 Node_Copy(from, newnode, expr);
1322 static RangeTblEntry *
1323 _copyRangeTblEntry(RangeTblEntry *from)
1325 RangeTblEntry *newnode = makeNode(RangeTblEntry);
1328 newnode->relname = pstrdup(from->relname);
1330 newnode->refname = pstrdup(from->refname);
1331 newnode->relid = from->relid;
1332 newnode->inh = from->inh;
1333 newnode->inFromCl = from->inFromCl;
1334 newnode->inJoinSet = from->inJoinSet;
1335 newnode->skipAcl = from->skipAcl;
1341 _copyRowMark(RowMark *from)
1343 RowMark *newnode = makeNode(RowMark);
1345 newnode->rti = from->rti;
1346 newnode->info = from->info;
1352 _copySortClause(SortClause *from)
1354 SortClause *newnode = makeNode(SortClause);
1356 newnode->tleSortGroupRef = from->tleSortGroupRef;
1357 newnode->sortop = from->sortop;
1363 _copyAConst(A_Const *from)
1365 A_Const *newnode = makeNode(A_Const);
1367 newnode->val = *((Value *) (copyObject(&(from->val))));
1368 Node_Copy(from, newnode, typename);
1374 _copyTypeName(TypeName *from)
1376 TypeName *newnode = makeNode(TypeName);
1379 newnode->name = pstrdup(from->name);
1380 newnode->timezone = from->timezone;
1381 newnode->setof = from->setof;
1382 newnode->typmod = from->typmod;
1383 Node_Copy(from, newnode, arrayBounds);
1389 _copyTypeCast(TypeCast *from)
1391 TypeCast *newnode = makeNode(TypeCast);
1393 Node_Copy(from, newnode, arg);
1394 Node_Copy(from, newnode, typename);
1400 _copyQuery(Query *from)
1402 Query *newnode = makeNode(Query);
1404 newnode->commandType = from->commandType;
1405 if (from->utilityStmt && nodeTag(from->utilityStmt) == T_NotifyStmt)
1407 NotifyStmt *from_notify = (NotifyStmt *) from->utilityStmt;
1408 NotifyStmt *n = makeNode(NotifyStmt);
1410 n->relname = pstrdup(from_notify->relname);
1411 newnode->utilityStmt = (Node *) n;
1413 newnode->resultRelation = from->resultRelation;
1415 newnode->into = pstrdup(from->into);
1416 newnode->isPortal = from->isPortal;
1417 newnode->isBinary = from->isBinary;
1418 newnode->isTemp = from->isTemp;
1419 newnode->unionall = from->unionall;
1420 newnode->hasAggs = from->hasAggs;
1421 newnode->hasSubLinks = from->hasSubLinks;
1423 Node_Copy(from, newnode, rtable);
1424 Node_Copy(from, newnode, targetList);
1425 Node_Copy(from, newnode, qual);
1426 Node_Copy(from, newnode, rowMark);
1428 Node_Copy(from, newnode, distinctClause);
1429 Node_Copy(from, newnode, sortClause);
1430 Node_Copy(from, newnode, groupClause);
1431 Node_Copy(from, newnode, havingQual);
1433 /* why is intersectClause missing? */
1434 Node_Copy(from, newnode, unionClause);
1436 Node_Copy(from, newnode, limitOffset);
1437 Node_Copy(from, newnode, limitCount);
1439 /* we do not copy the planner internal fields: base_rel_list,
1440 * join_rel_list, query_pathkeys. Not entirely clear if this is right?
1448 * mnodes.h routines have no copy functions
1451 /* ****************************************************************
1452 * pg_list.h copy functions
1453 * ****************************************************************
1457 _copyValue(Value *from)
1459 Value *newnode = makeNode(Value);
1461 newnode->type = from->type;
1465 newnode->val.str = pstrdup(from->val.str);
1468 newnode->val.ival = from->val.ival;
1471 newnode->val.dval = from->val.dval;
1480 * copyObject returns a copy of the node or list. If it is a list, it
1481 * recursively copies its items.
1485 copyObject(void *from)
1491 switch (nodeTag(from))
1498 retval = _copyPlan(from);
1501 retval = _copyResult(from);
1504 retval = _copyAppend(from);
1507 retval = _copyScan(from);
1510 retval = _copySeqScan(from);
1513 retval = _copyIndexScan(from);
1516 retval = _copyTidScan(from);
1519 retval = _copyJoin(from);
1522 retval = _copyNestLoop(from);
1525 retval = _copyMergeJoin(from);
1528 retval = _copyHashJoin(from);
1531 retval = _copyNoname(from);
1534 retval = _copyMaterial(from);
1537 retval = _copySort(from);
1540 retval = _copyGroup(from);
1543 retval = _copyAgg(from);
1546 retval = _copyGroupClause(from);
1549 retval = _copyUnique(from);
1552 retval = _copyHash(from);
1555 retval = _copySubPlan(from);
1562 retval = _copyResdom(from);
1565 retval = _copyFjoin(from);
1568 retval = _copyExpr(from);
1571 retval = _copyVar(from);
1574 retval = _copyOper(from);
1577 retval = _copyConst(from);
1580 retval = _copyParam(from);
1583 retval = _copyFunc(from);
1586 retval = _copyArray(from);
1589 retval = _copyArrayRef(from);
1592 retval = _copyAggref(from);
1595 retval = _copySubLink(from);
1598 retval = _copyCaseExpr(from);
1601 retval = _copyCaseWhen(from);
1608 retval = _copyRelOptInfo(from);
1611 retval = _copyPath(from);
1614 retval = _copyIndexPath(from);
1617 retval = _copyTidPath(from);
1620 retval = _copyNestPath(from);
1623 retval = _copyMergePath(from);
1626 retval = _copyHashPath(from);
1629 retval = _copyPathKeyItem(from);
1631 case T_RestrictInfo:
1632 retval = _copyRestrictInfo(from);
1635 retval = _copyJoinInfo(from);
1638 retval = _copyIter(from);
1641 retval = _copyStream(from);
1643 case T_IndexOptInfo:
1644 retval = _copyIndexOptInfo(from);
1651 retval = _copyQuery(from);
1654 retval = _copyTargetEntry(from);
1656 case T_RangeTblEntry:
1657 retval = _copyRangeTblEntry(from);
1660 retval = _copyRowMark(from);
1663 retval = _copySortClause(from);
1666 retval = _copyAConst(from);
1669 retval = _copyTypeName(from);
1672 retval = _copyTypeCast(from);
1681 retval = _copyValue(from);
1689 /* rather ugly coding for speed... */
1690 /* Note the input list cannot be NIL if we got here. */
1691 nl = lcons(copyObject(lfirst(list)), NIL);
1694 foreach(l, lnext(list))
1696 lnext(nl) = lcons(copyObject(lfirst(l)), NIL);
1702 elog(ERROR, "copyObject: don't know how to copy %d", nodeTag(from));