1 /*-------------------------------------------------------------------------
4 * Copy functions for Postgres tree nodes.
6 * NOTE: a general convention when copying or comparing plan nodes is
7 * that we ignore the executor state subnode. We do not need to look
8 * at it because no current uses of copyObject() or equal() need to
9 * deal with already-executing plan trees. By leaving the state subnodes
10 * out, we avoid needing to write copy/compare routines for all the
11 * different executor state node types.
14 * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
15 * Portions Copyright (c) 1994, Regents of the University of California
18 * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.219 2002/11/19 23:21:58 tgl Exp $
20 *-------------------------------------------------------------------------
25 #include "optimizer/clauses.h"
26 #include "optimizer/planmain.h"
27 #include "utils/datum.h"
32 * a macro to simplify calling of copyObject on the specified field
34 #define Node_Copy(from, newnode, field) \
35 ((newnode)->field = copyObject((from)->field))
40 * This copy function only copies the "cons-cells" of the list, not the
41 * pointed-to objects. (Use copyObject if you want a "deep" copy.)
43 * We also use this function for copying lists of integers, which is
44 * grotty but unlikely to break --- it could fail if sizeof(pointer)
45 * is less than sizeof(int), but I don't know any such machines...
47 * Note that copyObject will surely coredump if applied to a list
57 /* rather ugly coding for speed... */
61 newlist = nl = makeList1(lfirst(list));
63 foreach(l, lnext(list))
65 lnext(nl) = makeList1(lfirst(l));
71 /* ****************************************************************
72 * plannodes.h copy functions
73 * ****************************************************************
79 * This function copies the fields of the Plan node. It is used by
80 * all the copy functions for classes which inherit from Plan.
84 CopyPlanFields(Plan *from, Plan *newnode)
86 newnode->startup_cost = from->startup_cost;
87 newnode->total_cost = from->total_cost;
88 newnode->plan_rows = from->plan_rows;
89 newnode->plan_width = from->plan_width;
90 /* state is NOT copied */
91 Node_Copy(from, newnode, targetlist);
92 Node_Copy(from, newnode, qual);
93 Node_Copy(from, newnode, lefttree);
94 Node_Copy(from, newnode, righttree);
95 newnode->extParam = listCopy(from->extParam);
96 newnode->locParam = listCopy(from->locParam);
97 newnode->chgParam = listCopy(from->chgParam);
98 Node_Copy(from, newnode, initPlan);
99 /* subPlan list must point to subplans in the new subtree, not the old */
100 if (from->subPlan != NIL)
101 newnode->subPlan = nconc(pull_subplans((Node *) newnode->targetlist),
102 pull_subplans((Node *) newnode->qual));
104 newnode->subPlan = NIL;
105 newnode->nParamExec = from->nParamExec;
113 _copyPlan(Plan *from)
115 Plan *newnode = makeNode(Plan);
118 * copy the node superclass fields
120 CopyPlanFields(from, newnode);
131 _copyResult(Result *from)
133 Result *newnode = makeNode(Result);
136 * copy node superclass fields
138 CopyPlanFields((Plan *) from, (Plan *) newnode);
141 * copy remainder of node
143 Node_Copy(from, newnode, resconstantqual);
146 * We must add subplans in resconstantqual to the new plan's subPlan
149 if (from->plan.subPlan != NIL)
150 newnode->plan.subPlan = nconc(newnode->plan.subPlan,
151 pull_subplans(newnode->resconstantqual));
161 _copyAppend(Append *from)
163 Append *newnode = makeNode(Append);
166 * copy node superclass fields
168 CopyPlanFields((Plan *) from, (Plan *) newnode);
171 * copy remainder of node
173 Node_Copy(from, newnode, appendplans);
174 newnode->isTarget = from->isTarget;
183 * This function copies the fields of the Scan node. It is used by
184 * all the copy functions for classes which inherit from Scan.
188 CopyScanFields(Scan *from, Scan *newnode)
190 newnode->scanrelid = from->scanrelid;
199 _copyScan(Scan *from)
201 Scan *newnode = makeNode(Scan);
204 * copy node superclass fields
206 CopyPlanFields((Plan *) from, (Plan *) newnode);
207 CopyScanFields((Scan *) from, (Scan *) newnode);
217 _copySeqScan(SeqScan *from)
219 SeqScan *newnode = makeNode(SeqScan);
222 * copy node superclass fields
224 CopyPlanFields((Plan *) from, (Plan *) newnode);
225 CopyScanFields((Scan *) from, (Scan *) newnode);
235 _copyIndexScan(IndexScan *from)
237 IndexScan *newnode = makeNode(IndexScan);
240 * copy node superclass fields
242 CopyPlanFields((Plan *) from, (Plan *) newnode);
243 CopyScanFields((Scan *) from, (Scan *) newnode);
246 * 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;
254 * We must add subplans in index quals to the new plan's subPlan list
256 if (from->scan.plan.subPlan != NIL)
258 newnode->scan.plan.subPlan = nconc(newnode->scan.plan.subPlan,
259 pull_subplans((Node *) newnode->indxqual));
260 newnode->scan.plan.subPlan = nconc(newnode->scan.plan.subPlan,
261 pull_subplans((Node *) newnode->indxqualorig));
272 _copyTidScan(TidScan *from)
274 TidScan *newnode = makeNode(TidScan);
277 * copy node superclass fields
279 CopyPlanFields((Plan *) from, (Plan *) newnode);
280 CopyScanFields((Scan *) from, (Scan *) newnode);
283 * copy remainder of node
285 newnode->needRescan = from->needRescan;
286 Node_Copy(from, newnode, tideval);
295 static SubqueryScan *
296 _copySubqueryScan(SubqueryScan *from)
298 SubqueryScan *newnode = makeNode(SubqueryScan);
301 * copy node superclass fields
303 CopyPlanFields((Plan *) from, (Plan *) newnode);
304 CopyScanFields((Scan *) from, (Scan *) newnode);
307 * copy remainder of node
309 Node_Copy(from, newnode, subplan);
318 static FunctionScan *
319 _copyFunctionScan(FunctionScan *from)
321 FunctionScan *newnode = makeNode(FunctionScan);
324 * copy node superclass fields
326 CopyPlanFields((Plan *) from, (Plan *) newnode);
327 CopyScanFields((Scan *) from, (Scan *) newnode);
335 * This function copies the fields of the Join node. It is used by
336 * all the copy functions for classes which inherit from Join.
340 CopyJoinFields(Join *from, Join *newnode)
342 newnode->jointype = from->jointype;
343 Node_Copy(from, newnode, joinqual);
344 /* subPlan list must point to subplans in the new subtree, not the old */
345 if (from->plan.subPlan != NIL)
346 newnode->plan.subPlan = nconc(newnode->plan.subPlan,
347 pull_subplans((Node *) newnode->joinqual));
356 _copyJoin(Join *from)
358 Join *newnode = makeNode(Join);
361 * copy node superclass fields
363 CopyPlanFields((Plan *) from, (Plan *) newnode);
364 CopyJoinFields(from, newnode);
375 _copyNestLoop(NestLoop *from)
377 NestLoop *newnode = makeNode(NestLoop);
380 * copy node superclass fields
382 CopyPlanFields((Plan *) from, (Plan *) newnode);
383 CopyJoinFields((Join *) from, (Join *) newnode);
394 _copyMergeJoin(MergeJoin *from)
396 MergeJoin *newnode = makeNode(MergeJoin);
399 * copy node superclass fields
401 CopyPlanFields((Plan *) from, (Plan *) newnode);
402 CopyJoinFields((Join *) from, (Join *) newnode);
405 * copy remainder of node
407 Node_Copy(from, newnode, mergeclauses);
410 * We must add subplans in mergeclauses to the new plan's subPlan list
412 if (from->join.plan.subPlan != NIL)
413 newnode->join.plan.subPlan = nconc(newnode->join.plan.subPlan,
414 pull_subplans((Node *) newnode->mergeclauses));
424 _copyHashJoin(HashJoin *from)
426 HashJoin *newnode = makeNode(HashJoin);
429 * copy node superclass fields
431 CopyPlanFields((Plan *) from, (Plan *) newnode);
432 CopyJoinFields((Join *) from, (Join *) newnode);
435 * copy remainder of node
437 Node_Copy(from, newnode, hashclauses);
438 newnode->hashjoinop = from->hashjoinop;
441 * We must add subplans in hashclauses to the new plan's subPlan list
443 if (from->join.plan.subPlan != NIL)
444 newnode->join.plan.subPlan = nconc(newnode->join.plan.subPlan,
445 pull_subplans((Node *) newnode->hashclauses));
456 _copyMaterial(Material *from)
458 Material *newnode = makeNode(Material);
461 * copy node superclass fields
463 CopyPlanFields((Plan *) from, (Plan *) newnode);
474 _copySort(Sort *from)
476 Sort *newnode = makeNode(Sort);
479 * copy node superclass fields
481 CopyPlanFields((Plan *) from, (Plan *) newnode);
483 newnode->keycount = from->keycount;
494 _copyGroup(Group *from)
496 Group *newnode = makeNode(Group);
498 CopyPlanFields((Plan *) from, (Plan *) newnode);
500 newnode->numCols = from->numCols;
501 newnode->grpColIdx = palloc(from->numCols * sizeof(AttrNumber));
502 memcpy(newnode->grpColIdx, from->grpColIdx,
503 from->numCols * sizeof(AttrNumber));
515 Agg *newnode = makeNode(Agg);
517 CopyPlanFields((Plan *) from, (Plan *) newnode);
519 newnode->aggstrategy = from->aggstrategy;
520 newnode->numCols = from->numCols;
521 if (from->numCols > 0)
523 newnode->grpColIdx = palloc(from->numCols * sizeof(AttrNumber));
524 memcpy(newnode->grpColIdx, from->grpColIdx,
525 from->numCols * sizeof(AttrNumber));
527 newnode->numGroups = from->numGroups;
537 _copyGroupClause(GroupClause *from)
539 GroupClause *newnode = makeNode(GroupClause);
541 newnode->tleSortGroupRef = from->tleSortGroupRef;
542 newnode->sortop = from->sortop;
552 _copyUnique(Unique *from)
554 Unique *newnode = makeNode(Unique);
557 * copy node superclass fields
559 CopyPlanFields((Plan *) from, (Plan *) newnode);
562 * copy remainder of node
564 newnode->numCols = from->numCols;
565 newnode->uniqColIdx = palloc(from->numCols * sizeof(AttrNumber));
566 memcpy(newnode->uniqColIdx, from->uniqColIdx, from->numCols * sizeof(AttrNumber));
576 _copySetOp(SetOp *from)
578 SetOp *newnode = makeNode(SetOp);
581 * copy node superclass fields
583 CopyPlanFields((Plan *) from, (Plan *) newnode);
586 * copy remainder of node
588 newnode->cmd = from->cmd;
589 newnode->numCols = from->numCols;
590 newnode->dupColIdx = palloc(from->numCols * sizeof(AttrNumber));
591 memcpy(newnode->dupColIdx, from->dupColIdx, from->numCols * sizeof(AttrNumber));
592 newnode->flagColIdx = from->flagColIdx;
602 _copyLimit(Limit *from)
604 Limit *newnode = makeNode(Limit);
607 * copy node superclass fields
609 CopyPlanFields((Plan *) from, (Plan *) newnode);
612 * copy remainder of node
614 Node_Copy(from, newnode, limitOffset);
615 Node_Copy(from, newnode, limitCount);
625 _copyHash(Hash *from)
627 Hash *newnode = makeNode(Hash);
630 * copy node superclass fields
632 CopyPlanFields((Plan *) from, (Plan *) newnode);
635 * copy remainder of node
637 Node_Copy(from, newnode, hashkey);
643 _copySubPlan(SubPlan *from)
645 SubPlan *newnode = makeNode(SubPlan);
647 Node_Copy(from, newnode, plan);
648 newnode->plan_id = from->plan_id;
649 Node_Copy(from, newnode, rtable);
650 newnode->setParam = listCopy(from->setParam);
651 newnode->parParam = listCopy(from->parParam);
652 Node_Copy(from, newnode, sublink);
654 /* do not copy execution state */
655 newnode->needShutdown = false;
656 newnode->curTuple = NULL;
661 /* ****************************************************************
662 * primnodes.h copy functions
663 * ****************************************************************
671 _copyResdom(Resdom *from)
673 Resdom *newnode = makeNode(Resdom);
675 newnode->resno = from->resno;
676 newnode->restype = from->restype;
677 newnode->restypmod = from->restypmod;
678 if (from->resname != NULL)
679 newnode->resname = pstrdup(from->resname);
680 newnode->ressortgroupref = from->ressortgroupref;
681 newnode->reskey = from->reskey;
682 newnode->reskeyop = from->reskeyop;
683 newnode->resjunk = from->resjunk;
689 _copyFjoin(Fjoin *from)
691 Fjoin *newnode = makeNode(Fjoin);
694 * copy node superclass fields
697 newnode->fj_initialized = from->fj_initialized;
698 newnode->fj_nNodes = from->fj_nNodes;
700 Node_Copy(from, newnode, fj_innerNode);
702 newnode->fj_results = (DatumPtr)
703 palloc((from->fj_nNodes) * sizeof(Datum));
704 memmove(from->fj_results,
706 (from->fj_nNodes) * sizeof(Datum));
708 newnode->fj_alwaysDone = (BoolPtr)
709 palloc((from->fj_nNodes) * sizeof(bool));
710 memmove(from->fj_alwaysDone,
711 newnode->fj_alwaysDone,
712 (from->fj_nNodes) * sizeof(bool));
723 _copyExpr(Expr *from)
725 Expr *newnode = makeNode(Expr);
728 * copy node superclass fields
730 newnode->typeOid = from->typeOid;
731 newnode->opType = from->opType;
733 Node_Copy(from, newnode, oper);
734 Node_Copy(from, newnode, args);
746 Var *newnode = makeNode(Var);
749 * copy remainder of node
751 newnode->varno = from->varno;
752 newnode->varattno = from->varattno;
753 newnode->vartype = from->vartype;
754 newnode->vartypmod = from->vartypmod;
755 newnode->varlevelsup = from->varlevelsup;
757 newnode->varnoold = from->varnoold;
758 newnode->varoattno = from->varoattno;
768 _copyOper(Oper *from)
770 Oper *newnode = makeNode(Oper);
773 * copy remainder of node
775 newnode->opno = from->opno;
776 newnode->opid = from->opid;
777 newnode->opresulttype = from->opresulttype;
778 newnode->opretset = from->opretset;
779 /* Do not copy the run-time state, if any */
780 newnode->op_fcache = NULL;
790 _copyConst(Const *from)
792 Const *newnode = makeNode(Const);
795 * copy remainder of node
797 newnode->consttype = from->consttype;
798 newnode->constlen = from->constlen;
800 if (from->constbyval || from->constisnull)
803 * passed by value so just copy the datum. Also, don't try to copy
804 * struct when value is null!
806 newnode->constvalue = from->constvalue;
811 * not passed by value. We need a palloc'd copy.
813 newnode->constvalue = datumCopy(from->constvalue,
818 newnode->constisnull = from->constisnull;
819 newnode->constbyval = from->constbyval;
820 newnode->constisset = from->constisset;
821 newnode->constiscast = from->constiscast;
831 _copyParam(Param *from)
833 Param *newnode = makeNode(Param);
836 * copy remainder of node
838 newnode->paramkind = from->paramkind;
839 newnode->paramid = from->paramid;
841 if (from->paramname != NULL)
842 newnode->paramname = pstrdup(from->paramname);
843 newnode->paramtype = from->paramtype;
853 _copyFunc(Func *from)
855 Func *newnode = makeNode(Func);
858 * copy remainder of node
860 newnode->funcid = from->funcid;
861 newnode->funcresulttype = from->funcresulttype;
862 newnode->funcretset = from->funcretset;
863 newnode->funcformat = from->funcformat;
864 /* Do not copy the run-time state, if any */
865 newnode->func_fcache = NULL;
875 _copyAggref(Aggref *from)
877 Aggref *newnode = makeNode(Aggref);
879 newnode->aggfnoid = from->aggfnoid;
880 newnode->aggtype = from->aggtype;
881 Node_Copy(from, newnode, target);
882 newnode->aggstar = from->aggstar;
883 newnode->aggdistinct = from->aggdistinct;
884 newnode->aggno = from->aggno; /* probably not needed */
894 _copySubLink(SubLink *from)
896 SubLink *newnode = makeNode(SubLink);
899 * copy remainder of node
901 newnode->subLinkType = from->subLinkType;
902 newnode->useor = from->useor;
903 Node_Copy(from, newnode, lefthand);
904 Node_Copy(from, newnode, oper);
905 Node_Copy(from, newnode, subselect);
915 _copyFieldSelect(FieldSelect *from)
917 FieldSelect *newnode = makeNode(FieldSelect);
920 * copy remainder of node
922 Node_Copy(from, newnode, arg);
923 newnode->fieldnum = from->fieldnum;
924 newnode->resulttype = from->resulttype;
925 newnode->resulttypmod = from->resulttypmod;
935 _copyRelabelType(RelabelType *from)
937 RelabelType *newnode = makeNode(RelabelType);
940 * copy remainder of node
942 Node_Copy(from, newnode, arg);
943 newnode->resulttype = from->resulttype;
944 newnode->resulttypmod = from->resulttypmod;
945 newnode->relabelformat = from->relabelformat;
951 _copyRangeTblRef(RangeTblRef *from)
953 RangeTblRef *newnode = makeNode(RangeTblRef);
955 newnode->rtindex = from->rtindex;
961 _copyFromExpr(FromExpr *from)
963 FromExpr *newnode = makeNode(FromExpr);
965 Node_Copy(from, newnode, fromlist);
966 Node_Copy(from, newnode, quals);
972 _copyJoinExpr(JoinExpr *from)
974 JoinExpr *newnode = makeNode(JoinExpr);
976 newnode->jointype = from->jointype;
977 newnode->isNatural = from->isNatural;
978 Node_Copy(from, newnode, larg);
979 Node_Copy(from, newnode, rarg);
980 Node_Copy(from, newnode, using);
981 Node_Copy(from, newnode, quals);
982 Node_Copy(from, newnode, alias);
983 newnode->rtindex = from->rtindex;
989 _copyCaseExpr(CaseExpr *from)
991 CaseExpr *newnode = makeNode(CaseExpr);
994 * copy remainder of node
996 newnode->casetype = from->casetype;
998 Node_Copy(from, newnode, arg);
999 Node_Copy(from, newnode, args);
1000 Node_Copy(from, newnode, defresult);
1006 _copyCaseWhen(CaseWhen *from)
1008 CaseWhen *newnode = makeNode(CaseWhen);
1011 * copy remainder of node
1013 Node_Copy(from, newnode, expr);
1014 Node_Copy(from, newnode, result);
1020 _copyNullTest(NullTest *from)
1022 NullTest *newnode = makeNode(NullTest);
1025 * copy remainder of node
1027 Node_Copy(from, newnode, arg);
1028 newnode->nulltesttype = from->nulltesttype;
1033 static BooleanTest *
1034 _copyBooleanTest(BooleanTest *from)
1036 BooleanTest *newnode = makeNode(BooleanTest);
1039 * copy remainder of node
1041 Node_Copy(from, newnode, arg);
1042 newnode->booltesttype = from->booltesttype;
1047 static ConstraintTest *
1048 _copyConstraintTest(ConstraintTest *from)
1050 ConstraintTest *newnode = makeNode(ConstraintTest);
1053 * copy remainder of node
1055 Node_Copy(from, newnode, arg);
1056 newnode->testtype = from->testtype;
1058 newnode->name = pstrdup(from->name);
1060 newnode->domname = pstrdup(from->domname);
1061 Node_Copy(from, newnode, check_expr);
1066 static ConstraintTestValue *
1067 _copyConstraintTestValue(ConstraintTestValue *from)
1069 ConstraintTestValue *newnode = makeNode(ConstraintTestValue);
1072 * copy remainder of node
1074 newnode->typeId = from->typeId;
1075 newnode->typeMod = from->typeMod;
1080 static DomainConstraintValue *
1081 _copyDomainConstraintValue(DomainConstraintValue *from)
1083 DomainConstraintValue *newnode = makeNode(DomainConstraintValue);
1089 _copyArrayRef(ArrayRef *from)
1091 ArrayRef *newnode = makeNode(ArrayRef);
1094 * copy remainder of node
1096 newnode->refrestype = from->refrestype;
1097 newnode->refattrlength = from->refattrlength;
1098 newnode->refelemlength = from->refelemlength;
1099 newnode->refelembyval = from->refelembyval;
1100 newnode->refelemalign = from->refelemalign;
1102 Node_Copy(from, newnode, refupperindexpr);
1103 Node_Copy(from, newnode, reflowerindexpr);
1104 Node_Copy(from, newnode, refexpr);
1105 Node_Copy(from, newnode, refassgnexpr);
1110 /* ****************************************************************
1111 * relation.h copy functions
1112 * ****************************************************************
1120 _copyRelOptInfo(RelOptInfo *from)
1122 RelOptInfo *newnode = makeNode(RelOptInfo);
1124 newnode->reloptkind = from->reloptkind;
1126 newnode->relids = listCopy(from->relids);
1128 newnode->rows = from->rows;
1129 newnode->width = from->width;
1131 Node_Copy(from, newnode, targetlist);
1132 Node_Copy(from, newnode, pathlist);
1133 /* XXX cheapest-path fields should point to members of pathlist? */
1134 Node_Copy(from, newnode, cheapest_startup_path);
1135 Node_Copy(from, newnode, cheapest_total_path);
1136 newnode->pruneable = from->pruneable;
1138 newnode->rtekind = from->rtekind;
1139 Node_Copy(from, newnode, indexlist);
1140 newnode->pages = from->pages;
1141 newnode->tuples = from->tuples;
1142 Node_Copy(from, newnode, subplan);
1144 newnode->joinrti = from->joinrti;
1145 newnode->joinrteids = listCopy(from->joinrteids);
1147 Node_Copy(from, newnode, baserestrictinfo);
1148 newnode->baserestrictcost = from->baserestrictcost;
1149 newnode->outerjoinset = listCopy(from->outerjoinset);
1150 Node_Copy(from, newnode, joininfo);
1151 Node_Copy(from, newnode, innerjoin);
1160 static IndexOptInfo *
1161 _copyIndexOptInfo(IndexOptInfo *from)
1163 IndexOptInfo *newnode = makeNode(IndexOptInfo);
1166 newnode->indexoid = from->indexoid;
1167 newnode->pages = from->pages;
1168 newnode->tuples = from->tuples;
1170 newnode->ncolumns = from->ncolumns;
1171 newnode->nkeys = from->nkeys;
1173 if (from->classlist)
1175 /* copy the trailing zero too */
1176 len = (from->ncolumns + 1) * sizeof(Oid);
1177 newnode->classlist = (Oid *) palloc(len);
1178 memcpy(newnode->classlist, from->classlist, len);
1181 if (from->indexkeys)
1183 /* copy the trailing zero too */
1184 len = (from->nkeys + 1) * sizeof(int);
1185 newnode->indexkeys = (int *) palloc(len);
1186 memcpy(newnode->indexkeys, from->indexkeys, len);
1191 /* copy the trailing zero too */
1192 len = (from->ncolumns + 1) * sizeof(Oid);
1193 newnode->ordering = (Oid *) palloc(len);
1194 memcpy(newnode->ordering, from->ordering, len);
1197 newnode->relam = from->relam;
1198 newnode->amcostestimate = from->amcostestimate;
1199 newnode->indproc = from->indproc;
1200 Node_Copy(from, newnode, indpred);
1201 newnode->unique = from->unique;
1209 * This function copies the fields of the Path node. It is used by
1210 * all the copy functions for classes which inherit from Path.
1214 CopyPathFields(Path *from, Path *newnode)
1217 * Modify the next line, since it causes the copying to cycle (i.e.
1218 * the parent points right back here! -- JMH, 7/7/92. Old version:
1219 * Node_Copy(from, newnode, parent);
1221 newnode->parent = from->parent;
1223 newnode->startup_cost = from->startup_cost;
1224 newnode->total_cost = from->total_cost;
1226 newnode->pathtype = from->pathtype;
1228 Node_Copy(from, newnode, pathkeys);
1236 _copyPath(Path *from)
1238 Path *newnode = makeNode(Path);
1240 CopyPathFields(from, newnode);
1250 _copyIndexPath(IndexPath *from)
1252 IndexPath *newnode = makeNode(IndexPath);
1255 * copy the node superclass fields
1257 CopyPathFields((Path *) from, (Path *) newnode);
1260 * copy remainder of node
1262 Node_Copy(from, newnode, indexinfo);
1263 Node_Copy(from, newnode, indexqual);
1264 newnode->indexscandir = from->indexscandir;
1265 newnode->joinrelids = listCopy(from->joinrelids);
1266 newnode->alljoinquals = from->alljoinquals;
1267 newnode->rows = from->rows;
1277 _copyTidPath(TidPath *from)
1279 TidPath *newnode = makeNode(TidPath);
1282 * copy the node superclass fields
1284 CopyPathFields((Path *) from, (Path *) newnode);
1287 * copy remainder of node
1289 Node_Copy(from, newnode, tideval);
1290 newnode->unjoined_relids = listCopy(from->unjoined_relids);
1300 _copyAppendPath(AppendPath *from)
1302 AppendPath *newnode = makeNode(AppendPath);
1305 * copy the node superclass fields
1307 CopyPathFields((Path *) from, (Path *) newnode);
1310 * copy remainder of node
1312 Node_Copy(from, newnode, subpaths);
1322 _copyResultPath(ResultPath *from)
1324 ResultPath *newnode = makeNode(ResultPath);
1327 * copy the node superclass fields
1329 CopyPathFields((Path *) from, (Path *) newnode);
1332 * copy remainder of node
1334 Node_Copy(from, newnode, subpath);
1335 Node_Copy(from, newnode, constantqual);
1341 * CopyJoinPathFields
1343 * This function copies the fields of the JoinPath node. It is used by
1344 * all the copy functions for classes which inherit from JoinPath.
1348 CopyJoinPathFields(JoinPath *from, JoinPath *newnode)
1350 newnode->jointype = from->jointype;
1351 Node_Copy(from, newnode, outerjoinpath);
1352 Node_Copy(from, newnode, innerjoinpath);
1353 Node_Copy(from, newnode, joinrestrictinfo);
1361 _copyNestPath(NestPath *from)
1363 NestPath *newnode = makeNode(NestPath);
1366 * copy the node superclass fields
1368 CopyPathFields((Path *) from, (Path *) newnode);
1369 CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode);
1379 _copyMergePath(MergePath *from)
1381 MergePath *newnode = makeNode(MergePath);
1384 * copy the node superclass fields
1386 CopyPathFields((Path *) from, (Path *) newnode);
1387 CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode);
1390 * copy the remainder of the node
1392 Node_Copy(from, newnode, path_mergeclauses);
1393 Node_Copy(from, newnode, outersortkeys);
1394 Node_Copy(from, newnode, innersortkeys);
1404 _copyHashPath(HashPath *from)
1406 HashPath *newnode = makeNode(HashPath);
1409 * copy the node superclass fields
1411 CopyPathFields((Path *) from, (Path *) newnode);
1412 CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode);
1415 * copy remainder of node
1417 Node_Copy(from, newnode, path_hashclauses);
1426 static PathKeyItem *
1427 _copyPathKeyItem(PathKeyItem *from)
1429 PathKeyItem *newnode = makeNode(PathKeyItem);
1432 * copy remainder of node
1434 Node_Copy(from, newnode, key);
1435 newnode->sortop = from->sortop;
1444 static RestrictInfo *
1445 _copyRestrictInfo(RestrictInfo *from)
1447 RestrictInfo *newnode = makeNode(RestrictInfo);
1450 * copy remainder of node
1452 Node_Copy(from, newnode, clause);
1453 newnode->ispusheddown = from->ispusheddown;
1454 Node_Copy(from, newnode, subclauseindices);
1455 newnode->eval_cost = from->eval_cost;
1456 newnode->this_selec = from->this_selec;
1457 newnode->mergejoinoperator = from->mergejoinoperator;
1458 newnode->left_sortop = from->left_sortop;
1459 newnode->right_sortop = from->right_sortop;
1462 * Do not copy pathkeys, since they'd not be canonical in a copied
1465 newnode->left_pathkey = NIL;
1466 newnode->right_pathkey = NIL;
1467 newnode->left_mergescansel = from->left_mergescansel;
1468 newnode->right_mergescansel = from->right_mergescansel;
1469 newnode->hashjoinoperator = from->hashjoinoperator;
1470 newnode->left_bucketsize = from->left_bucketsize;
1471 newnode->right_bucketsize = from->right_bucketsize;
1481 _copyJoinInfo(JoinInfo *from)
1483 JoinInfo *newnode = makeNode(JoinInfo);
1486 * copy remainder of node
1488 newnode->unjoined_relids = listCopy(from->unjoined_relids);
1489 Node_Copy(from, newnode, jinfo_restrictinfo);
1494 /* ****************************************************************
1495 * parsenodes.h copy functions
1496 * ****************************************************************
1499 static TargetEntry *
1500 _copyTargetEntry(TargetEntry *from)
1502 TargetEntry *newnode = makeNode(TargetEntry);
1504 Node_Copy(from, newnode, resdom);
1505 Node_Copy(from, newnode, fjoin);
1506 Node_Copy(from, newnode, expr);
1510 static RangeTblEntry *
1511 _copyRangeTblEntry(RangeTblEntry *from)
1513 RangeTblEntry *newnode = makeNode(RangeTblEntry);
1515 newnode->rtekind = from->rtekind;
1516 newnode->relid = from->relid;
1517 Node_Copy(from, newnode, subquery);
1518 Node_Copy(from, newnode, funcexpr);
1519 Node_Copy(from, newnode, coldeflist);
1520 newnode->jointype = from->jointype;
1521 Node_Copy(from, newnode, joinaliasvars);
1522 Node_Copy(from, newnode, alias);
1523 Node_Copy(from, newnode, eref);
1524 newnode->inh = from->inh;
1525 newnode->inFromCl = from->inFromCl;
1526 newnode->checkForRead = from->checkForRead;
1527 newnode->checkForWrite = from->checkForWrite;
1528 newnode->checkAsUser = from->checkAsUser;
1533 static FkConstraint *
1534 _copyFkConstraint(FkConstraint *from)
1536 FkConstraint *newnode = makeNode(FkConstraint);
1538 if (from->constr_name)
1539 newnode->constr_name = pstrdup(from->constr_name);
1540 Node_Copy(from, newnode, pktable);
1541 Node_Copy(from, newnode, fk_attrs);
1542 Node_Copy(from, newnode, pk_attrs);
1543 newnode->fk_matchtype = from->fk_matchtype;
1544 newnode->fk_upd_action = from->fk_upd_action;
1545 newnode->fk_del_action = from->fk_del_action;
1546 newnode->deferrable = from->deferrable;
1547 newnode->initdeferred = from->initdeferred;
1548 newnode->skip_validation = from->skip_validation;
1554 _copySortClause(SortClause *from)
1556 SortClause *newnode = makeNode(SortClause);
1558 newnode->tleSortGroupRef = from->tleSortGroupRef;
1559 newnode->sortop = from->sortop;
1565 _copyAExpr(A_Expr *from)
1567 A_Expr *newnode = makeNode(A_Expr);
1569 newnode->oper = from->oper;
1570 Node_Copy(from, newnode, name);
1571 Node_Copy(from, newnode, lexpr);
1572 Node_Copy(from, newnode, rexpr);
1578 _copyColumnRef(ColumnRef *from)
1580 ColumnRef *newnode = makeNode(ColumnRef);
1582 Node_Copy(from, newnode, fields);
1583 Node_Copy(from, newnode, indirection);
1589 _copyParamRef(ParamRef *from)
1591 ParamRef *newnode = makeNode(ParamRef);
1593 newnode->number = from->number;
1594 Node_Copy(from, newnode, fields);
1595 Node_Copy(from, newnode, indirection);
1601 _copyAConst(A_Const *from)
1603 A_Const *newnode = makeNode(A_Const);
1605 /* This part must duplicate _copyValue */
1606 newnode->val.type = from->val.type;
1607 switch (from->val.type)
1610 newnode->val.val.ival = from->val.val.ival;
1615 newnode->val.val.str = pstrdup(from->val.val.str);
1621 elog(ERROR, "_copyAConst: unknown node type %d", from->val.type);
1625 Node_Copy(from, newnode, typename);
1631 _copyFuncCall(FuncCall *from)
1633 FuncCall *newnode = makeNode(FuncCall);
1635 Node_Copy(from, newnode, funcname);
1636 Node_Copy(from, newnode, args);
1637 newnode->agg_star = from->agg_star;
1638 newnode->agg_distinct = from->agg_distinct;
1644 _copyAIndices(A_Indices *from)
1646 A_Indices *newnode = makeNode(A_Indices);
1648 Node_Copy(from, newnode, lidx);
1649 Node_Copy(from, newnode, uidx);
1654 static ExprFieldSelect *
1655 _copyExprFieldSelect(ExprFieldSelect *from)
1657 ExprFieldSelect *newnode = makeNode(ExprFieldSelect);
1659 Node_Copy(from, newnode, arg);
1660 Node_Copy(from, newnode, fields);
1661 Node_Copy(from, newnode, indirection);
1667 _copyResTarget(ResTarget *from)
1669 ResTarget *newnode = makeNode(ResTarget);
1672 newnode->name = pstrdup(from->name);
1673 Node_Copy(from, newnode, indirection);
1674 Node_Copy(from, newnode, val);
1680 _copyTypeName(TypeName *from)
1682 TypeName *newnode = makeNode(TypeName);
1684 Node_Copy(from, newnode, names);
1685 newnode->typeid = from->typeid;
1686 newnode->timezone = from->timezone;
1687 newnode->setof = from->setof;
1688 newnode->pct_type = from->pct_type;
1689 newnode->typmod = from->typmod;
1690 Node_Copy(from, newnode, arrayBounds);
1695 static SortGroupBy *
1696 _copySortGroupBy(SortGroupBy *from)
1698 SortGroupBy *newnode = makeNode(SortGroupBy);
1700 Node_Copy(from, newnode, useOp);
1701 Node_Copy(from, newnode, node);
1707 _copyAlias(Alias *from)
1709 Alias *newnode = makeNode(Alias);
1711 if (from->aliasname)
1712 newnode->aliasname = pstrdup(from->aliasname);
1713 Node_Copy(from, newnode, colnames);
1719 _copyRangeVar(RangeVar *from)
1721 RangeVar *newnode = makeNode(RangeVar);
1723 if (from->catalogname)
1724 newnode->catalogname = pstrdup(from->catalogname);
1725 if (from->schemaname)
1726 newnode->schemaname = pstrdup(from->schemaname);
1728 newnode->relname = pstrdup(from->relname);
1729 newnode->inhOpt = from->inhOpt;
1730 newnode->istemp = from->istemp;
1731 Node_Copy(from, newnode, alias);
1736 static RangeSubselect *
1737 _copyRangeSubselect(RangeSubselect *from)
1739 RangeSubselect *newnode = makeNode(RangeSubselect);
1741 Node_Copy(from, newnode, subquery);
1742 Node_Copy(from, newnode, alias);
1747 static RangeFunction *
1748 _copyRangeFunction(RangeFunction *from)
1750 RangeFunction *newnode = makeNode(RangeFunction);
1752 Node_Copy(from, newnode, funccallnode);
1753 Node_Copy(from, newnode, alias);
1754 Node_Copy(from, newnode, coldeflist);
1760 _copyTypeCast(TypeCast *from)
1762 TypeCast *newnode = makeNode(TypeCast);
1764 Node_Copy(from, newnode, arg);
1765 Node_Copy(from, newnode, typename);
1771 _copyIndexElem(IndexElem *from)
1773 IndexElem *newnode = makeNode(IndexElem);
1776 newnode->name = pstrdup(from->name);
1777 Node_Copy(from, newnode, funcname);
1778 Node_Copy(from, newnode, args);
1779 Node_Copy(from, newnode, opclass);
1785 _copyColumnDef(ColumnDef *from)
1787 ColumnDef *newnode = makeNode(ColumnDef);
1790 newnode->colname = pstrdup(from->colname);
1791 Node_Copy(from, newnode, typename);
1792 newnode->inhcount = from->inhcount;
1793 newnode->is_local = from->is_local;
1794 newnode->is_not_null = from->is_not_null;
1795 Node_Copy(from, newnode, raw_default);
1796 if (from->cooked_default)
1797 newnode->cooked_default = pstrdup(from->cooked_default);
1798 Node_Copy(from, newnode, constraints);
1799 Node_Copy(from, newnode, support);
1805 _copyConstraint(Constraint *from)
1807 Constraint *newnode = makeNode(Constraint);
1809 newnode->contype = from->contype;
1811 newnode->name = pstrdup(from->name);
1812 Node_Copy(from, newnode, raw_expr);
1813 if (from->cooked_expr)
1814 newnode->cooked_expr = pstrdup(from->cooked_expr);
1815 Node_Copy(from, newnode, keys);
1821 _copyDefElem(DefElem *from)
1823 DefElem *newnode = makeNode(DefElem);
1826 newnode->defname = pstrdup(from->defname);
1827 Node_Copy(from, newnode, arg);
1833 _copyQuery(Query *from)
1835 Query *newnode = makeNode(Query);
1837 newnode->commandType = from->commandType;
1838 newnode->querySource = from->querySource;
1839 Node_Copy(from, newnode, utilityStmt);
1840 newnode->resultRelation = from->resultRelation;
1841 Node_Copy(from, newnode, into);
1842 newnode->isPortal = from->isPortal;
1843 newnode->isBinary = from->isBinary;
1844 newnode->hasAggs = from->hasAggs;
1845 newnode->hasSubLinks = from->hasSubLinks;
1847 Node_Copy(from, newnode, rtable);
1848 Node_Copy(from, newnode, jointree);
1850 newnode->rowMarks = listCopy(from->rowMarks);
1852 Node_Copy(from, newnode, targetList);
1854 Node_Copy(from, newnode, groupClause);
1855 Node_Copy(from, newnode, havingQual);
1856 Node_Copy(from, newnode, distinctClause);
1857 Node_Copy(from, newnode, sortClause);
1859 Node_Copy(from, newnode, limitOffset);
1860 Node_Copy(from, newnode, limitCount);
1862 Node_Copy(from, newnode, setOperations);
1864 newnode->resultRelations = listCopy(from->resultRelations);
1867 * We do not copy the planner internal fields: base_rel_list,
1868 * other_rel_list, join_rel_list, equi_key_list, query_pathkeys,
1869 * hasJoinRTEs. Not entirely clear if this is right?
1876 _copyInsertStmt(InsertStmt *from)
1878 InsertStmt *newnode = makeNode(InsertStmt);
1880 Node_Copy(from, newnode, relation);
1881 Node_Copy(from, newnode, cols);
1882 Node_Copy(from, newnode, targetList);
1883 Node_Copy(from, newnode, selectStmt);
1889 _copyDeleteStmt(DeleteStmt *from)
1891 DeleteStmt *newnode = makeNode(DeleteStmt);
1893 Node_Copy(from, newnode, relation);
1894 Node_Copy(from, newnode, whereClause);
1900 _copyUpdateStmt(UpdateStmt *from)
1902 UpdateStmt *newnode = makeNode(UpdateStmt);
1904 Node_Copy(from, newnode, relation);
1905 Node_Copy(from, newnode, targetList);
1906 Node_Copy(from, newnode, whereClause);
1907 Node_Copy(from, newnode, fromClause);
1913 _copySelectStmt(SelectStmt *from)
1915 SelectStmt *newnode = makeNode(SelectStmt);
1917 Node_Copy(from, newnode, distinctClause);
1918 Node_Copy(from, newnode, into);
1919 Node_Copy(from, newnode, intoColNames);
1920 Node_Copy(from, newnode, targetList);
1921 Node_Copy(from, newnode, fromClause);
1922 Node_Copy(from, newnode, whereClause);
1923 Node_Copy(from, newnode, groupClause);
1924 Node_Copy(from, newnode, havingClause);
1925 Node_Copy(from, newnode, sortClause);
1926 if (from->portalname)
1927 newnode->portalname = pstrdup(from->portalname);
1928 newnode->binary = from->binary;
1929 Node_Copy(from, newnode, limitOffset);
1930 Node_Copy(from, newnode, limitCount);
1931 Node_Copy(from, newnode, forUpdate);
1932 newnode->op = from->op;
1933 newnode->all = from->all;
1934 Node_Copy(from, newnode, larg);
1935 Node_Copy(from, newnode, rarg);
1940 static SetOperationStmt *
1941 _copySetOperationStmt(SetOperationStmt *from)
1943 SetOperationStmt *newnode = makeNode(SetOperationStmt);
1945 newnode->op = from->op;
1946 newnode->all = from->all;
1947 Node_Copy(from, newnode, larg);
1948 Node_Copy(from, newnode, rarg);
1949 newnode->colTypes = listCopy(from->colTypes);
1954 static AlterTableStmt *
1955 _copyAlterTableStmt(AlterTableStmt *from)
1957 AlterTableStmt *newnode = makeNode(AlterTableStmt);
1959 newnode->subtype = from->subtype;
1960 Node_Copy(from, newnode, relation);
1962 newnode->name = pstrdup(from->name);
1963 Node_Copy(from, newnode, def);
1964 newnode->behavior = from->behavior;
1970 _copyGrantStmt(GrantStmt *from)
1972 GrantStmt *newnode = makeNode(GrantStmt);
1974 newnode->is_grant = from->is_grant;
1975 newnode->objtype = from->objtype;
1976 Node_Copy(from, newnode, objects);
1977 newnode->privileges = listCopy(from->privileges);
1978 Node_Copy(from, newnode, grantees);
1983 static PrivGrantee *
1984 _copyPrivGrantee(PrivGrantee *from)
1986 PrivGrantee *newnode = makeNode(PrivGrantee);
1989 newnode->username = pstrdup(from->username);
1990 if (from->groupname)
1991 newnode->groupname = pstrdup(from->groupname);
1996 static FuncWithArgs *
1997 _copyFuncWithArgs(FuncWithArgs *from)
1999 FuncWithArgs *newnode = makeNode(FuncWithArgs);
2001 Node_Copy(from, newnode, funcname);
2002 Node_Copy(from, newnode, funcargs);
2007 static InsertDefault *
2008 _copyInsertDefault(InsertDefault *from)
2010 InsertDefault *newnode = makeNode(InsertDefault);
2016 static ClosePortalStmt *
2017 _copyClosePortalStmt(ClosePortalStmt *from)
2019 ClosePortalStmt *newnode = makeNode(ClosePortalStmt);
2021 if (from->portalname)
2022 newnode->portalname = pstrdup(from->portalname);
2027 static ClusterStmt *
2028 _copyClusterStmt(ClusterStmt *from)
2030 ClusterStmt *newnode = makeNode(ClusterStmt);
2032 Node_Copy(from, newnode, relation);
2033 if (from->indexname)
2034 newnode->indexname = pstrdup(from->indexname);
2040 _copyCopyStmt(CopyStmt *from)
2042 CopyStmt *newnode = makeNode(CopyStmt);
2044 Node_Copy(from, newnode, relation);
2045 Node_Copy(from, newnode, attlist);
2046 newnode->is_from = from->is_from;
2048 newnode->filename = pstrdup(from->filename);
2049 Node_Copy(from, newnode, options);
2055 _copyCreateStmt(CreateStmt *from)
2057 CreateStmt *newnode = makeNode(CreateStmt);
2059 Node_Copy(from, newnode, relation);
2060 Node_Copy(from, newnode, tableElts);
2061 Node_Copy(from, newnode, inhRelations);
2062 Node_Copy(from, newnode, constraints);
2063 newnode->hasoids = from->hasoids;
2064 newnode->oncommit = from->oncommit;
2070 _copyDefineStmt(DefineStmt *from)
2072 DefineStmt *newnode = makeNode(DefineStmt);
2074 newnode->defType = from->defType;
2075 Node_Copy(from, newnode, defnames);
2076 Node_Copy(from, newnode, definition);
2082 _copyDropStmt(DropStmt *from)
2084 DropStmt *newnode = makeNode(DropStmt);
2086 Node_Copy(from, newnode, objects);
2087 newnode->removeType = from->removeType;
2088 newnode->behavior = from->behavior;
2093 static TruncateStmt *
2094 _copyTruncateStmt(TruncateStmt *from)
2096 TruncateStmt *newnode = makeNode(TruncateStmt);
2098 Node_Copy(from, newnode, relation);
2103 static CommentStmt *
2104 _copyCommentStmt(CommentStmt *from)
2106 CommentStmt *newnode = makeNode(CommentStmt);
2108 newnode->objtype = from->objtype;
2109 Node_Copy(from, newnode, objname);
2110 Node_Copy(from, newnode, objargs);
2112 newnode->comment = pstrdup(from->comment);
2118 _copyFetchStmt(FetchStmt *from)
2120 FetchStmt *newnode = makeNode(FetchStmt);
2122 newnode->direction = from->direction;
2123 newnode->howMany = from->howMany;
2124 newnode->portalname = pstrdup(from->portalname);
2125 newnode->ismove = from->ismove;
2131 _copyIndexStmt(IndexStmt *from)
2133 IndexStmt *newnode = makeNode(IndexStmt);
2135 newnode->idxname = pstrdup(from->idxname);
2136 Node_Copy(from, newnode, relation);
2137 newnode->accessMethod = pstrdup(from->accessMethod);
2138 Node_Copy(from, newnode, indexParams);
2139 Node_Copy(from, newnode, whereClause);
2140 Node_Copy(from, newnode, rangetable);
2141 newnode->unique = from->unique;
2142 newnode->primary = from->primary;
2143 newnode->isconstraint = from->isconstraint;
2148 static CreateFunctionStmt *
2149 _copyCreateFunctionStmt(CreateFunctionStmt *from)
2151 CreateFunctionStmt *newnode = makeNode(CreateFunctionStmt);
2153 newnode->replace = from->replace;
2154 Node_Copy(from, newnode, funcname);
2155 Node_Copy(from, newnode, argTypes);
2156 Node_Copy(from, newnode, returnType);
2157 Node_Copy(from, newnode, options);
2158 Node_Copy(from, newnode, withClause);
2163 static RemoveAggrStmt *
2164 _copyRemoveAggrStmt(RemoveAggrStmt *from)
2166 RemoveAggrStmt *newnode = makeNode(RemoveAggrStmt);
2168 Node_Copy(from, newnode, aggname);
2169 Node_Copy(from, newnode, aggtype);
2170 newnode->behavior = from->behavior;
2175 static RemoveFuncStmt *
2176 _copyRemoveFuncStmt(RemoveFuncStmt *from)
2178 RemoveFuncStmt *newnode = makeNode(RemoveFuncStmt);
2180 Node_Copy(from, newnode, funcname);
2181 Node_Copy(from, newnode, args);
2182 newnode->behavior = from->behavior;
2187 static RemoveOperStmt *
2188 _copyRemoveOperStmt(RemoveOperStmt *from)
2190 RemoveOperStmt *newnode = makeNode(RemoveOperStmt);
2192 Node_Copy(from, newnode, opname);
2193 Node_Copy(from, newnode, args);
2194 newnode->behavior = from->behavior;
2199 static RemoveOpClassStmt *
2200 _copyRemoveOpClassStmt(RemoveOpClassStmt *from)
2202 RemoveOpClassStmt *newnode = makeNode(RemoveOpClassStmt);
2204 Node_Copy(from, newnode, opclassname);
2206 newnode->amname = pstrdup(from->amname);
2207 newnode->behavior = from->behavior;
2213 _copyRenameStmt(RenameStmt *from)
2215 RenameStmt *newnode = makeNode(RenameStmt);
2217 Node_Copy(from, newnode, relation);
2219 newnode->oldname = pstrdup(from->oldname);
2221 newnode->newname = pstrdup(from->newname);
2222 newnode->renameType = from->renameType;
2228 _copyRuleStmt(RuleStmt *from)
2230 RuleStmt *newnode = makeNode(RuleStmt);
2232 Node_Copy(from, newnode, relation);
2233 newnode->rulename = pstrdup(from->rulename);
2234 Node_Copy(from, newnode, whereClause);
2235 newnode->event = from->event;
2236 newnode->instead = from->instead;
2237 newnode->replace = from->replace;
2238 Node_Copy(from, newnode, actions);
2244 _copyNotifyStmt(NotifyStmt *from)
2246 NotifyStmt *newnode = makeNode(NotifyStmt);
2248 Node_Copy(from, newnode, relation);
2254 _copyListenStmt(ListenStmt *from)
2256 ListenStmt *newnode = makeNode(ListenStmt);
2258 Node_Copy(from, newnode, relation);
2263 static UnlistenStmt *
2264 _copyUnlistenStmt(UnlistenStmt *from)
2266 UnlistenStmt *newnode = makeNode(UnlistenStmt);
2268 Node_Copy(from, newnode, relation);
2273 static TransactionStmt *
2274 _copyTransactionStmt(TransactionStmt *from)
2276 TransactionStmt *newnode = makeNode(TransactionStmt);
2278 newnode->command = from->command;
2279 Node_Copy(from, newnode, options);
2284 static CompositeTypeStmt *
2285 _copyCompositeTypeStmt(CompositeTypeStmt *from)
2287 CompositeTypeStmt *newnode = makeNode(CompositeTypeStmt);
2289 Node_Copy(from, newnode, typevar);
2290 Node_Copy(from, newnode, coldeflist);
2296 _copyViewStmt(ViewStmt *from)
2298 ViewStmt *newnode = makeNode(ViewStmt);
2300 Node_Copy(from, newnode, view);
2301 Node_Copy(from, newnode, aliases);
2302 Node_Copy(from, newnode, query);
2303 newnode->replace = from->replace;
2309 _copyLoadStmt(LoadStmt *from)
2311 LoadStmt *newnode = makeNode(LoadStmt);
2314 newnode->filename = pstrdup(from->filename);
2319 static CreateDomainStmt *
2320 _copyCreateDomainStmt(CreateDomainStmt *from)
2322 CreateDomainStmt *newnode = makeNode(CreateDomainStmt);
2324 Node_Copy(from, newnode, domainname);
2325 Node_Copy(from, newnode, typename);
2326 Node_Copy(from, newnode, constraints);
2331 static CreateOpClassStmt *
2332 _copyCreateOpClassStmt(CreateOpClassStmt *from)
2334 CreateOpClassStmt *newnode = makeNode(CreateOpClassStmt);
2336 Node_Copy(from, newnode, opclassname);
2338 newnode->amname = pstrdup(from->amname);
2339 Node_Copy(from, newnode, datatype);
2340 Node_Copy(from, newnode, items);
2341 newnode->isDefault = from->isDefault;
2346 static CreateOpClassItem *
2347 _copyCreateOpClassItem(CreateOpClassItem *from)
2349 CreateOpClassItem *newnode = makeNode(CreateOpClassItem);
2351 newnode->itemtype = from->itemtype;
2352 Node_Copy(from, newnode, name);
2353 Node_Copy(from, newnode, args);
2354 newnode->number = from->number;
2355 newnode->recheck = from->recheck;
2356 Node_Copy(from, newnode, storedtype);
2361 static CreatedbStmt *
2362 _copyCreatedbStmt(CreatedbStmt *from)
2364 CreatedbStmt *newnode = makeNode(CreatedbStmt);
2367 newnode->dbname = pstrdup(from->dbname);
2368 Node_Copy(from, newnode, options);
2373 static AlterDatabaseSetStmt *
2374 _copyAlterDatabaseSetStmt(AlterDatabaseSetStmt *from)
2376 AlterDatabaseSetStmt *newnode = makeNode(AlterDatabaseSetStmt);
2379 newnode->dbname = pstrdup(from->dbname);
2381 newnode->variable = pstrdup(from->variable);
2382 Node_Copy(from, newnode, value);
2388 _copyDropdbStmt(DropdbStmt *from)
2390 DropdbStmt *newnode = makeNode(DropdbStmt);
2393 newnode->dbname = pstrdup(from->dbname);
2399 _copyVacuumStmt(VacuumStmt *from)
2401 VacuumStmt *newnode = makeNode(VacuumStmt);
2403 newnode->vacuum = from->vacuum;
2404 newnode->full = from->full;
2405 newnode->analyze = from->analyze;
2406 newnode->freeze = from->freeze;
2407 newnode->verbose = from->verbose;
2408 Node_Copy(from, newnode, relation);
2409 Node_Copy(from, newnode, va_cols);
2414 static ExplainStmt *
2415 _copyExplainStmt(ExplainStmt *from)
2417 ExplainStmt *newnode = makeNode(ExplainStmt);
2419 Node_Copy(from, newnode, query);
2420 newnode->verbose = from->verbose;
2421 newnode->analyze = from->analyze;
2426 static CreateSeqStmt *
2427 _copyCreateSeqStmt(CreateSeqStmt *from)
2429 CreateSeqStmt *newnode = makeNode(CreateSeqStmt);
2431 Node_Copy(from, newnode, sequence);
2432 Node_Copy(from, newnode, options);
2437 static VariableSetStmt *
2438 _copyVariableSetStmt(VariableSetStmt *from)
2440 VariableSetStmt *newnode = makeNode(VariableSetStmt);
2443 newnode->name = pstrdup(from->name);
2444 Node_Copy(from, newnode, args);
2445 newnode->is_local = from->is_local;
2450 static VariableShowStmt *
2451 _copyVariableShowStmt(VariableShowStmt *from)
2453 VariableShowStmt *newnode = makeNode(VariableShowStmt);
2456 newnode->name = pstrdup(from->name);
2461 static VariableResetStmt *
2462 _copyVariableResetStmt(VariableResetStmt *from)
2464 VariableResetStmt *newnode = makeNode(VariableResetStmt);
2467 newnode->name = pstrdup(from->name);
2472 static CreateTrigStmt *
2473 _copyCreateTrigStmt(CreateTrigStmt *from)
2475 CreateTrigStmt *newnode = makeNode(CreateTrigStmt);
2478 newnode->trigname = pstrdup(from->trigname);
2479 Node_Copy(from, newnode, relation);
2480 Node_Copy(from, newnode, funcname);
2481 Node_Copy(from, newnode, args);
2482 newnode->before = from->before;
2483 newnode->row = from->row;
2484 memcpy(newnode->actions, from->actions, sizeof(from->actions));
2486 newnode->lang = pstrdup(from->lang);
2488 newnode->text = pstrdup(from->text);
2490 Node_Copy(from, newnode, attr);
2492 newnode->when = pstrdup(from->when);
2493 newnode->isconstraint = from->isconstraint;
2494 newnode->deferrable = from->deferrable;
2495 newnode->initdeferred = from->initdeferred;
2496 Node_Copy(from, newnode, constrrel);
2501 static DropPropertyStmt *
2502 _copyDropPropertyStmt(DropPropertyStmt *from)
2504 DropPropertyStmt *newnode = makeNode(DropPropertyStmt);
2506 Node_Copy(from, newnode, relation);
2508 newnode->property = pstrdup(from->property);
2509 newnode->removeType = from->removeType;
2510 newnode->behavior = from->behavior;
2515 static CreatePLangStmt *
2516 _copyCreatePLangStmt(CreatePLangStmt *from)
2518 CreatePLangStmt *newnode = makeNode(CreatePLangStmt);
2521 newnode->plname = pstrdup(from->plname);
2522 Node_Copy(from, newnode, plhandler);
2523 Node_Copy(from, newnode, plvalidator);
2524 newnode->pltrusted = from->pltrusted;
2529 static DropPLangStmt *
2530 _copyDropPLangStmt(DropPLangStmt *from)
2532 DropPLangStmt *newnode = makeNode(DropPLangStmt);
2535 newnode->plname = pstrdup(from->plname);
2536 newnode->behavior = from->behavior;
2541 static CreateUserStmt *
2542 _copyCreateUserStmt(CreateUserStmt *from)
2544 CreateUserStmt *newnode = makeNode(CreateUserStmt);
2547 newnode->user = pstrdup(from->user);
2548 Node_Copy(from, newnode, options);
2553 static AlterUserStmt *
2554 _copyAlterUserStmt(AlterUserStmt *from)
2556 AlterUserStmt *newnode = makeNode(AlterUserStmt);
2559 newnode->user = pstrdup(from->user);
2560 Node_Copy(from, newnode, options);
2565 static AlterUserSetStmt *
2566 _copyAlterUserSetStmt(AlterUserSetStmt *from)
2568 AlterUserSetStmt *newnode = makeNode(AlterUserSetStmt);
2571 newnode->user = pstrdup(from->user);
2573 newnode->variable = pstrdup(from->variable);
2574 Node_Copy(from, newnode, value);
2579 static DropUserStmt *
2580 _copyDropUserStmt(DropUserStmt *from)
2582 DropUserStmt *newnode = makeNode(DropUserStmt);
2584 Node_Copy(from, newnode, users);
2590 _copyLockStmt(LockStmt *from)
2592 LockStmt *newnode = makeNode(LockStmt);
2594 Node_Copy(from, newnode, relations);
2596 newnode->mode = from->mode;
2601 static ConstraintsSetStmt *
2602 _copyConstraintsSetStmt(ConstraintsSetStmt *from)
2604 ConstraintsSetStmt *newnode = makeNode(ConstraintsSetStmt);
2606 Node_Copy(from, newnode, constraints);
2607 newnode->deferred = from->deferred;
2612 static CreateGroupStmt *
2613 _copyCreateGroupStmt(CreateGroupStmt *from)
2615 CreateGroupStmt *newnode = makeNode(CreateGroupStmt);
2618 newnode->name = pstrdup(from->name);
2619 Node_Copy(from, newnode, options);
2624 static AlterGroupStmt *
2625 _copyAlterGroupStmt(AlterGroupStmt *from)
2627 AlterGroupStmt *newnode = makeNode(AlterGroupStmt);
2630 newnode->name = pstrdup(from->name);
2631 newnode->action = from->action;
2632 Node_Copy(from, newnode, listUsers);
2637 static DropGroupStmt *
2638 _copyDropGroupStmt(DropGroupStmt *from)
2640 DropGroupStmt *newnode = makeNode(DropGroupStmt);
2643 newnode->name = pstrdup(from->name);
2648 static ReindexStmt *
2649 _copyReindexStmt(ReindexStmt *from)
2651 ReindexStmt *newnode = makeNode(ReindexStmt);
2653 newnode->reindexType = from->reindexType;
2654 Node_Copy(from, newnode, relation);
2656 newnode->name = pstrdup(from->name);
2657 newnode->force = from->force;
2658 newnode->all = from->all;
2663 static CreateSchemaStmt *
2664 _copyCreateSchemaStmt(CreateSchemaStmt *from)
2666 CreateSchemaStmt *newnode = makeNode(CreateSchemaStmt);
2668 newnode->schemaname = pstrdup(from->schemaname);
2670 newnode->authid = pstrdup(from->authid);
2671 Node_Copy(from, newnode, schemaElts);
2676 static CreateConversionStmt *
2677 _copyCreateConversionStmt(CreateConversionStmt *from)
2679 CreateConversionStmt *newnode = makeNode(CreateConversionStmt);
2681 Node_Copy(from, newnode, conversion_name);
2682 newnode->for_encoding_name = pstrdup(from->for_encoding_name);
2683 newnode->to_encoding_name = pstrdup(from->to_encoding_name);
2684 Node_Copy(from, newnode, func_name);
2685 newnode->def = from->def;
2690 static CreateCastStmt *
2691 _copyCreateCastStmt(CreateCastStmt *from)
2693 CreateCastStmt *newnode = makeNode(CreateCastStmt);
2695 Node_Copy(from, newnode, sourcetype);
2696 Node_Copy(from, newnode, targettype);
2697 Node_Copy(from, newnode, func);
2698 newnode->context = from->context;
2703 static DropCastStmt *
2704 _copyDropCastStmt(DropCastStmt *from)
2706 DropCastStmt *newnode = makeNode(DropCastStmt);
2708 Node_Copy(from, newnode, sourcetype);
2709 Node_Copy(from, newnode, targettype);
2710 newnode->behavior = from->behavior;
2715 static PrepareStmt *
2716 _copyPrepareStmt(PrepareStmt *from)
2718 PrepareStmt *newnode = makeNode(PrepareStmt);
2720 newnode->name = pstrdup(from->name);
2721 Node_Copy(from, newnode, argtypes);
2722 newnode->argtype_oids = listCopy(from->argtype_oids);
2723 Node_Copy(from, newnode, query);
2728 static ExecuteStmt *
2729 _copyExecuteStmt(ExecuteStmt *from)
2731 ExecuteStmt *newnode = makeNode(ExecuteStmt);
2733 newnode->name = pstrdup(from->name);
2734 Node_Copy(from, newnode, into);
2735 Node_Copy(from, newnode, params);
2740 static DeallocateStmt *
2741 _copyDeallocateStmt(DeallocateStmt *from)
2743 DeallocateStmt *newnode = makeNode(DeallocateStmt);
2745 newnode->name = pstrdup(from->name);
2751 /* ****************************************************************
2752 * pg_list.h copy functions
2753 * ****************************************************************
2757 _copyValue(Value *from)
2759 Value *newnode = makeNode(Value);
2761 /* See also _copyAConst when changing this code! */
2763 newnode->type = from->type;
2767 newnode->val.ival = from->val.ival;
2772 newnode->val.str = pstrdup(from->val.str);
2778 elog(ERROR, "_copyValue: unknown node type %d", from->type);
2785 * copyObject returns a copy of the node or list. If it is a list, it
2786 * recursively copies its items.
2790 copyObject(void *from)
2797 switch (nodeTag(from))
2803 retval = _copyPlan(from);
2806 retval = _copyResult(from);
2809 retval = _copyAppend(from);
2812 retval = _copyScan(from);
2815 retval = _copySeqScan(from);
2818 retval = _copyIndexScan(from);
2821 retval = _copyTidScan(from);
2823 case T_SubqueryScan:
2824 retval = _copySubqueryScan(from);
2826 case T_FunctionScan:
2827 retval = _copyFunctionScan(from);
2830 retval = _copyJoin(from);
2833 retval = _copyNestLoop(from);
2836 retval = _copyMergeJoin(from);
2839 retval = _copyHashJoin(from);
2842 retval = _copyMaterial(from);
2845 retval = _copySort(from);
2848 retval = _copyGroup(from);
2851 retval = _copyAgg(from);
2854 retval = _copyUnique(from);
2857 retval = _copySetOp(from);
2860 retval = _copyLimit(from);
2863 retval = _copyHash(from);
2866 retval = _copySubPlan(from);
2873 retval = _copyResdom(from);
2876 retval = _copyFjoin(from);
2879 retval = _copyExpr(from);
2882 retval = _copyVar(from);
2885 retval = _copyOper(from);
2888 retval = _copyConst(from);
2891 retval = _copyParam(from);
2894 retval = _copyAggref(from);
2897 retval = _copySubLink(from);
2900 retval = _copyFunc(from);
2903 retval = _copyArrayRef(from);
2906 retval = _copyFieldSelect(from);
2909 retval = _copyRelabelType(from);
2912 retval = _copyRangeTblRef(from);
2915 retval = _copyFromExpr(from);
2918 retval = _copyJoinExpr(from);
2925 retval = _copyRelOptInfo(from);
2928 retval = _copyPath(from);
2931 retval = _copyIndexPath(from);
2934 retval = _copyTidPath(from);
2937 retval = _copyAppendPath(from);
2940 retval = _copyResultPath(from);
2943 retval = _copyNestPath(from);
2946 retval = _copyMergePath(from);
2949 retval = _copyHashPath(from);
2952 retval = _copyPathKeyItem(from);
2954 case T_RestrictInfo:
2955 retval = _copyRestrictInfo(from);
2958 retval = _copyJoinInfo(from);
2960 case T_IndexOptInfo:
2961 retval = _copyIndexOptInfo(from);
2972 retval = _copyValue(from);
2980 /* rather ugly coding for speed... */
2981 /* Note the input list cannot be NIL if we got here. */
2982 nl = makeList1(copyObject(lfirst(list)));
2985 foreach(l, lnext(list))
2987 lnext(nl) = makeList1(copyObject(lfirst(l)));
2997 retval = _copyQuery(from);
3000 retval = _copyInsertStmt(from);
3003 retval = _copyDeleteStmt(from);
3006 retval = _copyUpdateStmt(from);
3009 retval = _copySelectStmt(from);
3011 case T_SetOperationStmt:
3012 retval = _copySetOperationStmt(from);
3014 case T_AlterTableStmt:
3015 retval = _copyAlterTableStmt(from);
3018 retval = _copyGrantStmt(from);
3020 case T_ClosePortalStmt:
3021 retval = _copyClosePortalStmt(from);
3024 retval = _copyClusterStmt(from);
3027 retval = _copyCopyStmt(from);
3030 retval = _copyCreateStmt(from);
3033 retval = _copyDefineStmt(from);
3036 retval = _copyDropStmt(from);
3038 case T_TruncateStmt:
3039 retval = _copyTruncateStmt(from);
3042 retval = _copyCommentStmt(from);
3045 retval = _copyFetchStmt(from);
3048 retval = _copyIndexStmt(from);
3050 case T_CreateFunctionStmt:
3051 retval = _copyCreateFunctionStmt(from);
3053 case T_RemoveAggrStmt:
3054 retval = _copyRemoveAggrStmt(from);
3056 case T_RemoveFuncStmt:
3057 retval = _copyRemoveFuncStmt(from);
3059 case T_RemoveOperStmt:
3060 retval = _copyRemoveOperStmt(from);
3062 case T_RemoveOpClassStmt:
3063 retval = _copyRemoveOpClassStmt(from);
3066 retval = _copyRenameStmt(from);
3069 retval = _copyRuleStmt(from);
3072 retval = _copyNotifyStmt(from);
3075 retval = _copyListenStmt(from);
3077 case T_UnlistenStmt:
3078 retval = _copyUnlistenStmt(from);
3080 case T_TransactionStmt:
3081 retval = _copyTransactionStmt(from);
3083 case T_CompositeTypeStmt:
3084 retval = _copyCompositeTypeStmt(from);
3087 retval = _copyViewStmt(from);
3090 retval = _copyLoadStmt(from);
3092 case T_CreateDomainStmt:
3093 retval = _copyCreateDomainStmt(from);
3095 case T_CreateOpClassStmt:
3096 retval = _copyCreateOpClassStmt(from);
3098 case T_CreateOpClassItem:
3099 retval = _copyCreateOpClassItem(from);
3101 case T_CreatedbStmt:
3102 retval = _copyCreatedbStmt(from);
3104 case T_AlterDatabaseSetStmt:
3105 retval = _copyAlterDatabaseSetStmt(from);
3108 retval = _copyDropdbStmt(from);
3111 retval = _copyVacuumStmt(from);
3114 retval = _copyExplainStmt(from);
3116 case T_CreateSeqStmt:
3117 retval = _copyCreateSeqStmt(from);
3119 case T_VariableSetStmt:
3120 retval = _copyVariableSetStmt(from);
3122 case T_VariableShowStmt:
3123 retval = _copyVariableShowStmt(from);
3125 case T_VariableResetStmt:
3126 retval = _copyVariableResetStmt(from);
3128 case T_CreateTrigStmt:
3129 retval = _copyCreateTrigStmt(from);
3131 case T_DropPropertyStmt:
3132 retval = _copyDropPropertyStmt(from);
3134 case T_CreatePLangStmt:
3135 retval = _copyCreatePLangStmt(from);
3137 case T_DropPLangStmt:
3138 retval = _copyDropPLangStmt(from);
3140 case T_CreateUserStmt:
3141 retval = _copyCreateUserStmt(from);
3143 case T_AlterUserStmt:
3144 retval = _copyAlterUserStmt(from);
3146 case T_AlterUserSetStmt:
3147 retval = _copyAlterUserSetStmt(from);
3149 case T_DropUserStmt:
3150 retval = _copyDropUserStmt(from);
3153 retval = _copyLockStmt(from);
3155 case T_ConstraintsSetStmt:
3156 retval = _copyConstraintsSetStmt(from);
3158 case T_CreateGroupStmt:
3159 retval = _copyCreateGroupStmt(from);
3161 case T_AlterGroupStmt:
3162 retval = _copyAlterGroupStmt(from);
3164 case T_DropGroupStmt:
3165 retval = _copyDropGroupStmt(from);
3168 retval = _copyReindexStmt(from);
3170 case T_CheckPointStmt:
3171 retval = (void *) makeNode(CheckPointStmt);
3173 case T_CreateSchemaStmt:
3174 retval = _copyCreateSchemaStmt(from);
3176 case T_CreateConversionStmt:
3177 retval = _copyCreateConversionStmt(from);
3179 case T_CreateCastStmt:
3180 retval = _copyCreateCastStmt(from);
3182 case T_DropCastStmt:
3183 retval = _copyDropCastStmt(from);
3186 retval = _copyPrepareStmt(from);
3189 retval = _copyExecuteStmt(from);
3191 case T_DeallocateStmt:
3192 retval = _copyDeallocateStmt(from);
3196 retval = _copyAExpr(from);
3199 retval = _copyColumnRef(from);
3202 retval = _copyParamRef(from);
3205 retval = _copyAConst(from);
3208 retval = _copyFuncCall(from);
3211 retval = _copyAIndices(from);
3213 case T_ExprFieldSelect:
3214 retval = _copyExprFieldSelect(from);
3217 retval = _copyResTarget(from);
3220 retval = _copyTypeCast(from);
3223 retval = _copySortGroupBy(from);
3226 retval = _copyAlias(from);
3229 retval = _copyRangeVar(from);
3231 case T_RangeSubselect:
3232 retval = _copyRangeSubselect(from);
3234 case T_RangeFunction:
3235 retval = _copyRangeFunction(from);
3238 retval = _copyTypeName(from);
3241 retval = _copyIndexElem(from);
3244 retval = _copyColumnDef(from);
3247 retval = _copyConstraint(from);
3250 retval = _copyDefElem(from);
3253 retval = _copyTargetEntry(from);
3255 case T_RangeTblEntry:
3256 retval = _copyRangeTblEntry(from);
3259 retval = _copySortClause(from);
3262 retval = _copyGroupClause(from);
3265 retval = _copyCaseExpr(from);
3268 retval = _copyCaseWhen(from);
3271 retval = _copyNullTest(from);
3274 retval = _copyBooleanTest(from);
3276 case T_ConstraintTest:
3277 retval = _copyConstraintTest(from);
3279 case T_ConstraintTestValue:
3280 retval = _copyConstraintTestValue(from);
3282 case T_FkConstraint:
3283 retval = _copyFkConstraint(from);
3286 retval = _copyPrivGrantee(from);
3288 case T_FuncWithArgs:
3289 retval = _copyFuncWithArgs(from);
3291 case T_InsertDefault:
3292 retval = _copyInsertDefault(from);
3294 case T_DomainConstraintValue:
3295 retval = _copyDomainConstraintValue(from);
3299 elog(ERROR, "copyObject: don't know how to copy node type %d",
3301 retval = from; /* keep compiler quiet */