copyfuncs.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:38k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * copyfuncs.c
  4.  *   Copy functions for Postgres tree nodes.
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.82 1999/05/25 22:41:11 momjian Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include "postgres.h"
  17. #include "nodes/pg_list.h"
  18. #include "nodes/execnodes.h"
  19. #include "nodes/plannodes.h"
  20. #include "nodes/parsenodes.h"
  21. #include "nodes/primnodes.h"
  22. #include "nodes/relation.h"
  23. #include "utils/syscache.h"
  24. #include "utils/builtins.h" /* for namecpy */
  25. #include "utils/elog.h"
  26. #include "utils/palloc.h"
  27. #include "catalog/pg_type.h"
  28. #include "storage/lmgr.h"
  29. #include "optimizer/planmain.h"
  30. #include "optimizer/subselect.h"
  31. /*
  32.  * listCopy
  33.  *   this copy function only copies the "lcons-cells" of the list but not
  34.  *   its contents. (good for list of pointers as well as list of integers).
  35.  */
  36. List *
  37. listCopy(List *list)
  38. {
  39. List    *newlist = NIL;
  40. List    *l,
  41.    *nl = NIL;
  42. foreach(l, list)
  43. {
  44. if (newlist == NIL)
  45. newlist = nl = lcons(lfirst(l), NIL);
  46. else
  47. {
  48. lnext(nl) = lcons(lfirst(l), NIL);
  49. nl = lnext(nl);
  50. }
  51. }
  52. return newlist;
  53. }
  54. /*
  55.  * Node_Copy
  56.  *   a macro to simplify calling of copyObject on the specified field
  57.  */
  58. #define Node_Copy(from, newnode, field) 
  59. newnode->field = copyObject(from->field)
  60. /* ****************************************************************
  61.  *  plannodes.h copy functions
  62.  * ****************************************************************
  63.  */
  64. /* ----------------
  65.  * CopyPlanFields
  66.  *
  67.  * This function copies the fields of the Plan node.  It is used by
  68.  * all the copy functions for classes which inherit from Plan.
  69.  * ----------------
  70.  */
  71. static void
  72. CopyPlanFields(Plan *from, Plan *newnode)
  73. {
  74. newnode->cost = from->cost;
  75. newnode->plan_size = from->plan_size;
  76. newnode->plan_width = from->plan_width;
  77. newnode->plan_tupperpage = from->plan_tupperpage;
  78. newnode->targetlist = copyObject(from->targetlist);
  79. newnode->qual = copyObject(from->qual);
  80. newnode->lefttree = copyObject(from->lefttree);
  81. newnode->righttree = copyObject(from->righttree);
  82. newnode->extParam = listCopy(from->extParam);
  83. newnode->locParam = listCopy(from->locParam);
  84. newnode->chgParam = listCopy(from->chgParam);
  85. Node_Copy(from, newnode, initPlan);
  86. if (from->subPlan != NULL)
  87. newnode->subPlan = SS_pull_subplan((Node *) newnode->qual);
  88. else
  89. newnode->subPlan = NULL;
  90. newnode->nParamExec = from->nParamExec;
  91. }
  92. /* ----------------
  93.  * _copyPlan
  94.  * ----------------
  95.  */
  96. static Plan *
  97. _copyPlan(Plan *from)
  98. {
  99. Plan    *newnode = makeNode(Plan);
  100. /* ----------------
  101.  * copy the node superclass fields
  102.  * ----------------
  103.  */
  104. CopyPlanFields(from, newnode);
  105. return newnode;
  106. }
  107. /* ----------------
  108.  * _copyResult
  109.  * ----------------
  110.  */
  111. static Result *
  112. _copyResult(Result *from)
  113. {
  114. Result    *newnode = makeNode(Result);
  115. /* ----------------
  116.  * copy node superclass fields
  117.  * ----------------
  118.  */
  119. CopyPlanFields((Plan *) from, (Plan *) newnode);
  120. /* ----------------
  121.  * copy remainder of node
  122.  * ----------------
  123.  */
  124. Node_Copy(from, newnode, resconstantqual);
  125. /*
  126.  * We must add subplans in resconstantqual to the new plan's subPlan
  127.  * list
  128.  */
  129. newnode->plan.subPlan = nconc(newnode->plan.subPlan,
  130.   SS_pull_subplan(newnode->resconstantqual));
  131. return newnode;
  132. }
  133. /* ----------------
  134.  * _copyAppend
  135.  * ----------------
  136.  */
  137. static Append *
  138. _copyAppend(Append *from)
  139. {
  140. Append    *newnode = makeNode(Append);
  141. /* ----------------
  142.  * copy node superclass fields
  143.  * ----------------
  144.  */
  145. CopyPlanFields((Plan *) from, (Plan *) newnode);
  146. /* ----------------
  147.  * copy remainder of node
  148.  * ----------------
  149.  */
  150. Node_Copy(from, newnode, appendplans);
  151. Node_Copy(from, newnode, unionrtables);
  152. newnode->inheritrelid = from->inheritrelid;
  153. Node_Copy(from, newnode, inheritrtable);
  154. return newnode;
  155. }
  156. /* ----------------
  157.  * CopyScanFields
  158.  *
  159.  * This function copies the fields of the Scan node.  It is used by
  160.  * all the copy functions for classes which inherit from Scan.
  161.  * ----------------
  162.  */
  163. static void
  164. CopyScanFields(Scan *from, Scan *newnode)
  165. {
  166. newnode->scanrelid = from->scanrelid;
  167. return;
  168. }
  169. /* ----------------
  170.  * _copyScan
  171.  * ----------------
  172.  */
  173. static Scan *
  174. _copyScan(Scan *from)
  175. {
  176. Scan    *newnode = makeNode(Scan);
  177. /* ----------------
  178.  * copy node superclass fields
  179.  * ----------------
  180.  */
  181. CopyPlanFields((Plan *) from, (Plan *) newnode);
  182. CopyScanFields((Scan *) from, (Scan *) newnode);
  183. return newnode;
  184. }
  185. /* ----------------
  186.  * _copySeqScan
  187.  * ----------------
  188.  */
  189. static SeqScan *
  190. _copySeqScan(SeqScan *from)
  191. {
  192. SeqScan    *newnode = makeNode(SeqScan);
  193. /* ----------------
  194.  * copy node superclass fields
  195.  * ----------------
  196.  */
  197. CopyPlanFields((Plan *) from, (Plan *) newnode);
  198. CopyScanFields((Scan *) from, (Scan *) newnode);
  199. return newnode;
  200. }
  201. /* ----------------
  202.  * _copyIndexScan
  203.  * ----------------
  204.  */
  205. static IndexScan *
  206. _copyIndexScan(IndexScan *from)
  207. {
  208. IndexScan  *newnode = makeNode(IndexScan);
  209. /* ----------------
  210.  * copy node superclass fields
  211.  * ----------------
  212.  */
  213. CopyPlanFields((Plan *) from, (Plan *) newnode);
  214. CopyScanFields((Scan *) from, (Scan *) newnode);
  215. /* ----------------
  216.  * copy remainder of node
  217.  * ----------------
  218.  */
  219. newnode->indxid = listCopy(from->indxid);
  220. Node_Copy(from, newnode, indxqual);
  221. Node_Copy(from, newnode, indxqualorig);
  222. return newnode;
  223. }
  224. /* ----------------
  225.  * CopyJoinFields
  226.  *
  227.  * This function copies the fields of the Join node.  It is used by
  228.  * all the copy functions for classes which inherit from Join.
  229.  * ----------------
  230.  */
  231. static void
  232. CopyJoinFields(Join *from, Join *newnode)
  233. {
  234. /* nothing extra */
  235. return;
  236. }
  237. /* ----------------
  238.  * _copyJoin
  239.  * ----------------
  240.  */
  241. static Join *
  242. _copyJoin(Join *from)
  243. {
  244. Join    *newnode = makeNode(Join);
  245. /* ----------------
  246.  * copy node superclass fields
  247.  * ----------------
  248.  */
  249. CopyPlanFields((Plan *) from, (Plan *) newnode);
  250. CopyJoinFields(from, newnode);
  251. return newnode;
  252. }
  253. /* ----------------
  254.  * _copyNestLoop
  255.  * ----------------
  256.  */
  257. static NestLoop *
  258. _copyNestLoop(NestLoop *from)
  259. {
  260. NestLoop   *newnode = makeNode(NestLoop);
  261. /* ----------------
  262.  * copy node superclass fields
  263.  * ----------------
  264.  */
  265. CopyPlanFields((Plan *) from, (Plan *) newnode);
  266. CopyJoinFields((Join *) from, (Join *) newnode);
  267. return newnode;
  268. }
  269. /* ----------------
  270.  * _copyMergeJoin
  271.  * ----------------
  272.  */
  273. static MergeJoin *
  274. _copyMergeJoin(MergeJoin *from)
  275. {
  276. MergeJoin  *newnode = makeNode(MergeJoin);
  277. /* ----------------
  278.  * copy node superclass fields
  279.  * ----------------
  280.  */
  281. CopyPlanFields((Plan *) from, (Plan *) newnode);
  282. CopyJoinFields((Join *) from, (Join *) newnode);
  283. /* ----------------
  284.  * copy remainder of node
  285.  * ----------------
  286.  */
  287. Node_Copy(from, newnode, mergeclauses);
  288. return newnode;
  289. }
  290. /* ----------------
  291.  * _copyHashJoin
  292.  * ----------------
  293.  */
  294. static HashJoin *
  295. _copyHashJoin(HashJoin *from)
  296. {
  297. HashJoin   *newnode = makeNode(HashJoin);
  298. /* ----------------
  299.  * copy node superclass fields
  300.  * ----------------
  301.  */
  302. CopyPlanFields((Plan *) from, (Plan *) newnode);
  303. CopyJoinFields((Join *) from, (Join *) newnode);
  304. /* ----------------
  305.  * copy remainder of node
  306.  * ----------------
  307.  */
  308. Node_Copy(from, newnode, hashclauses);
  309. newnode->hashjoinop = from->hashjoinop;
  310. return newnode;
  311. }
  312. /* ----------------
  313.  * CopyNonameFields
  314.  *
  315.  * This function copies the fields of the Noname node.  It is used by
  316.  * all the copy functions for classes which inherit from Noname.
  317.  * ----------------
  318.  */
  319. static void
  320. CopyNonameFields(Noname *from, Noname *newnode)
  321. {
  322. newnode->nonameid = from->nonameid;
  323. newnode->keycount = from->keycount;
  324. return;
  325. }
  326. /* ----------------
  327.  * _copyNoname
  328.  * ----------------
  329.  */
  330. static Noname *
  331. _copyNoname(Noname *from)
  332. {
  333. Noname    *newnode = makeNode(Noname);
  334. /* ----------------
  335.  * copy node superclass fields
  336.  * ----------------
  337.  */
  338. CopyPlanFields((Plan *) from, (Plan *) newnode);
  339. CopyNonameFields(from, newnode);
  340. return newnode;
  341. }
  342. /* ----------------
  343.  * _copyMaterial
  344.  * ----------------
  345.  */
  346. static Material *
  347. _copyMaterial(Material *from)
  348. {
  349. Material   *newnode = makeNode(Material);
  350. /* ----------------
  351.  * copy node superclass fields
  352.  * ----------------
  353.  */
  354. CopyPlanFields((Plan *) from, (Plan *) newnode);
  355. CopyNonameFields((Noname *) from, (Noname *) newnode);
  356. return newnode;
  357. }
  358. /* ----------------
  359.  * _copySort
  360.  * ----------------
  361.  */
  362. static Sort *
  363. _copySort(Sort *from)
  364. {
  365. Sort    *newnode = makeNode(Sort);
  366. /* ----------------
  367.  * copy node superclass fields
  368.  * ----------------
  369.  */
  370. CopyPlanFields((Plan *) from, (Plan *) newnode);
  371. CopyNonameFields((Noname *) from, (Noname *) newnode);
  372. return newnode;
  373. }
  374. /* ----------------
  375.  * _copyGroup
  376.  * ----------------
  377.  */
  378. static Group *
  379. _copyGroup(Group *from)
  380. {
  381. Group    *newnode = makeNode(Group);
  382. CopyPlanFields((Plan *) from, (Plan *) newnode);
  383. newnode->tuplePerGroup = from->tuplePerGroup;
  384. newnode->numCols = from->numCols;
  385. newnode->grpColIdx = palloc(from->numCols * sizeof(AttrNumber));
  386. memcpy(newnode->grpColIdx, from->grpColIdx, from->numCols * sizeof(AttrNumber));
  387. return newnode;
  388. }
  389. /* ---------------
  390.  * _copyAgg
  391.  * --------------
  392.  */
  393. static Agg *
  394. _copyAgg(Agg *from)
  395. {
  396. Agg    *newnode = makeNode(Agg);
  397. CopyPlanFields((Plan *) from, (Plan *) newnode);
  398. /*
  399.  * Cannot copy agg list; it must be rebuilt to point to subnodes of
  400.  * new node.
  401.  */
  402. set_agg_tlist_references(newnode);
  403. return newnode;
  404. }
  405. /* ---------------
  406.  * _copyGroupClause
  407.  * --------------
  408.  */
  409. static GroupClause *
  410. _copyGroupClause(GroupClause *from)
  411. {
  412. GroupClause *newnode = makeNode(GroupClause);
  413. newnode->grpOpoid = from->grpOpoid;
  414. newnode->tleGroupref = from->tleGroupref;
  415. return newnode;
  416. }
  417. /* ----------------
  418.  * _copyUnique
  419.  * ----------------
  420.  */
  421. static Unique *
  422. _copyUnique(Unique *from)
  423. {
  424. Unique    *newnode = makeNode(Unique);
  425. /* ----------------
  426.  * copy node superclass fields
  427.  * ----------------
  428.  */
  429. CopyPlanFields((Plan *) from, (Plan *) newnode);
  430. CopyNonameFields((Noname *) from, (Noname *) newnode);
  431. /* ----------------
  432.  * copy remainder of node
  433.  * ----------------
  434.  */
  435. if (from->uniqueAttr)
  436. newnode->uniqueAttr = pstrdup(from->uniqueAttr);
  437. else
  438. newnode->uniqueAttr = NULL;
  439. newnode->uniqueAttrNum = from->uniqueAttrNum;
  440. return newnode;
  441. }
  442. /* ----------------
  443.  * _copyHash
  444.  * ----------------
  445.  */
  446. static Hash *
  447. _copyHash(Hash *from)
  448. {
  449. Hash    *newnode = makeNode(Hash);
  450. /* ----------------
  451.  * copy node superclass fields
  452.  * ----------------
  453.  */
  454. CopyPlanFields((Plan *) from, (Plan *) newnode);
  455. /* ----------------
  456.  * copy remainder of node
  457.  * ----------------
  458.  */
  459. Node_Copy(from, newnode, hashkey);
  460. return newnode;
  461. }
  462. static SubPlan *
  463. _copySubPlan(SubPlan *from)
  464. {
  465. SubPlan    *newnode = makeNode(SubPlan);
  466. Node_Copy(from, newnode, plan);
  467. newnode->plan_id = from->plan_id;
  468. Node_Copy(from, newnode, rtable);
  469. newnode->setParam = listCopy(from->setParam);
  470. newnode->parParam = listCopy(from->parParam);
  471. Node_Copy(from, newnode, sublink);
  472. return newnode;
  473. }
  474. /* ****************************************************************
  475.  *    primnodes.h copy functions
  476.  * ****************************************************************
  477.  */
  478. /* ----------------
  479.  * _copyResdom
  480.  * ----------------
  481.  */
  482. static Resdom *
  483. _copyResdom(Resdom *from)
  484. {
  485. Resdom    *newnode = makeNode(Resdom);
  486. newnode->resno = from->resno;
  487. newnode->restype = from->restype;
  488. newnode->restypmod = from->restypmod;
  489. if (from->resname != NULL)
  490. newnode->resname = pstrdup(from->resname);
  491. newnode->reskey = from->reskey;
  492. newnode->reskeyop = from->reskeyop;
  493. newnode->resgroupref = from->resgroupref;
  494. newnode->resjunk = from->resjunk;
  495. return newnode;
  496. }
  497. static Fjoin *
  498. _copyFjoin(Fjoin *from)
  499. {
  500. Fjoin    *newnode = makeNode(Fjoin);
  501. /* ----------------
  502.  * copy node superclass fields
  503.  * ----------------
  504.  */
  505. newnode->fj_initialized = from->fj_initialized;
  506. newnode->fj_nNodes = from->fj_nNodes;
  507. Node_Copy(from, newnode, fj_innerNode);
  508. newnode->fj_results = (DatumPtr)
  509. palloc((from->fj_nNodes) * sizeof(Datum));
  510. memmove(from->fj_results,
  511. newnode->fj_results,
  512. (from->fj_nNodes) * sizeof(Datum));
  513. newnode->fj_alwaysDone = (BoolPtr)
  514. palloc((from->fj_nNodes) * sizeof(bool));
  515. memmove(from->fj_alwaysDone,
  516. newnode->fj_alwaysDone,
  517. (from->fj_nNodes) * sizeof(bool));
  518. return newnode;
  519. }
  520. /* ----------------
  521.  * _copyExpr
  522.  * ----------------
  523.  */
  524. static Expr *
  525. _copyExpr(Expr *from)
  526. {
  527. Expr    *newnode = makeNode(Expr);
  528. /* ----------------
  529.  * copy node superclass fields
  530.  * ----------------
  531.  */
  532. newnode->typeOid = from->typeOid;
  533. newnode->opType = from->opType;
  534. Node_Copy(from, newnode, oper);
  535. Node_Copy(from, newnode, args);
  536. return newnode;
  537. }
  538. /* ----------------
  539.  * _copyVar
  540.  * ----------------
  541.  */
  542. static Var *
  543. _copyVar(Var *from)
  544. {
  545. Var    *newnode = makeNode(Var);
  546. /* ----------------
  547.  * copy remainder of node
  548.  * ----------------
  549.  */
  550. newnode->varno = from->varno;
  551. newnode->varattno = from->varattno;
  552. newnode->vartype = from->vartype;
  553. newnode->vartypmod = from->vartypmod;
  554. newnode->varlevelsup = from->varlevelsup;
  555. newnode->varnoold = from->varnoold;
  556. newnode->varoattno = from->varoattno;
  557. return newnode;
  558. }
  559. /* ----------------
  560.  * _copyOper
  561.  * ----------------
  562.  */
  563. static Oper *
  564. _copyOper(Oper *from)
  565. {
  566. Oper    *newnode = makeNode(Oper);
  567. /* ----------------
  568.  * copy remainder of node
  569.  * ----------------
  570.  */
  571. newnode->opno = from->opno;
  572. newnode->opid = from->opid;
  573. newnode->opresulttype = from->opresulttype;
  574. newnode->opsize = from->opsize;
  575. /*
  576.  * NOTE: shall we copy the cache structure or just the pointer ?
  577.  * Alternatively we can set 'op_fcache' to NULL, in which case the
  578.  * executor will initialize it when it needs it...
  579.  */
  580. newnode->op_fcache = from->op_fcache;
  581. return newnode;
  582. }
  583. /* ----------------
  584.  * _copyConst
  585.  * ----------------
  586.  */
  587. static Const *
  588. _copyConst(Const *from)
  589. {
  590. static Oid cached_type;
  591. static bool cached_typbyval;
  592. Const    *newnode = makeNode(Const);
  593. /* ----------------
  594.  * copy remainder of node
  595.  * ----------------
  596.  */
  597. newnode->consttype = from->consttype;
  598. newnode->constlen = from->constlen;
  599. /* ----------------
  600.  * XXX super cheesy hack until parser/planner
  601.  * puts in the right values here.
  602.  *
  603.  * But I like cheese.
  604.  * ----------------
  605.  */
  606. if (!from->constisnull && cached_type != from->consttype)
  607. {
  608. HeapTuple typeTuple;
  609. Form_pg_type typeStruct;
  610. /* ----------------
  611.  *  get the type tuple corresponding to the paramList->type,
  612.  *  If this fails, returnValue has been pre-initialized
  613.  *  to "null" so we just return it.
  614.  * ----------------
  615.  */
  616. typeTuple = SearchSysCacheTuple(TYPOID,
  617. ObjectIdGetDatum(from->consttype),
  618. 0, 0, 0);
  619. /* ----------------
  620.  *  get the type length and by-value from the type tuple and
  621.  *  save the information in our one element cache.
  622.  * ----------------
  623.  */
  624. Assert(PointerIsValid(typeTuple));
  625. typeStruct = (Form_pg_type) GETSTRUCT(typeTuple);
  626. cached_typbyval = (typeStruct)->typbyval ? true : false;
  627. cached_type = from->consttype;
  628. }
  629. from->constbyval = cached_typbyval;
  630. if (!from->constisnull)
  631. {
  632. /* ----------------
  633.  * copying the Datum in a const node is a bit trickier
  634.  * because it might be a pointer and it might also be of
  635.  * variable length...
  636.  * ----------------
  637.  */
  638. if (from->constbyval == true)
  639. {
  640. /* ----------------
  641.  * passed by value so just copy the datum.
  642.  * ----------------
  643.  */
  644. newnode->constvalue = from->constvalue;
  645. }
  646. else
  647. {
  648. /* ----------------
  649.  * not passed by value. datum contains a pointer.
  650.  * ----------------
  651.  */
  652. if (from->constlen != -1)
  653. {
  654. /* ----------------
  655.  * fixed length structure
  656.  * ----------------
  657.  */
  658. newnode->constvalue = PointerGetDatum(palloc(from->constlen));
  659. memmove((char *) newnode->constvalue,
  660. (char *) from->constvalue, from->constlen);
  661. }
  662. else
  663. {
  664. /* ----------------
  665.  * variable length structure. here the length is stored
  666.  * in the first int pointed to by the constval.
  667.  * ----------------
  668.  */
  669. int length;
  670. length = VARSIZE(from->constvalue);
  671. newnode->constvalue = PointerGetDatum(palloc(length));
  672. memmove((char *) newnode->constvalue,
  673. (char *) from->constvalue, length);
  674. }
  675. }
  676. }
  677. else
  678. newnode->constvalue = from->constvalue;
  679. newnode->constisnull = from->constisnull;
  680. newnode->constbyval = from->constbyval;
  681. newnode->constisset = from->constisset;
  682. newnode->constiscast = from->constiscast;
  683. return newnode;
  684. }
  685. /* ----------------
  686.  * _copyParam
  687.  * ----------------
  688.  */
  689. static Param *
  690. _copyParam(Param *from)
  691. {
  692. Param    *newnode = makeNode(Param);
  693. /* ----------------
  694.  * copy remainder of node
  695.  * ----------------
  696.  */
  697. newnode->paramkind = from->paramkind;
  698. newnode->paramid = from->paramid;
  699. if (from->paramname != NULL)
  700. newnode->paramname = pstrdup(from->paramname);
  701. newnode->paramtype = from->paramtype;
  702. Node_Copy(from, newnode, param_tlist);
  703. return newnode;
  704. }
  705. /* ----------------
  706.  * _copyFunc
  707.  * ----------------
  708.  */
  709. static Func *
  710. _copyFunc(Func *from)
  711. {
  712. Func    *newnode = makeNode(Func);
  713. /* ----------------
  714.  * copy remainder of node
  715.  * ----------------
  716.  */
  717. newnode->funcid = from->funcid;
  718. newnode->functype = from->functype;
  719. newnode->funcisindex = from->funcisindex;
  720. newnode->funcsize = from->funcsize;
  721. newnode->func_fcache = from->func_fcache;
  722. Node_Copy(from, newnode, func_tlist);
  723. Node_Copy(from, newnode, func_planlist);
  724. return newnode;
  725. }
  726. /* ----------------
  727.  * _copyAggref
  728.  * ----------------
  729.  */
  730. static Aggref *
  731. _copyAggref(Aggref *from)
  732. {
  733. Aggref    *newnode = makeNode(Aggref);
  734. /* ----------------
  735.  * copy remainder of node
  736.  * ----------------
  737.  */
  738. newnode->aggname = pstrdup(from->aggname);
  739. newnode->basetype = from->basetype;
  740. newnode->aggtype = from->aggtype;
  741. Node_Copy(from, newnode, target);
  742. newnode->aggno = from->aggno;
  743. newnode->usenulls = from->usenulls;
  744. return newnode;
  745. }
  746. /* ----------------
  747.  * _copySubLink
  748.  * ----------------
  749.  */
  750. static SubLink *
  751. _copySubLink(SubLink *from)
  752. {
  753. SubLink    *newnode = makeNode(SubLink);
  754. /* ----------------
  755.  * copy remainder of node
  756.  * ----------------
  757.  */
  758. newnode->subLinkType = from->subLinkType;
  759. newnode->useor = from->useor;
  760. Node_Copy(from, newnode, lefthand);
  761. Node_Copy(from, newnode, oper);
  762. Node_Copy(from, newnode, subselect);
  763. return newnode;
  764. }
  765. /* ----------------
  766.  * _copyCaseExpr
  767.  * ----------------
  768.  */
  769. static CaseExpr *
  770. _copyCaseExpr(CaseExpr *from)
  771. {
  772. CaseExpr   *newnode = makeNode(CaseExpr);
  773. /* ----------------
  774.  * copy remainder of node
  775.  * ----------------
  776.  */
  777. newnode->casetype = from->casetype;
  778. Node_Copy(from, newnode, arg);
  779. Node_Copy(from, newnode, args);
  780. Node_Copy(from, newnode, defresult);
  781. return newnode;
  782. }
  783. /* ----------------
  784.  * _copyCaseWhen
  785.  * ----------------
  786.  */
  787. static CaseWhen *
  788. _copyCaseWhen(CaseWhen *from)
  789. {
  790. CaseWhen   *newnode = makeNode(CaseWhen);
  791. /* ----------------
  792.  * copy remainder of node
  793.  * ----------------
  794.  */
  795. Node_Copy(from, newnode, expr);
  796. Node_Copy(from, newnode, result);
  797. return newnode;
  798. }
  799. static Array *
  800. _copyArray(Array *from)
  801. {
  802. Array    *newnode = makeNode(Array);
  803. /* ----------------
  804.  * copy remainder of node
  805.  * ----------------
  806.  */
  807. newnode->arrayelemtype = from->arrayelemtype;
  808. newnode->arrayelemlength = from->arrayelemlength;
  809. newnode->arrayelembyval = from->arrayelembyval;
  810. newnode->arrayndim = from->arrayndim;
  811. newnode->arraylow = from->arraylow;
  812. newnode->arrayhigh = from->arrayhigh;
  813. newnode->arraylen = from->arraylen;
  814. return newnode;
  815. }
  816. static ArrayRef *
  817. _copyArrayRef(ArrayRef *from)
  818. {
  819. ArrayRef   *newnode = makeNode(ArrayRef);
  820. /* ----------------
  821.  * copy remainder of node
  822.  * ----------------
  823.  */
  824. newnode->refattrlength = from->refattrlength;
  825. newnode->refelemlength = from->refelemlength;
  826. newnode->refelemtype = from->refelemtype;
  827. newnode->refelembyval = from->refelembyval;
  828. Node_Copy(from, newnode, refupperindexpr);
  829. Node_Copy(from, newnode, reflowerindexpr);
  830. Node_Copy(from, newnode, refexpr);
  831. Node_Copy(from, newnode, refassgnexpr);
  832. return newnode;
  833. }
  834. /* ****************************************************************
  835.  * relation.h copy functions
  836.  * ****************************************************************
  837.  */
  838. /* ----------------
  839.  * _copyRelOptInfo
  840.  * ----------------
  841.  */
  842. /*
  843.  * when you change this, also make sure to fix up xfunc_copyRelOptInfo in
  844.  * planner/path/xfunc.c accordingly!!!
  845.  * -- JMH, 8/2/93
  846.  */
  847. static RelOptInfo *
  848. _copyRelOptInfo(RelOptInfo *from)
  849. {
  850. RelOptInfo *newnode = makeNode(RelOptInfo);
  851. int i,
  852. len;
  853. /* ----------------
  854.  * copy remainder of node
  855.  * ----------------
  856.  */
  857. newnode->relids = listCopy(from->relids);
  858. newnode->indexed = from->indexed;
  859. newnode->pages = from->pages;
  860. newnode->tuples = from->tuples;
  861. newnode->size = from->size;
  862. newnode->width = from->width;
  863. Node_Copy(from, newnode, targetlist);
  864. Node_Copy(from, newnode, pathlist);
  865. Node_Copy(from, newnode, cheapestpath);
  866. newnode->pruneable = from->pruneable;
  867. if (from->classlist)
  868. {
  869. for (len = 0; from->classlist[len] != 0; len++)
  870. ;
  871. newnode->classlist = (Oid *) palloc(sizeof(Oid) * (len + 1));
  872. for (i = 0; i < len; i++)
  873. newnode->classlist[i] = from->classlist[i];
  874. newnode->classlist[len] = 0;
  875. }
  876. if (from->indexkeys)
  877. {
  878. for (len = 0; from->indexkeys[len] != 0; len++)
  879. ;
  880. newnode->indexkeys = (int *) palloc(sizeof(int) * (len + 1));
  881. for (i = 0; i < len; i++)
  882. newnode->indexkeys[i] = from->indexkeys[i];
  883. newnode->indexkeys[len] = 0;
  884. }
  885. newnode->relam = from->relam;
  886. newnode->indproc = from->indproc;
  887. Node_Copy(from, newnode, indpred);
  888. if (from->ordering)
  889. {
  890. for (len = 0; from->ordering[len] != 0; len++)
  891. ;
  892. newnode->ordering = (Oid *) palloc(sizeof(Oid) * (len + 1));
  893. for (i = 0; i < len; i++)
  894. newnode->ordering[i] = from->ordering[i];
  895. newnode->ordering[len] = 0;
  896. }
  897. Node_Copy(from, newnode, restrictinfo);
  898. Node_Copy(from, newnode, joininfo);
  899. Node_Copy(from, newnode, innerjoin);
  900. return newnode;
  901. }
  902. /* ----------------
  903.  * CopyPathFields
  904.  *
  905.  * This function copies the fields of the Path node.  It is used by
  906.  * all the copy functions for classes which inherit from Path.
  907.  * ----------------
  908.  */
  909. static void
  910. CopyPathFields(Path *from, Path *newnode)
  911. {
  912. newnode->pathtype = from->pathtype;
  913. /*
  914.  * Modify the next line, since it causes the copying to cycle (i.e.
  915.  * the parent points right back here! -- JMH, 7/7/92. Old version:
  916.  * Node_Copy(from, newnode, parent);
  917.  */
  918. newnode->parent = from->parent;
  919. newnode->path_cost = from->path_cost;
  920. newnode->pathorder = makeNode(PathOrder);
  921. newnode->pathorder->ordtype = from->pathorder->ordtype;
  922. if (from->pathorder->ordtype == SORTOP_ORDER)
  923. {
  924. int len,
  925. i;
  926. Oid    *ordering = from->pathorder->ord.sortop;
  927. if (ordering)
  928. {
  929. for (len = 0; ordering[len] != 0; len++)
  930. ;
  931. newnode->pathorder->ord.sortop = (Oid *) palloc(sizeof(Oid) * (len + 1));
  932. for (i = 0; i < len; i++)
  933. newnode->pathorder->ord.sortop[i] = ordering[i];
  934. newnode->pathorder->ord.sortop[len] = 0;
  935. }
  936. }
  937. else
  938. Node_Copy(from, newnode, pathorder->ord.merge);
  939. Node_Copy(from, newnode, pathkeys);
  940. newnode->outerjoincost = from->outerjoincost;
  941. newnode->joinid = listCopy(from->joinid);
  942. Node_Copy(from, newnode, loc_restrictinfo);
  943. }
  944. /* ----------------
  945.  * _copyPath
  946.  * ----------------
  947.  */
  948. static Path *
  949. _copyPath(Path *from)
  950. {
  951. Path    *newnode = makeNode(Path);
  952. CopyPathFields(from, newnode);
  953. return newnode;
  954. }
  955. /* ----------------
  956.  * _copyIndexPath
  957.  * ----------------
  958.  */
  959. static IndexPath *
  960. _copyIndexPath(IndexPath *from)
  961. {
  962. IndexPath  *newnode = makeNode(IndexPath);
  963. /* ----------------
  964.  * copy the node superclass fields
  965.  * ----------------
  966.  */
  967. CopyPathFields((Path *) from, (Path *) newnode);
  968. /* ----------------
  969.  * copy remainder of node
  970.  * ----------------
  971.  */
  972. newnode->indexid = listCopy(from->indexid);
  973. Node_Copy(from, newnode, indexqual);
  974. if (from->indexkeys)
  975. {
  976. int i,
  977. len;
  978. for (len = 0; from->indexkeys[len] != 0; len++)
  979. ;
  980. newnode->indexkeys = (int *) palloc(sizeof(int) * (len + 1));
  981. for (i = 0; i < len; i++)
  982. newnode->indexkeys[i] = from->indexkeys[i];
  983. newnode->indexkeys[len] = 0;
  984. }
  985. return newnode;
  986. }
  987. /* ----------------
  988.  * CopyNestPathFields
  989.  *
  990.  * This function copies the fields of the NestPath node.  It is used by
  991.  * all the copy functions for classes which inherit from NestPath.
  992.  * ----------------
  993.  */
  994. static void
  995. CopyNestPathFields(NestPath *from, NestPath *newnode)
  996. {
  997. Node_Copy(from, newnode, pathinfo);
  998. Node_Copy(from, newnode, outerjoinpath);
  999. Node_Copy(from, newnode, innerjoinpath);
  1000. }
  1001. /* ----------------
  1002.  * _copyNestPath
  1003.  * ----------------
  1004.  */
  1005. static NestPath *
  1006. _copyNestPath(NestPath *from)
  1007. {
  1008. NestPath   *newnode = makeNode(NestPath);
  1009. /* ----------------
  1010.  * copy the node superclass fields
  1011.  * ----------------
  1012.  */
  1013. CopyPathFields((Path *) from, (Path *) newnode);
  1014. CopyNestPathFields(from, newnode);
  1015. return newnode;
  1016. }
  1017. /* ----------------
  1018.  * _copyMergePath
  1019.  * ----------------
  1020.  */
  1021. static MergePath *
  1022. _copyMergePath(MergePath *from)
  1023. {
  1024. MergePath  *newnode = makeNode(MergePath);
  1025. /* ----------------
  1026.  * copy the node superclass fields
  1027.  * ----------------
  1028.  */
  1029. CopyPathFields((Path *) from, (Path *) newnode);
  1030. CopyNestPathFields((NestPath *) from, (NestPath *) newnode);
  1031. /* ----------------
  1032.  * copy the remainder of the node
  1033.  * ----------------
  1034.  */
  1035. Node_Copy(from, newnode, path_mergeclauses);
  1036. Node_Copy(from, newnode, outersortkeys);
  1037. Node_Copy(from, newnode, innersortkeys);
  1038. return newnode;
  1039. }
  1040. /* ----------------
  1041.  * _copyHashPath
  1042.  * ----------------
  1043.  */
  1044. static HashPath *
  1045. _copyHashPath(HashPath *from)
  1046. {
  1047. HashPath   *newnode = makeNode(HashPath);
  1048. /* ----------------
  1049.  * copy the node superclass fields
  1050.  * ----------------
  1051.  */
  1052. CopyPathFields((Path *) from, (Path *) newnode);
  1053. CopyNestPathFields((NestPath *) from, (NestPath *) newnode);
  1054. /* ----------------
  1055.  * copy remainder of node
  1056.  * ----------------
  1057.  */
  1058. Node_Copy(from, newnode, path_hashclauses);
  1059. Node_Copy(from, newnode, outerhashkeys);
  1060. Node_Copy(from, newnode, innerhashkeys);
  1061. return newnode;
  1062. }
  1063. /* ----------------
  1064.  * _copyOrderKey
  1065.  * ----------------
  1066.  */
  1067. static OrderKey *
  1068. _copyOrderKey(OrderKey *from)
  1069. {
  1070. OrderKey   *newnode = makeNode(OrderKey);
  1071. /* ----------------
  1072.  * copy remainder of node
  1073.  * ----------------
  1074.  */
  1075. newnode->attribute_number = from->attribute_number;
  1076. newnode->array_index = from->array_index;
  1077. return newnode;
  1078. }
  1079. /* ----------------
  1080.  * _copyJoinKey
  1081.  * ----------------
  1082.  */
  1083. static JoinKey *
  1084. _copyJoinKey(JoinKey *from)
  1085. {
  1086. JoinKey    *newnode = makeNode(JoinKey);
  1087. /* ----------------
  1088.  * copy remainder of node
  1089.  * ----------------
  1090.  */
  1091. Node_Copy(from, newnode, outer);
  1092. Node_Copy(from, newnode, inner);
  1093. return newnode;
  1094. }
  1095. /* ----------------
  1096.  * _copyMergeOrder
  1097.  * ----------------
  1098.  */
  1099. static MergeOrder *
  1100. _copyMergeOrder(MergeOrder *from)
  1101. {
  1102. MergeOrder *newnode = makeNode(MergeOrder);
  1103. /* ----------------
  1104.  * copy remainder of node
  1105.  * ----------------
  1106.  */
  1107. newnode->join_operator = from->join_operator;
  1108. newnode->left_operator = from->left_operator;
  1109. newnode->right_operator = from->right_operator;
  1110. newnode->left_type = from->left_type;
  1111. newnode->right_type = from->right_type;
  1112. return newnode;
  1113. }
  1114. /* ----------------
  1115.  * _copyRestrictInfo
  1116.  * ----------------
  1117.  */
  1118. static RestrictInfo *
  1119. _copyRestrictInfo(RestrictInfo *from)
  1120. {
  1121. RestrictInfo *newnode = makeNode(RestrictInfo);
  1122. /* ----------------
  1123.  * copy remainder of node
  1124.  * ----------------
  1125.  */
  1126. Node_Copy(from, newnode, clause);
  1127. newnode->selectivity = from->selectivity;
  1128. newnode->notclause = from->notclause;
  1129. Node_Copy(from, newnode, indexids);
  1130. Node_Copy(from, newnode, mergejoinorder);
  1131. newnode->hashjoinoperator = from->hashjoinoperator;
  1132. newnode->restrictinfojoinid = listCopy(from->restrictinfojoinid);
  1133. return newnode;
  1134. }
  1135. /* ----------------
  1136.  * CopyJoinMethodFields
  1137.  *
  1138.  * This function copies the fields of the JoinMethod node.  It is used by
  1139.  * all the copy functions for classes which inherit from JoinMethod.
  1140.  * ----------------
  1141.  */
  1142. static void
  1143. CopyJoinMethodFields(JoinMethod *from, JoinMethod *newnode)
  1144. {
  1145. Node_Copy(from, newnode, jmkeys);
  1146. Node_Copy(from, newnode, clauses);
  1147. return;
  1148. }
  1149. /* ----------------
  1150.  * _copyJoinMethod
  1151.  * ----------------
  1152.  */
  1153. static JoinMethod *
  1154. _copyJoinMethod(JoinMethod *from)
  1155. {
  1156. JoinMethod *newnode = makeNode(JoinMethod);
  1157. CopyJoinMethodFields(from, newnode);
  1158. return newnode;
  1159. }
  1160. /* ----------------
  1161.  * _copyHashInfo
  1162.  * ----------------
  1163.  */
  1164. static HashInfo *
  1165. _copyHashInfo(HashInfo *from)
  1166. {
  1167. HashInfo   *newnode = makeNode(HashInfo);
  1168. /* ----------------
  1169.  * copy remainder of node
  1170.  * ----------------
  1171.  */
  1172. CopyJoinMethodFields((JoinMethod *) from, (JoinMethod *) newnode);
  1173. newnode->hashop = from->hashop;
  1174. return newnode;
  1175. }
  1176. /* ----------------
  1177.  * _copyMergeInfo
  1178.  * ----------------
  1179.  */
  1180. static MergeInfo *
  1181. _copyMergeInfo(MergeInfo *from)
  1182. {
  1183. MergeInfo  *newnode = makeNode(MergeInfo);
  1184. /* ----------------
  1185.  * copy remainder of node
  1186.  * ----------------
  1187.  */
  1188. CopyJoinMethodFields((JoinMethod *) from, (JoinMethod *) newnode);
  1189. Node_Copy(from, newnode, m_ordering);
  1190. return newnode;
  1191. }
  1192. /* ----------------
  1193.  * _copyJoinInfo
  1194.  * ----------------
  1195.  */
  1196. static JoinInfo *
  1197. _copyJoinInfo(JoinInfo *from)
  1198. {
  1199. JoinInfo   *newnode = makeNode(JoinInfo);
  1200. /* ----------------
  1201.  * copy remainder of node
  1202.  * ----------------
  1203.  */
  1204. newnode->unjoined_relids = listCopy(from->unjoined_relids);
  1205. Node_Copy(from, newnode, jinfo_restrictinfo);
  1206. newnode->mergejoinable = from->mergejoinable;
  1207. newnode->hashjoinable = from->hashjoinable;
  1208. return newnode;
  1209. }
  1210. static Iter *
  1211. _copyIter(Iter *from)
  1212. {
  1213. Iter    *newnode = makeNode(Iter);
  1214. Node_Copy(from, newnode, iterexpr);
  1215. newnode->itertype = from->itertype;
  1216. return newnode;
  1217. }
  1218. static Stream *
  1219. _copyStream(Stream *from)
  1220. {
  1221. Stream    *newnode = makeNode(Stream);
  1222. newnode->pathptr = from->pathptr;
  1223. newnode->cinfo = from->cinfo;
  1224. newnode->clausetype = from->clausetype;
  1225. newnode->upstream = (StreamPtr) NULL; /* only copy nodes
  1226.  * downwards! */
  1227. Node_Copy(from, newnode, downstream);
  1228. if (newnode->downstream)
  1229. ((Stream *) newnode->downstream)->upstream = (Stream *) newnode;
  1230. newnode->groupup = from->groupup;
  1231. newnode->groupcost = from->groupcost;
  1232. newnode->groupsel = from->groupsel;
  1233. return newnode;
  1234. }
  1235. /*
  1236.  * parsenodes.h routines have no copy functions
  1237.  */
  1238. static TargetEntry *
  1239. _copyTargetEntry(TargetEntry *from)
  1240. {
  1241. TargetEntry *newnode = makeNode(TargetEntry);
  1242. Node_Copy(from, newnode, resdom);
  1243. Node_Copy(from, newnode, fjoin);
  1244. Node_Copy(from, newnode, expr);
  1245. return newnode;
  1246. }
  1247. static RangeTblEntry *
  1248. _copyRangeTblEntry(RangeTblEntry *from)
  1249. {
  1250. RangeTblEntry *newnode = makeNode(RangeTblEntry);
  1251. if (from->relname)
  1252. newnode->relname = pstrdup(from->relname);
  1253. if (from->refname)
  1254. newnode->refname = pstrdup(from->refname);
  1255. newnode->relid = from->relid;
  1256. newnode->inh = from->inh;
  1257. newnode->inFromCl = from->inFromCl;
  1258. newnode->skipAcl = from->skipAcl;
  1259. return newnode;
  1260. }
  1261. static RowMark *
  1262. _copyRowMark(RowMark *from)
  1263. {
  1264. RowMark    *newnode = makeNode(RowMark);
  1265. newnode->rti = from->rti;
  1266. newnode->info = from->info;
  1267. return newnode;
  1268. }
  1269. static SortClause *
  1270. _copySortClause(SortClause *from)
  1271. {
  1272. SortClause *newnode = makeNode(SortClause);
  1273. Node_Copy(from, newnode, resdom);
  1274. newnode->opoid = from->opoid;
  1275. return newnode;
  1276. }
  1277. static A_Const *
  1278. _copyAConst(A_Const *from)
  1279. {
  1280. A_Const    *newnode = makeNode(A_Const);
  1281. newnode->val = *((Value *) (copyObject(&(from->val))));
  1282. Node_Copy(from, newnode, typename);
  1283. return newnode;
  1284. }
  1285. static TypeName *
  1286. _copyTypeName(TypeName *from)
  1287. {
  1288. TypeName   *newnode = makeNode(TypeName);
  1289. if (from->name)
  1290. newnode->name = pstrdup(from->name);
  1291. newnode->timezone = from->timezone;
  1292. newnode->setof = from->setof;
  1293. newnode->typmod = from->typmod;
  1294. Node_Copy(from, newnode, arrayBounds);
  1295. return newnode;
  1296. }
  1297. static Query *
  1298. _copyQuery(Query *from)
  1299. {
  1300. Query    *newnode = makeNode(Query);
  1301. newnode->commandType = from->commandType;
  1302. if (from->utilityStmt && nodeTag(from->utilityStmt) == T_NotifyStmt)
  1303. {
  1304. NotifyStmt *from_notify = (NotifyStmt *) from->utilityStmt;
  1305. NotifyStmt *n = makeNode(NotifyStmt);
  1306. n->relname = pstrdup(from_notify->relname);
  1307. newnode->utilityStmt = (Node *) n;
  1308. }
  1309. newnode->resultRelation = from->resultRelation;
  1310. if (from->into)
  1311. newnode->into = pstrdup(from->into);
  1312. newnode->isPortal = from->isPortal;
  1313. newnode->isBinary = from->isBinary;
  1314. newnode->isTemp = from->isTemp;
  1315. newnode->unionall = from->unionall;
  1316. if (from->uniqueFlag)
  1317. newnode->uniqueFlag = pstrdup(from->uniqueFlag);
  1318. Node_Copy(from, newnode, sortClause);
  1319. Node_Copy(from, newnode, rtable);
  1320. Node_Copy(from, newnode, targetList);
  1321. Node_Copy(from, newnode, qual);
  1322. Node_Copy(from, newnode, groupClause);
  1323. Node_Copy(from, newnode, havingQual);
  1324. newnode->hasAggs = from->hasAggs;
  1325. newnode->hasSubLinks = from->hasSubLinks;
  1326. if (from->unionClause)
  1327. {
  1328. List    *ulist,
  1329.    *temp_list = NIL;
  1330. foreach(ulist, from->unionClause)
  1331. temp_list = lappend(temp_list, copyObject(lfirst(ulist)));
  1332. newnode->unionClause = temp_list;
  1333. }
  1334. Node_Copy(from, newnode, limitOffset);
  1335. Node_Copy(from, newnode, limitCount);
  1336. Node_Copy(from, newnode, rowMark);
  1337. return newnode;
  1338. }
  1339. /*
  1340.  * mnodes.h routines have no copy functions
  1341.  */
  1342. /* ****************************************************************
  1343.  * pg_list.h copy functions
  1344.  * ****************************************************************
  1345.  */
  1346. static Value *
  1347. _copyValue(Value *from)
  1348. {
  1349. Value    *newnode = makeNode(Value);
  1350. newnode->type = from->type;
  1351. switch (from->type)
  1352. {
  1353. case T_String:
  1354. newnode->val.str = pstrdup(from->val.str);
  1355. break;
  1356. case T_Integer:
  1357. newnode->val.ival = from->val.ival;
  1358. break;
  1359. case T_Float:
  1360. newnode->val.dval = from->val.dval;
  1361. break;
  1362. default:
  1363. break;
  1364. }
  1365. return newnode;
  1366. }
  1367. /* ----------------
  1368.  * copyObject returns a copy of the node or list. If it is a list, it
  1369.  * recursively copies its items.
  1370.  * ----------------
  1371.  */
  1372. void *
  1373. copyObject(void *from)
  1374. {
  1375. void    *retval;
  1376. if (from == NULL)
  1377. return NULL;
  1378. switch (nodeTag(from))
  1379. {
  1380. /*
  1381.  * PLAN NODES
  1382.  */
  1383. case T_Plan:
  1384. retval = _copyPlan(from);
  1385. break;
  1386. case T_Result:
  1387. retval = _copyResult(from);
  1388. break;
  1389. case T_Append:
  1390. retval = _copyAppend(from);
  1391. break;
  1392. case T_Scan:
  1393. retval = _copyScan(from);
  1394. break;
  1395. case T_SeqScan:
  1396. retval = _copySeqScan(from);
  1397. break;
  1398. case T_IndexScan:
  1399. retval = _copyIndexScan(from);
  1400. break;
  1401. case T_Join:
  1402. retval = _copyJoin(from);
  1403. break;
  1404. case T_NestLoop:
  1405. retval = _copyNestLoop(from);
  1406. break;
  1407. case T_MergeJoin:
  1408. retval = _copyMergeJoin(from);
  1409. break;
  1410. case T_HashJoin:
  1411. retval = _copyHashJoin(from);
  1412. break;
  1413. case T_Noname:
  1414. retval = _copyNoname(from);
  1415. break;
  1416. case T_Material:
  1417. retval = _copyMaterial(from);
  1418. break;
  1419. case T_Sort:
  1420. retval = _copySort(from);
  1421. break;
  1422. case T_Group:
  1423. retval = _copyGroup(from);
  1424. break;
  1425. case T_Agg:
  1426. retval = _copyAgg(from);
  1427. break;
  1428. case T_GroupClause:
  1429. retval = _copyGroupClause(from);
  1430. break;
  1431. case T_Unique:
  1432. retval = _copyUnique(from);
  1433. break;
  1434. case T_Hash:
  1435. retval = _copyHash(from);
  1436. break;
  1437. case T_SubPlan:
  1438. retval = _copySubPlan(from);
  1439. break;
  1440. /*
  1441.  * PRIMITIVE NODES
  1442.  */
  1443. case T_Resdom:
  1444. retval = _copyResdom(from);
  1445. break;
  1446. case T_Fjoin:
  1447. retval = _copyFjoin(from);
  1448. break;
  1449. case T_Expr:
  1450. retval = _copyExpr(from);
  1451. break;
  1452. case T_Var:
  1453. retval = _copyVar(from);
  1454. break;
  1455. case T_Oper:
  1456. retval = _copyOper(from);
  1457. break;
  1458. case T_Const:
  1459. retval = _copyConst(from);
  1460. break;
  1461. case T_Param:
  1462. retval = _copyParam(from);
  1463. break;
  1464. case T_Func:
  1465. retval = _copyFunc(from);
  1466. break;
  1467. case T_Array:
  1468. retval = _copyArray(from);
  1469. break;
  1470. case T_ArrayRef:
  1471. retval = _copyArrayRef(from);
  1472. break;
  1473. case T_Aggref:
  1474. retval = _copyAggref(from);
  1475. break;
  1476. case T_SubLink:
  1477. retval = _copySubLink(from);
  1478. break;
  1479. case T_CaseExpr:
  1480. retval = _copyCaseExpr(from);
  1481. break;
  1482. case T_CaseWhen:
  1483. retval = _copyCaseWhen(from);
  1484. break;
  1485. /*
  1486.  * RELATION NODES
  1487.  */
  1488. case T_RelOptInfo:
  1489. retval = _copyRelOptInfo(from);
  1490. break;
  1491. case T_Path:
  1492. retval = _copyPath(from);
  1493. break;
  1494. case T_IndexPath:
  1495. retval = _copyIndexPath(from);
  1496. break;
  1497. case T_NestPath:
  1498. retval = _copyNestPath(from);
  1499. break;
  1500. case T_MergePath:
  1501. retval = _copyMergePath(from);
  1502. break;
  1503. case T_HashPath:
  1504. retval = _copyHashPath(from);
  1505. break;
  1506. case T_OrderKey:
  1507. retval = _copyOrderKey(from);
  1508. break;
  1509. case T_JoinKey:
  1510. retval = _copyJoinKey(from);
  1511. break;
  1512. case T_MergeOrder:
  1513. retval = _copyMergeOrder(from);
  1514. break;
  1515. case T_RestrictInfo:
  1516. retval = _copyRestrictInfo(from);
  1517. break;
  1518. case T_JoinMethod:
  1519. retval = _copyJoinMethod(from);
  1520. break;
  1521. case T_HashInfo:
  1522. retval = _copyHashInfo(from);
  1523. break;
  1524. case T_MergeInfo:
  1525. retval = _copyMergeInfo(from);
  1526. break;
  1527. case T_JoinInfo:
  1528. retval = _copyJoinInfo(from);
  1529. break;
  1530. case T_Iter:
  1531. retval = _copyIter(from);
  1532. break;
  1533. case T_Stream:
  1534. retval = _copyStream(from);
  1535. break;
  1536. /*
  1537.  * PARSE NODES
  1538.  */
  1539. case T_Query:
  1540. retval = _copyQuery(from);
  1541. break;
  1542. case T_TargetEntry:
  1543. retval = _copyTargetEntry(from);
  1544. break;
  1545. case T_RangeTblEntry:
  1546. retval = _copyRangeTblEntry(from);
  1547. break;
  1548. case T_RowMark:
  1549. retval = _copyRowMark(from);
  1550. break;
  1551. case T_SortClause:
  1552. retval = _copySortClause(from);
  1553. break;
  1554. case T_A_Const:
  1555. retval = _copyAConst(from);
  1556. break;
  1557. case T_TypeName:
  1558. retval = _copyTypeName(from);
  1559. break;
  1560. /*
  1561.  * VALUE NODES
  1562.  */
  1563. case T_Integer:
  1564. case T_String:
  1565. case T_Float:
  1566. retval = _copyValue(from);
  1567. break;
  1568. case T_List:
  1569. {
  1570. List    *list = from,
  1571.    *l;
  1572. List    *newlist = NIL,
  1573.    *nl = NIL;
  1574. foreach(l, list)
  1575. {
  1576. if (newlist == NIL)
  1577. newlist = nl = lcons(copyObject(lfirst(l)), NIL);
  1578. else
  1579. {
  1580. lnext(nl) = lcons(copyObject(lfirst(l)), NIL);
  1581. nl = lnext(nl);
  1582. }
  1583. }
  1584. retval = newlist;
  1585. }
  1586. break;
  1587. default:
  1588. elog(ERROR, "copyObject: don't know how to copy %d", nodeTag(from));
  1589. retval = from;
  1590. break;
  1591. }
  1592. return retval;
  1593. }