diff options
Diffstat (limited to 'src/backend/nodes/copyfuncs.c')
-rw-r--r-- | src/backend/nodes/copyfuncs.c | 1949 |
1 files changed, 874 insertions, 1075 deletions
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index da3bf7b7213..0f02b5d119b 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -15,7 +15,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.221 2002/11/24 21:52:13 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.222 2002/11/25 03:33:27 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -28,11 +28,44 @@ /* - * Node_Copy - * a macro to simplify calling of copyObject on the specified field + * Macros to simplify copying of different kinds of fields. Use these + * wherever possible to reduce the chance for silly typos. Note that these + * hard-wire the convention that the local variables in a Copy routine are + * named 'newnode' and 'from'. */ -#define Node_Copy(from, newnode, field) \ - ((newnode)->field = copyObject((from)->field)) + +/* Copy a simple scalar field (int, float, bool, enum, etc) */ +#define COPY_SCALAR_FIELD(fldname) \ + (newnode->fldname = from->fldname) + +/* Copy a field that is a pointer to some kind of Node or Node tree */ +#define COPY_NODE_FIELD(fldname) \ + (newnode->fldname = copyObject(from->fldname)) + +/* Copy a field that is a pointer to a list of integers */ +#define COPY_INTLIST_FIELD(fldname) \ + (newnode->fldname = listCopy(from->fldname)) + +/* Copy a field that is a pointer to a C string, or perhaps NULL */ +#define COPY_STRING_FIELD(fldname) \ + (newnode->fldname = from->fldname ? pstrdup(from->fldname) : (char *) NULL) + +/* Copy a field that is a pointer to a simple palloc'd object of size sz */ +#define COPY_POINTER_FIELD(fldname, sz) \ + do { \ + Size _size = (sz); \ + newnode->fldname = palloc(_size); \ + memcpy(newnode->fldname, from->fldname, _size); \ + } while (0) + +/* Special hack for fixing subplan lists of Plan nodes (ick) */ +#define FIX_SUBPLAN_LINKS(subplanfldname, fldname) \ + do { \ + if (from->subplanfldname != NIL) \ + newnode->subplanfldname = \ + nconc(newnode->subplanfldname, \ + pull_subplans((Node *) (newnode->fldname))); \ + } while (0) /* @@ -73,41 +106,37 @@ listCopy(List *list) * **************************************************************** */ -/* ---------------- - * CopyPlanFields +/* + * CopyPlanFields * * This function copies the fields of the Plan node. It is used by * all the copy functions for classes which inherit from Plan. - * ---------------- */ static void CopyPlanFields(Plan *from, Plan *newnode) { - newnode->startup_cost = from->startup_cost; - newnode->total_cost = from->total_cost; - newnode->plan_rows = from->plan_rows; - newnode->plan_width = from->plan_width; - /* state is NOT copied */ - Node_Copy(from, newnode, targetlist); - Node_Copy(from, newnode, qual); - Node_Copy(from, newnode, lefttree); - Node_Copy(from, newnode, righttree); - newnode->extParam = listCopy(from->extParam); - newnode->locParam = listCopy(from->locParam); - newnode->chgParam = listCopy(from->chgParam); - Node_Copy(from, newnode, initPlan); + COPY_SCALAR_FIELD(startup_cost); + COPY_SCALAR_FIELD(total_cost); + COPY_SCALAR_FIELD(plan_rows); + COPY_SCALAR_FIELD(plan_width); + /* execution state is NOT copied */ + COPY_NODE_FIELD(targetlist); + COPY_NODE_FIELD(qual); + COPY_NODE_FIELD(lefttree); + COPY_NODE_FIELD(righttree); + COPY_INTLIST_FIELD(extParam); + COPY_INTLIST_FIELD(locParam); + COPY_INTLIST_FIELD(chgParam); + COPY_NODE_FIELD(initPlan); /* subPlan list must point to subplans in the new subtree, not the old */ - if (from->subPlan != NIL) - newnode->subPlan = nconc(pull_subplans((Node *) newnode->targetlist), - pull_subplans((Node *) newnode->qual)); - else - newnode->subPlan = NIL; - newnode->nParamExec = from->nParamExec; + newnode->subPlan = NIL; + FIX_SUBPLAN_LINKS(subPlan, targetlist); + FIX_SUBPLAN_LINKS(subPlan, qual); + COPY_SCALAR_FIELD(nParamExec); } -/* ---------------- - * _copyPlan - * ---------------- +/* + * _copyPlan */ static Plan * _copyPlan(Plan *from) @@ -115,7 +144,7 @@ _copyPlan(Plan *from) Plan *newnode = makeNode(Plan); /* - * copy the node superclass fields + * copy node superclass fields */ CopyPlanFields(from, newnode); @@ -123,9 +152,8 @@ _copyPlan(Plan *from) } -/* ---------------- - * _copyResult - * ---------------- +/* + * _copyResult */ static Result * _copyResult(Result *from) @@ -140,22 +168,16 @@ _copyResult(Result *from) /* * copy remainder of node */ - Node_Copy(from, newnode, resconstantqual); + COPY_NODE_FIELD(resconstantqual); - /* - * We must add subplans in resconstantqual to the new plan's subPlan - * list - */ - if (from->plan.subPlan != NIL) - newnode->plan.subPlan = nconc(newnode->plan.subPlan, - pull_subplans(newnode->resconstantqual)); + /* subPlan list must point to subplans in the new subtree, not the old */ + FIX_SUBPLAN_LINKS(plan.subPlan, resconstantqual); return newnode; } -/* ---------------- - * _copyAppend - * ---------------- +/* + * _copyAppend */ static Append * _copyAppend(Append *from) @@ -170,30 +192,29 @@ _copyAppend(Append *from) /* * copy remainder of node */ - Node_Copy(from, newnode, appendplans); - newnode->isTarget = from->isTarget; + COPY_NODE_FIELD(appendplans); + COPY_SCALAR_FIELD(isTarget); return newnode; } -/* ---------------- - * CopyScanFields +/* + * CopyScanFields * * This function copies the fields of the Scan node. It is used by * all the copy functions for classes which inherit from Scan. - * ---------------- */ static void CopyScanFields(Scan *from, Scan *newnode) { - newnode->scanrelid = from->scanrelid; - return; + CopyPlanFields((Plan *) from, (Plan *) newnode); + + COPY_SCALAR_FIELD(scanrelid); } -/* ---------------- - * _copyScan - * ---------------- +/* + * _copyScan */ static Scan * _copyScan(Scan *from) @@ -203,15 +224,13 @@ _copyScan(Scan *from) /* * copy node superclass fields */ - CopyPlanFields((Plan *) from, (Plan *) newnode); CopyScanFields((Scan *) from, (Scan *) newnode); return newnode; } -/* ---------------- - * _copySeqScan - * ---------------- +/* + * _copySeqScan */ static SeqScan * _copySeqScan(SeqScan *from) @@ -221,15 +240,13 @@ _copySeqScan(SeqScan *from) /* * copy node superclass fields */ - CopyPlanFields((Plan *) from, (Plan *) newnode); CopyScanFields((Scan *) from, (Scan *) newnode); return newnode; } -/* ---------------- - * _copyIndexScan - * ---------------- +/* + * _copyIndexScan */ static IndexScan * _copyIndexScan(IndexScan *from) @@ -239,34 +256,25 @@ _copyIndexScan(IndexScan *from) /* * copy node superclass fields */ - CopyPlanFields((Plan *) from, (Plan *) newnode); CopyScanFields((Scan *) from, (Scan *) newnode); /* * copy remainder of node */ - newnode->indxid = listCopy(from->indxid); - Node_Copy(from, newnode, indxqual); - Node_Copy(from, newnode, indxqualorig); - newnode->indxorderdir = from->indxorderdir; + COPY_INTLIST_FIELD(indxid); + COPY_NODE_FIELD(indxqual); + COPY_NODE_FIELD(indxqualorig); + COPY_SCALAR_FIELD(indxorderdir); - /* - * We must add subplans in index quals to the new plan's subPlan list - */ - if (from->scan.plan.subPlan != NIL) - { - newnode->scan.plan.subPlan = nconc(newnode->scan.plan.subPlan, - pull_subplans((Node *) newnode->indxqual)); - newnode->scan.plan.subPlan = nconc(newnode->scan.plan.subPlan, - pull_subplans((Node *) newnode->indxqualorig)); - } + /* subPlan list must point to subplans in the new subtree, not the old */ + FIX_SUBPLAN_LINKS(scan.plan.subPlan, indxqual); + FIX_SUBPLAN_LINKS(scan.plan.subPlan, indxqualorig); return newnode; } -/* ---------------- - * _copyTidScan - * ---------------- +/* + * _copyTidScan */ static TidScan * _copyTidScan(TidScan *from) @@ -276,21 +284,22 @@ _copyTidScan(TidScan *from) /* * copy node superclass fields */ - CopyPlanFields((Plan *) from, (Plan *) newnode); CopyScanFields((Scan *) from, (Scan *) newnode); /* * copy remainder of node */ - newnode->needRescan = from->needRescan; - Node_Copy(from, newnode, tideval); + COPY_SCALAR_FIELD(needRescan); + COPY_NODE_FIELD(tideval); + + /* subPlan list must point to subplans in the new subtree, not the old */ + FIX_SUBPLAN_LINKS(scan.plan.subPlan, tideval); return newnode; } -/* ---------------- - * _copySubqueryScan - * ---------------- +/* + * _copySubqueryScan */ static SubqueryScan * _copySubqueryScan(SubqueryScan *from) @@ -300,20 +309,18 @@ _copySubqueryScan(SubqueryScan *from) /* * copy node superclass fields */ - CopyPlanFields((Plan *) from, (Plan *) newnode); CopyScanFields((Scan *) from, (Scan *) newnode); /* * copy remainder of node */ - Node_Copy(from, newnode, subplan); + COPY_NODE_FIELD(subplan); return newnode; } -/* ---------------- - * _copyFunctionScan - * ---------------- +/* + * _copyFunctionScan */ static FunctionScan * _copyFunctionScan(FunctionScan *from) @@ -323,34 +330,32 @@ _copyFunctionScan(FunctionScan *from) /* * copy node superclass fields */ - CopyPlanFields((Plan *) from, (Plan *) newnode); CopyScanFields((Scan *) from, (Scan *) newnode); return newnode; } -/* ---------------- - * CopyJoinFields +/* + * CopyJoinFields * * This function copies the fields of the Join node. It is used by * all the copy functions for classes which inherit from Join. - * ---------------- */ static void CopyJoinFields(Join *from, Join *newnode) { - newnode->jointype = from->jointype; - Node_Copy(from, newnode, joinqual); + CopyPlanFields((Plan *) from, (Plan *) newnode); + + COPY_SCALAR_FIELD(jointype); + COPY_NODE_FIELD(joinqual); + /* subPlan list must point to subplans in the new subtree, not the old */ - if (from->plan.subPlan != NIL) - newnode->plan.subPlan = nconc(newnode->plan.subPlan, - pull_subplans((Node *) newnode->joinqual)); + FIX_SUBPLAN_LINKS(plan.subPlan, joinqual); } -/* ---------------- - * _copyJoin - * ---------------- +/* + * _copyJoin */ static Join * _copyJoin(Join *from) @@ -360,16 +365,14 @@ _copyJoin(Join *from) /* * copy node superclass fields */ - CopyPlanFields((Plan *) from, (Plan *) newnode); CopyJoinFields(from, newnode); return newnode; } -/* ---------------- - * _copyNestLoop - * ---------------- +/* + * _copyNestLoop */ static NestLoop * _copyNestLoop(NestLoop *from) @@ -379,16 +382,14 @@ _copyNestLoop(NestLoop *from) /* * copy node superclass fields */ - CopyPlanFields((Plan *) from, (Plan *) newnode); CopyJoinFields((Join *) from, (Join *) newnode); return newnode; } -/* ---------------- - * _copyMergeJoin - * ---------------- +/* + * _copyMergeJoin */ static MergeJoin * _copyMergeJoin(MergeJoin *from) @@ -398,27 +399,21 @@ _copyMergeJoin(MergeJoin *from) /* * copy node superclass fields */ - CopyPlanFields((Plan *) from, (Plan *) newnode); CopyJoinFields((Join *) from, (Join *) newnode); /* * copy remainder of node */ - Node_Copy(from, newnode, mergeclauses); + COPY_NODE_FIELD(mergeclauses); - /* - * We must add subplans in mergeclauses to the new plan's subPlan list - */ - if (from->join.plan.subPlan != NIL) - newnode->join.plan.subPlan = nconc(newnode->join.plan.subPlan, - pull_subplans((Node *) newnode->mergeclauses)); + /* subPlan list must point to subplans in the new subtree, not the old */ + FIX_SUBPLAN_LINKS(join.plan.subPlan, mergeclauses); return newnode; } -/* ---------------- - * _copyHashJoin - * ---------------- +/* + * _copyHashJoin */ static HashJoin * _copyHashJoin(HashJoin *from) @@ -428,29 +423,23 @@ _copyHashJoin(HashJoin *from) /* * copy node superclass fields */ - CopyPlanFields((Plan *) from, (Plan *) newnode); CopyJoinFields((Join *) from, (Join *) newnode); /* * copy remainder of node */ - Node_Copy(from, newnode, hashclauses); - newnode->hashjoinop = from->hashjoinop; + COPY_NODE_FIELD(hashclauses); + COPY_SCALAR_FIELD(hashjoinop); - /* - * We must add subplans in hashclauses to the new plan's subPlan list - */ - if (from->join.plan.subPlan != NIL) - newnode->join.plan.subPlan = nconc(newnode->join.plan.subPlan, - pull_subplans((Node *) newnode->hashclauses)); + /* subPlan list must point to subplans in the new subtree, not the old */ + FIX_SUBPLAN_LINKS(join.plan.subPlan, hashclauses); return newnode; } -/* ---------------- - * _copyMaterial - * ---------------- +/* + * _copyMaterial */ static Material * _copyMaterial(Material *from) @@ -466,9 +455,8 @@ _copyMaterial(Material *from) } -/* ---------------- - * _copySort - * ---------------- +/* + * _copySort */ static Sort * _copySort(Sort *from) @@ -480,15 +468,14 @@ _copySort(Sort *from) */ CopyPlanFields((Plan *) from, (Plan *) newnode); - newnode->keycount = from->keycount; + COPY_SCALAR_FIELD(keycount); return newnode; } -/* ---------------- - * _copyGroup - * ---------------- +/* + * _copyGroup */ static Group * _copyGroup(Group *from) @@ -497,17 +484,14 @@ _copyGroup(Group *from) CopyPlanFields((Plan *) from, (Plan *) newnode); - newnode->numCols = from->numCols; - newnode->grpColIdx = palloc(from->numCols * sizeof(AttrNumber)); - memcpy(newnode->grpColIdx, from->grpColIdx, - from->numCols * sizeof(AttrNumber)); + COPY_SCALAR_FIELD(numCols); + COPY_POINTER_FIELD(grpColIdx, from->numCols * sizeof(AttrNumber)); return newnode; } -/* --------------- - * _copyAgg - * -------------- +/* + * _copyAgg */ static Agg * _copyAgg(Agg *from) @@ -516,37 +500,17 @@ _copyAgg(Agg *from) CopyPlanFields((Plan *) from, (Plan *) newnode); - newnode->aggstrategy = from->aggstrategy; - newnode->numCols = from->numCols; + COPY_SCALAR_FIELD(aggstrategy); + COPY_SCALAR_FIELD(numCols); if (from->numCols > 0) - { - newnode->grpColIdx = palloc(from->numCols * sizeof(AttrNumber)); - memcpy(newnode->grpColIdx, from->grpColIdx, - from->numCols * sizeof(AttrNumber)); - } - newnode->numGroups = from->numGroups; - - return newnode; -} - -/* --------------- - * _copyGroupClause - * -------------- - */ -static GroupClause * -_copyGroupClause(GroupClause *from) -{ - GroupClause *newnode = makeNode(GroupClause); - - newnode->tleSortGroupRef = from->tleSortGroupRef; - newnode->sortop = from->sortop; + COPY_POINTER_FIELD(grpColIdx, from->numCols * sizeof(AttrNumber)); + COPY_SCALAR_FIELD(numGroups); return newnode; } -/* ---------------- - * _copyUnique - * ---------------- +/* + * _copyUnique */ static Unique * _copyUnique(Unique *from) @@ -561,16 +525,14 @@ _copyUnique(Unique *from) /* * copy remainder of node */ - newnode->numCols = from->numCols; - newnode->uniqColIdx = palloc(from->numCols * sizeof(AttrNumber)); - memcpy(newnode->uniqColIdx, from->uniqColIdx, from->numCols * sizeof(AttrNumber)); + COPY_SCALAR_FIELD(numCols); + COPY_POINTER_FIELD(uniqColIdx, from->numCols * sizeof(AttrNumber)); return newnode; } -/* ---------------- - * _copySetOp - * ---------------- +/* + * _copySetOp */ static SetOp * _copySetOp(SetOp *from) @@ -585,18 +547,16 @@ _copySetOp(SetOp *from) /* * copy remainder of node */ - newnode->cmd = from->cmd; - newnode->numCols = from->numCols; - newnode->dupColIdx = palloc(from->numCols * sizeof(AttrNumber)); - memcpy(newnode->dupColIdx, from->dupColIdx, from->numCols * sizeof(AttrNumber)); - newnode->flagColIdx = from->flagColIdx; + COPY_SCALAR_FIELD(cmd); + COPY_SCALAR_FIELD(numCols); + COPY_POINTER_FIELD(dupColIdx, from->numCols * sizeof(AttrNumber)); + COPY_SCALAR_FIELD(flagColIdx); return newnode; } -/* ---------------- - * _copyLimit - * ---------------- +/* + * _copyLimit */ static Limit * _copyLimit(Limit *from) @@ -611,15 +571,14 @@ _copyLimit(Limit *from) /* * copy remainder of node */ - Node_Copy(from, newnode, limitOffset); - Node_Copy(from, newnode, limitCount); + COPY_NODE_FIELD(limitOffset); + COPY_NODE_FIELD(limitCount); return newnode; } -/* ---------------- - * _copyHash - * ---------------- +/* + * _copyHash */ static Hash * _copyHash(Hash *from) @@ -634,7 +593,9 @@ _copyHash(Hash *from) /* * copy remainder of node */ - Node_Copy(from, newnode, hashkey); + COPY_NODE_FIELD(hashkey); + + /* XXX could the hashkey contain subplans? Not at present... */ return newnode; } @@ -644,12 +605,12 @@ _copySubPlan(SubPlan *from) { SubPlan *newnode = makeNode(SubPlan); - Node_Copy(from, newnode, plan); - newnode->plan_id = from->plan_id; - Node_Copy(from, newnode, rtable); - newnode->setParam = listCopy(from->setParam); - newnode->parParam = listCopy(from->parParam); - Node_Copy(from, newnode, sublink); + COPY_NODE_FIELD(plan); + COPY_SCALAR_FIELD(plan_id); + COPY_NODE_FIELD(rtable); + COPY_INTLIST_FIELD(setParam); + COPY_INTLIST_FIELD(parParam); + COPY_NODE_FIELD(sublink); /* do not copy execution state */ newnode->needShutdown = false; @@ -663,24 +624,22 @@ _copySubPlan(SubPlan *from) * **************************************************************** */ -/* ---------------- - * _copyResdom - * ---------------- +/* + * _copyResdom */ static Resdom * _copyResdom(Resdom *from) { Resdom *newnode = makeNode(Resdom); - newnode->resno = from->resno; - newnode->restype = from->restype; - newnode->restypmod = from->restypmod; - if (from->resname != NULL) - newnode->resname = pstrdup(from->resname); - newnode->ressortgroupref = from->ressortgroupref; - newnode->reskey = from->reskey; - newnode->reskeyop = from->reskeyop; - newnode->resjunk = from->resjunk; + COPY_SCALAR_FIELD(resno); + COPY_SCALAR_FIELD(restype); + COPY_SCALAR_FIELD(restypmod); + COPY_STRING_FIELD(resname); + COPY_SCALAR_FIELD(ressortgroupref); + COPY_SCALAR_FIELD(reskey); + COPY_SCALAR_FIELD(reskeyop); + COPY_SCALAR_FIELD(resjunk); return newnode; } @@ -690,112 +649,105 @@ _copyFjoin(Fjoin *from) { Fjoin *newnode = makeNode(Fjoin); - /* - * copy node superclass fields - */ + COPY_SCALAR_FIELD(fj_initialized); + COPY_SCALAR_FIELD(fj_nNodes); + COPY_NODE_FIELD(fj_innerNode); + COPY_POINTER_FIELD(fj_results, from->fj_nNodes * sizeof(Datum)); + COPY_POINTER_FIELD(fj_alwaysDone, from->fj_nNodes * sizeof(bool)); - newnode->fj_initialized = from->fj_initialized; - newnode->fj_nNodes = from->fj_nNodes; + return newnode; +} - Node_Copy(from, newnode, fj_innerNode); +static Alias * +_copyAlias(Alias *from) +{ + Alias *newnode = makeNode(Alias); - newnode->fj_results = (DatumPtr) - palloc((from->fj_nNodes) * sizeof(Datum)); - memmove(from->fj_results, - newnode->fj_results, - (from->fj_nNodes) * sizeof(Datum)); + COPY_STRING_FIELD(aliasname); + COPY_NODE_FIELD(colnames); - newnode->fj_alwaysDone = (BoolPtr) - palloc((from->fj_nNodes) * sizeof(bool)); - memmove(from->fj_alwaysDone, - newnode->fj_alwaysDone, - (from->fj_nNodes) * sizeof(bool)); + return newnode; +} +static RangeVar * +_copyRangeVar(RangeVar *from) +{ + RangeVar *newnode = makeNode(RangeVar); + + COPY_STRING_FIELD(catalogname); + COPY_STRING_FIELD(schemaname); + COPY_STRING_FIELD(relname); + COPY_SCALAR_FIELD(inhOpt); + COPY_SCALAR_FIELD(istemp); + COPY_NODE_FIELD(alias); return newnode; } -/* ---------------- - * _copyExpr - * ---------------- +/* + * _copyExpr */ static Expr * _copyExpr(Expr *from) { Expr *newnode = makeNode(Expr); - /* - * copy node superclass fields - */ - newnode->typeOid = from->typeOid; - newnode->opType = from->opType; - - Node_Copy(from, newnode, oper); - Node_Copy(from, newnode, args); + COPY_SCALAR_FIELD(typeOid); + COPY_SCALAR_FIELD(opType); + COPY_NODE_FIELD(oper); + COPY_NODE_FIELD(args); return newnode; } -/* ---------------- - * _copyVar - * ---------------- +/* + * _copyVar */ static Var * _copyVar(Var *from) { Var *newnode = makeNode(Var); - /* - * copy remainder of node - */ - newnode->varno = from->varno; - newnode->varattno = from->varattno; - newnode->vartype = from->vartype; - newnode->vartypmod = from->vartypmod; - newnode->varlevelsup = from->varlevelsup; - - newnode->varnoold = from->varnoold; - newnode->varoattno = from->varoattno; + COPY_SCALAR_FIELD(varno); + COPY_SCALAR_FIELD(varattno); + COPY_SCALAR_FIELD(vartype); + COPY_SCALAR_FIELD(vartypmod); + COPY_SCALAR_FIELD(varlevelsup); + COPY_SCALAR_FIELD(varnoold); + COPY_SCALAR_FIELD(varoattno); return newnode; } -/* ---------------- - * _copyOper - * ---------------- +/* + * _copyOper */ static Oper * _copyOper(Oper *from) { Oper *newnode = makeNode(Oper); - /* - * copy remainder of node - */ - newnode->opno = from->opno; - newnode->opid = from->opid; - newnode->opresulttype = from->opresulttype; - newnode->opretset = from->opretset; + COPY_SCALAR_FIELD(opno); + COPY_SCALAR_FIELD(opid); + COPY_SCALAR_FIELD(opresulttype); + COPY_SCALAR_FIELD(opretset); + /* Do not copy the run-time state, if any */ newnode->op_fcache = NULL; return newnode; } -/* ---------------- - * _copyConst - * ---------------- +/* + * _copyConst */ static Const * _copyConst(Const *from) { Const *newnode = makeNode(Const); - /* - * copy remainder of node - */ - newnode->consttype = from->consttype; - newnode->constlen = from->constlen; + COPY_SCALAR_FIELD(consttype); + COPY_SCALAR_FIELD(constlen); if (from->constbyval || from->constisnull) { @@ -808,141 +760,119 @@ _copyConst(Const *from) else { /* - * not passed by value. We need a palloc'd copy. + * passed by reference. We need a palloc'd copy. */ newnode->constvalue = datumCopy(from->constvalue, from->constbyval, from->constlen); } - newnode->constisnull = from->constisnull; - newnode->constbyval = from->constbyval; - newnode->constisset = from->constisset; - newnode->constiscast = from->constiscast; + COPY_SCALAR_FIELD(constisnull); + COPY_SCALAR_FIELD(constbyval); + COPY_SCALAR_FIELD(constisset); + COPY_SCALAR_FIELD(constiscast); return newnode; } -/* ---------------- - * _copyParam - * ---------------- +/* + * _copyParam */ static Param * _copyParam(Param *from) { Param *newnode = makeNode(Param); - /* - * copy remainder of node - */ - newnode->paramkind = from->paramkind; - newnode->paramid = from->paramid; - - if (from->paramname != NULL) - newnode->paramname = pstrdup(from->paramname); - newnode->paramtype = from->paramtype; + COPY_SCALAR_FIELD(paramkind); + COPY_SCALAR_FIELD(paramid); + COPY_STRING_FIELD(paramname); + COPY_SCALAR_FIELD(paramtype); return newnode; } -/* ---------------- - * _copyFunc - * ---------------- +/* + * _copyFunc */ static Func * _copyFunc(Func *from) { Func *newnode = makeNode(Func); - /* - * copy remainder of node - */ - newnode->funcid = from->funcid; - newnode->funcresulttype = from->funcresulttype; - newnode->funcretset = from->funcretset; - newnode->funcformat = from->funcformat; + COPY_SCALAR_FIELD(funcid); + COPY_SCALAR_FIELD(funcresulttype); + COPY_SCALAR_FIELD(funcretset); + COPY_SCALAR_FIELD(funcformat); + /* Do not copy the run-time state, if any */ newnode->func_fcache = NULL; return newnode; } -/* ---------------- - * _copyAggref - * ---------------- +/* + * _copyAggref */ static Aggref * _copyAggref(Aggref *from) { Aggref *newnode = makeNode(Aggref); - newnode->aggfnoid = from->aggfnoid; - newnode->aggtype = from->aggtype; - Node_Copy(from, newnode, target); - newnode->aggstar = from->aggstar; - newnode->aggdistinct = from->aggdistinct; - newnode->aggno = from->aggno; /* probably not needed */ + COPY_SCALAR_FIELD(aggfnoid); + COPY_SCALAR_FIELD(aggtype); + COPY_NODE_FIELD(target); + COPY_SCALAR_FIELD(aggstar); + COPY_SCALAR_FIELD(aggdistinct); + COPY_SCALAR_FIELD(aggno); /* probably not necessary */ return newnode; } -/* ---------------- - * _copySubLink - * ---------------- +/* + * _copySubLink */ static SubLink * _copySubLink(SubLink *from) { SubLink *newnode = makeNode(SubLink); - /* - * copy remainder of node - */ - newnode->subLinkType = from->subLinkType; - newnode->useor = from->useor; - Node_Copy(from, newnode, lefthand); - Node_Copy(from, newnode, oper); - Node_Copy(from, newnode, subselect); + COPY_SCALAR_FIELD(subLinkType); + COPY_SCALAR_FIELD(useor); + COPY_NODE_FIELD(lefthand); + COPY_NODE_FIELD(oper); + COPY_NODE_FIELD(subselect); return newnode; } -/* ---------------- - * _copyFieldSelect - * ---------------- +/* + * _copyFieldSelect */ static FieldSelect * _copyFieldSelect(FieldSelect *from) { FieldSelect *newnode = makeNode(FieldSelect); - /* - * copy remainder of node - */ - Node_Copy(from, newnode, arg); - newnode->fieldnum = from->fieldnum; - newnode->resulttype = from->resulttype; - newnode->resulttypmod = from->resulttypmod; + COPY_NODE_FIELD(arg); + COPY_SCALAR_FIELD(fieldnum); + COPY_SCALAR_FIELD(resulttype); + COPY_SCALAR_FIELD(resulttypmod); return newnode; } -/* ---------------- - * _copyRelabelType - * ---------------- +/* + * _copyRelabelType */ static RelabelType * _copyRelabelType(RelabelType *from) { RelabelType *newnode = makeNode(RelabelType); - /* - * copy remainder of node - */ - Node_Copy(from, newnode, arg); - newnode->resulttype = from->resulttype; - newnode->resulttypmod = from->resulttypmod; - newnode->relabelformat = from->relabelformat; + COPY_NODE_FIELD(arg); + COPY_SCALAR_FIELD(resulttype); + COPY_SCALAR_FIELD(resulttypmod); + COPY_SCALAR_FIELD(relabelformat); return newnode; } @@ -952,18 +882,7 @@ _copyRangeTblRef(RangeTblRef *from) { RangeTblRef *newnode = makeNode(RangeTblRef); - newnode->rtindex = from->rtindex; - - return newnode; -} - -static FromExpr * -_copyFromExpr(FromExpr *from) -{ - FromExpr *newnode = makeNode(FromExpr); - - Node_Copy(from, newnode, fromlist); - Node_Copy(from, newnode, quals); + COPY_SCALAR_FIELD(rtindex); return newnode; } @@ -973,114 +892,25 @@ _copyJoinExpr(JoinExpr *from) { JoinExpr *newnode = makeNode(JoinExpr); - newnode->jointype = from->jointype; - newnode->isNatural = from->isNatural; - Node_Copy(from, newnode, larg); - Node_Copy(from, newnode, rarg); - Node_Copy(from, newnode, using); - Node_Copy(from, newnode, quals); - Node_Copy(from, newnode, alias); - newnode->rtindex = from->rtindex; - - return newnode; -} - -static CaseExpr * -_copyCaseExpr(CaseExpr *from) -{ - CaseExpr *newnode = makeNode(CaseExpr); - - /* - * copy remainder of node - */ - newnode->casetype = from->casetype; - - Node_Copy(from, newnode, arg); - Node_Copy(from, newnode, args); - Node_Copy(from, newnode, defresult); - - return newnode; -} - -static CaseWhen * -_copyCaseWhen(CaseWhen *from) -{ - CaseWhen *newnode = makeNode(CaseWhen); - - /* - * copy remainder of node - */ - Node_Copy(from, newnode, expr); - Node_Copy(from, newnode, result); + COPY_SCALAR_FIELD(jointype); + COPY_SCALAR_FIELD(isNatural); + COPY_NODE_FIELD(larg); + COPY_NODE_FIELD(rarg); + COPY_NODE_FIELD(using); + COPY_NODE_FIELD(quals); + COPY_NODE_FIELD(alias); + COPY_SCALAR_FIELD(rtindex); return newnode; } -static NullTest * -_copyNullTest(NullTest *from) -{ - NullTest *newnode = makeNode(NullTest); - - /* - * copy remainder of node - */ - Node_Copy(from, newnode, arg); - newnode->nulltesttype = from->nulltesttype; - - return newnode; -} - -static BooleanTest * -_copyBooleanTest(BooleanTest *from) -{ - BooleanTest *newnode = makeNode(BooleanTest); - - /* - * copy remainder of node - */ - Node_Copy(from, newnode, arg); - newnode->booltesttype = from->booltesttype; - - return newnode; -} - -static ConstraintTest * -_copyConstraintTest(ConstraintTest *from) -{ - ConstraintTest *newnode = makeNode(ConstraintTest); - - /* - * copy remainder of node - */ - Node_Copy(from, newnode, arg); - newnode->testtype = from->testtype; - if (from->name) - newnode->name = pstrdup(from->name); - if (from->domname) - newnode->domname = pstrdup(from->domname); - Node_Copy(from, newnode, check_expr); - - return newnode; -} - -static ConstraintTestValue * -_copyConstraintTestValue(ConstraintTestValue *from) +static FromExpr * +_copyFromExpr(FromExpr *from) { - ConstraintTestValue *newnode = makeNode(ConstraintTestValue); - - /* - * copy remainder of node - */ - newnode->typeId = from->typeId; - newnode->typeMod = from->typeMod; - - return newnode; -} + FromExpr *newnode = makeNode(FromExpr); -static DomainConstraintValue * -_copyDomainConstraintValue(DomainConstraintValue *from) -{ - DomainConstraintValue *newnode = makeNode(DomainConstraintValue); + COPY_NODE_FIELD(fromlist); + COPY_NODE_FIELD(quals); return newnode; } @@ -1090,130 +920,112 @@ _copyArrayRef(ArrayRef *from) { ArrayRef *newnode = makeNode(ArrayRef); - /* - * copy remainder of node - */ - newnode->refrestype = from->refrestype; - newnode->refattrlength = from->refattrlength; - newnode->refelemlength = from->refelemlength; - newnode->refelembyval = from->refelembyval; - newnode->refelemalign = from->refelemalign; - - Node_Copy(from, newnode, refupperindexpr); - Node_Copy(from, newnode, reflowerindexpr); - Node_Copy(from, newnode, refexpr); - Node_Copy(from, newnode, refassgnexpr); + COPY_SCALAR_FIELD(refrestype); + COPY_SCALAR_FIELD(refattrlength); + COPY_SCALAR_FIELD(refelemlength); + COPY_SCALAR_FIELD(refelembyval); + COPY_SCALAR_FIELD(refelemalign); + COPY_NODE_FIELD(refupperindexpr); + COPY_NODE_FIELD(reflowerindexpr); + COPY_NODE_FIELD(refexpr); + COPY_NODE_FIELD(refassgnexpr); return newnode; } /* **************************************************************** * relation.h copy functions + * + * XXX the code to copy RelOptInfo and Path nodes is really completely bogus, + * because it makes no attempt to deal with multiple links from RelOptInfo + * to Paths, nor with back-links from Paths to their parent RelOptInfo. + * Currently, since we never actually try to copy a RelOptInfo, this is okay. * **************************************************************** */ -/* ---------------- - * _copyRelOptInfo - * ---------------- +/* + * _copyRelOptInfo */ static RelOptInfo * _copyRelOptInfo(RelOptInfo *from) { RelOptInfo *newnode = makeNode(RelOptInfo); - newnode->reloptkind = from->reloptkind; - - newnode->relids = listCopy(from->relids); - - newnode->rows = from->rows; - newnode->width = from->width; - - Node_Copy(from, newnode, targetlist); - Node_Copy(from, newnode, pathlist); + COPY_SCALAR_FIELD(reloptkind); + COPY_INTLIST_FIELD(relids); + COPY_SCALAR_FIELD(rows); + COPY_SCALAR_FIELD(width); + COPY_NODE_FIELD(targetlist); + COPY_NODE_FIELD(pathlist); /* XXX cheapest-path fields should point to members of pathlist? */ - Node_Copy(from, newnode, cheapest_startup_path); - Node_Copy(from, newnode, cheapest_total_path); - newnode->pruneable = from->pruneable; - - newnode->rtekind = from->rtekind; - Node_Copy(from, newnode, indexlist); - newnode->pages = from->pages; - newnode->tuples = from->tuples; - Node_Copy(from, newnode, subplan); - - newnode->joinrti = from->joinrti; - newnode->joinrteids = listCopy(from->joinrteids); - - Node_Copy(from, newnode, baserestrictinfo); - newnode->baserestrictcost = from->baserestrictcost; - newnode->outerjoinset = listCopy(from->outerjoinset); - Node_Copy(from, newnode, joininfo); - - newnode->index_outer_relids = listCopy(from->index_outer_relids); - Node_Copy(from, newnode, index_inner_paths); + COPY_NODE_FIELD(cheapest_startup_path); + COPY_NODE_FIELD(cheapest_total_path); + COPY_SCALAR_FIELD(pruneable); + COPY_SCALAR_FIELD(rtekind); + COPY_NODE_FIELD(indexlist); + COPY_SCALAR_FIELD(pages); + COPY_SCALAR_FIELD(tuples); + COPY_NODE_FIELD(subplan); + COPY_SCALAR_FIELD(joinrti); + COPY_INTLIST_FIELD(joinrteids); + COPY_NODE_FIELD(baserestrictinfo); + COPY_SCALAR_FIELD(baserestrictcost); + COPY_INTLIST_FIELD(outerjoinset); + COPY_NODE_FIELD(joininfo); + COPY_INTLIST_FIELD(index_outer_relids); + COPY_NODE_FIELD(index_inner_paths); return newnode; } -/* ---------------- - * _copyIndexOptInfo - * ---------------- +/* + * _copyIndexOptInfo */ static IndexOptInfo * _copyIndexOptInfo(IndexOptInfo *from) { IndexOptInfo *newnode = makeNode(IndexOptInfo); - Size len; - - newnode->indexoid = from->indexoid; - newnode->pages = from->pages; - newnode->tuples = from->tuples; - newnode->ncolumns = from->ncolumns; - newnode->nkeys = from->nkeys; + COPY_SCALAR_FIELD(indexoid); + COPY_SCALAR_FIELD(pages); + COPY_SCALAR_FIELD(tuples); + COPY_SCALAR_FIELD(ncolumns); + COPY_SCALAR_FIELD(nkeys); if (from->classlist) { /* copy the trailing zero too */ - len = (from->ncolumns + 1) * sizeof(Oid); - newnode->classlist = (Oid *) palloc(len); - memcpy(newnode->classlist, from->classlist, len); + COPY_POINTER_FIELD(classlist, (from->ncolumns + 1) * sizeof(Oid)); } if (from->indexkeys) { /* copy the trailing zero too */ - len = (from->nkeys + 1) * sizeof(int); - newnode->indexkeys = (int *) palloc(len); - memcpy(newnode->indexkeys, from->indexkeys, len); + COPY_POINTER_FIELD(indexkeys, (from->nkeys + 1) * sizeof(int)); } if (from->ordering) { /* copy the trailing zero too */ - len = (from->ncolumns + 1) * sizeof(Oid); - newnode->ordering = (Oid *) palloc(len); - memcpy(newnode->ordering, from->ordering, len); + COPY_POINTER_FIELD(ordering, (from->ncolumns + 1) * sizeof(Oid)); } - newnode->relam = from->relam; - newnode->amcostestimate = from->amcostestimate; - newnode->indproc = from->indproc; - Node_Copy(from, newnode, indpred); - newnode->unique = from->unique; - - newnode->outer_relids = listCopy(from->outer_relids); - Node_Copy(from, newnode, inner_paths); + COPY_SCALAR_FIELD(relam); + COPY_SCALAR_FIELD(amcostestimate); + COPY_SCALAR_FIELD(indproc); + COPY_NODE_FIELD(indpred); + COPY_SCALAR_FIELD(unique); + COPY_INTLIST_FIELD(outer_relids); + COPY_NODE_FIELD(inner_paths); return newnode; } -/* ---------------- - * CopyPathFields +/* + * CopyPathFields * * This function copies the fields of the Path node. It is used by * all the copy functions for classes which inherit from Path. - * ---------------- */ static void CopyPathFields(Path *from, Path *newnode) @@ -1221,21 +1033,18 @@ CopyPathFields(Path *from, Path *newnode) /* * Modify the next line, since it causes the copying to cycle (i.e. * the parent points right back here! -- JMH, 7/7/92. Old version: - * Node_Copy(from, newnode, parent); + * COPY_NODE_FIELD(parent); */ - newnode->parent = from->parent; - - newnode->startup_cost = from->startup_cost; - newnode->total_cost = from->total_cost; + COPY_SCALAR_FIELD(parent); - newnode->pathtype = from->pathtype; - - Node_Copy(from, newnode, pathkeys); + COPY_SCALAR_FIELD(startup_cost); + COPY_SCALAR_FIELD(total_cost); + COPY_SCALAR_FIELD(pathtype); + COPY_NODE_FIELD(pathkeys); } -/* ---------------- - * _copyPath - * ---------------- +/* + * _copyPath */ static Path * _copyPath(Path *from) @@ -1247,9 +1056,8 @@ _copyPath(Path *from) return newnode; } -/* ---------------- - * _copyIndexPath - * ---------------- +/* + * _copyIndexPath */ static IndexPath * _copyIndexPath(IndexPath *from) @@ -1257,24 +1065,23 @@ _copyIndexPath(IndexPath *from) IndexPath *newnode = makeNode(IndexPath); /* - * copy the node superclass fields + * copy node superclass fields */ CopyPathFields((Path *) from, (Path *) newnode); /* * copy remainder of node */ - Node_Copy(from, newnode, indexinfo); - Node_Copy(from, newnode, indexqual); - newnode->indexscandir = from->indexscandir; - newnode->rows = from->rows; + COPY_NODE_FIELD(indexinfo); + COPY_NODE_FIELD(indexqual); + COPY_SCALAR_FIELD(indexscandir); + COPY_SCALAR_FIELD(rows); return newnode; } -/* ---------------- - * _copyTidPath - * ---------------- +/* + * _copyTidPath */ static TidPath * _copyTidPath(TidPath *from) @@ -1282,22 +1089,21 @@ _copyTidPath(TidPath *from) TidPath *newnode = makeNode(TidPath); /* - * copy the node superclass fields + * copy node superclass fields */ CopyPathFields((Path *) from, (Path *) newnode); /* * copy remainder of node */ - Node_Copy(from, newnode, tideval); - newnode->unjoined_relids = listCopy(from->unjoined_relids); + COPY_NODE_FIELD(tideval); + COPY_INTLIST_FIELD(unjoined_relids); return newnode; } -/* ---------------- - * _copyAppendPath - * ---------------- +/* + * _copyAppendPath */ static AppendPath * _copyAppendPath(AppendPath *from) @@ -1305,21 +1111,20 @@ _copyAppendPath(AppendPath *from) AppendPath *newnode = makeNode(AppendPath); /* - * copy the node superclass fields + * copy node superclass fields */ CopyPathFields((Path *) from, (Path *) newnode); /* * copy remainder of node */ - Node_Copy(from, newnode, subpaths); + COPY_NODE_FIELD(subpaths); return newnode; } -/* ---------------- - * _copyResultPath - * ---------------- +/* + * _copyResultPath */ static ResultPath * _copyResultPath(ResultPath *from) @@ -1327,38 +1132,38 @@ _copyResultPath(ResultPath *from) ResultPath *newnode = makeNode(ResultPath); /* - * copy the node superclass fields + * copy node superclass fields */ CopyPathFields((Path *) from, (Path *) newnode); /* * copy remainder of node */ - Node_Copy(from, newnode, subpath); - Node_Copy(from, newnode, constantqual); + COPY_NODE_FIELD(subpath); + COPY_NODE_FIELD(constantqual); return newnode; } -/* ---------------- - * CopyJoinPathFields +/* + * CopyJoinPathFields * * This function copies the fields of the JoinPath node. It is used by * all the copy functions for classes which inherit from JoinPath. - * ---------------- */ static void CopyJoinPathFields(JoinPath *from, JoinPath *newnode) { - newnode->jointype = from->jointype; - Node_Copy(from, newnode, outerjoinpath); - Node_Copy(from, newnode, innerjoinpath); - Node_Copy(from, newnode, joinrestrictinfo); + CopyPathFields((Path *) from, (Path *) newnode); + + COPY_SCALAR_FIELD(jointype); + COPY_NODE_FIELD(outerjoinpath); + COPY_NODE_FIELD(innerjoinpath); + COPY_NODE_FIELD(joinrestrictinfo); } -/* ---------------- - * _copyNestPath - * ---------------- +/* + * _copyNestPath */ static NestPath * _copyNestPath(NestPath *from) @@ -1366,17 +1171,15 @@ _copyNestPath(NestPath *from) NestPath *newnode = makeNode(NestPath); /* - * copy the node superclass fields + * copy node superclass fields */ - CopyPathFields((Path *) from, (Path *) newnode); CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode); return newnode; } -/* ---------------- - * _copyMergePath - * ---------------- +/* + * _copyMergePath */ static MergePath * _copyMergePath(MergePath *from) @@ -1384,24 +1187,22 @@ _copyMergePath(MergePath *from) MergePath *newnode = makeNode(MergePath); /* - * copy the node superclass fields + * copy node superclass fields */ - CopyPathFields((Path *) from, (Path *) newnode); CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode); /* - * copy the remainder of the node + * copy remainder of node */ - Node_Copy(from, newnode, path_mergeclauses); - Node_Copy(from, newnode, outersortkeys); - Node_Copy(from, newnode, innersortkeys); + COPY_NODE_FIELD(path_mergeclauses); + COPY_NODE_FIELD(outersortkeys); + COPY_NODE_FIELD(innersortkeys); return newnode; } -/* ---------------- - * _copyHashPath - * ---------------- +/* + * _copyHashPath */ static HashPath * _copyHashPath(HashPath *from) @@ -1409,57 +1210,48 @@ _copyHashPath(HashPath *from) HashPath *newnode = makeNode(HashPath); /* - * copy the node superclass fields + * copy node superclass fields */ - CopyPathFields((Path *) from, (Path *) newnode); CopyJoinPathFields((JoinPath *) from, (JoinPath *) newnode); /* * copy remainder of node */ - Node_Copy(from, newnode, path_hashclauses); + COPY_NODE_FIELD(path_hashclauses); return newnode; } -/* ---------------- - * _copyPathKeyItem - * ---------------- +/* + * _copyPathKeyItem */ static PathKeyItem * _copyPathKeyItem(PathKeyItem *from) { PathKeyItem *newnode = makeNode(PathKeyItem); - /* - * copy remainder of node - */ - Node_Copy(from, newnode, key); - newnode->sortop = from->sortop; + COPY_NODE_FIELD(key); + COPY_SCALAR_FIELD(sortop); return newnode; } -/* ---------------- - * _copyRestrictInfo - * ---------------- +/* + * _copyRestrictInfo */ static RestrictInfo * _copyRestrictInfo(RestrictInfo *from) { RestrictInfo *newnode = makeNode(RestrictInfo); - /* - * copy remainder of node - */ - Node_Copy(from, newnode, clause); - newnode->ispusheddown = from->ispusheddown; - Node_Copy(from, newnode, subclauseindices); - newnode->eval_cost = from->eval_cost; - newnode->this_selec = from->this_selec; - newnode->mergejoinoperator = from->mergejoinoperator; - newnode->left_sortop = from->left_sortop; - newnode->right_sortop = from->right_sortop; + COPY_NODE_FIELD(clause); + COPY_SCALAR_FIELD(ispusheddown); + COPY_NODE_FIELD(subclauseindices); /* XXX probably bad */ + COPY_SCALAR_FIELD(eval_cost); + COPY_SCALAR_FIELD(this_selec); + COPY_SCALAR_FIELD(mergejoinoperator); + COPY_SCALAR_FIELD(left_sortop); + COPY_SCALAR_FIELD(right_sortop); /* * Do not copy pathkeys, since they'd not be canonical in a copied @@ -1467,48 +1259,41 @@ _copyRestrictInfo(RestrictInfo *from) */ newnode->left_pathkey = NIL; newnode->right_pathkey = NIL; - newnode->left_mergescansel = from->left_mergescansel; - newnode->right_mergescansel = from->right_mergescansel; - newnode->hashjoinoperator = from->hashjoinoperator; - newnode->left_bucketsize = from->left_bucketsize; - newnode->right_bucketsize = from->right_bucketsize; + + COPY_SCALAR_FIELD(left_mergescansel); + COPY_SCALAR_FIELD(right_mergescansel); + COPY_SCALAR_FIELD(hashjoinoperator); + COPY_SCALAR_FIELD(left_bucketsize); + COPY_SCALAR_FIELD(right_bucketsize); return newnode; } -/* ---------------- - * _copyJoinInfo - * ---------------- +/* + * _copyJoinInfo */ static JoinInfo * _copyJoinInfo(JoinInfo *from) { JoinInfo *newnode = makeNode(JoinInfo); - /* - * copy remainder of node - */ - newnode->unjoined_relids = listCopy(from->unjoined_relids); - Node_Copy(from, newnode, jinfo_restrictinfo); + COPY_INTLIST_FIELD(unjoined_relids); + COPY_NODE_FIELD(jinfo_restrictinfo); return newnode; } -/* ---------------- - * _copyInnerIndexscanInfo - * ---------------- +/* + * _copyInnerIndexscanInfo */ static InnerIndexscanInfo * _copyInnerIndexscanInfo(InnerIndexscanInfo *from) { InnerIndexscanInfo *newnode = makeNode(InnerIndexscanInfo); - /* - * copy remainder of node - */ - newnode->other_relids = listCopy(from->other_relids); - newnode->isouterjoin = from->isouterjoin; - Node_Copy(from, newnode, best_innerpath); + COPY_INTLIST_FIELD(other_relids); + COPY_SCALAR_FIELD(isouterjoin); + COPY_NODE_FIELD(best_innerpath); return newnode; } @@ -1523,9 +1308,10 @@ _copyTargetEntry(TargetEntry *from) { TargetEntry *newnode = makeNode(TargetEntry); - Node_Copy(from, newnode, resdom); - Node_Copy(from, newnode, fjoin); - Node_Copy(from, newnode, expr); + COPY_NODE_FIELD(resdom); + COPY_NODE_FIELD(fjoin); + COPY_NODE_FIELD(expr); + return newnode; } @@ -1534,20 +1320,20 @@ _copyRangeTblEntry(RangeTblEntry *from) { RangeTblEntry *newnode = makeNode(RangeTblEntry); - newnode->rtekind = from->rtekind; - newnode->relid = from->relid; - Node_Copy(from, newnode, subquery); - Node_Copy(from, newnode, funcexpr); - Node_Copy(from, newnode, coldeflist); - newnode->jointype = from->jointype; - Node_Copy(from, newnode, joinaliasvars); - Node_Copy(from, newnode, alias); - Node_Copy(from, newnode, eref); - newnode->inh = from->inh; - newnode->inFromCl = from->inFromCl; - newnode->checkForRead = from->checkForRead; - newnode->checkForWrite = from->checkForWrite; - newnode->checkAsUser = from->checkAsUser; + COPY_SCALAR_FIELD(rtekind); + COPY_SCALAR_FIELD(relid); + COPY_NODE_FIELD(subquery); + COPY_NODE_FIELD(funcexpr); + COPY_NODE_FIELD(coldeflist); + COPY_SCALAR_FIELD(jointype); + COPY_NODE_FIELD(joinaliasvars); + COPY_NODE_FIELD(alias); + COPY_NODE_FIELD(eref); + COPY_SCALAR_FIELD(inh); + COPY_SCALAR_FIELD(inFromCl); + COPY_SCALAR_FIELD(checkForRead); + COPY_SCALAR_FIELD(checkForWrite); + COPY_SCALAR_FIELD(checkAsUser); return newnode; } @@ -1557,17 +1343,16 @@ _copyFkConstraint(FkConstraint *from) { FkConstraint *newnode = makeNode(FkConstraint); - if (from->constr_name) - newnode->constr_name = pstrdup(from->constr_name); - Node_Copy(from, newnode, pktable); - Node_Copy(from, newnode, fk_attrs); - Node_Copy(from, newnode, pk_attrs); - newnode->fk_matchtype = from->fk_matchtype; - newnode->fk_upd_action = from->fk_upd_action; - newnode->fk_del_action = from->fk_del_action; - newnode->deferrable = from->deferrable; - newnode->initdeferred = from->initdeferred; - newnode->skip_validation = from->skip_validation; + COPY_STRING_FIELD(constr_name); + COPY_NODE_FIELD(pktable); + COPY_NODE_FIELD(fk_attrs); + COPY_NODE_FIELD(pk_attrs); + COPY_SCALAR_FIELD(fk_matchtype); + COPY_SCALAR_FIELD(fk_upd_action); + COPY_SCALAR_FIELD(fk_del_action); + COPY_SCALAR_FIELD(deferrable); + COPY_SCALAR_FIELD(initdeferred); + COPY_SCALAR_FIELD(skip_validation); return newnode; } @@ -1577,8 +1362,19 @@ _copySortClause(SortClause *from) { SortClause *newnode = makeNode(SortClause); - newnode->tleSortGroupRef = from->tleSortGroupRef; - newnode->sortop = from->sortop; + COPY_SCALAR_FIELD(tleSortGroupRef); + COPY_SCALAR_FIELD(sortop); + + return newnode; +} + +static GroupClause * +_copyGroupClause(GroupClause *from) +{ + GroupClause *newnode = makeNode(GroupClause); + + COPY_SCALAR_FIELD(tleSortGroupRef); + COPY_SCALAR_FIELD(sortop); return newnode; } @@ -1588,10 +1384,10 @@ _copyAExpr(A_Expr *from) { A_Expr *newnode = makeNode(A_Expr); - newnode->oper = from->oper; - Node_Copy(from, newnode, name); - Node_Copy(from, newnode, lexpr); - Node_Copy(from, newnode, rexpr); + COPY_SCALAR_FIELD(oper); + COPY_NODE_FIELD(name); + COPY_NODE_FIELD(lexpr); + COPY_NODE_FIELD(rexpr); return newnode; } @@ -1601,8 +1397,8 @@ _copyColumnRef(ColumnRef *from) { ColumnRef *newnode = makeNode(ColumnRef); - Node_Copy(from, newnode, fields); - Node_Copy(from, newnode, indirection); + COPY_NODE_FIELD(fields); + COPY_NODE_FIELD(indirection); return newnode; } @@ -1612,9 +1408,9 @@ _copyParamRef(ParamRef *from) { ParamRef *newnode = makeNode(ParamRef); - newnode->number = from->number; - Node_Copy(from, newnode, fields); - Node_Copy(from, newnode, indirection); + COPY_SCALAR_FIELD(number); + COPY_NODE_FIELD(fields); + COPY_NODE_FIELD(indirection); return newnode; } @@ -1625,16 +1421,16 @@ _copyAConst(A_Const *from) A_Const *newnode = makeNode(A_Const); /* This part must duplicate _copyValue */ - newnode->val.type = from->val.type; + COPY_SCALAR_FIELD(val.type); switch (from->val.type) { case T_Integer: - newnode->val.val.ival = from->val.val.ival; + COPY_SCALAR_FIELD(val.val.ival); break; case T_Float: case T_String: case T_BitString: - newnode->val.val.str = pstrdup(from->val.val.str); + COPY_STRING_FIELD(val.val.str); break; case T_Null: /* nothing to do */ @@ -1644,7 +1440,7 @@ _copyAConst(A_Const *from) break; } - Node_Copy(from, newnode, typename); + COPY_NODE_FIELD(typename); return newnode; } @@ -1654,10 +1450,10 @@ _copyFuncCall(FuncCall *from) { FuncCall *newnode = makeNode(FuncCall); - Node_Copy(from, newnode, funcname); - Node_Copy(from, newnode, args); - newnode->agg_star = from->agg_star; - newnode->agg_distinct = from->agg_distinct; + COPY_NODE_FIELD(funcname); + COPY_NODE_FIELD(args); + COPY_SCALAR_FIELD(agg_star); + COPY_SCALAR_FIELD(agg_distinct); return newnode; } @@ -1667,8 +1463,8 @@ _copyAIndices(A_Indices *from) { A_Indices *newnode = makeNode(A_Indices); - Node_Copy(from, newnode, lidx); - Node_Copy(from, newnode, uidx); + COPY_NODE_FIELD(lidx); + COPY_NODE_FIELD(uidx); return newnode; } @@ -1678,9 +1474,9 @@ _copyExprFieldSelect(ExprFieldSelect *from) { ExprFieldSelect *newnode = makeNode(ExprFieldSelect); - Node_Copy(from, newnode, arg); - Node_Copy(from, newnode, fields); - Node_Copy(from, newnode, indirection); + COPY_NODE_FIELD(arg); + COPY_NODE_FIELD(fields); + COPY_NODE_FIELD(indirection); return newnode; } @@ -1690,10 +1486,9 @@ _copyResTarget(ResTarget *from) { ResTarget *newnode = makeNode(ResTarget); - if (from->name) - newnode->name = pstrdup(from->name); - Node_Copy(from, newnode, indirection); - Node_Copy(from, newnode, val); + COPY_STRING_FIELD(name); + COPY_NODE_FIELD(indirection); + COPY_NODE_FIELD(val); return newnode; } @@ -1703,13 +1498,13 @@ _copyTypeName(TypeName *from) { TypeName *newnode = makeNode(TypeName); - Node_Copy(from, newnode, names); - newnode->typeid = from->typeid; - newnode->timezone = from->timezone; - newnode->setof = from->setof; - newnode->pct_type = from->pct_type; - newnode->typmod = from->typmod; - Node_Copy(from, newnode, arrayBounds); + COPY_NODE_FIELD(names); + COPY_SCALAR_FIELD(typeid); + COPY_SCALAR_FIELD(timezone); + COPY_SCALAR_FIELD(setof); + COPY_SCALAR_FIELD(pct_type); + COPY_SCALAR_FIELD(typmod); + COPY_NODE_FIELD(arrayBounds); return newnode; } @@ -1719,38 +1514,8 @@ _copySortGroupBy(SortGroupBy *from) { SortGroupBy *newnode = makeNode(SortGroupBy); - Node_Copy(from, newnode, useOp); - Node_Copy(from, newnode, node); - - return newnode; -} - -static Alias * -_copyAlias(Alias *from) -{ - Alias *newnode = makeNode(Alias); - - if (from->aliasname) - newnode->aliasname = pstrdup(from->aliasname); - Node_Copy(from, newnode, colnames); - - return newnode; -} - -static RangeVar * -_copyRangeVar(RangeVar *from) -{ - RangeVar *newnode = makeNode(RangeVar); - - if (from->catalogname) - newnode->catalogname = pstrdup(from->catalogname); - if (from->schemaname) - newnode->schemaname = pstrdup(from->schemaname); - if (from->relname) - newnode->relname = pstrdup(from->relname); - newnode->inhOpt = from->inhOpt; - newnode->istemp = from->istemp; - Node_Copy(from, newnode, alias); + COPY_NODE_FIELD(useOp); + COPY_NODE_FIELD(node); return newnode; } @@ -1760,8 +1525,8 @@ _copyRangeSubselect(RangeSubselect *from) { RangeSubselect *newnode = makeNode(RangeSubselect); - Node_Copy(from, newnode, subquery); - Node_Copy(from, newnode, alias); + COPY_NODE_FIELD(subquery); + COPY_NODE_FIELD(alias); return newnode; } @@ -1771,9 +1536,9 @@ _copyRangeFunction(RangeFunction *from) { RangeFunction *newnode = makeNode(RangeFunction); - Node_Copy(from, newnode, funccallnode); - Node_Copy(from, newnode, alias); - Node_Copy(from, newnode, coldeflist); + COPY_NODE_FIELD(funccallnode); + COPY_NODE_FIELD(alias); + COPY_NODE_FIELD(coldeflist); return newnode; } @@ -1783,8 +1548,8 @@ _copyTypeCast(TypeCast *from) { TypeCast *newnode = makeNode(TypeCast); - Node_Copy(from, newnode, arg); - Node_Copy(from, newnode, typename); + COPY_NODE_FIELD(arg); + COPY_NODE_FIELD(typename); return newnode; } @@ -1794,11 +1559,10 @@ _copyIndexElem(IndexElem *from) { IndexElem *newnode = makeNode(IndexElem); - if (from->name) - newnode->name = pstrdup(from->name); - Node_Copy(from, newnode, funcname); - Node_Copy(from, newnode, args); - Node_Copy(from, newnode, opclass); + COPY_STRING_FIELD(name); + COPY_NODE_FIELD(funcname); + COPY_NODE_FIELD(args); + COPY_NODE_FIELD(opclass); return newnode; } @@ -1808,17 +1572,15 @@ _copyColumnDef(ColumnDef *from) { ColumnDef *newnode = makeNode(ColumnDef); - if (from->colname) - newnode->colname = pstrdup(from->colname); - Node_Copy(from, newnode, typename); - newnode->inhcount = from->inhcount; - newnode->is_local = from->is_local; - newnode->is_not_null = from->is_not_null; - Node_Copy(from, newnode, raw_default); - if (from->cooked_default) - newnode->cooked_default = pstrdup(from->cooked_default); - Node_Copy(from, newnode, constraints); - Node_Copy(from, newnode, support); + COPY_STRING_FIELD(colname); + COPY_NODE_FIELD(typename); + COPY_SCALAR_FIELD(inhcount); + COPY_SCALAR_FIELD(is_local); + COPY_SCALAR_FIELD(is_not_null); + COPY_NODE_FIELD(raw_default); + COPY_STRING_FIELD(cooked_default); + COPY_NODE_FIELD(constraints); + COPY_NODE_FIELD(support); return newnode; } @@ -1828,62 +1590,131 @@ _copyConstraint(Constraint *from) { Constraint *newnode = makeNode(Constraint); - newnode->contype = from->contype; - if (from->name) - newnode->name = pstrdup(from->name); - Node_Copy(from, newnode, raw_expr); - if (from->cooked_expr) - newnode->cooked_expr = pstrdup(from->cooked_expr); - Node_Copy(from, newnode, keys); + COPY_SCALAR_FIELD(contype); + COPY_STRING_FIELD(name); + COPY_NODE_FIELD(raw_expr); + COPY_STRING_FIELD(cooked_expr); + COPY_NODE_FIELD(keys); return newnode; } -static DefElem * -_copyDefElem(DefElem *from) +static CaseExpr * +_copyCaseExpr(CaseExpr *from) { - DefElem *newnode = makeNode(DefElem); + CaseExpr *newnode = makeNode(CaseExpr); - if (from->defname) - newnode->defname = pstrdup(from->defname); - Node_Copy(from, newnode, arg); + COPY_SCALAR_FIELD(casetype); + COPY_NODE_FIELD(arg); + COPY_NODE_FIELD(args); + COPY_NODE_FIELD(defresult); return newnode; } -static Query * -_copyQuery(Query *from) +static CaseWhen * +_copyCaseWhen(CaseWhen *from) { - Query *newnode = makeNode(Query); + CaseWhen *newnode = makeNode(CaseWhen); - newnode->commandType = from->commandType; - newnode->querySource = from->querySource; - Node_Copy(from, newnode, utilityStmt); - newnode->resultRelation = from->resultRelation; - Node_Copy(from, newnode, into); - newnode->isPortal = from->isPortal; - newnode->isBinary = from->isBinary; - newnode->hasAggs = from->hasAggs; - newnode->hasSubLinks = from->hasSubLinks; + COPY_NODE_FIELD(expr); + COPY_NODE_FIELD(result); - Node_Copy(from, newnode, rtable); - Node_Copy(from, newnode, jointree); + return newnode; +} - newnode->rowMarks = listCopy(from->rowMarks); +static NullTest * +_copyNullTest(NullTest *from) +{ + NullTest *newnode = makeNode(NullTest); - Node_Copy(from, newnode, targetList); + COPY_NODE_FIELD(arg); + COPY_SCALAR_FIELD(nulltesttype); - Node_Copy(from, newnode, groupClause); - Node_Copy(from, newnode, havingQual); - Node_Copy(from, newnode, distinctClause); - Node_Copy(from, newnode, sortClause); + return newnode; +} - Node_Copy(from, newnode, limitOffset); - Node_Copy(from, newnode, limitCount); +static BooleanTest * +_copyBooleanTest(BooleanTest *from) +{ + BooleanTest *newnode = makeNode(BooleanTest); - Node_Copy(from, newnode, setOperations); + COPY_NODE_FIELD(arg); + COPY_SCALAR_FIELD(booltesttype); + + return newnode; +} + +static ConstraintTest * +_copyConstraintTest(ConstraintTest *from) +{ + ConstraintTest *newnode = makeNode(ConstraintTest); + + COPY_NODE_FIELD(arg); + COPY_SCALAR_FIELD(testtype); + COPY_STRING_FIELD(name); + COPY_STRING_FIELD(domname); + COPY_NODE_FIELD(check_expr); + + return newnode; +} + +static DomainConstraintValue * +_copyDomainConstraintValue(DomainConstraintValue *from) +{ + DomainConstraintValue *newnode = makeNode(DomainConstraintValue); + + return newnode; +} + +static ConstraintTestValue * +_copyConstraintTestValue(ConstraintTestValue *from) +{ + ConstraintTestValue *newnode = makeNode(ConstraintTestValue); - newnode->resultRelations = listCopy(from->resultRelations); + COPY_SCALAR_FIELD(typeId); + COPY_SCALAR_FIELD(typeMod); + + return newnode; +} + +static DefElem * +_copyDefElem(DefElem *from) +{ + DefElem *newnode = makeNode(DefElem); + + COPY_STRING_FIELD(defname); + COPY_NODE_FIELD(arg); + + return newnode; +} + +static Query * +_copyQuery(Query *from) +{ + Query *newnode = makeNode(Query); + + COPY_SCALAR_FIELD(commandType); + COPY_SCALAR_FIELD(querySource); + COPY_NODE_FIELD(utilityStmt); + COPY_SCALAR_FIELD(resultRelation); + COPY_NODE_FIELD(into); + COPY_SCALAR_FIELD(isPortal); + COPY_SCALAR_FIELD(isBinary); + COPY_SCALAR_FIELD(hasAggs); + COPY_SCALAR_FIELD(hasSubLinks); + COPY_NODE_FIELD(rtable); + COPY_NODE_FIELD(jointree); + COPY_INTLIST_FIELD(rowMarks); + COPY_NODE_FIELD(targetList); + COPY_NODE_FIELD(groupClause); + COPY_NODE_FIELD(havingQual); + COPY_NODE_FIELD(distinctClause); + COPY_NODE_FIELD(sortClause); + COPY_NODE_FIELD(limitOffset); + COPY_NODE_FIELD(limitCount); + COPY_NODE_FIELD(setOperations); + COPY_INTLIST_FIELD(resultRelations); /* * We do not copy the planner internal fields: base_rel_list, @@ -1899,10 +1730,10 @@ _copyInsertStmt(InsertStmt *from) { InsertStmt *newnode = makeNode(InsertStmt); - Node_Copy(from, newnode, relation); - Node_Copy(from, newnode, cols); - Node_Copy(from, newnode, targetList); - Node_Copy(from, newnode, selectStmt); + COPY_NODE_FIELD(relation); + COPY_NODE_FIELD(cols); + COPY_NODE_FIELD(targetList); + COPY_NODE_FIELD(selectStmt); return newnode; } @@ -1912,8 +1743,8 @@ _copyDeleteStmt(DeleteStmt *from) { DeleteStmt *newnode = makeNode(DeleteStmt); - Node_Copy(from, newnode, relation); - Node_Copy(from, newnode, whereClause); + COPY_NODE_FIELD(relation); + COPY_NODE_FIELD(whereClause); return newnode; } @@ -1923,10 +1754,10 @@ _copyUpdateStmt(UpdateStmt *from) { UpdateStmt *newnode = makeNode(UpdateStmt); - Node_Copy(from, newnode, relation); - Node_Copy(from, newnode, targetList); - Node_Copy(from, newnode, whereClause); - Node_Copy(from, newnode, fromClause); + COPY_NODE_FIELD(relation); + COPY_NODE_FIELD(targetList); + COPY_NODE_FIELD(whereClause); + COPY_NODE_FIELD(fromClause); return newnode; } @@ -1936,25 +1767,24 @@ _copySelectStmt(SelectStmt *from) { SelectStmt *newnode = makeNode(SelectStmt); - Node_Copy(from, newnode, distinctClause); - Node_Copy(from, newnode, into); - Node_Copy(from, newnode, intoColNames); - Node_Copy(from, newnode, targetList); - Node_Copy(from, newnode, fromClause); - Node_Copy(from, newnode, whereClause); - Node_Copy(from, newnode, groupClause); - Node_Copy(from, newnode, havingClause); - Node_Copy(from, newnode, sortClause); - if (from->portalname) - newnode->portalname = pstrdup(from->portalname); - newnode->binary = from->binary; - Node_Copy(from, newnode, limitOffset); - Node_Copy(from, newnode, limitCount); - Node_Copy(from, newnode, forUpdate); - newnode->op = from->op; - newnode->all = from->all; - Node_Copy(from, newnode, larg); - Node_Copy(from, newnode, rarg); + COPY_NODE_FIELD(distinctClause); + COPY_NODE_FIELD(into); + COPY_NODE_FIELD(intoColNames); + COPY_NODE_FIELD(targetList); + COPY_NODE_FIELD(fromClause); + COPY_NODE_FIELD(whereClause); + COPY_NODE_FIELD(groupClause); + COPY_NODE_FIELD(havingClause); + COPY_NODE_FIELD(sortClause); + COPY_STRING_FIELD(portalname); + COPY_SCALAR_FIELD(binary); + COPY_NODE_FIELD(limitOffset); + COPY_NODE_FIELD(limitCount); + COPY_NODE_FIELD(forUpdate); + COPY_SCALAR_FIELD(op); + COPY_SCALAR_FIELD(all); + COPY_NODE_FIELD(larg); + COPY_NODE_FIELD(rarg); return newnode; } @@ -1964,11 +1794,11 @@ _copySetOperationStmt(SetOperationStmt *from) { SetOperationStmt *newnode = makeNode(SetOperationStmt); - newnode->op = from->op; - newnode->all = from->all; - Node_Copy(from, newnode, larg); - Node_Copy(from, newnode, rarg); - newnode->colTypes = listCopy(from->colTypes); + COPY_SCALAR_FIELD(op); + COPY_SCALAR_FIELD(all); + COPY_NODE_FIELD(larg); + COPY_NODE_FIELD(rarg); + COPY_INTLIST_FIELD(colTypes); return newnode; } @@ -1978,12 +1808,11 @@ _copyAlterTableStmt(AlterTableStmt *from) { AlterTableStmt *newnode = makeNode(AlterTableStmt); - newnode->subtype = from->subtype; - Node_Copy(from, newnode, relation); - if (from->name) - newnode->name = pstrdup(from->name); - Node_Copy(from, newnode, def); - newnode->behavior = from->behavior; + COPY_SCALAR_FIELD(subtype); + COPY_NODE_FIELD(relation); + COPY_STRING_FIELD(name); + COPY_NODE_FIELD(def); + COPY_SCALAR_FIELD(behavior); return newnode; } @@ -1993,11 +1822,11 @@ _copyGrantStmt(GrantStmt *from) { GrantStmt *newnode = makeNode(GrantStmt); - newnode->is_grant = from->is_grant; - newnode->objtype = from->objtype; - Node_Copy(from, newnode, objects); - newnode->privileges = listCopy(from->privileges); - Node_Copy(from, newnode, grantees); + COPY_SCALAR_FIELD(is_grant); + COPY_SCALAR_FIELD(objtype); + COPY_NODE_FIELD(objects); + COPY_INTLIST_FIELD(privileges); + COPY_NODE_FIELD(grantees); return newnode; } @@ -2007,10 +1836,8 @@ _copyPrivGrantee(PrivGrantee *from) { PrivGrantee *newnode = makeNode(PrivGrantee); - if (from->username) - newnode->username = pstrdup(from->username); - if (from->groupname) - newnode->groupname = pstrdup(from->groupname); + COPY_STRING_FIELD(username); + COPY_STRING_FIELD(groupname); return newnode; } @@ -2020,8 +1847,8 @@ _copyFuncWithArgs(FuncWithArgs *from) { FuncWithArgs *newnode = makeNode(FuncWithArgs); - Node_Copy(from, newnode, funcname); - Node_Copy(from, newnode, funcargs); + COPY_NODE_FIELD(funcname); + COPY_NODE_FIELD(funcargs); return newnode; } @@ -2040,8 +1867,7 @@ _copyClosePortalStmt(ClosePortalStmt *from) { ClosePortalStmt *newnode = makeNode(ClosePortalStmt); - if (from->portalname) - newnode->portalname = pstrdup(from->portalname); + COPY_STRING_FIELD(portalname); return newnode; } @@ -2051,9 +1877,8 @@ _copyClusterStmt(ClusterStmt *from) { ClusterStmt *newnode = makeNode(ClusterStmt); - Node_Copy(from, newnode, relation); - if (from->indexname) - newnode->indexname = pstrdup(from->indexname); + COPY_NODE_FIELD(relation); + COPY_STRING_FIELD(indexname); return newnode; } @@ -2063,12 +1888,11 @@ _copyCopyStmt(CopyStmt *from) { CopyStmt *newnode = makeNode(CopyStmt); - Node_Copy(from, newnode, relation); - Node_Copy(from, newnode, attlist); - newnode->is_from = from->is_from; - if (from->filename) - newnode->filename = pstrdup(from->filename); - Node_Copy(from, newnode, options); + COPY_NODE_FIELD(relation); + COPY_NODE_FIELD(attlist); + COPY_SCALAR_FIELD(is_from); + COPY_STRING_FIELD(filename); + COPY_NODE_FIELD(options); return newnode; } @@ -2078,12 +1902,12 @@ _copyCreateStmt(CreateStmt *from) { CreateStmt *newnode = makeNode(CreateStmt); - Node_Copy(from, newnode, relation); - Node_Copy(from, newnode, tableElts); - Node_Copy(from, newnode, inhRelations); - Node_Copy(from, newnode, constraints); - newnode->hasoids = from->hasoids; - newnode->oncommit = from->oncommit; + COPY_NODE_FIELD(relation); + COPY_NODE_FIELD(tableElts); + COPY_NODE_FIELD(inhRelations); + COPY_NODE_FIELD(constraints); + COPY_SCALAR_FIELD(hasoids); + COPY_SCALAR_FIELD(oncommit); return newnode; } @@ -2093,9 +1917,9 @@ _copyDefineStmt(DefineStmt *from) { DefineStmt *newnode = makeNode(DefineStmt); - newnode->defType = from->defType; - Node_Copy(from, newnode, defnames); - Node_Copy(from, newnode, definition); + COPY_SCALAR_FIELD(defType); + COPY_NODE_FIELD(defnames); + COPY_NODE_FIELD(definition); return newnode; } @@ -2105,9 +1929,9 @@ _copyDropStmt(DropStmt *from) { DropStmt *newnode = makeNode(DropStmt); - Node_Copy(from, newnode, objects); - newnode->removeType = from->removeType; - newnode->behavior = from->behavior; + COPY_NODE_FIELD(objects); + COPY_SCALAR_FIELD(removeType); + COPY_SCALAR_FIELD(behavior); return newnode; } @@ -2117,7 +1941,7 @@ _copyTruncateStmt(TruncateStmt *from) { TruncateStmt *newnode = makeNode(TruncateStmt); - Node_Copy(from, newnode, relation); + COPY_NODE_FIELD(relation); return newnode; } @@ -2127,11 +1951,10 @@ _copyCommentStmt(CommentStmt *from) { CommentStmt *newnode = makeNode(CommentStmt); - newnode->objtype = from->objtype; - Node_Copy(from, newnode, objname); - Node_Copy(from, newnode, objargs); - if (from->comment) - newnode->comment = pstrdup(from->comment); + COPY_SCALAR_FIELD(objtype); + COPY_NODE_FIELD(objname); + COPY_NODE_FIELD(objargs); + COPY_STRING_FIELD(comment); return newnode; } @@ -2141,10 +1964,10 @@ _copyFetchStmt(FetchStmt *from) { FetchStmt *newnode = makeNode(FetchStmt); - newnode->direction = from->direction; - newnode->howMany = from->howMany; - newnode->portalname = pstrdup(from->portalname); - newnode->ismove = from->ismove; + COPY_SCALAR_FIELD(direction); + COPY_SCALAR_FIELD(howMany); + COPY_STRING_FIELD(portalname); + COPY_SCALAR_FIELD(ismove); return newnode; } @@ -2154,15 +1977,15 @@ _copyIndexStmt(IndexStmt *from) { IndexStmt *newnode = makeNode(IndexStmt); - newnode->idxname = pstrdup(from->idxname); - Node_Copy(from, newnode, relation); - newnode->accessMethod = pstrdup(from->accessMethod); - Node_Copy(from, newnode, indexParams); - Node_Copy(from, newnode, whereClause); - Node_Copy(from, newnode, rangetable); - newnode->unique = from->unique; - newnode->primary = from->primary; - newnode->isconstraint = from->isconstraint; + COPY_STRING_FIELD(idxname); + COPY_NODE_FIELD(relation); + COPY_STRING_FIELD(accessMethod); + COPY_NODE_FIELD(indexParams); + COPY_NODE_FIELD(whereClause); + COPY_NODE_FIELD(rangetable); + COPY_SCALAR_FIELD(unique); + COPY_SCALAR_FIELD(primary); + COPY_SCALAR_FIELD(isconstraint); return newnode; } @@ -2172,12 +1995,12 @@ _copyCreateFunctionStmt(CreateFunctionStmt *from) { CreateFunctionStmt *newnode = makeNode(CreateFunctionStmt); - newnode->replace = from->replace; - Node_Copy(from, newnode, funcname); - Node_Copy(from, newnode, argTypes); - Node_Copy(from, newnode, returnType); - Node_Copy(from, newnode, options); - Node_Copy(from, newnode, withClause); + COPY_SCALAR_FIELD(replace); + COPY_NODE_FIELD(funcname); + COPY_NODE_FIELD(argTypes); + COPY_NODE_FIELD(returnType); + COPY_NODE_FIELD(options); + COPY_NODE_FIELD(withClause); return newnode; } @@ -2187,9 +2010,9 @@ _copyRemoveAggrStmt(RemoveAggrStmt *from) { RemoveAggrStmt *newnode = makeNode(RemoveAggrStmt); - Node_Copy(from, newnode, aggname); - Node_Copy(from, newnode, aggtype); - newnode->behavior = from->behavior; + COPY_NODE_FIELD(aggname); + COPY_NODE_FIELD(aggtype); + COPY_SCALAR_FIELD(behavior); return newnode; } @@ -2199,9 +2022,9 @@ _copyRemoveFuncStmt(RemoveFuncStmt *from) { RemoveFuncStmt *newnode = makeNode(RemoveFuncStmt); - Node_Copy(from, newnode, funcname); - Node_Copy(from, newnode, args); - newnode->behavior = from->behavior; + COPY_NODE_FIELD(funcname); + COPY_NODE_FIELD(args); + COPY_SCALAR_FIELD(behavior); return newnode; } @@ -2211,9 +2034,9 @@ _copyRemoveOperStmt(RemoveOperStmt *from) { RemoveOperStmt *newnode = makeNode(RemoveOperStmt); - Node_Copy(from, newnode, opname); - Node_Copy(from, newnode, args); - newnode->behavior = from->behavior; + COPY_NODE_FIELD(opname); + COPY_NODE_FIELD(args); + COPY_SCALAR_FIELD(behavior); return newnode; } @@ -2223,10 +2046,9 @@ _copyRemoveOpClassStmt(RemoveOpClassStmt *from) { RemoveOpClassStmt *newnode = makeNode(RemoveOpClassStmt); - Node_Copy(from, newnode, opclassname); - if (from->amname) - newnode->amname = pstrdup(from->amname); - newnode->behavior = from->behavior; + COPY_NODE_FIELD(opclassname); + COPY_STRING_FIELD(amname); + COPY_SCALAR_FIELD(behavior); return newnode; } @@ -2236,12 +2058,10 @@ _copyRenameStmt(RenameStmt *from) { RenameStmt *newnode = makeNode(RenameStmt); - Node_Copy(from, newnode, relation); - if (from->oldname) - newnode->oldname = pstrdup(from->oldname); - if (from->newname) - newnode->newname = pstrdup(from->newname); - newnode->renameType = from->renameType; + COPY_NODE_FIELD(relation); + COPY_STRING_FIELD(oldname); + COPY_STRING_FIELD(newname); + COPY_SCALAR_FIELD(renameType); return newnode; } @@ -2251,13 +2071,13 @@ _copyRuleStmt(RuleStmt *from) { RuleStmt *newnode = makeNode(RuleStmt); - Node_Copy(from, newnode, relation); - newnode->rulename = pstrdup(from->rulename); - Node_Copy(from, newnode, whereClause); - newnode->event = from->event; - newnode->instead = from->instead; - newnode->replace = from->replace; - Node_Copy(from, newnode, actions); + COPY_NODE_FIELD(relation); + COPY_STRING_FIELD(rulename); + COPY_NODE_FIELD(whereClause); + COPY_SCALAR_FIELD(event); + COPY_SCALAR_FIELD(instead); + COPY_NODE_FIELD(actions); + COPY_SCALAR_FIELD(replace); return newnode; } @@ -2267,7 +2087,7 @@ _copyNotifyStmt(NotifyStmt *from) { NotifyStmt *newnode = makeNode(NotifyStmt); - Node_Copy(from, newnode, relation); + COPY_NODE_FIELD(relation); return newnode; } @@ -2277,7 +2097,7 @@ _copyListenStmt(ListenStmt *from) { ListenStmt *newnode = makeNode(ListenStmt); - Node_Copy(from, newnode, relation); + COPY_NODE_FIELD(relation); return newnode; } @@ -2287,7 +2107,7 @@ _copyUnlistenStmt(UnlistenStmt *from) { UnlistenStmt *newnode = makeNode(UnlistenStmt); - Node_Copy(from, newnode, relation); + COPY_NODE_FIELD(relation); return newnode; } @@ -2297,8 +2117,8 @@ _copyTransactionStmt(TransactionStmt *from) { TransactionStmt *newnode = makeNode(TransactionStmt); - newnode->command = from->command; - Node_Copy(from, newnode, options); + COPY_SCALAR_FIELD(command); + COPY_NODE_FIELD(options); return newnode; } @@ -2308,8 +2128,8 @@ _copyCompositeTypeStmt(CompositeTypeStmt *from) { CompositeTypeStmt *newnode = makeNode(CompositeTypeStmt); - Node_Copy(from, newnode, typevar); - Node_Copy(from, newnode, coldeflist); + COPY_NODE_FIELD(typevar); + COPY_NODE_FIELD(coldeflist); return newnode; } @@ -2319,10 +2139,10 @@ _copyViewStmt(ViewStmt *from) { ViewStmt *newnode = makeNode(ViewStmt); - Node_Copy(from, newnode, view); - Node_Copy(from, newnode, aliases); - Node_Copy(from, newnode, query); - newnode->replace = from->replace; + COPY_NODE_FIELD(view); + COPY_NODE_FIELD(aliases); + COPY_NODE_FIELD(query); + COPY_SCALAR_FIELD(replace); return newnode; } @@ -2332,8 +2152,7 @@ _copyLoadStmt(LoadStmt *from) { LoadStmt *newnode = makeNode(LoadStmt); - if (from->filename) - newnode->filename = pstrdup(from->filename); + COPY_STRING_FIELD(filename); return newnode; } @@ -2343,9 +2162,9 @@ _copyCreateDomainStmt(CreateDomainStmt *from) { CreateDomainStmt *newnode = makeNode(CreateDomainStmt); - Node_Copy(from, newnode, domainname); - Node_Copy(from, newnode, typename); - Node_Copy(from, newnode, constraints); + COPY_NODE_FIELD(domainname); + COPY_NODE_FIELD(typename); + COPY_NODE_FIELD(constraints); return newnode; } @@ -2355,12 +2174,11 @@ _copyCreateOpClassStmt(CreateOpClassStmt *from) { CreateOpClassStmt *newnode = makeNode(CreateOpClassStmt); - Node_Copy(from, newnode, opclassname); - if (from->amname) - newnode->amname = pstrdup(from->amname); - Node_Copy(from, newnode, datatype); - Node_Copy(from, newnode, items); - newnode->isDefault = from->isDefault; + COPY_NODE_FIELD(opclassname); + COPY_STRING_FIELD(amname); + COPY_NODE_FIELD(datatype); + COPY_NODE_FIELD(items); + COPY_SCALAR_FIELD(isDefault); return newnode; } @@ -2370,12 +2188,12 @@ _copyCreateOpClassItem(CreateOpClassItem *from) { CreateOpClassItem *newnode = makeNode(CreateOpClassItem); - newnode->itemtype = from->itemtype; - Node_Copy(from, newnode, name); - Node_Copy(from, newnode, args); - newnode->number = from->number; - newnode->recheck = from->recheck; - Node_Copy(from, newnode, storedtype); + COPY_SCALAR_FIELD(itemtype); + COPY_NODE_FIELD(name); + COPY_NODE_FIELD(args); + COPY_SCALAR_FIELD(number); + COPY_SCALAR_FIELD(recheck); + COPY_NODE_FIELD(storedtype); return newnode; } @@ -2385,9 +2203,8 @@ _copyCreatedbStmt(CreatedbStmt *from) { CreatedbStmt *newnode = makeNode(CreatedbStmt); - if (from->dbname) - newnode->dbname = pstrdup(from->dbname); - Node_Copy(from, newnode, options); + COPY_STRING_FIELD(dbname); + COPY_NODE_FIELD(options); return newnode; } @@ -2397,11 +2214,9 @@ _copyAlterDatabaseSetStmt(AlterDatabaseSetStmt *from) { AlterDatabaseSetStmt *newnode = makeNode(AlterDatabaseSetStmt); - if (from->dbname) - newnode->dbname = pstrdup(from->dbname); - if (from->variable) - newnode->variable = pstrdup(from->variable); - Node_Copy(from, newnode, value); + COPY_STRING_FIELD(dbname); + COPY_STRING_FIELD(variable); + COPY_NODE_FIELD(value); return newnode; } @@ -2411,8 +2226,7 @@ _copyDropdbStmt(DropdbStmt *from) { DropdbStmt *newnode = makeNode(DropdbStmt); - if (from->dbname) - newnode->dbname = pstrdup(from->dbname); + COPY_STRING_FIELD(dbname); return newnode; } @@ -2422,13 +2236,13 @@ _copyVacuumStmt(VacuumStmt *from) { VacuumStmt *newnode = makeNode(VacuumStmt); - newnode->vacuum = from->vacuum; - newnode->full = from->full; - newnode->analyze = from->analyze; - newnode->freeze = from->freeze; - newnode->verbose = from->verbose; - Node_Copy(from, newnode, relation); - Node_Copy(from, newnode, va_cols); + COPY_SCALAR_FIELD(vacuum); + COPY_SCALAR_FIELD(full); + COPY_SCALAR_FIELD(analyze); + COPY_SCALAR_FIELD(freeze); + COPY_SCALAR_FIELD(verbose); + COPY_NODE_FIELD(relation); + COPY_NODE_FIELD(va_cols); return newnode; } @@ -2438,9 +2252,9 @@ _copyExplainStmt(ExplainStmt *from) { ExplainStmt *newnode = makeNode(ExplainStmt); - Node_Copy(from, newnode, query); - newnode->verbose = from->verbose; - newnode->analyze = from->analyze; + COPY_NODE_FIELD(query); + COPY_SCALAR_FIELD(verbose); + COPY_SCALAR_FIELD(analyze); return newnode; } @@ -2450,8 +2264,8 @@ _copyCreateSeqStmt(CreateSeqStmt *from) { CreateSeqStmt *newnode = makeNode(CreateSeqStmt); - Node_Copy(from, newnode, sequence); - Node_Copy(from, newnode, options); + COPY_NODE_FIELD(sequence); + COPY_NODE_FIELD(options); return newnode; } @@ -2461,10 +2275,9 @@ _copyVariableSetStmt(VariableSetStmt *from) { VariableSetStmt *newnode = makeNode(VariableSetStmt); - if (from->name) - newnode->name = pstrdup(from->name); - Node_Copy(from, newnode, args); - newnode->is_local = from->is_local; + COPY_STRING_FIELD(name); + COPY_NODE_FIELD(args); + COPY_SCALAR_FIELD(is_local); return newnode; } @@ -2474,8 +2287,7 @@ _copyVariableShowStmt(VariableShowStmt *from) { VariableShowStmt *newnode = makeNode(VariableShowStmt); - if (from->name) - newnode->name = pstrdup(from->name); + COPY_STRING_FIELD(name); return newnode; } @@ -2485,8 +2297,7 @@ _copyVariableResetStmt(VariableResetStmt *from) { VariableResetStmt *newnode = makeNode(VariableResetStmt); - if (from->name) - newnode->name = pstrdup(from->name); + COPY_STRING_FIELD(name); return newnode; } @@ -2496,18 +2307,17 @@ _copyCreateTrigStmt(CreateTrigStmt *from) { CreateTrigStmt *newnode = makeNode(CreateTrigStmt); - if (from->trigname) - newnode->trigname = pstrdup(from->trigname); - Node_Copy(from, newnode, relation); - Node_Copy(from, newnode, funcname); - Node_Copy(from, newnode, args); - newnode->before = from->before; - newnode->row = from->row; - memcpy(newnode->actions, from->actions, sizeof(from->actions)); - newnode->isconstraint = from->isconstraint; - newnode->deferrable = from->deferrable; - newnode->initdeferred = from->initdeferred; - Node_Copy(from, newnode, constrrel); + COPY_STRING_FIELD(trigname); + COPY_NODE_FIELD(relation); + COPY_NODE_FIELD(funcname); + COPY_NODE_FIELD(args); + COPY_SCALAR_FIELD(before); + COPY_SCALAR_FIELD(row); + strcpy(newnode->actions, from->actions); /* in-line string field */ + COPY_SCALAR_FIELD(isconstraint); + COPY_SCALAR_FIELD(deferrable); + COPY_SCALAR_FIELD(initdeferred); + COPY_NODE_FIELD(constrrel); return newnode; } @@ -2517,11 +2327,10 @@ _copyDropPropertyStmt(DropPropertyStmt *from) { DropPropertyStmt *newnode = makeNode(DropPropertyStmt); - Node_Copy(from, newnode, relation); - if (from->property) - newnode->property = pstrdup(from->property); - newnode->removeType = from->removeType; - newnode->behavior = from->behavior; + COPY_NODE_FIELD(relation); + COPY_STRING_FIELD(property); + COPY_SCALAR_FIELD(removeType); + COPY_SCALAR_FIELD(behavior); return newnode; } @@ -2531,11 +2340,10 @@ _copyCreatePLangStmt(CreatePLangStmt *from) { CreatePLangStmt *newnode = makeNode(CreatePLangStmt); - if (from->plname) - newnode->plname = pstrdup(from->plname); - Node_Copy(from, newnode, plhandler); - Node_Copy(from, newnode, plvalidator); - newnode->pltrusted = from->pltrusted; + COPY_STRING_FIELD(plname); + COPY_NODE_FIELD(plhandler); + COPY_NODE_FIELD(plvalidator); + COPY_SCALAR_FIELD(pltrusted); return newnode; } @@ -2545,9 +2353,8 @@ _copyDropPLangStmt(DropPLangStmt *from) { DropPLangStmt *newnode = makeNode(DropPLangStmt); - if (from->plname) - newnode->plname = pstrdup(from->plname); - newnode->behavior = from->behavior; + COPY_STRING_FIELD(plname); + COPY_SCALAR_FIELD(behavior); return newnode; } @@ -2557,9 +2364,8 @@ _copyCreateUserStmt(CreateUserStmt *from) { CreateUserStmt *newnode = makeNode(CreateUserStmt); - if (from->user) - newnode->user = pstrdup(from->user); - Node_Copy(from, newnode, options); + COPY_STRING_FIELD(user); + COPY_NODE_FIELD(options); return newnode; } @@ -2569,9 +2375,8 @@ _copyAlterUserStmt(AlterUserStmt *from) { AlterUserStmt *newnode = makeNode(AlterUserStmt); - if (from->user) - newnode->user = pstrdup(from->user); - Node_Copy(from, newnode, options); + COPY_STRING_FIELD(user); + COPY_NODE_FIELD(options); return newnode; } @@ -2581,11 +2386,9 @@ _copyAlterUserSetStmt(AlterUserSetStmt *from) { AlterUserSetStmt *newnode = makeNode(AlterUserSetStmt); - if (from->user) - newnode->user = pstrdup(from->user); - if (from->variable) - newnode->variable = pstrdup(from->variable); - Node_Copy(from, newnode, value); + COPY_STRING_FIELD(user); + COPY_STRING_FIELD(variable); + COPY_NODE_FIELD(value); return newnode; } @@ -2595,7 +2398,7 @@ _copyDropUserStmt(DropUserStmt *from) { DropUserStmt *newnode = makeNode(DropUserStmt); - Node_Copy(from, newnode, users); + COPY_NODE_FIELD(users); return newnode; } @@ -2605,9 +2408,8 @@ _copyLockStmt(LockStmt *from) { LockStmt *newnode = makeNode(LockStmt); - Node_Copy(from, newnode, relations); - - newnode->mode = from->mode; + COPY_NODE_FIELD(relations); + COPY_SCALAR_FIELD(mode); return newnode; } @@ -2617,8 +2419,8 @@ _copyConstraintsSetStmt(ConstraintsSetStmt *from) { ConstraintsSetStmt *newnode = makeNode(ConstraintsSetStmt); - Node_Copy(from, newnode, constraints); - newnode->deferred = from->deferred; + COPY_NODE_FIELD(constraints); + COPY_SCALAR_FIELD(deferred); return newnode; } @@ -2628,9 +2430,8 @@ _copyCreateGroupStmt(CreateGroupStmt *from) { CreateGroupStmt *newnode = makeNode(CreateGroupStmt); - if (from->name) - newnode->name = pstrdup(from->name); - Node_Copy(from, newnode, options); + COPY_STRING_FIELD(name); + COPY_NODE_FIELD(options); return newnode; } @@ -2640,10 +2441,9 @@ _copyAlterGroupStmt(AlterGroupStmt *from) { AlterGroupStmt *newnode = makeNode(AlterGroupStmt); - if (from->name) - newnode->name = pstrdup(from->name); - newnode->action = from->action; - Node_Copy(from, newnode, listUsers); + COPY_STRING_FIELD(name); + COPY_SCALAR_FIELD(action); + COPY_NODE_FIELD(listUsers); return newnode; } @@ -2653,8 +2453,7 @@ _copyDropGroupStmt(DropGroupStmt *from) { DropGroupStmt *newnode = makeNode(DropGroupStmt); - if (from->name) - newnode->name = pstrdup(from->name); + COPY_STRING_FIELD(name); return newnode; } @@ -2664,12 +2463,11 @@ _copyReindexStmt(ReindexStmt *from) { ReindexStmt *newnode = makeNode(ReindexStmt); - newnode->reindexType = from->reindexType; - Node_Copy(from, newnode, relation); - if (from->name) - newnode->name = pstrdup(from->name); - newnode->force = from->force; - newnode->all = from->all; + COPY_SCALAR_FIELD(reindexType); + COPY_NODE_FIELD(relation); + COPY_STRING_FIELD(name); + COPY_SCALAR_FIELD(force); + COPY_SCALAR_FIELD(all); return newnode; } @@ -2679,10 +2477,9 @@ _copyCreateSchemaStmt(CreateSchemaStmt *from) { CreateSchemaStmt *newnode = makeNode(CreateSchemaStmt); - newnode->schemaname = pstrdup(from->schemaname); - if (from->authid) - newnode->authid = pstrdup(from->authid); - Node_Copy(from, newnode, schemaElts); + COPY_STRING_FIELD(schemaname); + COPY_STRING_FIELD(authid); + COPY_NODE_FIELD(schemaElts); return newnode; } @@ -2692,11 +2489,11 @@ _copyCreateConversionStmt(CreateConversionStmt *from) { CreateConversionStmt *newnode = makeNode(CreateConversionStmt); - Node_Copy(from, newnode, conversion_name); - newnode->for_encoding_name = pstrdup(from->for_encoding_name); - newnode->to_encoding_name = pstrdup(from->to_encoding_name); - Node_Copy(from, newnode, func_name); - newnode->def = from->def; + COPY_NODE_FIELD(conversion_name); + COPY_STRING_FIELD(for_encoding_name); + COPY_STRING_FIELD(to_encoding_name); + COPY_NODE_FIELD(func_name); + COPY_SCALAR_FIELD(def); return newnode; } @@ -2706,10 +2503,10 @@ _copyCreateCastStmt(CreateCastStmt *from) { CreateCastStmt *newnode = makeNode(CreateCastStmt); - Node_Copy(from, newnode, sourcetype); - Node_Copy(from, newnode, targettype); - Node_Copy(from, newnode, func); - newnode->context = from->context; + COPY_NODE_FIELD(sourcetype); + COPY_NODE_FIELD(targettype); + COPY_NODE_FIELD(func); + COPY_SCALAR_FIELD(context); return newnode; } @@ -2719,9 +2516,9 @@ _copyDropCastStmt(DropCastStmt *from) { DropCastStmt *newnode = makeNode(DropCastStmt); - Node_Copy(from, newnode, sourcetype); - Node_Copy(from, newnode, targettype); - newnode->behavior = from->behavior; + COPY_NODE_FIELD(sourcetype); + COPY_NODE_FIELD(targettype); + COPY_SCALAR_FIELD(behavior); return newnode; } @@ -2731,10 +2528,10 @@ _copyPrepareStmt(PrepareStmt *from) { PrepareStmt *newnode = makeNode(PrepareStmt); - newnode->name = pstrdup(from->name); - Node_Copy(from, newnode, argtypes); - newnode->argtype_oids = listCopy(from->argtype_oids); - Node_Copy(from, newnode, query); + COPY_STRING_FIELD(name); + COPY_NODE_FIELD(argtypes); + COPY_INTLIST_FIELD(argtype_oids); + COPY_NODE_FIELD(query); return newnode; } @@ -2744,9 +2541,9 @@ _copyExecuteStmt(ExecuteStmt *from) { ExecuteStmt *newnode = makeNode(ExecuteStmt); - newnode->name = pstrdup(from->name); - Node_Copy(from, newnode, into); - Node_Copy(from, newnode, params); + COPY_STRING_FIELD(name); + COPY_NODE_FIELD(into); + COPY_NODE_FIELD(params); return newnode; } @@ -2756,7 +2553,7 @@ _copyDeallocateStmt(DeallocateStmt *from) { DeallocateStmt *newnode = makeNode(DeallocateStmt); - newnode->name = pstrdup(from->name); + COPY_STRING_FIELD(name); return newnode; } @@ -2774,16 +2571,16 @@ _copyValue(Value *from) /* See also _copyAConst when changing this code! */ - newnode->type = from->type; + COPY_SCALAR_FIELD(type); switch (from->type) { case T_Integer: - newnode->val.ival = from->val.ival; + COPY_SCALAR_FIELD(val.ival); break; case T_Float: case T_String: case T_BitString: - newnode->val.str = pstrdup(from->val.str); + COPY_STRING_FIELD(val.str); break; case T_Null: /* nothing to do */ @@ -2795,10 +2592,11 @@ _copyValue(Value *from) return newnode; } -/* ---------------- - * copyObject returns a copy of the node or list. If it is a list, it - * recursively copies its items. - * ---------------- +/* + * copyObject + * + * Create a copy of a Node tree or list. This is a "deep" copy: all + * substructure is copied too, recursively. */ void * copyObject(void *from) @@ -2889,6 +2687,12 @@ copyObject(void *from) case T_Fjoin: retval = _copyFjoin(from); break; + case T_Alias: + retval = _copyAlias(from); + break; + case T_RangeVar: + retval = _copyRangeVar(from); + break; case T_Expr: retval = _copyExpr(from); break; @@ -2904,18 +2708,15 @@ copyObject(void *from) case T_Param: retval = _copyParam(from); break; + case T_Func: + retval = _copyFunc(from); + break; case T_Aggref: retval = _copyAggref(from); break; case T_SubLink: retval = _copySubLink(from); break; - case T_Func: - retval = _copyFunc(from); - break; - case T_ArrayRef: - retval = _copyArrayRef(from); - break; case T_FieldSelect: retval = _copyFieldSelect(from); break; @@ -2925,11 +2726,14 @@ copyObject(void *from) case T_RangeTblRef: retval = _copyRangeTblRef(from); break; + case T_JoinExpr: + retval = _copyJoinExpr(from); + break; case T_FromExpr: retval = _copyFromExpr(from); break; - case T_JoinExpr: - retval = _copyJoinExpr(from); + case T_ArrayRef: + retval = _copyArrayRef(from); break; /* @@ -3239,12 +3043,6 @@ copyObject(void *from) case T_SortGroupBy: retval = _copySortGroupBy(from); break; - case T_Alias: - retval = _copyAlias(from); - break; - case T_RangeVar: - retval = _copyRangeVar(from); - break; case T_RangeSubselect: retval = _copyRangeSubselect(from); break; @@ -3318,5 +3116,6 @@ copyObject(void *from) retval = from; /* keep compiler quiet */ break; } + return retval; } |