1 /*-------------------------------------------------------------------------
4 * Free functions for Postgres tree nodes.
6 * Copyright (c) 1994, Regents of the University of California
10 * $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.7 1999/02/11 14:58:49 momjian Exp $
12 *-------------------------------------------------------------------------
19 #include "nodes/pg_list.h"
20 #include "nodes/execnodes.h"
21 #include "nodes/plannodes.h"
22 #include "nodes/parsenodes.h"
23 #include "nodes/primnodes.h"
24 #include "nodes/relation.h"
26 #include "utils/syscache.h"
27 #include "utils/builtins.h" /* for namecpy */
28 #include "utils/elog.h"
29 #include "utils/palloc.h"
30 #include "catalog/pg_type.h"
31 #include "storage/lmgr.h"
32 #include "optimizer/planmain.h"
34 /* ****************************************************************
35 * plannodes.h free functions
36 * ****************************************************************
42 * This function frees the fields of the Plan node. It is used by
43 * all the free functions for classes which inherit node Plan.
47 FreePlanFields(Plan *node)
49 freeObject(node->targetlist);
50 freeObject(node->qual);
51 freeObject(node->lefttree);
52 freeObject(node->righttree);
53 freeList(node->extParam);
54 freeList(node->locParam);
55 freeList(node->chgParam);
56 freeObject(node->initPlan);
57 freeList(node->subPlan);
68 * free the node superclass fields
74 * free remainder of node
86 _freeResult(Result *node)
89 * free node superclass fields
92 FreePlanFields((Plan *) node);
95 * free remainder of node
98 freeObject(node->resconstantqual);
108 _freeAppend(Append *node)
111 * free node superclass fields
114 FreePlanFields((Plan *) node);
117 * free remainder of node
120 freeObject(node->appendplans);
121 freeObject(node->unionrtables);
122 freeObject(node->inheritrtable);
131 * This function frees the fields of the Scan node. It is used by
132 * all the free functions for classes which inherit node Scan.
136 FreeScanFields(Scan *node)
145 _freeScan(Scan *node)
148 * free node superclass fields
151 FreePlanFields((Plan *) node);
152 FreeScanFields((Scan *) node);
162 _freeSeqScan(SeqScan *node)
165 * free node superclass fields
168 FreePlanFields((Plan *) node);
169 FreeScanFields((Scan *) node);
179 _freeIndexScan(IndexScan *node)
182 * free node superclass fields
185 FreePlanFields((Plan *) node);
186 FreeScanFields((Scan *) node);
189 * free remainder of node
192 freeList(node->indxid);
193 freeObject(node->indxqual);
194 freeObject(node->indxqualorig);
202 * This function frees the fields of the Join node. It is used by
203 * all the free functions for classes which inherit node Join.
207 FreeJoinFields(Join *node)
219 _freeJoin(Join *node)
222 * free node superclass fields
225 FreePlanFields((Plan *) node);
226 FreeJoinFields(node);
237 _freeNestLoop(NestLoop *node)
240 * free node superclass fields
243 FreePlanFields((Plan *) node);
244 FreeJoinFields((Join *) node);
255 _freeMergeJoin(MergeJoin *node)
258 * free node superclass fields
261 FreePlanFields((Plan *) node);
262 FreeJoinFields((Join *) node);
265 * free remainder of node
268 freeObject(node->mergeclauses);
270 pfree(node->mergerightorder);
271 pfree(node->mergeleftorder);
281 _freeHashJoin(HashJoin *node)
284 * free node superclass fields
287 FreePlanFields((Plan *) node);
288 FreeJoinFields((Join *) node);
291 * free remainder of node
294 freeObject(node->hashclauses);
303 * This function frees the fields of the Noname node. It is used by
304 * all the free functions for classes which inherit node Noname.
308 FreeNonameFields(Noname *node)
319 _freeNoname(Noname *node)
322 * free node superclass fields
325 FreePlanFields((Plan *) node);
326 FreeNonameFields(node);
336 _freeMaterial(Material *node)
339 * free node superclass fields
342 FreePlanFields((Plan *) node);
343 FreeNonameFields((Noname *) node);
354 _freeSort(Sort *node)
357 * free node superclass fields
360 FreePlanFields((Plan *) node);
361 FreeNonameFields((Noname *) node);
372 _freeGroup(Group *node)
374 FreePlanFields((Plan *) node);
376 pfree(node->grpColIdx);
388 FreePlanFields((Plan *) node);
390 freeList(node->aggs);
400 _freeGroupClause(GroupClause *node)
402 freeObject(node->entry);
413 _freeUnique(Unique *node)
416 * free node superclass fields
419 FreePlanFields((Plan *) node);
420 FreeNonameFields((Noname *) node);
423 * free remainder of node
426 if (node->uniqueAttr)
427 pfree(node->uniqueAttr);
438 _freeHash(Hash *node)
441 * free node superclass fields
444 FreePlanFields((Plan *) node);
447 * free remainder of node
450 freeObject(node->hashkey);
456 _freeSubPlan(SubPlan *node)
458 freeObject(node->plan);
459 freeObject(node->rtable);
460 freeList(node->setParam);
461 freeList(node->parParam);
462 freeObject(node->sublink);
467 /* ****************************************************************
468 * primnodes.h free functions
469 * ****************************************************************
477 _freeResdom(Resdom *node)
479 if (node->resname != NULL)
480 pfree(node->resname);
486 _freeFjoin(Fjoin *node)
488 freeObject(node->fj_innerNode);
489 pfree(node->fj_results);
490 pfree(node->fj_alwaysDone);
500 _freeExpr(Expr *node)
502 freeObject(node->oper);
503 freeObject(node->args);
516 * free remainder of node
523 _freeFcache(FunctionCachePtr ptr)
526 pfree(ptr->argOidVect);
528 pfree(ptr->nullVect);
534 pfree(ptr->func_state);
546 _freeOper(Oper *node)
549 * free remainder of node
553 _freeFcache(node->op_fcache);
563 _freeConst(Const *node)
566 * free remainder of node
569 if (!node->constbyval)
570 pfree((void *)node->constvalue);
580 _freeParam(Param *node)
583 * free remainder of node
586 if (node->paramname != NULL)
587 pfree(node->paramname);
588 freeObject(node->param_tlist);
598 _freeFunc(Func *node)
601 * free remainder of node
604 freeObject(node->func_tlist);
605 freeObject(node->func_planlist);
606 if (node->func_fcache)
607 _freeFcache(node->func_fcache);
617 _freeAggref(Aggref *node)
620 * free remainder of node
623 pfree(node->aggname);
624 freeObject(node->target);
634 _freeSubLink(SubLink *node)
637 * free remainder of node
640 freeObject(node->lefthand);
641 freeObject(node->oper);
642 freeObject(node->subselect);
652 _freeCaseExpr(CaseExpr *node)
655 * free remainder of node
658 freeObject(node->arg);
659 freeObject(node->args);
660 freeObject(node->defresult);
670 _freeCaseWhen(CaseWhen *node)
673 * free remainder of node
676 freeObject(node->expr);
677 freeObject(node->result);
683 _freeArray(Array *node)
686 * free remainder of node
693 _freeArrayRef(ArrayRef *node)
696 * free remainder of node
699 freeObject(node->refupperindexpr);
700 freeObject(node->reflowerindexpr);
701 freeObject(node->refexpr);
702 freeObject(node->refassgnexpr);
707 /* ****************************************************************
708 * relation.h free functions
709 * ****************************************************************
717 _freeRelOptInfo(RelOptInfo *node)
720 * free remainder of node
723 freeList(node->relids);
725 freeObject(node->targetlist);
726 freeObject(node->pathlist);
727 freeObject(node->unorderedpath);
728 freeObject(node->cheapestpath);
731 pfree(node->classlist);
734 pfree(node->indexkeys);
736 freeObject(node->indpred);
739 pfree(node->ordering);
741 freeObject(node->restrictinfo);
742 freeObject(node->joininfo);
743 freeObject(node->innerjoin);
744 freeObject(node->superrels);
752 * This function frees the fields of the Path node. It is used by
753 * all the free functions for classes which inherit node Path.
757 FreePathFields(Path *node)
759 if (node->pathorder->ordtype == SORTOP_ORDER)
761 if (node->pathorder->ord.sortop)
762 pfree(node->pathorder->ord.sortop);
765 freeObject(node->pathorder->ord.merge);
767 pfree(node->pathorder); /* is it an object, but we don't have
768 separate free for it */
770 freeObject(node->pathkeys);
772 freeList(node->joinid);
773 freeObject(node->loc_restrictinfo);
781 _freePath(Path *node)
783 FreePathFields(node);
793 _freeIndexPath(IndexPath *node)
796 * free the node superclass fields
799 FreePathFields((Path *) node);
802 * free remainder of node
805 freeList(node->indexid);
806 freeObject(node->indexqual);
809 pfree(node->indexkeys);
817 * This function frees the fields of the JoinPath node. It is used by
818 * all the free functions for classes which inherit node JoinPath.
822 FreeJoinPathFields(JoinPath *node)
824 freeObject(node->pathinfo);
825 freeObject(node->outerjoinpath);
826 freeObject(node->innerjoinpath);
834 _freeJoinPath(JoinPath *node)
837 * free the node superclass fields
840 FreePathFields((Path *) node);
841 FreeJoinPathFields(node);
851 _freeMergePath(MergePath *node)
854 * free the node superclass fields
857 FreePathFields((Path *) node);
858 FreeJoinPathFields((JoinPath *) node);
861 * free the remainder of the node
864 freeObject(node->path_mergeclauses);
865 freeObject(node->outersortkeys);
866 freeObject(node->innersortkeys);
876 _freeHashPath(HashPath *node)
879 * free the node superclass fields
882 FreePathFields((Path *) node);
883 FreeJoinPathFields((JoinPath *) node);
886 * free remainder of node
889 freeObject(node->path_hashclauses);
890 freeObject(node->outerhashkeys);
891 freeObject(node->innerhashkeys);
901 _freeOrderKey(OrderKey *node)
912 _freeJoinKey(JoinKey *node)
915 * free remainder of node
918 freeObject(node->outer);
919 freeObject(node->inner);
929 _freeMergeOrder(MergeOrder *node)
932 * free remainder of node
943 _freeRestrictInfo(RestrictInfo * node)
946 * free remainder of node
949 freeObject(node->clause);
950 freeObject(node->indexids);
951 freeObject(node->mergejoinorder);
952 freeList(node->restrictinfojoinid);
958 * FreeJoinMethodFields
960 * This function frees the fields of the JoinMethod node. It is used by
961 * all the free functions for classes which inherit node JoinMethod.
965 FreeJoinMethodFields(JoinMethod *node)
967 freeObject(node->jmkeys);
968 freeObject(node->clauses);
977 _freeJoinMethod(JoinMethod *node)
979 FreeJoinMethodFields(node);
989 _freeHashInfo(HashInfo *node)
992 * free remainder of node
995 FreeJoinMethodFields((JoinMethod *) node);
1005 _freeMergeInfo(MergeInfo *node)
1008 * free remainder of node
1011 FreeJoinMethodFields((JoinMethod *) node);
1012 freeObject(node->m_ordering);
1022 _freeJoinInfo(JoinInfo * node)
1025 * free remainder of node
1028 freeList(node->otherrels);
1029 freeObject(node->jinfo_restrictinfo);
1035 _freeIter(Iter *node)
1037 freeObject(node->iterexpr);
1043 _freeStream(Stream *node)
1045 freeObject(node->downstream);
1051 * parsenodes.h routines have no free functions
1056 _freeTargetEntry(TargetEntry *node)
1058 freeObject(node->resdom);
1059 freeObject(node->fjoin);
1060 freeObject(node->expr);
1066 _freeRangeTblEntry(RangeTblEntry *node)
1069 pfree(node->relname);
1071 pfree(node->refname);
1077 _freeRowMark(RowMark *node)
1083 _freeSortClause(SortClause *node)
1085 freeObject(node->resdom);
1091 _freeAConst(A_Const *node)
1093 freeObject(&(node->val));
1094 freeObject(node->typename);
1100 _freeTypeName(TypeName *node)
1104 freeObject(node->arrayBounds);
1110 _freeQuery(Query *node)
1112 if (node->utilityStmt && nodeTag(node->utilityStmt) == T_NotifyStmt)
1114 NotifyStmt *node_notify = (NotifyStmt *) node->utilityStmt;
1116 pfree(node_notify->relname);
1121 if (node->uniqueFlag)
1122 pfree(node->uniqueFlag);
1124 freeObject(node->sortClause);
1125 freeObject(node->rtable);
1126 freeObject(node->targetList);
1127 freeObject(node->qual);
1128 freeObject(node->groupClause);
1129 freeObject(node->havingQual);
1130 freeObject(node->unionClause);
1131 freeObject(node->limitOffset);
1132 freeObject(node->limitCount);
1133 freeObject(node->rowMark);
1140 * mnodes.h routines have no free functions
1144 /* ****************************************************************
1145 * pg_list.h free functions
1146 * ****************************************************************
1150 _freeValue(Value *node)
1155 pfree(node->val.str);
1165 * freeObject free's the node or list. If it is a list, it
1166 * recursively frees its items.
1170 freeObject(void *node)
1175 switch (nodeTag(node))
1196 _freeIndexScan(node);
1202 _freeNestLoop(node);
1205 _freeMergeJoin(node);
1208 _freeHashJoin(node);
1214 _freeMaterial(node);
1226 _freeGroupClause(node);
1269 _freeArrayRef(node);
1278 _freeCaseExpr(node);
1281 _freeCaseWhen(node);
1288 _freeRelOptInfo(node);
1294 _freeIndexPath(node);
1297 _freeJoinPath(node);
1300 _freeMergePath(node);
1303 _freeHashPath(node);
1306 _freeOrderKey(node);
1312 _freeMergeOrder(node);
1314 case T_RestrictInfo:
1315 _freeRestrictInfo(node);
1318 _freeJoinMethod(node);
1321 _freeHashInfo(node);
1324 _freeMergeInfo(node);
1327 _freeJoinInfo(node);
1343 _freeTargetEntry(node);
1345 case T_RangeTblEntry:
1346 _freeRangeTblEntry(node);
1352 _freeSortClause(node);
1358 _freeTypeName(node);
1375 freeObject(lfirst(l));
1380 elog(ERROR, "freeObject: don't know how to free %d", nodeTag(node));