1 /*-------------------------------------------------------------------------
4 * Free functions for Postgres tree nodes.
6 * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.37 2000/02/20 21:32:05 tgl Exp $
13 *-------------------------------------------------------------------------
18 #include "optimizer/planmain.h"
19 #include "access/heapam.h"
21 /* ****************************************************************
22 * plannodes.h free functions
23 * ****************************************************************
25 static void freeObject(void *obj);
30 * This function frees the fields of the Plan node. It is used by
31 * all the free functions for classes which inherit node Plan.
35 FreePlanFields(Plan *node)
37 freeObject(node->targetlist);
38 freeObject(node->qual);
39 freeObject(node->lefttree);
40 freeObject(node->righttree);
41 freeList(node->extParam);
42 freeList(node->locParam);
43 freeList(node->chgParam);
44 freeObject(node->initPlan);
45 freeList(node->subPlan);
56 * free the node superclass fields
62 * free remainder of node
74 _freeResult(Result *node)
77 * free node superclass fields
80 FreePlanFields((Plan *) node);
83 * free remainder of node
86 freeObject(node->resconstantqual);
96 _freeAppend(Append *node)
99 * free node superclass fields
102 FreePlanFields((Plan *) node);
105 * free remainder of node
108 freeObject(node->appendplans);
109 freeObject(node->unionrtables);
110 freeObject(node->inheritrtable);
119 * This function frees the fields of the Scan node. It is used by
120 * all the free functions for classes which inherit node Scan.
124 FreeScanFields(Scan *node)
133 _freeScan(Scan *node)
136 * free node superclass fields
139 FreePlanFields((Plan *) node);
140 FreeScanFields((Scan *) node);
150 _freeSeqScan(SeqScan *node)
153 * free node superclass fields
156 FreePlanFields((Plan *) node);
157 FreeScanFields((Scan *) node);
167 _freeIndexScan(IndexScan *node)
170 * free node superclass fields
173 FreePlanFields((Plan *) node);
174 FreeScanFields((Scan *) node);
177 * free remainder of node
180 freeList(node->indxid);
181 freeObject(node->indxqual);
182 freeObject(node->indxqualorig);
192 _freeTidScan(TidScan *node)
195 * free node superclass fields
198 FreePlanFields((Plan *) node);
199 FreeScanFields((Scan *) node);
202 * free remainder of node
205 freeObject(node->tideval);
213 * This function frees the fields of the Join node. It is used by
214 * all the free functions for classes which inherit node Join.
218 FreeJoinFields(Join *node)
230 _freeJoin(Join *node)
233 * free node superclass fields
236 FreePlanFields((Plan *) node);
237 FreeJoinFields(node);
248 _freeNestLoop(NestLoop *node)
251 * free node superclass fields
254 FreePlanFields((Plan *) node);
255 FreeJoinFields((Join *) node);
266 _freeMergeJoin(MergeJoin *node)
269 * free node superclass fields
272 FreePlanFields((Plan *) node);
273 FreeJoinFields((Join *) node);
276 * free remainder of node
279 freeObject(node->mergeclauses);
289 _freeHashJoin(HashJoin *node)
292 * free node superclass fields
295 FreePlanFields((Plan *) node);
296 FreeJoinFields((Join *) node);
299 * free remainder of node
302 freeObject(node->hashclauses);
311 * This function frees the fields of the Noname node. It is used by
312 * all the free functions for classes which inherit node Noname.
316 FreeNonameFields(Noname *node)
327 _freeNoname(Noname *node)
330 * free node superclass fields
333 FreePlanFields((Plan *) node);
334 FreeNonameFields(node);
344 _freeMaterial(Material *node)
347 * free node superclass fields
350 FreePlanFields((Plan *) node);
351 FreeNonameFields((Noname *) node);
362 _freeSort(Sort *node)
365 * free node superclass fields
368 FreePlanFields((Plan *) node);
369 FreeNonameFields((Noname *) node);
380 _freeGroup(Group *node)
382 FreePlanFields((Plan *) node);
384 pfree(node->grpColIdx);
396 FreePlanFields((Plan *) node);
406 _freeGroupClause(GroupClause *node)
417 _freeUnique(Unique *node)
420 * free node superclass fields
423 FreePlanFields((Plan *) node);
424 FreeNonameFields((Noname *) node);
427 * free remainder of node
430 pfree(node->uniqColIdx);
441 _freeHash(Hash *node)
444 * free node superclass fields
447 FreePlanFields((Plan *) node);
450 * free remainder of node
453 freeObject(node->hashkey);
459 _freeSubPlan(SubPlan *node)
461 freeObject(node->plan);
462 freeObject(node->rtable);
463 freeList(node->setParam);
464 freeList(node->parParam);
465 freeObject(node->sublink);
468 heap_freetuple(node->curTuple);
473 /* ****************************************************************
474 * primnodes.h free functions
475 * ****************************************************************
483 _freeResdom(Resdom *node)
485 if (node->resname != NULL)
486 pfree(node->resname);
492 _freeFjoin(Fjoin *node)
494 freeObject(node->fj_innerNode);
495 pfree(node->fj_results);
496 pfree(node->fj_alwaysDone);
506 _freeExpr(Expr *node)
508 freeObject(node->oper);
509 freeObject(node->args);
522 * free remainder of node
529 _freeFcache(FunctionCachePtr ptr)
532 pfree(ptr->argOidVect);
534 pfree(ptr->nullVect);
540 pfree(ptr->func_state);
552 _freeOper(Oper *node)
555 * free remainder of node
559 _freeFcache(node->op_fcache);
569 _freeConst(Const *node)
572 * free remainder of node
575 if (!node->constbyval)
576 pfree((void *) node->constvalue);
586 _freeParam(Param *node)
589 * free remainder of node
592 if (node->paramname != NULL)
593 pfree(node->paramname);
594 freeObject(node->param_tlist);
604 _freeFunc(Func *node)
607 * free remainder of node
610 freeObject(node->func_tlist);
611 freeObject(node->func_planlist);
612 if (node->func_fcache)
613 _freeFcache(node->func_fcache);
623 _freeAggref(Aggref *node)
626 * free remainder of node
629 pfree(node->aggname);
630 freeObject(node->target);
640 _freeSubLink(SubLink *node)
643 * free remainder of node
646 freeObject(node->lefthand);
647 freeObject(node->oper);
648 freeObject(node->subselect);
658 _freeRelabelType(RelabelType *node)
661 * free remainder of node
664 freeObject(node->arg);
674 _freeCaseExpr(CaseExpr *node)
677 * free remainder of node
680 freeObject(node->arg);
681 freeObject(node->args);
682 freeObject(node->defresult);
692 _freeCaseWhen(CaseWhen *node)
695 * free remainder of node
698 freeObject(node->expr);
699 freeObject(node->result);
705 _freeArray(Array *node)
708 * free remainder of node
715 _freeArrayRef(ArrayRef *node)
718 * free remainder of node
721 freeObject(node->refupperindexpr);
722 freeObject(node->reflowerindexpr);
723 freeObject(node->refexpr);
724 freeObject(node->refassgnexpr);
729 /* ****************************************************************
730 * relation.h free functions
731 * ****************************************************************
739 _freeRelOptInfo(RelOptInfo *node)
742 * free remainder of node
745 freeList(node->relids);
747 freeObject(node->targetlist);
748 freeObject(node->pathlist);
749 /* XXX is this right? cheapest-path fields will typically be pointers
750 * into pathlist, not separate structs...
752 freeObject(node->cheapest_startup_path);
753 freeObject(node->cheapest_total_path);
755 freeObject(node->baserestrictinfo);
756 freeObject(node->joininfo);
757 freeObject(node->innerjoin);
767 _freeIndexOptInfo(IndexOptInfo *node)
770 * free remainder of node
774 pfree(node->classlist);
777 pfree(node->indexkeys);
780 pfree(node->ordering);
782 freeObject(node->indpred);
790 * This function frees the fields of the Path node. It is used by
791 * all the free functions for classes which inherit node Path.
795 FreePathFields(Path *node)
797 /* we do NOT free the parent; it doesn't belong to the Path */
799 freeObject(node->pathkeys);
807 _freePath(Path *node)
809 FreePathFields(node);
819 _freeIndexPath(IndexPath *node)
822 * free the node superclass fields
825 FreePathFields((Path *) node);
828 * free remainder of node
831 freeList(node->indexid);
832 freeObject(node->indexqual);
833 freeList(node->joinrelids);
843 _freeTidPath(TidPath *node)
846 * free the node superclass fields
849 FreePathFields((Path *) node);
852 * free remainder of node
855 freeObject(node->tideval);
856 freeList(node->unjoined_relids);
864 * This function frees the fields of the JoinPath node. It is used by
865 * all the free functions for classes which inherit node JoinPath.
869 FreeJoinPathFields(JoinPath *node)
871 freeObject(node->outerjoinpath);
872 freeObject(node->innerjoinpath);
873 /* XXX probably wrong, since ordinarily a JoinPath would share its
874 * restrictinfo list with other paths made for the same join?
876 freeObject(node->joinrestrictinfo);
884 _freeNestPath(NestPath *node)
887 * free the node superclass fields
890 FreePathFields((Path *) node);
891 FreeJoinPathFields((JoinPath *) node);
901 _freeMergePath(MergePath *node)
904 * free the node superclass fields
907 FreePathFields((Path *) node);
908 FreeJoinPathFields((JoinPath *) node);
911 * free the remainder of the node
914 freeObject(node->path_mergeclauses);
915 freeObject(node->outersortkeys);
916 freeObject(node->innersortkeys);
926 _freeHashPath(HashPath *node)
929 * free the node superclass fields
932 FreePathFields((Path *) node);
933 FreeJoinPathFields((JoinPath *) node);
936 * free remainder of node
939 freeObject(node->path_hashclauses);
949 _freePathKeyItem(PathKeyItem *node)
952 * free remainder of node
955 freeObject(node->key);
966 _freeRestrictInfo(RestrictInfo *node)
969 * free remainder of node
972 freeObject(node->clause);
973 /* this is certainly wrong? IndexOptInfos don't belong to
976 freeObject(node->subclauseindices);
986 _freeJoinInfo(JoinInfo *node)
989 * free remainder of node
992 freeList(node->unjoined_relids);
993 freeObject(node->jinfo_restrictinfo);
999 _freeIter(Iter *node)
1001 freeObject(node->iterexpr);
1007 _freeStream(Stream *node)
1009 freeObject(node->downstream);
1015 * parsenodes.h routines have no free functions
1019 _freeTargetEntry(TargetEntry *node)
1021 freeObject(node->resdom);
1022 freeObject(node->fjoin);
1023 freeObject(node->expr);
1029 _freeRangeTblEntry(RangeTblEntry *node)
1032 pfree(node->relname);
1033 freeObject(node->ref);
1039 _freeAttr(Attr *node)
1042 pfree(node->relname);
1043 freeObject(node->attrs);
1049 _freeRowMark(RowMark *node)
1055 _freeSortClause(SortClause *node)
1061 _freeAConst(A_Const *node)
1063 freeObject(&(node->val));
1064 freeObject(node->typename);
1070 _freeTypeName(TypeName *node)
1074 freeObject(node->arrayBounds);
1080 _freeTypeCast(TypeCast *node)
1082 freeObject(node->arg);
1083 freeObject(node->typename);
1089 _freeQuery(Query *node)
1091 if (node->utilityStmt && nodeTag(node->utilityStmt) == T_NotifyStmt)
1093 NotifyStmt *node_notify = (NotifyStmt *) node->utilityStmt;
1095 pfree(node_notify->relname);
1100 freeObject(node->rtable);
1101 freeObject(node->targetList);
1102 freeObject(node->qual);
1103 freeObject(node->rowMark);
1104 freeObject(node->distinctClause);
1105 freeObject(node->sortClause);
1106 freeObject(node->groupClause);
1107 freeObject(node->havingQual);
1108 /* why not intersectClause? */
1109 freeObject(node->unionClause);
1110 freeObject(node->limitOffset);
1111 freeObject(node->limitCount);
1113 /* XXX should we be freeing the planner internal fields? */
1120 * mnodes.h routines have no free functions
1123 /* ****************************************************************
1124 * pg_list.h free functions
1125 * ****************************************************************
1129 _freeValue(Value *node)
1134 pfree(node->val.str);
1144 * freeObject free's the node or list. If it is a list, it
1145 * recursively frees its items.
1149 freeObject(void *node)
1154 switch (nodeTag(node))
1176 _freeIndexScan(node);
1185 _freeNestLoop(node);
1188 _freeMergeJoin(node);
1191 _freeHashJoin(node);
1197 _freeMaterial(node);
1209 _freeGroupClause(node);
1252 _freeArrayRef(node);
1261 _freeRelabelType(node);
1264 _freeCaseExpr(node);
1267 _freeCaseWhen(node);
1274 _freeRelOptInfo(node);
1280 _freeIndexPath(node);
1286 _freeNestPath(node);
1289 _freeMergePath(node);
1292 _freeHashPath(node);
1295 _freePathKeyItem(node);
1297 case T_RestrictInfo:
1298 _freeRestrictInfo(node);
1301 _freeJoinInfo(node);
1309 case T_IndexOptInfo:
1310 _freeIndexOptInfo(node);
1320 _freeTargetEntry(node);
1322 case T_RangeTblEntry:
1323 _freeRangeTblEntry(node);
1329 _freeSortClause(node);
1335 _freeTypeName(node);
1338 _freeTypeCast(node);
1358 freeObject(lfirst(l));
1363 elog(ERROR, "freeObject: don't know how to free %d", nodeTag(node));