]> granicus.if.org Git - postgresql/blob - src/backend/nodes/copyfuncs.c
90ebd7819a7d1c8c5b3c6f1591aa57451d8460c6
[postgresql] / src / backend / nodes / copyfuncs.c
1 /*-------------------------------------------------------------------------
2  *
3  * copyfuncs.c
4  *        Copy functions for Postgres tree nodes.
5  *
6  * NOTE: we currently support copying all node types found in parse and
7  * plan trees.  We do not support copying executor state trees; there
8  * is no need for that, and no point in maintaining all the code that
9  * would be needed.  We also do not support copying Path trees, mainly
10  * because the circular linkages between RelOptInfo and Path nodes can't
11  * be handled easily in a simple depth-first traversal.
12  *
13  *
14  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
15  * Portions Copyright (c) 1994, Regents of the University of California
16  *
17  * IDENTIFICATION
18  *        $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.399 2008/08/07 19:35:02 tgl Exp $
19  *
20  *-------------------------------------------------------------------------
21  */
22
23 #include "postgres.h"
24
25 #include "nodes/plannodes.h"
26 #include "nodes/relation.h"
27 #include "utils/datum.h"
28
29
30 /*
31  * Macros to simplify copying of different kinds of fields.  Use these
32  * wherever possible to reduce the chance for silly typos.      Note that these
33  * hard-wire the convention that the local variables in a Copy routine are
34  * named 'newnode' and 'from'.
35  */
36
37 /* Copy a simple scalar field (int, float, bool, enum, etc) */
38 #define COPY_SCALAR_FIELD(fldname) \
39         (newnode->fldname = from->fldname)
40
41 /* Copy a field that is a pointer to some kind of Node or Node tree */
42 #define COPY_NODE_FIELD(fldname) \
43         (newnode->fldname = copyObject(from->fldname))
44
45 /* Copy a field that is a pointer to a Bitmapset */
46 #define COPY_BITMAPSET_FIELD(fldname) \
47         (newnode->fldname = bms_copy(from->fldname))
48
49 /* Copy a field that is a pointer to a C string, or perhaps NULL */
50 #define COPY_STRING_FIELD(fldname) \
51         (newnode->fldname = from->fldname ? pstrdup(from->fldname) : (char *) NULL)
52
53 /* Copy a field that is a pointer to a simple palloc'd object of size sz */
54 #define COPY_POINTER_FIELD(fldname, sz) \
55         do { \
56                 Size    _size = (sz); \
57                 newnode->fldname = palloc(_size); \
58                 memcpy(newnode->fldname, from->fldname, _size); \
59         } while (0)
60
61
62 /* ****************************************************************
63  *                                       plannodes.h copy functions
64  * ****************************************************************
65  */
66
67 /*
68  * _copyPlannedStmt
69  */
70 static PlannedStmt *
71 _copyPlannedStmt(PlannedStmt *from)
72 {
73         PlannedStmt *newnode = makeNode(PlannedStmt);
74
75         COPY_SCALAR_FIELD(commandType);
76         COPY_SCALAR_FIELD(canSetTag);
77         COPY_NODE_FIELD(planTree);
78         COPY_NODE_FIELD(rtable);
79         COPY_NODE_FIELD(resultRelations);
80         COPY_NODE_FIELD(utilityStmt);
81         COPY_NODE_FIELD(intoClause);
82         COPY_NODE_FIELD(subplans);
83         COPY_BITMAPSET_FIELD(rewindPlanIDs);
84         COPY_NODE_FIELD(returningLists);
85         COPY_NODE_FIELD(rowMarks);
86         COPY_NODE_FIELD(relationOids);
87         COPY_SCALAR_FIELD(nParamExec);
88
89         return newnode;
90 }
91
92 /*
93  * CopyPlanFields
94  *
95  *              This function copies the fields of the Plan node.  It is used by
96  *              all the copy functions for classes which inherit from Plan.
97  */
98 static void
99 CopyPlanFields(Plan *from, Plan *newnode)
100 {
101         COPY_SCALAR_FIELD(startup_cost);
102         COPY_SCALAR_FIELD(total_cost);
103         COPY_SCALAR_FIELD(plan_rows);
104         COPY_SCALAR_FIELD(plan_width);
105         COPY_NODE_FIELD(targetlist);
106         COPY_NODE_FIELD(qual);
107         COPY_NODE_FIELD(lefttree);
108         COPY_NODE_FIELD(righttree);
109         COPY_NODE_FIELD(initPlan);
110         COPY_BITMAPSET_FIELD(extParam);
111         COPY_BITMAPSET_FIELD(allParam);
112 }
113
114 /*
115  * _copyPlan
116  */
117 static Plan *
118 _copyPlan(Plan *from)
119 {
120         Plan       *newnode = makeNode(Plan);
121
122         /*
123          * copy node superclass fields
124          */
125         CopyPlanFields(from, newnode);
126
127         return newnode;
128 }
129
130
131 /*
132  * _copyResult
133  */
134 static Result *
135 _copyResult(Result *from)
136 {
137         Result     *newnode = makeNode(Result);
138
139         /*
140          * copy node superclass fields
141          */
142         CopyPlanFields((Plan *) from, (Plan *) newnode);
143
144         /*
145          * copy remainder of node
146          */
147         COPY_NODE_FIELD(resconstantqual);
148
149         return newnode;
150 }
151
152 /*
153  * _copyAppend
154  */
155 static Append *
156 _copyAppend(Append *from)
157 {
158         Append     *newnode = makeNode(Append);
159
160         /*
161          * copy node superclass fields
162          */
163         CopyPlanFields((Plan *) from, (Plan *) newnode);
164
165         /*
166          * copy remainder of node
167          */
168         COPY_NODE_FIELD(appendplans);
169         COPY_SCALAR_FIELD(isTarget);
170
171         return newnode;
172 }
173
174 /*
175  * _copyBitmapAnd
176  */
177 static BitmapAnd *
178 _copyBitmapAnd(BitmapAnd *from)
179 {
180         BitmapAnd  *newnode = makeNode(BitmapAnd);
181
182         /*
183          * copy node superclass fields
184          */
185         CopyPlanFields((Plan *) from, (Plan *) newnode);
186
187         /*
188          * copy remainder of node
189          */
190         COPY_NODE_FIELD(bitmapplans);
191
192         return newnode;
193 }
194
195 /*
196  * _copyBitmapOr
197  */
198 static BitmapOr *
199 _copyBitmapOr(BitmapOr *from)
200 {
201         BitmapOr   *newnode = makeNode(BitmapOr);
202
203         /*
204          * copy node superclass fields
205          */
206         CopyPlanFields((Plan *) from, (Plan *) newnode);
207
208         /*
209          * copy remainder of node
210          */
211         COPY_NODE_FIELD(bitmapplans);
212
213         return newnode;
214 }
215
216
217 /*
218  * CopyScanFields
219  *
220  *              This function copies the fields of the Scan node.  It is used by
221  *              all the copy functions for classes which inherit from Scan.
222  */
223 static void
224 CopyScanFields(Scan *from, Scan *newnode)
225 {
226         CopyPlanFields((Plan *) from, (Plan *) newnode);
227
228         COPY_SCALAR_FIELD(scanrelid);
229 }
230
231 /*
232  * _copyScan
233  */
234 static Scan *
235 _copyScan(Scan *from)
236 {
237         Scan       *newnode = makeNode(Scan);
238
239         /*
240          * copy node superclass fields
241          */
242         CopyScanFields((Scan *) from, (Scan *) newnode);
243
244         return newnode;
245 }
246
247 /*
248  * _copySeqScan
249  */
250 static SeqScan *
251 _copySeqScan(SeqScan *from)
252 {
253         SeqScan    *newnode = makeNode(SeqScan);
254
255         /*
256          * copy node superclass fields
257          */
258         CopyScanFields((Scan *) from, (Scan *) newnode);
259
260         return newnode;
261 }
262
263 /*
264  * _copyIndexScan
265  */
266 static IndexScan *
267 _copyIndexScan(IndexScan *from)
268 {
269         IndexScan  *newnode = makeNode(IndexScan);
270
271         /*
272          * copy node superclass fields
273          */
274         CopyScanFields((Scan *) from, (Scan *) newnode);
275
276         /*
277          * copy remainder of node
278          */
279         COPY_SCALAR_FIELD(indexid);
280         COPY_NODE_FIELD(indexqual);
281         COPY_NODE_FIELD(indexqualorig);
282         COPY_SCALAR_FIELD(indexorderdir);
283
284         return newnode;
285 }
286
287 /*
288  * _copyBitmapIndexScan
289  */
290 static BitmapIndexScan *
291 _copyBitmapIndexScan(BitmapIndexScan *from)
292 {
293         BitmapIndexScan *newnode = makeNode(BitmapIndexScan);
294
295         /*
296          * copy node superclass fields
297          */
298         CopyScanFields((Scan *) from, (Scan *) newnode);
299
300         /*
301          * copy remainder of node
302          */
303         COPY_SCALAR_FIELD(indexid);
304         COPY_NODE_FIELD(indexqual);
305         COPY_NODE_FIELD(indexqualorig);
306
307         return newnode;
308 }
309
310 /*
311  * _copyBitmapHeapScan
312  */
313 static BitmapHeapScan *
314 _copyBitmapHeapScan(BitmapHeapScan *from)
315 {
316         BitmapHeapScan *newnode = makeNode(BitmapHeapScan);
317
318         /*
319          * copy node superclass fields
320          */
321         CopyScanFields((Scan *) from, (Scan *) newnode);
322
323         /*
324          * copy remainder of node
325          */
326         COPY_NODE_FIELD(bitmapqualorig);
327
328         return newnode;
329 }
330
331 /*
332  * _copyTidScan
333  */
334 static TidScan *
335 _copyTidScan(TidScan *from)
336 {
337         TidScan    *newnode = makeNode(TidScan);
338
339         /*
340          * copy node superclass fields
341          */
342         CopyScanFields((Scan *) from, (Scan *) newnode);
343
344         /*
345          * copy remainder of node
346          */
347         COPY_NODE_FIELD(tidquals);
348
349         return newnode;
350 }
351
352 /*
353  * _copySubqueryScan
354  */
355 static SubqueryScan *
356 _copySubqueryScan(SubqueryScan *from)
357 {
358         SubqueryScan *newnode = makeNode(SubqueryScan);
359
360         /*
361          * copy node superclass fields
362          */
363         CopyScanFields((Scan *) from, (Scan *) newnode);
364
365         /*
366          * copy remainder of node
367          */
368         COPY_NODE_FIELD(subplan);
369         COPY_NODE_FIELD(subrtable);
370
371         return newnode;
372 }
373
374 /*
375  * _copyFunctionScan
376  */
377 static FunctionScan *
378 _copyFunctionScan(FunctionScan *from)
379 {
380         FunctionScan *newnode = makeNode(FunctionScan);
381
382         /*
383          * copy node superclass fields
384          */
385         CopyScanFields((Scan *) from, (Scan *) newnode);
386
387         /*
388          * copy remainder of node
389          */
390         COPY_NODE_FIELD(funcexpr);
391         COPY_NODE_FIELD(funccolnames);
392         COPY_NODE_FIELD(funccoltypes);
393         COPY_NODE_FIELD(funccoltypmods);
394
395         return newnode;
396 }
397
398 /*
399  * _copyValuesScan
400  */
401 static ValuesScan *
402 _copyValuesScan(ValuesScan *from)
403 {
404         ValuesScan *newnode = makeNode(ValuesScan);
405
406         /*
407          * copy node superclass fields
408          */
409         CopyScanFields((Scan *) from, (Scan *) newnode);
410
411         /*
412          * copy remainder of node
413          */
414         COPY_NODE_FIELD(values_lists);
415
416         return newnode;
417 }
418
419 /*
420  * CopyJoinFields
421  *
422  *              This function copies the fields of the Join node.  It is used by
423  *              all the copy functions for classes which inherit from Join.
424  */
425 static void
426 CopyJoinFields(Join *from, Join *newnode)
427 {
428         CopyPlanFields((Plan *) from, (Plan *) newnode);
429
430         COPY_SCALAR_FIELD(jointype);
431         COPY_NODE_FIELD(joinqual);
432 }
433
434
435 /*
436  * _copyJoin
437  */
438 static Join *
439 _copyJoin(Join *from)
440 {
441         Join       *newnode = makeNode(Join);
442
443         /*
444          * copy node superclass fields
445          */
446         CopyJoinFields(from, newnode);
447
448         return newnode;
449 }
450
451
452 /*
453  * _copyNestLoop
454  */
455 static NestLoop *
456 _copyNestLoop(NestLoop *from)
457 {
458         NestLoop   *newnode = makeNode(NestLoop);
459
460         /*
461          * copy node superclass fields
462          */
463         CopyJoinFields((Join *) from, (Join *) newnode);
464
465         return newnode;
466 }
467
468
469 /*
470  * _copyMergeJoin
471  */
472 static MergeJoin *
473 _copyMergeJoin(MergeJoin *from)
474 {
475         MergeJoin  *newnode = makeNode(MergeJoin);
476         int                     numCols;
477
478         /*
479          * copy node superclass fields
480          */
481         CopyJoinFields((Join *) from, (Join *) newnode);
482
483         /*
484          * copy remainder of node
485          */
486         COPY_NODE_FIELD(mergeclauses);
487         numCols = list_length(from->mergeclauses);
488         COPY_POINTER_FIELD(mergeFamilies, numCols * sizeof(Oid));
489         COPY_POINTER_FIELD(mergeStrategies, numCols * sizeof(int));
490         COPY_POINTER_FIELD(mergeNullsFirst, numCols * sizeof(bool));
491
492         return newnode;
493 }
494
495 /*
496  * _copyHashJoin
497  */
498 static HashJoin *
499 _copyHashJoin(HashJoin *from)
500 {
501         HashJoin   *newnode = makeNode(HashJoin);
502
503         /*
504          * copy node superclass fields
505          */
506         CopyJoinFields((Join *) from, (Join *) newnode);
507
508         /*
509          * copy remainder of node
510          */
511         COPY_NODE_FIELD(hashclauses);
512
513         return newnode;
514 }
515
516
517 /*
518  * _copyMaterial
519  */
520 static Material *
521 _copyMaterial(Material *from)
522 {
523         Material   *newnode = makeNode(Material);
524
525         /*
526          * copy node superclass fields
527          */
528         CopyPlanFields((Plan *) from, (Plan *) newnode);
529
530         return newnode;
531 }
532
533
534 /*
535  * _copySort
536  */
537 static Sort *
538 _copySort(Sort *from)
539 {
540         Sort       *newnode = makeNode(Sort);
541
542         /*
543          * copy node superclass fields
544          */
545         CopyPlanFields((Plan *) from, (Plan *) newnode);
546
547         COPY_SCALAR_FIELD(numCols);
548         COPY_POINTER_FIELD(sortColIdx, from->numCols * sizeof(AttrNumber));
549         COPY_POINTER_FIELD(sortOperators, from->numCols * sizeof(Oid));
550         COPY_POINTER_FIELD(nullsFirst, from->numCols * sizeof(bool));
551
552         return newnode;
553 }
554
555
556 /*
557  * _copyGroup
558  */
559 static Group *
560 _copyGroup(Group *from)
561 {
562         Group      *newnode = makeNode(Group);
563
564         CopyPlanFields((Plan *) from, (Plan *) newnode);
565
566         COPY_SCALAR_FIELD(numCols);
567         COPY_POINTER_FIELD(grpColIdx, from->numCols * sizeof(AttrNumber));
568         COPY_POINTER_FIELD(grpOperators, from->numCols * sizeof(Oid));
569
570         return newnode;
571 }
572
573 /*
574  * _copyAgg
575  */
576 static Agg *
577 _copyAgg(Agg *from)
578 {
579         Agg                *newnode = makeNode(Agg);
580
581         CopyPlanFields((Plan *) from, (Plan *) newnode);
582
583         COPY_SCALAR_FIELD(aggstrategy);
584         COPY_SCALAR_FIELD(numCols);
585         if (from->numCols > 0)
586         {
587                 COPY_POINTER_FIELD(grpColIdx, from->numCols * sizeof(AttrNumber));
588                 COPY_POINTER_FIELD(grpOperators, from->numCols * sizeof(Oid));
589         }
590         COPY_SCALAR_FIELD(numGroups);
591
592         return newnode;
593 }
594
595 /*
596  * _copyUnique
597  */
598 static Unique *
599 _copyUnique(Unique *from)
600 {
601         Unique     *newnode = makeNode(Unique);
602
603         /*
604          * copy node superclass fields
605          */
606         CopyPlanFields((Plan *) from, (Plan *) newnode);
607
608         /*
609          * copy remainder of node
610          */
611         COPY_SCALAR_FIELD(numCols);
612         COPY_POINTER_FIELD(uniqColIdx, from->numCols * sizeof(AttrNumber));
613         COPY_POINTER_FIELD(uniqOperators, from->numCols * sizeof(Oid));
614
615         return newnode;
616 }
617
618 /*
619  * _copyHash
620  */
621 static Hash *
622 _copyHash(Hash *from)
623 {
624         Hash       *newnode = makeNode(Hash);
625
626         /*
627          * copy node superclass fields
628          */
629         CopyPlanFields((Plan *) from, (Plan *) newnode);
630
631         /*
632          * copy remainder of node
633          */
634
635         return newnode;
636 }
637
638 /*
639  * _copySetOp
640  */
641 static SetOp *
642 _copySetOp(SetOp *from)
643 {
644         SetOp      *newnode = makeNode(SetOp);
645
646         /*
647          * copy node superclass fields
648          */
649         CopyPlanFields((Plan *) from, (Plan *) newnode);
650
651         /*
652          * copy remainder of node
653          */
654         COPY_SCALAR_FIELD(cmd);
655         COPY_SCALAR_FIELD(strategy);
656         COPY_SCALAR_FIELD(numCols);
657         COPY_POINTER_FIELD(dupColIdx, from->numCols * sizeof(AttrNumber));
658         COPY_POINTER_FIELD(dupOperators, from->numCols * sizeof(Oid));
659         COPY_SCALAR_FIELD(flagColIdx);
660         COPY_SCALAR_FIELD(firstFlag);
661         COPY_SCALAR_FIELD(numGroups);
662
663         return newnode;
664 }
665
666 /*
667  * _copyLimit
668  */
669 static Limit *
670 _copyLimit(Limit *from)
671 {
672         Limit      *newnode = makeNode(Limit);
673
674         /*
675          * copy node superclass fields
676          */
677         CopyPlanFields((Plan *) from, (Plan *) newnode);
678
679         /*
680          * copy remainder of node
681          */
682         COPY_NODE_FIELD(limitOffset);
683         COPY_NODE_FIELD(limitCount);
684
685         return newnode;
686 }
687
688 /* ****************************************************************
689  *                                         primnodes.h copy functions
690  * ****************************************************************
691  */
692
693 /*
694  * _copyAlias
695  */
696 static Alias *
697 _copyAlias(Alias *from)
698 {
699         Alias      *newnode = makeNode(Alias);
700
701         COPY_STRING_FIELD(aliasname);
702         COPY_NODE_FIELD(colnames);
703
704         return newnode;
705 }
706
707 /*
708  * _copyRangeVar
709  */
710 static RangeVar *
711 _copyRangeVar(RangeVar *from)
712 {
713         RangeVar   *newnode = makeNode(RangeVar);
714
715         COPY_STRING_FIELD(catalogname);
716         COPY_STRING_FIELD(schemaname);
717         COPY_STRING_FIELD(relname);
718         COPY_SCALAR_FIELD(inhOpt);
719         COPY_SCALAR_FIELD(istemp);
720         COPY_NODE_FIELD(alias);
721
722         return newnode;
723 }
724
725 /*
726  * _copyIntoClause
727  */
728 static IntoClause *
729 _copyIntoClause(IntoClause *from)
730 {
731         IntoClause *newnode = makeNode(IntoClause);
732
733         COPY_NODE_FIELD(rel);
734         COPY_NODE_FIELD(colNames);
735         COPY_NODE_FIELD(options);
736         COPY_SCALAR_FIELD(onCommit);
737         COPY_STRING_FIELD(tableSpaceName);
738
739         return newnode;
740 }
741
742 /*
743  * We don't need a _copyExpr because Expr is an abstract supertype which
744  * should never actually get instantiated.      Also, since it has no common
745  * fields except NodeTag, there's no need for a helper routine to factor
746  * out copying the common fields...
747  */
748
749 /*
750  * _copyVar
751  */
752 static Var *
753 _copyVar(Var *from)
754 {
755         Var                *newnode = makeNode(Var);
756
757         COPY_SCALAR_FIELD(varno);
758         COPY_SCALAR_FIELD(varattno);
759         COPY_SCALAR_FIELD(vartype);
760         COPY_SCALAR_FIELD(vartypmod);
761         COPY_SCALAR_FIELD(varlevelsup);
762         COPY_SCALAR_FIELD(varnoold);
763         COPY_SCALAR_FIELD(varoattno);
764
765         return newnode;
766 }
767
768 /*
769  * _copyConst
770  */
771 static Const *
772 _copyConst(Const *from)
773 {
774         Const      *newnode = makeNode(Const);
775
776         COPY_SCALAR_FIELD(consttype);
777         COPY_SCALAR_FIELD(consttypmod);
778         COPY_SCALAR_FIELD(constlen);
779
780         if (from->constbyval || from->constisnull)
781         {
782                 /*
783                  * passed by value so just copy the datum. Also, don't try to copy
784                  * struct when value is null!
785                  */
786                 newnode->constvalue = from->constvalue;
787         }
788         else
789         {
790                 /*
791                  * passed by reference.  We need a palloc'd copy.
792                  */
793                 newnode->constvalue = datumCopy(from->constvalue,
794                                                                                 from->constbyval,
795                                                                                 from->constlen);
796         }
797
798         COPY_SCALAR_FIELD(constisnull);
799         COPY_SCALAR_FIELD(constbyval);
800
801         return newnode;
802 }
803
804 /*
805  * _copyParam
806  */
807 static Param *
808 _copyParam(Param *from)
809 {
810         Param      *newnode = makeNode(Param);
811
812         COPY_SCALAR_FIELD(paramkind);
813         COPY_SCALAR_FIELD(paramid);
814         COPY_SCALAR_FIELD(paramtype);
815         COPY_SCALAR_FIELD(paramtypmod);
816
817         return newnode;
818 }
819
820 /*
821  * _copyAggref
822  */
823 static Aggref *
824 _copyAggref(Aggref *from)
825 {
826         Aggref     *newnode = makeNode(Aggref);
827
828         COPY_SCALAR_FIELD(aggfnoid);
829         COPY_SCALAR_FIELD(aggtype);
830         COPY_NODE_FIELD(args);
831         COPY_SCALAR_FIELD(agglevelsup);
832         COPY_SCALAR_FIELD(aggstar);
833         COPY_SCALAR_FIELD(aggdistinct);
834
835         return newnode;
836 }
837
838 /*
839  * _copyArrayRef
840  */
841 static ArrayRef *
842 _copyArrayRef(ArrayRef *from)
843 {
844         ArrayRef   *newnode = makeNode(ArrayRef);
845
846         COPY_SCALAR_FIELD(refarraytype);
847         COPY_SCALAR_FIELD(refelemtype);
848         COPY_SCALAR_FIELD(reftypmod);
849         COPY_NODE_FIELD(refupperindexpr);
850         COPY_NODE_FIELD(reflowerindexpr);
851         COPY_NODE_FIELD(refexpr);
852         COPY_NODE_FIELD(refassgnexpr);
853
854         return newnode;
855 }
856
857 /*
858  * _copyFuncExpr
859  */
860 static FuncExpr *
861 _copyFuncExpr(FuncExpr *from)
862 {
863         FuncExpr   *newnode = makeNode(FuncExpr);
864
865         COPY_SCALAR_FIELD(funcid);
866         COPY_SCALAR_FIELD(funcresulttype);
867         COPY_SCALAR_FIELD(funcretset);
868         COPY_SCALAR_FIELD(funcformat);
869         COPY_NODE_FIELD(args);
870
871         return newnode;
872 }
873
874 /*
875  * _copyOpExpr
876  */
877 static OpExpr *
878 _copyOpExpr(OpExpr *from)
879 {
880         OpExpr     *newnode = makeNode(OpExpr);
881
882         COPY_SCALAR_FIELD(opno);
883         COPY_SCALAR_FIELD(opfuncid);
884         COPY_SCALAR_FIELD(opresulttype);
885         COPY_SCALAR_FIELD(opretset);
886         COPY_NODE_FIELD(args);
887
888         return newnode;
889 }
890
891 /*
892  * _copyDistinctExpr (same as OpExpr)
893  */
894 static DistinctExpr *
895 _copyDistinctExpr(DistinctExpr *from)
896 {
897         DistinctExpr *newnode = makeNode(DistinctExpr);
898
899         COPY_SCALAR_FIELD(opno);
900         COPY_SCALAR_FIELD(opfuncid);
901         COPY_SCALAR_FIELD(opresulttype);
902         COPY_SCALAR_FIELD(opretset);
903         COPY_NODE_FIELD(args);
904
905         return newnode;
906 }
907
908 /*
909  * _copyScalarArrayOpExpr
910  */
911 static ScalarArrayOpExpr *
912 _copyScalarArrayOpExpr(ScalarArrayOpExpr *from)
913 {
914         ScalarArrayOpExpr *newnode = makeNode(ScalarArrayOpExpr);
915
916         COPY_SCALAR_FIELD(opno);
917         COPY_SCALAR_FIELD(opfuncid);
918         COPY_SCALAR_FIELD(useOr);
919         COPY_NODE_FIELD(args);
920
921         return newnode;
922 }
923
924 /*
925  * _copyBoolExpr
926  */
927 static BoolExpr *
928 _copyBoolExpr(BoolExpr *from)
929 {
930         BoolExpr   *newnode = makeNode(BoolExpr);
931
932         COPY_SCALAR_FIELD(boolop);
933         COPY_NODE_FIELD(args);
934
935         return newnode;
936 }
937
938 /*
939  * _copySubLink
940  */
941 static SubLink *
942 _copySubLink(SubLink *from)
943 {
944         SubLink    *newnode = makeNode(SubLink);
945
946         COPY_SCALAR_FIELD(subLinkType);
947         COPY_NODE_FIELD(testexpr);
948         COPY_NODE_FIELD(operName);
949         COPY_NODE_FIELD(subselect);
950
951         return newnode;
952 }
953
954 /*
955  * _copySubPlan
956  */
957 static SubPlan *
958 _copySubPlan(SubPlan *from)
959 {
960         SubPlan    *newnode = makeNode(SubPlan);
961
962         COPY_SCALAR_FIELD(subLinkType);
963         COPY_NODE_FIELD(testexpr);
964         COPY_NODE_FIELD(paramIds);
965         COPY_SCALAR_FIELD(plan_id);
966         COPY_SCALAR_FIELD(firstColType);
967         COPY_SCALAR_FIELD(useHashTable);
968         COPY_SCALAR_FIELD(unknownEqFalse);
969         COPY_NODE_FIELD(setParam);
970         COPY_NODE_FIELD(parParam);
971         COPY_NODE_FIELD(args);
972
973         return newnode;
974 }
975
976 /*
977  * _copyFieldSelect
978  */
979 static FieldSelect *
980 _copyFieldSelect(FieldSelect *from)
981 {
982         FieldSelect *newnode = makeNode(FieldSelect);
983
984         COPY_NODE_FIELD(arg);
985         COPY_SCALAR_FIELD(fieldnum);
986         COPY_SCALAR_FIELD(resulttype);
987         COPY_SCALAR_FIELD(resulttypmod);
988
989         return newnode;
990 }
991
992 /*
993  * _copyFieldStore
994  */
995 static FieldStore *
996 _copyFieldStore(FieldStore *from)
997 {
998         FieldStore *newnode = makeNode(FieldStore);
999
1000         COPY_NODE_FIELD(arg);
1001         COPY_NODE_FIELD(newvals);
1002         COPY_NODE_FIELD(fieldnums);
1003         COPY_SCALAR_FIELD(resulttype);
1004
1005         return newnode;
1006 }
1007
1008 /*
1009  * _copyRelabelType
1010  */
1011 static RelabelType *
1012 _copyRelabelType(RelabelType *from)
1013 {
1014         RelabelType *newnode = makeNode(RelabelType);
1015
1016         COPY_NODE_FIELD(arg);
1017         COPY_SCALAR_FIELD(resulttype);
1018         COPY_SCALAR_FIELD(resulttypmod);
1019         COPY_SCALAR_FIELD(relabelformat);
1020
1021         return newnode;
1022 }
1023
1024 /*
1025  * _copyCoerceViaIO
1026  */
1027 static CoerceViaIO *
1028 _copyCoerceViaIO(CoerceViaIO *from)
1029 {
1030         CoerceViaIO *newnode = makeNode(CoerceViaIO);
1031
1032         COPY_NODE_FIELD(arg);
1033         COPY_SCALAR_FIELD(resulttype);
1034         COPY_SCALAR_FIELD(coerceformat);
1035
1036         return newnode;
1037 }
1038
1039 /*
1040  * _copyArrayCoerceExpr
1041  */
1042 static ArrayCoerceExpr *
1043 _copyArrayCoerceExpr(ArrayCoerceExpr *from)
1044 {
1045         ArrayCoerceExpr *newnode = makeNode(ArrayCoerceExpr);
1046
1047         COPY_NODE_FIELD(arg);
1048         COPY_SCALAR_FIELD(elemfuncid);
1049         COPY_SCALAR_FIELD(resulttype);
1050         COPY_SCALAR_FIELD(resulttypmod);
1051         COPY_SCALAR_FIELD(isExplicit);
1052         COPY_SCALAR_FIELD(coerceformat);
1053
1054         return newnode;
1055 }
1056
1057 /*
1058  * _copyConvertRowtypeExpr
1059  */
1060 static ConvertRowtypeExpr *
1061 _copyConvertRowtypeExpr(ConvertRowtypeExpr *from)
1062 {
1063         ConvertRowtypeExpr *newnode = makeNode(ConvertRowtypeExpr);
1064
1065         COPY_NODE_FIELD(arg);
1066         COPY_SCALAR_FIELD(resulttype);
1067         COPY_SCALAR_FIELD(convertformat);
1068
1069         return newnode;
1070 }
1071
1072 /*
1073  * _copyCaseExpr
1074  */
1075 static CaseExpr *
1076 _copyCaseExpr(CaseExpr *from)
1077 {
1078         CaseExpr   *newnode = makeNode(CaseExpr);
1079
1080         COPY_SCALAR_FIELD(casetype);
1081         COPY_NODE_FIELD(arg);
1082         COPY_NODE_FIELD(args);
1083         COPY_NODE_FIELD(defresult);
1084
1085         return newnode;
1086 }
1087
1088 /*
1089  * _copyCaseWhen
1090  */
1091 static CaseWhen *
1092 _copyCaseWhen(CaseWhen *from)
1093 {
1094         CaseWhen   *newnode = makeNode(CaseWhen);
1095
1096         COPY_NODE_FIELD(expr);
1097         COPY_NODE_FIELD(result);
1098
1099         return newnode;
1100 }
1101
1102 /*
1103  * _copyCaseTestExpr
1104  */
1105 static CaseTestExpr *
1106 _copyCaseTestExpr(CaseTestExpr *from)
1107 {
1108         CaseTestExpr *newnode = makeNode(CaseTestExpr);
1109
1110         COPY_SCALAR_FIELD(typeId);
1111         COPY_SCALAR_FIELD(typeMod);
1112
1113         return newnode;
1114 }
1115
1116 /*
1117  * _copyArrayExpr
1118  */
1119 static ArrayExpr *
1120 _copyArrayExpr(ArrayExpr *from)
1121 {
1122         ArrayExpr  *newnode = makeNode(ArrayExpr);
1123
1124         COPY_SCALAR_FIELD(array_typeid);
1125         COPY_SCALAR_FIELD(element_typeid);
1126         COPY_NODE_FIELD(elements);
1127         COPY_SCALAR_FIELD(multidims);
1128
1129         return newnode;
1130 }
1131
1132 /*
1133  * _copyRowExpr
1134  */
1135 static RowExpr *
1136 _copyRowExpr(RowExpr *from)
1137 {
1138         RowExpr    *newnode = makeNode(RowExpr);
1139
1140         COPY_NODE_FIELD(args);
1141         COPY_SCALAR_FIELD(row_typeid);
1142         COPY_SCALAR_FIELD(row_format);
1143
1144         return newnode;
1145 }
1146
1147 /*
1148  * _copyRowCompareExpr
1149  */
1150 static RowCompareExpr *
1151 _copyRowCompareExpr(RowCompareExpr *from)
1152 {
1153         RowCompareExpr *newnode = makeNode(RowCompareExpr);
1154
1155         COPY_SCALAR_FIELD(rctype);
1156         COPY_NODE_FIELD(opnos);
1157         COPY_NODE_FIELD(opfamilies);
1158         COPY_NODE_FIELD(largs);
1159         COPY_NODE_FIELD(rargs);
1160
1161         return newnode;
1162 }
1163
1164 /*
1165  * _copyCoalesceExpr
1166  */
1167 static CoalesceExpr *
1168 _copyCoalesceExpr(CoalesceExpr *from)
1169 {
1170         CoalesceExpr *newnode = makeNode(CoalesceExpr);
1171
1172         COPY_SCALAR_FIELD(coalescetype);
1173         COPY_NODE_FIELD(args);
1174
1175         return newnode;
1176 }
1177
1178 /*
1179  * _copyMinMaxExpr
1180  */
1181 static MinMaxExpr *
1182 _copyMinMaxExpr(MinMaxExpr *from)
1183 {
1184         MinMaxExpr *newnode = makeNode(MinMaxExpr);
1185
1186         COPY_SCALAR_FIELD(minmaxtype);
1187         COPY_SCALAR_FIELD(op);
1188         COPY_NODE_FIELD(args);
1189
1190         return newnode;
1191 }
1192
1193 /*
1194  * _copyXmlExpr
1195  */
1196 static XmlExpr *
1197 _copyXmlExpr(XmlExpr *from)
1198 {
1199         XmlExpr    *newnode = makeNode(XmlExpr);
1200
1201         COPY_SCALAR_FIELD(op);
1202         COPY_STRING_FIELD(name);
1203         COPY_NODE_FIELD(named_args);
1204         COPY_NODE_FIELD(arg_names);
1205         COPY_NODE_FIELD(args);
1206         COPY_SCALAR_FIELD(xmloption);
1207         COPY_SCALAR_FIELD(type);
1208         COPY_SCALAR_FIELD(typmod);
1209
1210         return newnode;
1211 }
1212
1213 /*
1214  * _copyNullIfExpr (same as OpExpr)
1215  */
1216 static NullIfExpr *
1217 _copyNullIfExpr(NullIfExpr *from)
1218 {
1219         NullIfExpr *newnode = makeNode(NullIfExpr);
1220
1221         COPY_SCALAR_FIELD(opno);
1222         COPY_SCALAR_FIELD(opfuncid);
1223         COPY_SCALAR_FIELD(opresulttype);
1224         COPY_SCALAR_FIELD(opretset);
1225         COPY_NODE_FIELD(args);
1226
1227         return newnode;
1228 }
1229
1230 /*
1231  * _copyNullTest
1232  */
1233 static NullTest *
1234 _copyNullTest(NullTest *from)
1235 {
1236         NullTest   *newnode = makeNode(NullTest);
1237
1238         COPY_NODE_FIELD(arg);
1239         COPY_SCALAR_FIELD(nulltesttype);
1240
1241         return newnode;
1242 }
1243
1244 /*
1245  * _copyBooleanTest
1246  */
1247 static BooleanTest *
1248 _copyBooleanTest(BooleanTest *from)
1249 {
1250         BooleanTest *newnode = makeNode(BooleanTest);
1251
1252         COPY_NODE_FIELD(arg);
1253         COPY_SCALAR_FIELD(booltesttype);
1254
1255         return newnode;
1256 }
1257
1258 /*
1259  * _copyCoerceToDomain
1260  */
1261 static CoerceToDomain *
1262 _copyCoerceToDomain(CoerceToDomain *from)
1263 {
1264         CoerceToDomain *newnode = makeNode(CoerceToDomain);
1265
1266         COPY_NODE_FIELD(arg);
1267         COPY_SCALAR_FIELD(resulttype);
1268         COPY_SCALAR_FIELD(resulttypmod);
1269         COPY_SCALAR_FIELD(coercionformat);
1270
1271         return newnode;
1272 }
1273
1274 /*
1275  * _copyCoerceToDomainValue
1276  */
1277 static CoerceToDomainValue *
1278 _copyCoerceToDomainValue(CoerceToDomainValue *from)
1279 {
1280         CoerceToDomainValue *newnode = makeNode(CoerceToDomainValue);
1281
1282         COPY_SCALAR_FIELD(typeId);
1283         COPY_SCALAR_FIELD(typeMod);
1284
1285         return newnode;
1286 }
1287
1288 /*
1289  * _copySetToDefault
1290  */
1291 static SetToDefault *
1292 _copySetToDefault(SetToDefault *from)
1293 {
1294         SetToDefault *newnode = makeNode(SetToDefault);
1295
1296         COPY_SCALAR_FIELD(typeId);
1297         COPY_SCALAR_FIELD(typeMod);
1298
1299         return newnode;
1300 }
1301
1302 /*
1303  * _copyCurrentOfExpr
1304  */
1305 static CurrentOfExpr *
1306 _copyCurrentOfExpr(CurrentOfExpr *from)
1307 {
1308         CurrentOfExpr *newnode = makeNode(CurrentOfExpr);
1309
1310         COPY_SCALAR_FIELD(cvarno);
1311         COPY_STRING_FIELD(cursor_name);
1312         COPY_SCALAR_FIELD(cursor_param);
1313
1314         return newnode;
1315 }
1316
1317 /*
1318  * _copyTargetEntry
1319  */
1320 static TargetEntry *
1321 _copyTargetEntry(TargetEntry *from)
1322 {
1323         TargetEntry *newnode = makeNode(TargetEntry);
1324
1325         COPY_NODE_FIELD(expr);
1326         COPY_SCALAR_FIELD(resno);
1327         COPY_STRING_FIELD(resname);
1328         COPY_SCALAR_FIELD(ressortgroupref);
1329         COPY_SCALAR_FIELD(resorigtbl);
1330         COPY_SCALAR_FIELD(resorigcol);
1331         COPY_SCALAR_FIELD(resjunk);
1332
1333         return newnode;
1334 }
1335
1336 /*
1337  * _copyRangeTblRef
1338  */
1339 static RangeTblRef *
1340 _copyRangeTblRef(RangeTblRef *from)
1341 {
1342         RangeTblRef *newnode = makeNode(RangeTblRef);
1343
1344         COPY_SCALAR_FIELD(rtindex);
1345
1346         return newnode;
1347 }
1348
1349 /*
1350  * _copyJoinExpr
1351  */
1352 static JoinExpr *
1353 _copyJoinExpr(JoinExpr *from)
1354 {
1355         JoinExpr   *newnode = makeNode(JoinExpr);
1356
1357         COPY_SCALAR_FIELD(jointype);
1358         COPY_SCALAR_FIELD(isNatural);
1359         COPY_NODE_FIELD(larg);
1360         COPY_NODE_FIELD(rarg);
1361         COPY_NODE_FIELD(using);
1362         COPY_NODE_FIELD(quals);
1363         COPY_NODE_FIELD(alias);
1364         COPY_SCALAR_FIELD(rtindex);
1365
1366         return newnode;
1367 }
1368
1369 /*
1370  * _copyFromExpr
1371  */
1372 static FromExpr *
1373 _copyFromExpr(FromExpr *from)
1374 {
1375         FromExpr   *newnode = makeNode(FromExpr);
1376
1377         COPY_NODE_FIELD(fromlist);
1378         COPY_NODE_FIELD(quals);
1379
1380         return newnode;
1381 }
1382
1383 /* ****************************************************************
1384  *                                              relation.h copy functions
1385  *
1386  * We don't support copying RelOptInfo, IndexOptInfo, or Path nodes.
1387  * There are some subsidiary structs that are useful to copy, though.
1388  * ****************************************************************
1389  */
1390
1391 /*
1392  * _copyPathKey
1393  */
1394 static PathKey *
1395 _copyPathKey(PathKey *from)
1396 {
1397         PathKey    *newnode = makeNode(PathKey);
1398
1399         /* EquivalenceClasses are never moved, so just shallow-copy the pointer */
1400         COPY_SCALAR_FIELD(pk_eclass);
1401         COPY_SCALAR_FIELD(pk_opfamily);
1402         COPY_SCALAR_FIELD(pk_strategy);
1403         COPY_SCALAR_FIELD(pk_nulls_first);
1404
1405         return newnode;
1406 }
1407
1408 /*
1409  * _copyRestrictInfo
1410  */
1411 static RestrictInfo *
1412 _copyRestrictInfo(RestrictInfo *from)
1413 {
1414         RestrictInfo *newnode = makeNode(RestrictInfo);
1415
1416         COPY_NODE_FIELD(clause);
1417         COPY_SCALAR_FIELD(is_pushed_down);
1418         COPY_SCALAR_FIELD(outerjoin_delayed);
1419         COPY_SCALAR_FIELD(can_join);
1420         COPY_SCALAR_FIELD(pseudoconstant);
1421         COPY_BITMAPSET_FIELD(clause_relids);
1422         COPY_BITMAPSET_FIELD(required_relids);
1423         COPY_BITMAPSET_FIELD(left_relids);
1424         COPY_BITMAPSET_FIELD(right_relids);
1425         COPY_NODE_FIELD(orclause);
1426         /* EquivalenceClasses are never copied, so shallow-copy the pointers */
1427         COPY_SCALAR_FIELD(parent_ec);
1428         COPY_SCALAR_FIELD(eval_cost);
1429         COPY_SCALAR_FIELD(this_selec);
1430         COPY_NODE_FIELD(mergeopfamilies);
1431         /* EquivalenceClasses are never copied, so shallow-copy the pointers */
1432         COPY_SCALAR_FIELD(left_ec);
1433         COPY_SCALAR_FIELD(right_ec);
1434         COPY_SCALAR_FIELD(left_em);
1435         COPY_SCALAR_FIELD(right_em);
1436         /* MergeScanSelCache isn't a Node, so hard to copy; just reset cache */
1437         newnode->scansel_cache = NIL;
1438         COPY_SCALAR_FIELD(outer_is_left);
1439         COPY_SCALAR_FIELD(hashjoinoperator);
1440         COPY_SCALAR_FIELD(left_bucketsize);
1441         COPY_SCALAR_FIELD(right_bucketsize);
1442
1443         return newnode;
1444 }
1445
1446 /*
1447  * _copyOuterJoinInfo
1448  */
1449 static OuterJoinInfo *
1450 _copyOuterJoinInfo(OuterJoinInfo *from)
1451 {
1452         OuterJoinInfo *newnode = makeNode(OuterJoinInfo);
1453
1454         COPY_BITMAPSET_FIELD(min_lefthand);
1455         COPY_BITMAPSET_FIELD(min_righthand);
1456         COPY_BITMAPSET_FIELD(syn_lefthand);
1457         COPY_BITMAPSET_FIELD(syn_righthand);
1458         COPY_SCALAR_FIELD(is_full_join);
1459         COPY_SCALAR_FIELD(lhs_strict);
1460         COPY_SCALAR_FIELD(delay_upper_joins);
1461
1462         return newnode;
1463 }
1464
1465 /*
1466  * _copyInClauseInfo
1467  */
1468 static InClauseInfo *
1469 _copyInClauseInfo(InClauseInfo *from)
1470 {
1471         InClauseInfo *newnode = makeNode(InClauseInfo);
1472
1473         COPY_BITMAPSET_FIELD(lefthand);
1474         COPY_BITMAPSET_FIELD(righthand);
1475         COPY_NODE_FIELD(sub_targetlist);
1476         COPY_NODE_FIELD(in_operators);
1477
1478         return newnode;
1479 }
1480
1481 /*
1482  * _copyAppendRelInfo
1483  */
1484 static AppendRelInfo *
1485 _copyAppendRelInfo(AppendRelInfo *from)
1486 {
1487         AppendRelInfo *newnode = makeNode(AppendRelInfo);
1488
1489         COPY_SCALAR_FIELD(parent_relid);
1490         COPY_SCALAR_FIELD(child_relid);
1491         COPY_SCALAR_FIELD(parent_reltype);
1492         COPY_SCALAR_FIELD(child_reltype);
1493         COPY_NODE_FIELD(col_mappings);
1494         COPY_NODE_FIELD(translated_vars);
1495         COPY_SCALAR_FIELD(parent_reloid);
1496
1497         return newnode;
1498 }
1499
1500 /* ****************************************************************
1501  *                                      parsenodes.h copy functions
1502  * ****************************************************************
1503  */
1504
1505 static RangeTblEntry *
1506 _copyRangeTblEntry(RangeTblEntry *from)
1507 {
1508         RangeTblEntry *newnode = makeNode(RangeTblEntry);
1509
1510         COPY_SCALAR_FIELD(rtekind);
1511         COPY_SCALAR_FIELD(relid);
1512         COPY_NODE_FIELD(subquery);
1513         COPY_NODE_FIELD(funcexpr);
1514         COPY_NODE_FIELD(funccoltypes);
1515         COPY_NODE_FIELD(funccoltypmods);
1516         COPY_NODE_FIELD(values_lists);
1517         COPY_SCALAR_FIELD(jointype);
1518         COPY_NODE_FIELD(joinaliasvars);
1519         COPY_NODE_FIELD(alias);
1520         COPY_NODE_FIELD(eref);
1521         COPY_SCALAR_FIELD(inh);
1522         COPY_SCALAR_FIELD(inFromCl);
1523         COPY_SCALAR_FIELD(requiredPerms);
1524         COPY_SCALAR_FIELD(checkAsUser);
1525
1526         return newnode;
1527 }
1528
1529 static FkConstraint *
1530 _copyFkConstraint(FkConstraint *from)
1531 {
1532         FkConstraint *newnode = makeNode(FkConstraint);
1533
1534         COPY_STRING_FIELD(constr_name);
1535         COPY_NODE_FIELD(pktable);
1536         COPY_NODE_FIELD(fk_attrs);
1537         COPY_NODE_FIELD(pk_attrs);
1538         COPY_SCALAR_FIELD(fk_matchtype);
1539         COPY_SCALAR_FIELD(fk_upd_action);
1540         COPY_SCALAR_FIELD(fk_del_action);
1541         COPY_SCALAR_FIELD(deferrable);
1542         COPY_SCALAR_FIELD(initdeferred);
1543         COPY_SCALAR_FIELD(skip_validation);
1544
1545         return newnode;
1546 }
1547
1548 static SortGroupClause *
1549 _copySortGroupClause(SortGroupClause *from)
1550 {
1551         SortGroupClause *newnode = makeNode(SortGroupClause);
1552
1553         COPY_SCALAR_FIELD(tleSortGroupRef);
1554         COPY_SCALAR_FIELD(eqop);
1555         COPY_SCALAR_FIELD(sortop);
1556         COPY_SCALAR_FIELD(nulls_first);
1557
1558         return newnode;
1559 }
1560
1561 static RowMarkClause *
1562 _copyRowMarkClause(RowMarkClause *from)
1563 {
1564         RowMarkClause *newnode = makeNode(RowMarkClause);
1565
1566         COPY_SCALAR_FIELD(rti);
1567         COPY_SCALAR_FIELD(forUpdate);
1568         COPY_SCALAR_FIELD(noWait);
1569
1570         return newnode;
1571 }
1572
1573 static A_Expr *
1574 _copyAExpr(A_Expr *from)
1575 {
1576         A_Expr     *newnode = makeNode(A_Expr);
1577
1578         COPY_SCALAR_FIELD(kind);
1579         COPY_NODE_FIELD(name);
1580         COPY_NODE_FIELD(lexpr);
1581         COPY_NODE_FIELD(rexpr);
1582         COPY_SCALAR_FIELD(location);
1583
1584         return newnode;
1585 }
1586
1587 static ColumnRef *
1588 _copyColumnRef(ColumnRef *from)
1589 {
1590         ColumnRef  *newnode = makeNode(ColumnRef);
1591
1592         COPY_NODE_FIELD(fields);
1593         COPY_SCALAR_FIELD(location);
1594
1595         return newnode;
1596 }
1597
1598 static ParamRef *
1599 _copyParamRef(ParamRef *from)
1600 {
1601         ParamRef   *newnode = makeNode(ParamRef);
1602
1603         COPY_SCALAR_FIELD(number);
1604
1605         return newnode;
1606 }
1607
1608 static A_Const *
1609 _copyAConst(A_Const *from)
1610 {
1611         A_Const    *newnode = makeNode(A_Const);
1612
1613         /* This part must duplicate _copyValue */
1614         COPY_SCALAR_FIELD(val.type);
1615         switch (from->val.type)
1616         {
1617                 case T_Integer:
1618                         COPY_SCALAR_FIELD(val.val.ival);
1619                         break;
1620                 case T_Float:
1621                 case T_String:
1622                 case T_BitString:
1623                         COPY_STRING_FIELD(val.val.str);
1624                         break;
1625                 case T_Null:
1626                         /* nothing to do */
1627                         break;
1628                 default:
1629                         elog(ERROR, "unrecognized node type: %d",
1630                                  (int) from->val.type);
1631                         break;
1632         }
1633
1634         return newnode;
1635 }
1636
1637 static FuncCall *
1638 _copyFuncCall(FuncCall *from)
1639 {
1640         FuncCall   *newnode = makeNode(FuncCall);
1641
1642         COPY_NODE_FIELD(funcname);
1643         COPY_NODE_FIELD(args);
1644         COPY_SCALAR_FIELD(agg_star);
1645         COPY_SCALAR_FIELD(agg_distinct);
1646         COPY_SCALAR_FIELD(func_variadic);
1647         COPY_SCALAR_FIELD(location);
1648
1649         return newnode;
1650 }
1651
1652 static A_Indices *
1653 _copyAIndices(A_Indices *from)
1654 {
1655         A_Indices  *newnode = makeNode(A_Indices);
1656
1657         COPY_NODE_FIELD(lidx);
1658         COPY_NODE_FIELD(uidx);
1659
1660         return newnode;
1661 }
1662
1663 static A_Indirection *
1664 _copyA_Indirection(A_Indirection *from)
1665 {
1666         A_Indirection *newnode = makeNode(A_Indirection);
1667
1668         COPY_NODE_FIELD(arg);
1669         COPY_NODE_FIELD(indirection);
1670
1671         return newnode;
1672 }
1673
1674 static A_ArrayExpr *
1675 _copyA_ArrayExpr(A_ArrayExpr *from)
1676 {
1677         A_ArrayExpr  *newnode = makeNode(A_ArrayExpr);
1678
1679         COPY_NODE_FIELD(elements);
1680
1681         return newnode;
1682 }
1683
1684 static ResTarget *
1685 _copyResTarget(ResTarget *from)
1686 {
1687         ResTarget  *newnode = makeNode(ResTarget);
1688
1689         COPY_STRING_FIELD(name);
1690         COPY_NODE_FIELD(indirection);
1691         COPY_NODE_FIELD(val);
1692         COPY_SCALAR_FIELD(location);
1693
1694         return newnode;
1695 }
1696
1697 static TypeName *
1698 _copyTypeName(TypeName *from)
1699 {
1700         TypeName   *newnode = makeNode(TypeName);
1701
1702         COPY_NODE_FIELD(names);
1703         COPY_SCALAR_FIELD(typeid);
1704         COPY_SCALAR_FIELD(setof);
1705         COPY_SCALAR_FIELD(pct_type);
1706         COPY_NODE_FIELD(typmods);
1707         COPY_SCALAR_FIELD(typemod);
1708         COPY_NODE_FIELD(arrayBounds);
1709         COPY_SCALAR_FIELD(location);
1710
1711         return newnode;
1712 }
1713
1714 static SortBy *
1715 _copySortBy(SortBy *from)
1716 {
1717         SortBy     *newnode = makeNode(SortBy);
1718
1719         COPY_SCALAR_FIELD(sortby_dir);
1720         COPY_SCALAR_FIELD(sortby_nulls);
1721         COPY_NODE_FIELD(useOp);
1722         COPY_NODE_FIELD(node);
1723
1724         return newnode;
1725 }
1726
1727 static RangeSubselect *
1728 _copyRangeSubselect(RangeSubselect *from)
1729 {
1730         RangeSubselect *newnode = makeNode(RangeSubselect);
1731
1732         COPY_NODE_FIELD(subquery);
1733         COPY_NODE_FIELD(alias);
1734
1735         return newnode;
1736 }
1737
1738 static RangeFunction *
1739 _copyRangeFunction(RangeFunction *from)
1740 {
1741         RangeFunction *newnode = makeNode(RangeFunction);
1742
1743         COPY_NODE_FIELD(funccallnode);
1744         COPY_NODE_FIELD(alias);
1745         COPY_NODE_FIELD(coldeflist);
1746
1747         return newnode;
1748 }
1749
1750 static TypeCast *
1751 _copyTypeCast(TypeCast *from)
1752 {
1753         TypeCast   *newnode = makeNode(TypeCast);
1754
1755         COPY_NODE_FIELD(arg);
1756         COPY_NODE_FIELD(typename);
1757
1758         return newnode;
1759 }
1760
1761 static IndexElem *
1762 _copyIndexElem(IndexElem *from)
1763 {
1764         IndexElem  *newnode = makeNode(IndexElem);
1765
1766         COPY_STRING_FIELD(name);
1767         COPY_NODE_FIELD(expr);
1768         COPY_NODE_FIELD(opclass);
1769         COPY_SCALAR_FIELD(ordering);
1770         COPY_SCALAR_FIELD(nulls_ordering);
1771
1772         return newnode;
1773 }
1774
1775 static ColumnDef *
1776 _copyColumnDef(ColumnDef *from)
1777 {
1778         ColumnDef  *newnode = makeNode(ColumnDef);
1779
1780         COPY_STRING_FIELD(colname);
1781         COPY_NODE_FIELD(typename);
1782         COPY_SCALAR_FIELD(inhcount);
1783         COPY_SCALAR_FIELD(is_local);
1784         COPY_SCALAR_FIELD(is_not_null);
1785         COPY_NODE_FIELD(raw_default);
1786         COPY_STRING_FIELD(cooked_default);
1787         COPY_NODE_FIELD(constraints);
1788
1789         return newnode;
1790 }
1791
1792 static Constraint *
1793 _copyConstraint(Constraint *from)
1794 {
1795         Constraint *newnode = makeNode(Constraint);
1796
1797         COPY_SCALAR_FIELD(contype);
1798         COPY_STRING_FIELD(name);
1799         COPY_NODE_FIELD(raw_expr);
1800         COPY_STRING_FIELD(cooked_expr);
1801         COPY_NODE_FIELD(keys);
1802         COPY_NODE_FIELD(options);
1803         COPY_STRING_FIELD(indexspace);
1804
1805         return newnode;
1806 }
1807
1808 static DefElem *
1809 _copyDefElem(DefElem *from)
1810 {
1811         DefElem    *newnode = makeNode(DefElem);
1812
1813         COPY_STRING_FIELD(defname);
1814         COPY_NODE_FIELD(arg);
1815
1816         return newnode;
1817 }
1818
1819 static LockingClause *
1820 _copyLockingClause(LockingClause *from)
1821 {
1822         LockingClause *newnode = makeNode(LockingClause);
1823
1824         COPY_NODE_FIELD(lockedRels);
1825         COPY_SCALAR_FIELD(forUpdate);
1826         COPY_SCALAR_FIELD(noWait);
1827
1828         return newnode;
1829 }
1830
1831 static XmlSerialize *
1832 _copyXmlSerialize(XmlSerialize *from)
1833 {
1834         XmlSerialize *newnode = makeNode(XmlSerialize);
1835
1836         COPY_SCALAR_FIELD(xmloption);
1837         COPY_NODE_FIELD(expr);
1838         COPY_NODE_FIELD(typename);
1839
1840         return newnode;
1841 }
1842
1843 static Query *
1844 _copyQuery(Query *from)
1845 {
1846         Query      *newnode = makeNode(Query);
1847
1848         COPY_SCALAR_FIELD(commandType);
1849         COPY_SCALAR_FIELD(querySource);
1850         COPY_SCALAR_FIELD(canSetTag);
1851         COPY_NODE_FIELD(utilityStmt);
1852         COPY_SCALAR_FIELD(resultRelation);
1853         COPY_NODE_FIELD(intoClause);
1854         COPY_SCALAR_FIELD(hasAggs);
1855         COPY_SCALAR_FIELD(hasSubLinks);
1856         COPY_SCALAR_FIELD(hasDistinctOn);
1857         COPY_NODE_FIELD(rtable);
1858         COPY_NODE_FIELD(jointree);
1859         COPY_NODE_FIELD(targetList);
1860         COPY_NODE_FIELD(returningList);
1861         COPY_NODE_FIELD(groupClause);
1862         COPY_NODE_FIELD(havingQual);
1863         COPY_NODE_FIELD(distinctClause);
1864         COPY_NODE_FIELD(sortClause);
1865         COPY_NODE_FIELD(limitOffset);
1866         COPY_NODE_FIELD(limitCount);
1867         COPY_NODE_FIELD(rowMarks);
1868         COPY_NODE_FIELD(setOperations);
1869
1870         return newnode;
1871 }
1872
1873 static InsertStmt *
1874 _copyInsertStmt(InsertStmt *from)
1875 {
1876         InsertStmt *newnode = makeNode(InsertStmt);
1877
1878         COPY_NODE_FIELD(relation);
1879         COPY_NODE_FIELD(cols);
1880         COPY_NODE_FIELD(selectStmt);
1881         COPY_NODE_FIELD(returningList);
1882
1883         return newnode;
1884 }
1885
1886 static DeleteStmt *
1887 _copyDeleteStmt(DeleteStmt *from)
1888 {
1889         DeleteStmt *newnode = makeNode(DeleteStmt);
1890
1891         COPY_NODE_FIELD(relation);
1892         COPY_NODE_FIELD(usingClause);
1893         COPY_NODE_FIELD(whereClause);
1894         COPY_NODE_FIELD(returningList);
1895
1896         return newnode;
1897 }
1898
1899 static UpdateStmt *
1900 _copyUpdateStmt(UpdateStmt *from)
1901 {
1902         UpdateStmt *newnode = makeNode(UpdateStmt);
1903
1904         COPY_NODE_FIELD(relation);
1905         COPY_NODE_FIELD(targetList);
1906         COPY_NODE_FIELD(whereClause);
1907         COPY_NODE_FIELD(fromClause);
1908         COPY_NODE_FIELD(returningList);
1909
1910         return newnode;
1911 }
1912
1913 static SelectStmt *
1914 _copySelectStmt(SelectStmt *from)
1915 {
1916         SelectStmt *newnode = makeNode(SelectStmt);
1917
1918         COPY_NODE_FIELD(distinctClause);
1919         COPY_NODE_FIELD(intoClause);
1920         COPY_NODE_FIELD(targetList);
1921         COPY_NODE_FIELD(fromClause);
1922         COPY_NODE_FIELD(whereClause);
1923         COPY_NODE_FIELD(groupClause);
1924         COPY_NODE_FIELD(havingClause);
1925         COPY_NODE_FIELD(valuesLists);
1926         COPY_NODE_FIELD(sortClause);
1927         COPY_NODE_FIELD(limitOffset);
1928         COPY_NODE_FIELD(limitCount);
1929         COPY_NODE_FIELD(lockingClause);
1930         COPY_SCALAR_FIELD(op);
1931         COPY_SCALAR_FIELD(all);
1932         COPY_NODE_FIELD(larg);
1933         COPY_NODE_FIELD(rarg);
1934
1935         return newnode;
1936 }
1937
1938 static SetOperationStmt *
1939 _copySetOperationStmt(SetOperationStmt *from)
1940 {
1941         SetOperationStmt *newnode = makeNode(SetOperationStmt);
1942
1943         COPY_SCALAR_FIELD(op);
1944         COPY_SCALAR_FIELD(all);
1945         COPY_NODE_FIELD(larg);
1946         COPY_NODE_FIELD(rarg);
1947         COPY_NODE_FIELD(colTypes);
1948         COPY_NODE_FIELD(colTypmods);
1949         COPY_NODE_FIELD(groupClauses);
1950
1951         return newnode;
1952 }
1953
1954 static AlterTableStmt *
1955 _copyAlterTableStmt(AlterTableStmt *from)
1956 {
1957         AlterTableStmt *newnode = makeNode(AlterTableStmt);
1958
1959         COPY_NODE_FIELD(relation);
1960         COPY_NODE_FIELD(cmds);
1961         COPY_SCALAR_FIELD(relkind);
1962
1963         return newnode;
1964 }
1965
1966 static AlterTableCmd *
1967 _copyAlterTableCmd(AlterTableCmd *from)
1968 {
1969         AlterTableCmd *newnode = makeNode(AlterTableCmd);
1970
1971         COPY_SCALAR_FIELD(subtype);
1972         COPY_STRING_FIELD(name);
1973         COPY_NODE_FIELD(def);
1974         COPY_NODE_FIELD(transform);
1975         COPY_SCALAR_FIELD(behavior);
1976
1977         return newnode;
1978 }
1979
1980 static AlterDomainStmt *
1981 _copyAlterDomainStmt(AlterDomainStmt *from)
1982 {
1983         AlterDomainStmt *newnode = makeNode(AlterDomainStmt);
1984
1985         COPY_SCALAR_FIELD(subtype);
1986         COPY_NODE_FIELD(typename);
1987         COPY_STRING_FIELD(name);
1988         COPY_NODE_FIELD(def);
1989         COPY_SCALAR_FIELD(behavior);
1990
1991         return newnode;
1992 }
1993
1994 static GrantStmt *
1995 _copyGrantStmt(GrantStmt *from)
1996 {
1997         GrantStmt  *newnode = makeNode(GrantStmt);
1998
1999         COPY_SCALAR_FIELD(is_grant);
2000         COPY_SCALAR_FIELD(objtype);
2001         COPY_NODE_FIELD(objects);
2002         COPY_NODE_FIELD(privileges);
2003         COPY_NODE_FIELD(grantees);
2004         COPY_SCALAR_FIELD(grant_option);
2005         COPY_SCALAR_FIELD(behavior);
2006
2007         return newnode;
2008 }
2009
2010 static PrivGrantee *
2011 _copyPrivGrantee(PrivGrantee *from)
2012 {
2013         PrivGrantee *newnode = makeNode(PrivGrantee);
2014
2015         COPY_STRING_FIELD(rolname);
2016
2017         return newnode;
2018 }
2019
2020 static FuncWithArgs *
2021 _copyFuncWithArgs(FuncWithArgs *from)
2022 {
2023         FuncWithArgs *newnode = makeNode(FuncWithArgs);
2024
2025         COPY_NODE_FIELD(funcname);
2026         COPY_NODE_FIELD(funcargs);
2027
2028         return newnode;
2029 }
2030
2031 static GrantRoleStmt *
2032 _copyGrantRoleStmt(GrantRoleStmt *from)
2033 {
2034         GrantRoleStmt *newnode = makeNode(GrantRoleStmt);
2035
2036         COPY_NODE_FIELD(granted_roles);
2037         COPY_NODE_FIELD(grantee_roles);
2038         COPY_SCALAR_FIELD(is_grant);
2039         COPY_SCALAR_FIELD(admin_opt);
2040         COPY_STRING_FIELD(grantor);
2041         COPY_SCALAR_FIELD(behavior);
2042
2043         return newnode;
2044 }
2045
2046 static DeclareCursorStmt *
2047 _copyDeclareCursorStmt(DeclareCursorStmt *from)
2048 {
2049         DeclareCursorStmt *newnode = makeNode(DeclareCursorStmt);
2050
2051         COPY_STRING_FIELD(portalname);
2052         COPY_SCALAR_FIELD(options);
2053         COPY_NODE_FIELD(query);
2054
2055         return newnode;
2056 }
2057
2058 static ClosePortalStmt *
2059 _copyClosePortalStmt(ClosePortalStmt *from)
2060 {
2061         ClosePortalStmt *newnode = makeNode(ClosePortalStmt);
2062
2063         COPY_STRING_FIELD(portalname);
2064
2065         return newnode;
2066 }
2067
2068 static ClusterStmt *
2069 _copyClusterStmt(ClusterStmt *from)
2070 {
2071         ClusterStmt *newnode = makeNode(ClusterStmt);
2072
2073         COPY_NODE_FIELD(relation);
2074         COPY_STRING_FIELD(indexname);
2075
2076         return newnode;
2077 }
2078
2079 static CopyStmt *
2080 _copyCopyStmt(CopyStmt *from)
2081 {
2082         CopyStmt   *newnode = makeNode(CopyStmt);
2083
2084         COPY_NODE_FIELD(relation);
2085         COPY_NODE_FIELD(query);
2086         COPY_NODE_FIELD(attlist);
2087         COPY_SCALAR_FIELD(is_from);
2088         COPY_STRING_FIELD(filename);
2089         COPY_NODE_FIELD(options);
2090
2091         return newnode;
2092 }
2093
2094 static CreateStmt *
2095 _copyCreateStmt(CreateStmt *from)
2096 {
2097         CreateStmt *newnode = makeNode(CreateStmt);
2098
2099         COPY_NODE_FIELD(relation);
2100         COPY_NODE_FIELD(tableElts);
2101         COPY_NODE_FIELD(inhRelations);
2102         COPY_NODE_FIELD(constraints);
2103         COPY_NODE_FIELD(options);
2104         COPY_SCALAR_FIELD(oncommit);
2105         COPY_STRING_FIELD(tablespacename);
2106
2107         return newnode;
2108 }
2109
2110 static InhRelation *
2111 _copyInhRelation(InhRelation *from)
2112 {
2113         InhRelation *newnode = makeNode(InhRelation);
2114
2115         COPY_NODE_FIELD(relation);
2116         COPY_NODE_FIELD(options);
2117
2118         return newnode;
2119 }
2120
2121 static DefineStmt *
2122 _copyDefineStmt(DefineStmt *from)
2123 {
2124         DefineStmt *newnode = makeNode(DefineStmt);
2125
2126         COPY_SCALAR_FIELD(kind);
2127         COPY_SCALAR_FIELD(oldstyle);
2128         COPY_NODE_FIELD(defnames);
2129         COPY_NODE_FIELD(args);
2130         COPY_NODE_FIELD(definition);
2131
2132         return newnode;
2133 }
2134
2135 static DropStmt *
2136 _copyDropStmt(DropStmt *from)
2137 {
2138         DropStmt   *newnode = makeNode(DropStmt);
2139
2140         COPY_NODE_FIELD(objects);
2141         COPY_SCALAR_FIELD(removeType);
2142         COPY_SCALAR_FIELD(behavior);
2143         COPY_SCALAR_FIELD(missing_ok);
2144
2145         return newnode;
2146 }
2147
2148 static TruncateStmt *
2149 _copyTruncateStmt(TruncateStmt *from)
2150 {
2151         TruncateStmt *newnode = makeNode(TruncateStmt);
2152
2153         COPY_NODE_FIELD(relations);
2154         COPY_SCALAR_FIELD(restart_seqs);
2155         COPY_SCALAR_FIELD(behavior);
2156
2157         return newnode;
2158 }
2159
2160 static CommentStmt *
2161 _copyCommentStmt(CommentStmt *from)
2162 {
2163         CommentStmt *newnode = makeNode(CommentStmt);
2164
2165         COPY_SCALAR_FIELD(objtype);
2166         COPY_NODE_FIELD(objname);
2167         COPY_NODE_FIELD(objargs);
2168         COPY_STRING_FIELD(comment);
2169
2170         return newnode;
2171 }
2172
2173 static FetchStmt *
2174 _copyFetchStmt(FetchStmt *from)
2175 {
2176         FetchStmt  *newnode = makeNode(FetchStmt);
2177
2178         COPY_SCALAR_FIELD(direction);
2179         COPY_SCALAR_FIELD(howMany);
2180         COPY_STRING_FIELD(portalname);
2181         COPY_SCALAR_FIELD(ismove);
2182
2183         return newnode;
2184 }
2185
2186 static IndexStmt *
2187 _copyIndexStmt(IndexStmt *from)
2188 {
2189         IndexStmt  *newnode = makeNode(IndexStmt);
2190
2191         COPY_STRING_FIELD(idxname);
2192         COPY_NODE_FIELD(relation);
2193         COPY_STRING_FIELD(accessMethod);
2194         COPY_STRING_FIELD(tableSpace);
2195         COPY_NODE_FIELD(indexParams);
2196         COPY_NODE_FIELD(options);
2197         COPY_NODE_FIELD(whereClause);
2198         COPY_SCALAR_FIELD(unique);
2199         COPY_SCALAR_FIELD(primary);
2200         COPY_SCALAR_FIELD(isconstraint);
2201         COPY_SCALAR_FIELD(concurrent);
2202
2203         return newnode;
2204 }
2205
2206 static CreateFunctionStmt *
2207 _copyCreateFunctionStmt(CreateFunctionStmt *from)
2208 {
2209         CreateFunctionStmt *newnode = makeNode(CreateFunctionStmt);
2210
2211         COPY_SCALAR_FIELD(replace);
2212         COPY_NODE_FIELD(funcname);
2213         COPY_NODE_FIELD(parameters);
2214         COPY_NODE_FIELD(returnType);
2215         COPY_NODE_FIELD(options);
2216         COPY_NODE_FIELD(withClause);
2217
2218         return newnode;
2219 }
2220
2221 static FunctionParameter *
2222 _copyFunctionParameter(FunctionParameter *from)
2223 {
2224         FunctionParameter *newnode = makeNode(FunctionParameter);
2225
2226         COPY_STRING_FIELD(name);
2227         COPY_NODE_FIELD(argType);
2228         COPY_SCALAR_FIELD(mode);
2229
2230         return newnode;
2231 }
2232
2233 static AlterFunctionStmt *
2234 _copyAlterFunctionStmt(AlterFunctionStmt *from)
2235 {
2236         AlterFunctionStmt *newnode = makeNode(AlterFunctionStmt);
2237
2238         COPY_NODE_FIELD(func);
2239         COPY_NODE_FIELD(actions);
2240
2241         return newnode;
2242 }
2243
2244 static RemoveFuncStmt *
2245 _copyRemoveFuncStmt(RemoveFuncStmt *from)
2246 {
2247         RemoveFuncStmt *newnode = makeNode(RemoveFuncStmt);
2248
2249         COPY_SCALAR_FIELD(kind);
2250         COPY_NODE_FIELD(name);
2251         COPY_NODE_FIELD(args);
2252         COPY_SCALAR_FIELD(behavior);
2253         COPY_SCALAR_FIELD(missing_ok);
2254
2255         return newnode;
2256 }
2257
2258 static RemoveOpClassStmt *
2259 _copyRemoveOpClassStmt(RemoveOpClassStmt *from)
2260 {
2261         RemoveOpClassStmt *newnode = makeNode(RemoveOpClassStmt);
2262
2263         COPY_NODE_FIELD(opclassname);
2264         COPY_STRING_FIELD(amname);
2265         COPY_SCALAR_FIELD(behavior);
2266         COPY_SCALAR_FIELD(missing_ok);
2267
2268         return newnode;
2269 }
2270
2271 static RemoveOpFamilyStmt *
2272 _copyRemoveOpFamilyStmt(RemoveOpFamilyStmt *from)
2273 {
2274         RemoveOpFamilyStmt *newnode = makeNode(RemoveOpFamilyStmt);
2275
2276         COPY_NODE_FIELD(opfamilyname);
2277         COPY_STRING_FIELD(amname);
2278         COPY_SCALAR_FIELD(behavior);
2279         COPY_SCALAR_FIELD(missing_ok);
2280
2281         return newnode;
2282 }
2283
2284 static RenameStmt *
2285 _copyRenameStmt(RenameStmt *from)
2286 {
2287         RenameStmt *newnode = makeNode(RenameStmt);
2288
2289         COPY_SCALAR_FIELD(renameType);
2290         COPY_NODE_FIELD(relation);
2291         COPY_NODE_FIELD(object);
2292         COPY_NODE_FIELD(objarg);
2293         COPY_STRING_FIELD(subname);
2294         COPY_STRING_FIELD(newname);
2295
2296         return newnode;
2297 }
2298
2299 static AlterObjectSchemaStmt *
2300 _copyAlterObjectSchemaStmt(AlterObjectSchemaStmt *from)
2301 {
2302         AlterObjectSchemaStmt *newnode = makeNode(AlterObjectSchemaStmt);
2303
2304         COPY_SCALAR_FIELD(objectType);
2305         COPY_NODE_FIELD(relation);
2306         COPY_NODE_FIELD(object);
2307         COPY_NODE_FIELD(objarg);
2308         COPY_STRING_FIELD(addname);
2309         COPY_STRING_FIELD(newschema);
2310
2311         return newnode;
2312 }
2313
2314 static AlterOwnerStmt *
2315 _copyAlterOwnerStmt(AlterOwnerStmt *from)
2316 {
2317         AlterOwnerStmt *newnode = makeNode(AlterOwnerStmt);
2318
2319         COPY_SCALAR_FIELD(objectType);
2320         COPY_NODE_FIELD(relation);
2321         COPY_NODE_FIELD(object);
2322         COPY_NODE_FIELD(objarg);
2323         COPY_STRING_FIELD(addname);
2324         COPY_STRING_FIELD(newowner);
2325
2326         return newnode;
2327 }
2328
2329 static RuleStmt *
2330 _copyRuleStmt(RuleStmt *from)
2331 {
2332         RuleStmt   *newnode = makeNode(RuleStmt);
2333
2334         COPY_NODE_FIELD(relation);
2335         COPY_STRING_FIELD(rulename);
2336         COPY_NODE_FIELD(whereClause);
2337         COPY_SCALAR_FIELD(event);
2338         COPY_SCALAR_FIELD(instead);
2339         COPY_NODE_FIELD(actions);
2340         COPY_SCALAR_FIELD(replace);
2341
2342         return newnode;
2343 }
2344
2345 static NotifyStmt *
2346 _copyNotifyStmt(NotifyStmt *from)
2347 {
2348         NotifyStmt *newnode = makeNode(NotifyStmt);
2349
2350         COPY_NODE_FIELD(relation);
2351
2352         return newnode;
2353 }
2354
2355 static ListenStmt *
2356 _copyListenStmt(ListenStmt *from)
2357 {
2358         ListenStmt *newnode = makeNode(ListenStmt);
2359
2360         COPY_NODE_FIELD(relation);
2361
2362         return newnode;
2363 }
2364
2365 static UnlistenStmt *
2366 _copyUnlistenStmt(UnlistenStmt *from)
2367 {
2368         UnlistenStmt *newnode = makeNode(UnlistenStmt);
2369
2370         COPY_NODE_FIELD(relation);
2371
2372         return newnode;
2373 }
2374
2375 static TransactionStmt *
2376 _copyTransactionStmt(TransactionStmt *from)
2377 {
2378         TransactionStmt *newnode = makeNode(TransactionStmt);
2379
2380         COPY_SCALAR_FIELD(kind);
2381         COPY_NODE_FIELD(options);
2382         COPY_STRING_FIELD(gid);
2383
2384         return newnode;
2385 }
2386
2387 static CompositeTypeStmt *
2388 _copyCompositeTypeStmt(CompositeTypeStmt *from)
2389 {
2390         CompositeTypeStmt *newnode = makeNode(CompositeTypeStmt);
2391
2392         COPY_NODE_FIELD(typevar);
2393         COPY_NODE_FIELD(coldeflist);
2394
2395         return newnode;
2396 }
2397
2398 static CreateEnumStmt *
2399 _copyCreateEnumStmt(CreateEnumStmt *from)
2400 {
2401         CreateEnumStmt *newnode = makeNode(CreateEnumStmt);
2402
2403         COPY_NODE_FIELD(typename);
2404         COPY_NODE_FIELD(vals);
2405
2406         return newnode;
2407 }
2408
2409 static ViewStmt *
2410 _copyViewStmt(ViewStmt *from)
2411 {
2412         ViewStmt   *newnode = makeNode(ViewStmt);
2413
2414         COPY_NODE_FIELD(view);
2415         COPY_NODE_FIELD(aliases);
2416         COPY_NODE_FIELD(query);
2417         COPY_SCALAR_FIELD(replace);
2418
2419         return newnode;
2420 }
2421
2422 static LoadStmt *
2423 _copyLoadStmt(LoadStmt *from)
2424 {
2425         LoadStmt   *newnode = makeNode(LoadStmt);
2426
2427         COPY_STRING_FIELD(filename);
2428
2429         return newnode;
2430 }
2431
2432 static CreateDomainStmt *
2433 _copyCreateDomainStmt(CreateDomainStmt *from)
2434 {
2435         CreateDomainStmt *newnode = makeNode(CreateDomainStmt);
2436
2437         COPY_NODE_FIELD(domainname);
2438         COPY_NODE_FIELD(typename);
2439         COPY_NODE_FIELD(constraints);
2440
2441         return newnode;
2442 }
2443
2444 static CreateOpClassStmt *
2445 _copyCreateOpClassStmt(CreateOpClassStmt *from)
2446 {
2447         CreateOpClassStmt *newnode = makeNode(CreateOpClassStmt);
2448
2449         COPY_NODE_FIELD(opclassname);
2450         COPY_NODE_FIELD(opfamilyname);
2451         COPY_STRING_FIELD(amname);
2452         COPY_NODE_FIELD(datatype);
2453         COPY_NODE_FIELD(items);
2454         COPY_SCALAR_FIELD(isDefault);
2455
2456         return newnode;
2457 }
2458
2459 static CreateOpClassItem *
2460 _copyCreateOpClassItem(CreateOpClassItem *from)
2461 {
2462         CreateOpClassItem *newnode = makeNode(CreateOpClassItem);
2463
2464         COPY_SCALAR_FIELD(itemtype);
2465         COPY_NODE_FIELD(name);
2466         COPY_NODE_FIELD(args);
2467         COPY_SCALAR_FIELD(number);
2468         COPY_NODE_FIELD(class_args);
2469         COPY_NODE_FIELD(storedtype);
2470
2471         return newnode;
2472 }
2473
2474 static CreateOpFamilyStmt *
2475 _copyCreateOpFamilyStmt(CreateOpFamilyStmt *from)
2476 {
2477         CreateOpFamilyStmt *newnode = makeNode(CreateOpFamilyStmt);
2478
2479         COPY_NODE_FIELD(opfamilyname);
2480         COPY_STRING_FIELD(amname);
2481
2482         return newnode;
2483 }
2484
2485 static AlterOpFamilyStmt *
2486 _copyAlterOpFamilyStmt(AlterOpFamilyStmt *from)
2487 {
2488         AlterOpFamilyStmt *newnode = makeNode(AlterOpFamilyStmt);
2489
2490         COPY_NODE_FIELD(opfamilyname);
2491         COPY_STRING_FIELD(amname);
2492         COPY_SCALAR_FIELD(isDrop);
2493         COPY_NODE_FIELD(items);
2494
2495         return newnode;
2496 }
2497
2498 static CreatedbStmt *
2499 _copyCreatedbStmt(CreatedbStmt *from)
2500 {
2501         CreatedbStmt *newnode = makeNode(CreatedbStmt);
2502
2503         COPY_STRING_FIELD(dbname);
2504         COPY_NODE_FIELD(options);
2505
2506         return newnode;
2507 }
2508
2509 static AlterDatabaseStmt *
2510 _copyAlterDatabaseStmt(AlterDatabaseStmt *from)
2511 {
2512         AlterDatabaseStmt *newnode = makeNode(AlterDatabaseStmt);
2513
2514         COPY_STRING_FIELD(dbname);
2515         COPY_NODE_FIELD(options);
2516
2517         return newnode;
2518 }
2519
2520 static AlterDatabaseSetStmt *
2521 _copyAlterDatabaseSetStmt(AlterDatabaseSetStmt *from)
2522 {
2523         AlterDatabaseSetStmt *newnode = makeNode(AlterDatabaseSetStmt);
2524
2525         COPY_STRING_FIELD(dbname);
2526         COPY_NODE_FIELD(setstmt);
2527
2528         return newnode;
2529 }
2530
2531 static DropdbStmt *
2532 _copyDropdbStmt(DropdbStmt *from)
2533 {
2534         DropdbStmt *newnode = makeNode(DropdbStmt);
2535
2536         COPY_STRING_FIELD(dbname);
2537         COPY_SCALAR_FIELD(missing_ok);
2538
2539         return newnode;
2540 }
2541
2542 static VacuumStmt *
2543 _copyVacuumStmt(VacuumStmt *from)
2544 {
2545         VacuumStmt *newnode = makeNode(VacuumStmt);
2546
2547         COPY_SCALAR_FIELD(vacuum);
2548         COPY_SCALAR_FIELD(full);
2549         COPY_SCALAR_FIELD(analyze);
2550         COPY_SCALAR_FIELD(verbose);
2551         COPY_SCALAR_FIELD(freeze_min_age);
2552         COPY_NODE_FIELD(relation);
2553         COPY_NODE_FIELD(va_cols);
2554
2555         return newnode;
2556 }
2557
2558 static ExplainStmt *
2559 _copyExplainStmt(ExplainStmt *from)
2560 {
2561         ExplainStmt *newnode = makeNode(ExplainStmt);
2562
2563         COPY_NODE_FIELD(query);
2564         COPY_SCALAR_FIELD(verbose);
2565         COPY_SCALAR_FIELD(analyze);
2566
2567         return newnode;
2568 }
2569
2570 static CreateSeqStmt *
2571 _copyCreateSeqStmt(CreateSeqStmt *from)
2572 {
2573         CreateSeqStmt *newnode = makeNode(CreateSeqStmt);
2574
2575         COPY_NODE_FIELD(sequence);
2576         COPY_NODE_FIELD(options);
2577
2578         return newnode;
2579 }
2580
2581 static AlterSeqStmt *
2582 _copyAlterSeqStmt(AlterSeqStmt *from)
2583 {
2584         AlterSeqStmt *newnode = makeNode(AlterSeqStmt);
2585
2586         COPY_NODE_FIELD(sequence);
2587         COPY_NODE_FIELD(options);
2588
2589         return newnode;
2590 }
2591
2592 static VariableSetStmt *
2593 _copyVariableSetStmt(VariableSetStmt *from)
2594 {
2595         VariableSetStmt *newnode = makeNode(VariableSetStmt);
2596
2597         COPY_SCALAR_FIELD(kind);
2598         COPY_STRING_FIELD(name);
2599         COPY_NODE_FIELD(args);
2600         COPY_SCALAR_FIELD(is_local);
2601
2602         return newnode;
2603 }
2604
2605 static VariableShowStmt *
2606 _copyVariableShowStmt(VariableShowStmt *from)
2607 {
2608         VariableShowStmt *newnode = makeNode(VariableShowStmt);
2609
2610         COPY_STRING_FIELD(name);
2611
2612         return newnode;
2613 }
2614
2615 static DiscardStmt *
2616 _copyDiscardStmt(DiscardStmt *from)
2617 {
2618         DiscardStmt *newnode = makeNode(DiscardStmt);
2619
2620         COPY_SCALAR_FIELD(target);
2621
2622         return newnode;
2623 }
2624
2625 static CreateTableSpaceStmt *
2626 _copyCreateTableSpaceStmt(CreateTableSpaceStmt *from)
2627 {
2628         CreateTableSpaceStmt *newnode = makeNode(CreateTableSpaceStmt);
2629
2630         COPY_STRING_FIELD(tablespacename);
2631         COPY_STRING_FIELD(owner);
2632         COPY_STRING_FIELD(location);
2633
2634         return newnode;
2635 }
2636
2637 static DropTableSpaceStmt *
2638 _copyDropTableSpaceStmt(DropTableSpaceStmt *from)
2639 {
2640         DropTableSpaceStmt *newnode = makeNode(DropTableSpaceStmt);
2641
2642         COPY_STRING_FIELD(tablespacename);
2643         COPY_SCALAR_FIELD(missing_ok);
2644
2645         return newnode;
2646 }
2647
2648 static CreateTrigStmt *
2649 _copyCreateTrigStmt(CreateTrigStmt *from)
2650 {
2651         CreateTrigStmt *newnode = makeNode(CreateTrigStmt);
2652
2653         COPY_STRING_FIELD(trigname);
2654         COPY_NODE_FIELD(relation);
2655         COPY_NODE_FIELD(funcname);
2656         COPY_NODE_FIELD(args);
2657         COPY_SCALAR_FIELD(before);
2658         COPY_SCALAR_FIELD(row);
2659         strcpy(newnode->actions, from->actions);        /* in-line string field */
2660         COPY_SCALAR_FIELD(isconstraint);
2661         COPY_SCALAR_FIELD(deferrable);
2662         COPY_SCALAR_FIELD(initdeferred);
2663         COPY_NODE_FIELD(constrrel);
2664
2665         return newnode;
2666 }
2667
2668 static DropPropertyStmt *
2669 _copyDropPropertyStmt(DropPropertyStmt *from)
2670 {
2671         DropPropertyStmt *newnode = makeNode(DropPropertyStmt);
2672
2673         COPY_NODE_FIELD(relation);
2674         COPY_STRING_FIELD(property);
2675         COPY_SCALAR_FIELD(removeType);
2676         COPY_SCALAR_FIELD(behavior);
2677         COPY_SCALAR_FIELD(missing_ok);
2678
2679         return newnode;
2680 }
2681
2682 static CreatePLangStmt *
2683 _copyCreatePLangStmt(CreatePLangStmt *from)
2684 {
2685         CreatePLangStmt *newnode = makeNode(CreatePLangStmt);
2686
2687         COPY_STRING_FIELD(plname);
2688         COPY_NODE_FIELD(plhandler);
2689         COPY_NODE_FIELD(plvalidator);
2690         COPY_SCALAR_FIELD(pltrusted);
2691
2692         return newnode;
2693 }
2694
2695 static DropPLangStmt *
2696 _copyDropPLangStmt(DropPLangStmt *from)
2697 {
2698         DropPLangStmt *newnode = makeNode(DropPLangStmt);
2699
2700         COPY_STRING_FIELD(plname);
2701         COPY_SCALAR_FIELD(behavior);
2702         COPY_SCALAR_FIELD(missing_ok);
2703
2704         return newnode;
2705 }
2706
2707 static CreateRoleStmt *
2708 _copyCreateRoleStmt(CreateRoleStmt *from)
2709 {
2710         CreateRoleStmt *newnode = makeNode(CreateRoleStmt);
2711
2712         COPY_SCALAR_FIELD(stmt_type);
2713         COPY_STRING_FIELD(role);
2714         COPY_NODE_FIELD(options);
2715
2716         return newnode;
2717 }
2718
2719 static AlterRoleStmt *
2720 _copyAlterRoleStmt(AlterRoleStmt *from)
2721 {
2722         AlterRoleStmt *newnode = makeNode(AlterRoleStmt);
2723
2724         COPY_STRING_FIELD(role);
2725         COPY_NODE_FIELD(options);
2726         COPY_SCALAR_FIELD(action);
2727
2728         return newnode;
2729 }
2730
2731 static AlterRoleSetStmt *
2732 _copyAlterRoleSetStmt(AlterRoleSetStmt *from)
2733 {
2734         AlterRoleSetStmt *newnode = makeNode(AlterRoleSetStmt);
2735
2736         COPY_STRING_FIELD(role);
2737         COPY_NODE_FIELD(setstmt);
2738
2739         return newnode;
2740 }
2741
2742 static DropRoleStmt *
2743 _copyDropRoleStmt(DropRoleStmt *from)
2744 {
2745         DropRoleStmt *newnode = makeNode(DropRoleStmt);
2746
2747         COPY_NODE_FIELD(roles);
2748         COPY_SCALAR_FIELD(missing_ok);
2749
2750         return newnode;
2751 }
2752
2753 static LockStmt *
2754 _copyLockStmt(LockStmt *from)
2755 {
2756         LockStmt   *newnode = makeNode(LockStmt);
2757
2758         COPY_NODE_FIELD(relations);
2759         COPY_SCALAR_FIELD(mode);
2760         COPY_SCALAR_FIELD(nowait);
2761
2762         return newnode;
2763 }
2764
2765 static ConstraintsSetStmt *
2766 _copyConstraintsSetStmt(ConstraintsSetStmt *from)
2767 {
2768         ConstraintsSetStmt *newnode = makeNode(ConstraintsSetStmt);
2769
2770         COPY_NODE_FIELD(constraints);
2771         COPY_SCALAR_FIELD(deferred);
2772
2773         return newnode;
2774 }
2775
2776 static ReindexStmt *
2777 _copyReindexStmt(ReindexStmt *from)
2778 {
2779         ReindexStmt *newnode = makeNode(ReindexStmt);
2780
2781         COPY_SCALAR_FIELD(kind);
2782         COPY_NODE_FIELD(relation);
2783         COPY_STRING_FIELD(name);
2784         COPY_SCALAR_FIELD(do_system);
2785         COPY_SCALAR_FIELD(do_user);
2786
2787         return newnode;
2788 }
2789
2790 static CreateSchemaStmt *
2791 _copyCreateSchemaStmt(CreateSchemaStmt *from)
2792 {
2793         CreateSchemaStmt *newnode = makeNode(CreateSchemaStmt);
2794
2795         COPY_STRING_FIELD(schemaname);
2796         COPY_STRING_FIELD(authid);
2797         COPY_NODE_FIELD(schemaElts);
2798
2799         return newnode;
2800 }
2801
2802 static CreateConversionStmt *
2803 _copyCreateConversionStmt(CreateConversionStmt *from)
2804 {
2805         CreateConversionStmt *newnode = makeNode(CreateConversionStmt);
2806
2807         COPY_NODE_FIELD(conversion_name);
2808         COPY_STRING_FIELD(for_encoding_name);
2809         COPY_STRING_FIELD(to_encoding_name);
2810         COPY_NODE_FIELD(func_name);
2811         COPY_SCALAR_FIELD(def);
2812
2813         return newnode;
2814 }
2815
2816 static CreateCastStmt *
2817 _copyCreateCastStmt(CreateCastStmt *from)
2818 {
2819         CreateCastStmt *newnode = makeNode(CreateCastStmt);
2820
2821         COPY_NODE_FIELD(sourcetype);
2822         COPY_NODE_FIELD(targettype);
2823         COPY_NODE_FIELD(func);
2824         COPY_SCALAR_FIELD(context);
2825
2826         return newnode;
2827 }
2828
2829 static DropCastStmt *
2830 _copyDropCastStmt(DropCastStmt *from)
2831 {
2832         DropCastStmt *newnode = makeNode(DropCastStmt);
2833
2834         COPY_NODE_FIELD(sourcetype);
2835         COPY_NODE_FIELD(targettype);
2836         COPY_SCALAR_FIELD(behavior);
2837         COPY_SCALAR_FIELD(missing_ok);
2838
2839         return newnode;
2840 }
2841
2842 static PrepareStmt *
2843 _copyPrepareStmt(PrepareStmt *from)
2844 {
2845         PrepareStmt *newnode = makeNode(PrepareStmt);
2846
2847         COPY_STRING_FIELD(name);
2848         COPY_NODE_FIELD(argtypes);
2849         COPY_NODE_FIELD(query);
2850
2851         return newnode;
2852 }
2853
2854 static ExecuteStmt *
2855 _copyExecuteStmt(ExecuteStmt *from)
2856 {
2857         ExecuteStmt *newnode = makeNode(ExecuteStmt);
2858
2859         COPY_STRING_FIELD(name);
2860         COPY_NODE_FIELD(into);
2861         COPY_NODE_FIELD(params);
2862
2863         return newnode;
2864 }
2865
2866 static DeallocateStmt *
2867 _copyDeallocateStmt(DeallocateStmt *from)
2868 {
2869         DeallocateStmt *newnode = makeNode(DeallocateStmt);
2870
2871         COPY_STRING_FIELD(name);
2872
2873         return newnode;
2874 }
2875
2876 static DropOwnedStmt *
2877 _copyDropOwnedStmt(DropOwnedStmt *from)
2878 {
2879         DropOwnedStmt *newnode = makeNode(DropOwnedStmt);
2880
2881         COPY_NODE_FIELD(roles);
2882         COPY_SCALAR_FIELD(behavior);
2883
2884         return newnode;
2885 }
2886
2887 static ReassignOwnedStmt *
2888 _copyReassignOwnedStmt(ReassignOwnedStmt *from)
2889 {
2890         ReassignOwnedStmt *newnode = makeNode(ReassignOwnedStmt);
2891
2892         COPY_NODE_FIELD(roles);
2893         COPY_SCALAR_FIELD(newrole);
2894
2895         return newnode;
2896 }
2897
2898 static AlterTSDictionaryStmt *
2899 _copyAlterTSDictionaryStmt(AlterTSDictionaryStmt *from)
2900 {
2901         AlterTSDictionaryStmt *newnode = makeNode(AlterTSDictionaryStmt);
2902
2903         COPY_NODE_FIELD(dictname);
2904         COPY_NODE_FIELD(options);
2905
2906         return newnode;
2907 }
2908
2909 static AlterTSConfigurationStmt *
2910 _copyAlterTSConfigurationStmt(AlterTSConfigurationStmt *from)
2911 {
2912         AlterTSConfigurationStmt *newnode = makeNode(AlterTSConfigurationStmt);
2913
2914         COPY_NODE_FIELD(cfgname);
2915         COPY_NODE_FIELD(tokentype);
2916         COPY_NODE_FIELD(dicts);
2917         COPY_SCALAR_FIELD(override);
2918         COPY_SCALAR_FIELD(replace);
2919         COPY_SCALAR_FIELD(missing_ok);
2920
2921         return newnode;
2922 }
2923
2924 /* ****************************************************************
2925  *                                      pg_list.h copy functions
2926  * ****************************************************************
2927  */
2928
2929 /*
2930  * Perform a deep copy of the specified list, using copyObject(). The
2931  * list MUST be of type T_List; T_IntList and T_OidList nodes don't
2932  * need deep copies, so they should be copied via list_copy()
2933  */
2934 #define COPY_NODE_CELL(new, old)                                        \
2935         (new) = (ListCell *) palloc(sizeof(ListCell));  \
2936         lfirst(new) = copyObject(lfirst(old));
2937
2938 static List *
2939 _copyList(List *from)
2940 {
2941         List       *new;
2942         ListCell   *curr_old;
2943         ListCell   *prev_new;
2944
2945         Assert(list_length(from) >= 1);
2946
2947         new = makeNode(List);
2948         new->length = from->length;
2949
2950         COPY_NODE_CELL(new->head, from->head);
2951         prev_new = new->head;
2952         curr_old = lnext(from->head);
2953
2954         while (curr_old)
2955         {
2956                 COPY_NODE_CELL(prev_new->next, curr_old);
2957                 prev_new = prev_new->next;
2958                 curr_old = curr_old->next;
2959         }
2960         prev_new->next = NULL;
2961         new->tail = prev_new;
2962
2963         return new;
2964 }
2965
2966 /* ****************************************************************
2967  *                                      value.h copy functions
2968  * ****************************************************************
2969  */
2970 static Value *
2971 _copyValue(Value *from)
2972 {
2973         Value      *newnode = makeNode(Value);
2974
2975         /* See also _copyAConst when changing this code! */
2976
2977         COPY_SCALAR_FIELD(type);
2978         switch (from->type)
2979         {
2980                 case T_Integer:
2981                         COPY_SCALAR_FIELD(val.ival);
2982                         break;
2983                 case T_Float:
2984                 case T_String:
2985                 case T_BitString:
2986                         COPY_STRING_FIELD(val.str);
2987                         break;
2988                 case T_Null:
2989                         /* nothing to do */
2990                         break;
2991                 default:
2992                         elog(ERROR, "unrecognized node type: %d",
2993                                  (int) from->type);
2994                         break;
2995         }
2996         return newnode;
2997 }
2998
2999 /*
3000  * copyObject
3001  *
3002  * Create a copy of a Node tree or list.  This is a "deep" copy: all
3003  * substructure is copied too, recursively.
3004  */
3005 void *
3006 copyObject(void *from)
3007 {
3008         void       *retval;
3009
3010         if (from == NULL)
3011                 return NULL;
3012
3013         switch (nodeTag(from))
3014         {
3015                         /*
3016                          * PLAN NODES
3017                          */
3018                 case T_PlannedStmt:
3019                         retval = _copyPlannedStmt(from);
3020                         break;
3021                 case T_Plan:
3022                         retval = _copyPlan(from);
3023                         break;
3024                 case T_Result:
3025                         retval = _copyResult(from);
3026                         break;
3027                 case T_Append:
3028                         retval = _copyAppend(from);
3029                         break;
3030                 case T_BitmapAnd:
3031                         retval = _copyBitmapAnd(from);
3032                         break;
3033                 case T_BitmapOr:
3034                         retval = _copyBitmapOr(from);
3035                         break;
3036                 case T_Scan:
3037                         retval = _copyScan(from);
3038                         break;
3039                 case T_SeqScan:
3040                         retval = _copySeqScan(from);
3041                         break;
3042                 case T_IndexScan:
3043                         retval = _copyIndexScan(from);
3044                         break;
3045                 case T_BitmapIndexScan:
3046                         retval = _copyBitmapIndexScan(from);
3047                         break;
3048                 case T_BitmapHeapScan:
3049                         retval = _copyBitmapHeapScan(from);
3050                         break;
3051                 case T_TidScan:
3052                         retval = _copyTidScan(from);
3053                         break;
3054                 case T_SubqueryScan:
3055                         retval = _copySubqueryScan(from);
3056                         break;
3057                 case T_FunctionScan:
3058                         retval = _copyFunctionScan(from);
3059                         break;
3060                 case T_ValuesScan:
3061                         retval = _copyValuesScan(from);
3062                         break;
3063                 case T_Join:
3064                         retval = _copyJoin(from);
3065                         break;
3066                 case T_NestLoop:
3067                         retval = _copyNestLoop(from);
3068                         break;
3069                 case T_MergeJoin:
3070                         retval = _copyMergeJoin(from);
3071                         break;
3072                 case T_HashJoin:
3073                         retval = _copyHashJoin(from);
3074                         break;
3075                 case T_Material:
3076                         retval = _copyMaterial(from);
3077                         break;
3078                 case T_Sort:
3079                         retval = _copySort(from);
3080                         break;
3081                 case T_Group:
3082                         retval = _copyGroup(from);
3083                         break;
3084                 case T_Agg:
3085                         retval = _copyAgg(from);
3086                         break;
3087                 case T_Unique:
3088                         retval = _copyUnique(from);
3089                         break;
3090                 case T_Hash:
3091                         retval = _copyHash(from);
3092                         break;
3093                 case T_SetOp:
3094                         retval = _copySetOp(from);
3095                         break;
3096                 case T_Limit:
3097                         retval = _copyLimit(from);
3098                         break;
3099
3100                         /*
3101                          * PRIMITIVE NODES
3102                          */
3103                 case T_Alias:
3104                         retval = _copyAlias(from);
3105                         break;
3106                 case T_RangeVar:
3107                         retval = _copyRangeVar(from);
3108                         break;
3109                 case T_IntoClause:
3110                         retval = _copyIntoClause(from);
3111                         break;
3112                 case T_Var:
3113                         retval = _copyVar(from);
3114                         break;
3115                 case T_Const:
3116                         retval = _copyConst(from);
3117                         break;
3118                 case T_Param:
3119                         retval = _copyParam(from);
3120                         break;
3121                 case T_Aggref:
3122                         retval = _copyAggref(from);
3123                         break;
3124                 case T_ArrayRef:
3125                         retval = _copyArrayRef(from);
3126                         break;
3127                 case T_FuncExpr:
3128                         retval = _copyFuncExpr(from);
3129                         break;
3130                 case T_OpExpr:
3131                         retval = _copyOpExpr(from);
3132                         break;
3133                 case T_DistinctExpr:
3134                         retval = _copyDistinctExpr(from);
3135                         break;
3136                 case T_ScalarArrayOpExpr:
3137                         retval = _copyScalarArrayOpExpr(from);
3138                         break;
3139                 case T_BoolExpr:
3140                         retval = _copyBoolExpr(from);
3141                         break;
3142                 case T_SubLink:
3143                         retval = _copySubLink(from);
3144                         break;
3145                 case T_SubPlan:
3146                         retval = _copySubPlan(from);
3147                         break;
3148                 case T_FieldSelect:
3149                         retval = _copyFieldSelect(from);
3150                         break;
3151                 case T_FieldStore:
3152                         retval = _copyFieldStore(from);
3153                         break;
3154                 case T_RelabelType:
3155                         retval = _copyRelabelType(from);
3156                         break;
3157                 case T_CoerceViaIO:
3158                         retval = _copyCoerceViaIO(from);
3159                         break;
3160                 case T_ArrayCoerceExpr:
3161                         retval = _copyArrayCoerceExpr(from);
3162                         break;
3163                 case T_ConvertRowtypeExpr:
3164                         retval = _copyConvertRowtypeExpr(from);
3165                         break;
3166                 case T_CaseExpr:
3167                         retval = _copyCaseExpr(from);
3168                         break;
3169                 case T_CaseWhen:
3170                         retval = _copyCaseWhen(from);
3171                         break;
3172                 case T_CaseTestExpr:
3173                         retval = _copyCaseTestExpr(from);
3174                         break;
3175                 case T_ArrayExpr:
3176                         retval = _copyArrayExpr(from);
3177                         break;
3178                 case T_RowExpr:
3179                         retval = _copyRowExpr(from);
3180                         break;
3181                 case T_RowCompareExpr:
3182                         retval = _copyRowCompareExpr(from);
3183                         break;
3184                 case T_CoalesceExpr:
3185                         retval = _copyCoalesceExpr(from);
3186                         break;
3187                 case T_MinMaxExpr:
3188                         retval = _copyMinMaxExpr(from);
3189                         break;
3190                 case T_XmlExpr:
3191                         retval = _copyXmlExpr(from);
3192                         break;
3193                 case T_NullIfExpr:
3194                         retval = _copyNullIfExpr(from);
3195                         break;
3196                 case T_NullTest:
3197                         retval = _copyNullTest(from);
3198                         break;
3199                 case T_BooleanTest:
3200                         retval = _copyBooleanTest(from);
3201                         break;
3202                 case T_CoerceToDomain:
3203                         retval = _copyCoerceToDomain(from);
3204                         break;
3205                 case T_CoerceToDomainValue:
3206                         retval = _copyCoerceToDomainValue(from);
3207                         break;
3208                 case T_SetToDefault:
3209                         retval = _copySetToDefault(from);
3210                         break;
3211                 case T_CurrentOfExpr:
3212                         retval = _copyCurrentOfExpr(from);
3213                         break;
3214                 case T_TargetEntry:
3215                         retval = _copyTargetEntry(from);
3216                         break;
3217                 case T_RangeTblRef:
3218                         retval = _copyRangeTblRef(from);
3219                         break;
3220                 case T_JoinExpr:
3221                         retval = _copyJoinExpr(from);
3222                         break;
3223                 case T_FromExpr:
3224                         retval = _copyFromExpr(from);
3225                         break;
3226
3227                         /*
3228                          * RELATION NODES
3229                          */
3230                 case T_PathKey:
3231                         retval = _copyPathKey(from);
3232                         break;
3233                 case T_RestrictInfo:
3234                         retval = _copyRestrictInfo(from);
3235                         break;
3236                 case T_OuterJoinInfo:
3237                         retval = _copyOuterJoinInfo(from);
3238                         break;
3239                 case T_InClauseInfo:
3240                         retval = _copyInClauseInfo(from);
3241                         break;
3242                 case T_AppendRelInfo:
3243                         retval = _copyAppendRelInfo(from);
3244                         break;
3245
3246                         /*
3247                          * VALUE NODES
3248                          */
3249                 case T_Integer:
3250                 case T_Float:
3251                 case T_String:
3252                 case T_BitString:
3253                 case T_Null:
3254                         retval = _copyValue(from);
3255                         break;
3256
3257                         /*
3258                          * LIST NODES
3259                          */
3260                 case T_List:
3261                         retval = _copyList(from);
3262                         break;
3263
3264                         /*
3265                          * Lists of integers and OIDs don't need to be deep-copied, so we
3266                          * perform a shallow copy via list_copy()
3267                          */
3268                 case T_IntList:
3269                 case T_OidList:
3270                         retval = list_copy(from);
3271                         break;
3272
3273                         /*
3274                          * PARSE NODES
3275                          */
3276                 case T_Query:
3277                         retval = _copyQuery(from);
3278                         break;
3279                 case T_InsertStmt:
3280                         retval = _copyInsertStmt(from);
3281                         break;
3282                 case T_DeleteStmt:
3283                         retval = _copyDeleteStmt(from);
3284                         break;
3285                 case T_UpdateStmt:
3286                         retval = _copyUpdateStmt(from);
3287                         break;
3288                 case T_SelectStmt:
3289                         retval = _copySelectStmt(from);
3290                         break;
3291                 case T_SetOperationStmt:
3292                         retval = _copySetOperationStmt(from);
3293                         break;
3294                 case T_AlterTableStmt:
3295                         retval = _copyAlterTableStmt(from);
3296                         break;
3297                 case T_AlterTableCmd:
3298                         retval = _copyAlterTableCmd(from);
3299                         break;
3300                 case T_AlterDomainStmt:
3301                         retval = _copyAlterDomainStmt(from);
3302                         break;
3303                 case T_GrantStmt:
3304                         retval = _copyGrantStmt(from);
3305                         break;
3306                 case T_GrantRoleStmt:
3307                         retval = _copyGrantRoleStmt(from);
3308                         break;
3309                 case T_DeclareCursorStmt:
3310                         retval = _copyDeclareCursorStmt(from);
3311                         break;
3312                 case T_ClosePortalStmt:
3313                         retval = _copyClosePortalStmt(from);
3314                         break;
3315                 case T_ClusterStmt:
3316                         retval = _copyClusterStmt(from);
3317                         break;
3318                 case T_CopyStmt:
3319                         retval = _copyCopyStmt(from);
3320                         break;
3321                 case T_CreateStmt:
3322                         retval = _copyCreateStmt(from);
3323                         break;
3324                 case T_InhRelation:
3325                         retval = _copyInhRelation(from);
3326                         break;
3327                 case T_DefineStmt:
3328                         retval = _copyDefineStmt(from);
3329                         break;
3330                 case T_DropStmt:
3331                         retval = _copyDropStmt(from);
3332                         break;
3333                 case T_TruncateStmt:
3334                         retval = _copyTruncateStmt(from);
3335                         break;
3336                 case T_CommentStmt:
3337                         retval = _copyCommentStmt(from);
3338                         break;
3339                 case T_FetchStmt:
3340                         retval = _copyFetchStmt(from);
3341                         break;
3342                 case T_IndexStmt:
3343                         retval = _copyIndexStmt(from);
3344                         break;
3345                 case T_CreateFunctionStmt:
3346                         retval = _copyCreateFunctionStmt(from);
3347                         break;
3348                 case T_FunctionParameter:
3349                         retval = _copyFunctionParameter(from);
3350                         break;
3351                 case T_AlterFunctionStmt:
3352                         retval = _copyAlterFunctionStmt(from);
3353                         break;
3354                 case T_RemoveFuncStmt:
3355                         retval = _copyRemoveFuncStmt(from);
3356                         break;
3357                 case T_RemoveOpClassStmt:
3358                         retval = _copyRemoveOpClassStmt(from);
3359                         break;
3360                 case T_RemoveOpFamilyStmt:
3361                         retval = _copyRemoveOpFamilyStmt(from);
3362                         break;
3363                 case T_RenameStmt:
3364                         retval = _copyRenameStmt(from);
3365                         break;
3366                 case T_AlterObjectSchemaStmt:
3367                         retval = _copyAlterObjectSchemaStmt(from);
3368                         break;
3369                 case T_AlterOwnerStmt:
3370                         retval = _copyAlterOwnerStmt(from);
3371                         break;
3372                 case T_RuleStmt:
3373                         retval = _copyRuleStmt(from);
3374                         break;
3375                 case T_NotifyStmt:
3376                         retval = _copyNotifyStmt(from);
3377                         break;
3378                 case T_ListenStmt:
3379                         retval = _copyListenStmt(from);
3380                         break;
3381                 case T_UnlistenStmt:
3382                         retval = _copyUnlistenStmt(from);
3383                         break;
3384                 case T_TransactionStmt:
3385                         retval = _copyTransactionStmt(from);
3386                         break;
3387                 case T_CompositeTypeStmt:
3388                         retval = _copyCompositeTypeStmt(from);
3389                         break;
3390                 case T_CreateEnumStmt:
3391                         retval = _copyCreateEnumStmt(from);
3392                         break;
3393                 case T_ViewStmt:
3394                         retval = _copyViewStmt(from);
3395                         break;
3396                 case T_LoadStmt:
3397                         retval = _copyLoadStmt(from);
3398                         break;
3399                 case T_CreateDomainStmt:
3400                         retval = _copyCreateDomainStmt(from);
3401                         break;
3402                 case T_CreateOpClassStmt:
3403                         retval = _copyCreateOpClassStmt(from);
3404                         break;
3405                 case T_CreateOpClassItem:
3406                         retval = _copyCreateOpClassItem(from);
3407                         break;
3408                 case T_CreateOpFamilyStmt:
3409                         retval = _copyCreateOpFamilyStmt(from);
3410                         break;
3411                 case T_AlterOpFamilyStmt:
3412                         retval = _copyAlterOpFamilyStmt(from);
3413                         break;
3414                 case T_CreatedbStmt:
3415                         retval = _copyCreatedbStmt(from);
3416                         break;
3417                 case T_AlterDatabaseStmt:
3418                         retval = _copyAlterDatabaseStmt(from);
3419                         break;
3420                 case T_AlterDatabaseSetStmt:
3421                         retval = _copyAlterDatabaseSetStmt(from);
3422                         break;
3423                 case T_DropdbStmt:
3424                         retval = _copyDropdbStmt(from);
3425                         break;
3426                 case T_VacuumStmt:
3427                         retval = _copyVacuumStmt(from);
3428                         break;
3429                 case T_ExplainStmt:
3430                         retval = _copyExplainStmt(from);
3431                         break;
3432                 case T_CreateSeqStmt:
3433                         retval = _copyCreateSeqStmt(from);
3434                         break;
3435                 case T_AlterSeqStmt:
3436                         retval = _copyAlterSeqStmt(from);
3437                         break;
3438                 case T_VariableSetStmt:
3439                         retval = _copyVariableSetStmt(from);
3440                         break;
3441                 case T_VariableShowStmt:
3442                         retval = _copyVariableShowStmt(from);
3443                         break;
3444                 case T_DiscardStmt:
3445                         retval = _copyDiscardStmt(from);
3446                         break;
3447                 case T_CreateTableSpaceStmt:
3448                         retval = _copyCreateTableSpaceStmt(from);
3449                         break;
3450                 case T_DropTableSpaceStmt:
3451                         retval = _copyDropTableSpaceStmt(from);
3452                         break;
3453                 case T_CreateTrigStmt:
3454                         retval = _copyCreateTrigStmt(from);
3455                         break;
3456                 case T_DropPropertyStmt:
3457                         retval = _copyDropPropertyStmt(from);
3458                         break;
3459                 case T_CreatePLangStmt:
3460                         retval = _copyCreatePLangStmt(from);
3461                         break;
3462                 case T_DropPLangStmt:
3463                         retval = _copyDropPLangStmt(from);
3464                         break;
3465                 case T_CreateRoleStmt:
3466                         retval = _copyCreateRoleStmt(from);
3467                         break;
3468                 case T_AlterRoleStmt:
3469                         retval = _copyAlterRoleStmt(from);
3470                         break;
3471                 case T_AlterRoleSetStmt:
3472                         retval = _copyAlterRoleSetStmt(from);
3473                         break;
3474                 case T_DropRoleStmt:
3475                         retval = _copyDropRoleStmt(from);
3476                         break;
3477                 case T_LockStmt:
3478                         retval = _copyLockStmt(from);
3479                         break;
3480                 case T_ConstraintsSetStmt:
3481                         retval = _copyConstraintsSetStmt(from);
3482                         break;
3483                 case T_ReindexStmt:
3484                         retval = _copyReindexStmt(from);
3485                         break;
3486                 case T_CheckPointStmt:
3487                         retval = (void *) makeNode(CheckPointStmt);
3488                         break;
3489                 case T_CreateSchemaStmt:
3490                         retval = _copyCreateSchemaStmt(from);
3491                         break;
3492                 case T_CreateConversionStmt:
3493                         retval = _copyCreateConversionStmt(from);
3494                         break;
3495                 case T_CreateCastStmt:
3496                         retval = _copyCreateCastStmt(from);
3497                         break;
3498                 case T_DropCastStmt:
3499                         retval = _copyDropCastStmt(from);
3500                         break;
3501                 case T_PrepareStmt:
3502                         retval = _copyPrepareStmt(from);
3503                         break;
3504                 case T_ExecuteStmt:
3505                         retval = _copyExecuteStmt(from);
3506                         break;
3507                 case T_DeallocateStmt:
3508                         retval = _copyDeallocateStmt(from);
3509                         break;
3510                 case T_DropOwnedStmt:
3511                         retval = _copyDropOwnedStmt(from);
3512                         break;
3513                 case T_ReassignOwnedStmt:
3514                         retval = _copyReassignOwnedStmt(from);
3515                         break;
3516                 case T_AlterTSDictionaryStmt:
3517                         retval = _copyAlterTSDictionaryStmt(from);
3518                         break;
3519                 case T_AlterTSConfigurationStmt:
3520                         retval = _copyAlterTSConfigurationStmt(from);
3521                         break;
3522
3523                 case T_A_Expr:
3524                         retval = _copyAExpr(from);
3525                         break;
3526                 case T_ColumnRef:
3527                         retval = _copyColumnRef(from);
3528                         break;
3529                 case T_ParamRef:
3530                         retval = _copyParamRef(from);
3531                         break;
3532                 case T_A_Const:
3533                         retval = _copyAConst(from);
3534                         break;
3535                 case T_FuncCall:
3536                         retval = _copyFuncCall(from);
3537                         break;
3538                 case T_A_Indices:
3539                         retval = _copyAIndices(from);
3540                         break;
3541                 case T_A_Indirection:
3542                         retval = _copyA_Indirection(from);
3543                         break;
3544                 case T_A_ArrayExpr:
3545                         retval = _copyA_ArrayExpr(from);
3546                         break;
3547                 case T_ResTarget:
3548                         retval = _copyResTarget(from);
3549                         break;
3550                 case T_TypeCast:
3551                         retval = _copyTypeCast(from);
3552                         break;
3553                 case T_SortBy:
3554                         retval = _copySortBy(from);
3555                         break;
3556                 case T_RangeSubselect:
3557                         retval = _copyRangeSubselect(from);
3558                         break;
3559                 case T_RangeFunction:
3560                         retval = _copyRangeFunction(from);
3561                         break;
3562                 case T_TypeName:
3563                         retval = _copyTypeName(from);
3564                         break;
3565                 case T_IndexElem:
3566                         retval = _copyIndexElem(from);
3567                         break;
3568                 case T_ColumnDef:
3569                         retval = _copyColumnDef(from);
3570                         break;
3571                 case T_Constraint:
3572                         retval = _copyConstraint(from);
3573                         break;
3574                 case T_DefElem:
3575                         retval = _copyDefElem(from);
3576                         break;
3577                 case T_LockingClause:
3578                         retval = _copyLockingClause(from);
3579                         break;
3580                 case T_RangeTblEntry:
3581                         retval = _copyRangeTblEntry(from);
3582                         break;
3583                 case T_SortGroupClause:
3584                         retval = _copySortGroupClause(from);
3585                         break;
3586                 case T_RowMarkClause:
3587                         retval = _copyRowMarkClause(from);
3588                         break;
3589                 case T_FkConstraint:
3590                         retval = _copyFkConstraint(from);
3591                         break;
3592                 case T_PrivGrantee:
3593                         retval = _copyPrivGrantee(from);
3594                         break;
3595                 case T_FuncWithArgs:
3596                         retval = _copyFuncWithArgs(from);
3597                         break;
3598                 case T_XmlSerialize:
3599                         retval = _copyXmlSerialize(from);
3600                         break;
3601
3602                 default:
3603                         elog(ERROR, "unrecognized node type: %d", (int) nodeTag(from));
3604                         retval = from;          /* keep compiler quiet */
3605                         break;
3606         }
3607
3608         return retval;
3609 }