diff options
Diffstat (limited to 'src/backend/nodes/freefuncs.c')
-rw-r--r-- | src/backend/nodes/freefuncs.c | 1381 |
1 files changed, 1381 insertions, 0 deletions
diff --git a/src/backend/nodes/freefuncs.c b/src/backend/nodes/freefuncs.c new file mode 100644 index 00000000000..e07573cf0ff --- /dev/null +++ b/src/backend/nodes/freefuncs.c @@ -0,0 +1,1381 @@ + /*------------------------------------------------------------------------- + * + * freefuncs.c-- + * Free functions for Postgres tree nodes. + * + * Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.1 1999/02/06 16:50:25 wieck Exp $ + * + *------------------------------------------------------------------------- + */ +#include <stdio.h> +#include <string.h> + +#include "postgres.h" + +#include "nodes/pg_list.h" +#include "nodes/execnodes.h" +#include "nodes/plannodes.h" +#include "nodes/parsenodes.h" +#include "nodes/primnodes.h" +#include "nodes/relation.h" + +#include "utils/syscache.h" +#include "utils/builtins.h" /* for namecpy */ +#include "utils/elog.h" +#include "utils/palloc.h" +#include "catalog/pg_type.h" +#include "storage/lmgr.h" +#include "optimizer/planmain.h" + +/* **************************************************************** + * plannodes.h free functions + * **************************************************************** + */ + +/* ---------------- + * FreePlanFields + * + * This function frees the fields of the Plan node. It is used by + * all the free functions for classes which inherit node Plan. + * ---------------- + */ +static void +FreePlanFields(Plan *node) +{ + freeObject(node->targetlist); + freeObject(node->qual); + freeObject(node->lefttree); + freeObject(node->righttree); + freeList(node->extParam); + freeList(node->locParam); + freeList(node->chgParam); + freeObject(node->initPlan); + freeList(node->subPlan); +} + +/* ---------------- + * _freePlan + * ---------------- + */ +static void +_freePlan(Plan *node) +{ + /* ---------------- + * free the node superclass fields + * ---------------- + */ + FreePlanFields(node); + + /* ---------------- + * free remainder of node + * ---------------- + */ + pfree(node); +} + + +/* ---------------- + * _freeResult + * ---------------- + */ +static void +_freeResult(Result *node) +{ + /* ---------------- + * free node superclass fields + * ---------------- + */ + FreePlanFields((Plan *) node); + + /* ---------------- + * free remainder of node + * ---------------- + */ + freeObject(node->resconstantqual); + + pfree(node); +} + +/* ---------------- + * _freeAppend + * ---------------- + */ +static void +_freeAppend(Append *node) +{ + /* ---------------- + * free node superclass fields + * ---------------- + */ + FreePlanFields((Plan *) node); + + /* ---------------- + * free remainder of node + * ---------------- + */ + freeObject(node->appendplans); + freeObject(node->unionrtables); + freeObject(node->inheritrtable); + + pfree(node); +} + + +/* ---------------- + * FreeScanFields + * + * This function frees the fields of the Scan node. It is used by + * all the free functions for classes which inherit node Scan. + * ---------------- + */ +static void +FreeScanFields(Scan *node) +{ +} + +/* ---------------- + * _freeScan + * ---------------- + */ +static void +_freeScan(Scan *node) +{ + /* ---------------- + * free node superclass fields + * ---------------- + */ + FreePlanFields((Plan *) node); + FreeScanFields((Scan *) node); + + pfree(node); +} + +/* ---------------- + * _freeSeqScan + * ---------------- + */ +static void +_freeSeqScan(SeqScan *node) +{ + /* ---------------- + * free node superclass fields + * ---------------- + */ + FreePlanFields((Plan *) node); + FreeScanFields((Scan *) node); + + pfree(node); +} + +/* ---------------- + * _freeIndexScan + * ---------------- + */ +static void +_freeIndexScan(IndexScan *node) +{ + /* ---------------- + * free node superclass fields + * ---------------- + */ + FreePlanFields((Plan *) node); + FreeScanFields((Scan *) node); + + /* ---------------- + * free remainder of node + * ---------------- + */ + freeList(node->indxid); + freeObject(node->indxqual); + freeObject(node->indxqualorig); + + pfree(node); +} + +/* ---------------- + * FreeJoinFields + * + * This function frees the fields of the Join node. It is used by + * all the free functions for classes which inherit node Join. + * ---------------- + */ +static void +FreeJoinFields(Join *node) +{ + /* nothing extra */ + return; +} + + +/* ---------------- + * _freeJoin + * ---------------- + */ +static void +_freeJoin(Join *node) +{ + /* ---------------- + * free node superclass fields + * ---------------- + */ + FreePlanFields((Plan *) node); + FreeJoinFields(node); + + pfree(node); +} + + +/* ---------------- + * _freeNestLoop + * ---------------- + */ +static void +_freeNestLoop(NestLoop *node) +{ + /* ---------------- + * free node superclass fields + * ---------------- + */ + FreePlanFields((Plan *) node); + FreeJoinFields((Join *) node); + + pfree(node); +} + + +/* ---------------- + * _freeMergeJoin + * ---------------- + */ +static void +_freeMergeJoin(MergeJoin *node) +{ + /* ---------------- + * free node superclass fields + * ---------------- + */ + FreePlanFields((Plan *) node); + FreeJoinFields((Join *) node); + + /* ---------------- + * free remainder of node + * ---------------- + */ + freeObject(node->mergeclauses); + + pfree(node->mergerightorder); + pfree(node->mergeleftorder); + + pfree(node); +} + +/* ---------------- + * _freeHashJoin + * ---------------- + */ +static void +_freeHashJoin(HashJoin *node) +{ + /* ---------------- + * free node superclass fields + * ---------------- + */ + FreePlanFields((Plan *) node); + FreeJoinFields((Join *) node); + + /* ---------------- + * free remainder of node + * ---------------- + */ + freeObject(node->hashclauses); + + pfree(node); +} + + +/* ---------------- + * FreeTempFields + * + * This function frees the fields of the Temp node. It is used by + * all the free functions for classes which inherit node Temp. + * ---------------- + */ +static void +FreeTempFields(Temp *node) +{ + return; +} + + +/* ---------------- + * _freeTemp + * ---------------- + */ +static void +_freeTemp(Temp *node) +{ + /* ---------------- + * free node superclass fields + * ---------------- + */ + FreePlanFields((Plan *) node); + FreeTempFields(node); + + pfree(node); +} + +/* ---------------- + * _freeMaterial + * ---------------- + */ +static void +_freeMaterial(Material *node) +{ + /* ---------------- + * free node superclass fields + * ---------------- + */ + FreePlanFields((Plan *) node); + FreeTempFields((Temp *) node); + + pfree(node); +} + + +/* ---------------- + * _freeSort + * ---------------- + */ +static void +_freeSort(Sort *node) +{ + /* ---------------- + * free node superclass fields + * ---------------- + */ + FreePlanFields((Plan *) node); + FreeTempFields((Temp *) node); + + pfree(node); +} + + +/* ---------------- + * _freeGroup + * ---------------- + */ +static void +_freeGroup(Group *node) +{ + FreePlanFields((Plan *) node); + + pfree(node->grpColIdx); + + pfree(node); +} + +/* --------------- + * _freeAgg + * -------------- + */ +static void +_freeAgg(Agg *node) +{ + FreePlanFields((Plan *) node); + + freeList(node->aggs); + + pfree(node); +} + +/* --------------- + * _freeGroupClause + * -------------- + */ +static void +_freeGroupClause(GroupClause *node) +{ + freeObject(node->entry); + + pfree(node); +} + + +/* ---------------- + * _freeUnique + * ---------------- + */ +static void +_freeUnique(Unique *node) +{ + /* ---------------- + * free node superclass fields + * ---------------- + */ + FreePlanFields((Plan *) node); + FreeTempFields((Temp *) node); + + /* ---------------- + * free remainder of node + * ---------------- + */ + if (node->uniqueAttr) + pfree(node->uniqueAttr); + + pfree(node); +} + + +/* ---------------- + * _freeHash + * ---------------- + */ +static void +_freeHash(Hash *node) +{ + /* ---------------- + * free node superclass fields + * ---------------- + */ + FreePlanFields((Plan *) node); + + /* ---------------- + * free remainder of node + * ---------------- + */ + freeObject(node->hashkey); + + pfree(node); +} + +static void +_freeSubPlan(SubPlan *node) +{ + freeObject(node->plan); + freeObject(node->rtable); + freeList(node->setParam); + freeList(node->parParam); + freeObject(node->sublink); + + pfree(node); +} + +/* **************************************************************** + * primnodes.h free functions + * **************************************************************** + */ + +/* ---------------- + * _freeResdom + * ---------------- + */ +static void +_freeResdom(Resdom *node) +{ + if (node->resname != NULL) + pfree(node->resname); + + pfree(node); +} + +static void +_freeFjoin(Fjoin *node) +{ + freeObject(node->fj_innerNode); + pfree(node->fj_results); + pfree(node->fj_alwaysDone); + + pfree(node); +} + +/* ---------------- + * _freeExpr + * ---------------- + */ +static void +_freeExpr(Expr *node) +{ + freeObject(node->oper); + freeObject(node->args); + + pfree(node); +} + +/* ---------------- + * _freeVar + * ---------------- + */ +static void +_freeVar(Var *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + pfree(node); +} + +static void +_freeFcache(FunctionCachePtr ptr) +{ + if (ptr->argOidVect) + pfree(ptr->argOidVect); + if (ptr->nullVect) + pfree(ptr->nullVect); + if (ptr->src) + pfree(ptr->src); + if (ptr->bin) + pfree(ptr->bin); + if (ptr->func_state) + pfree(ptr->func_state); + if (ptr->setArg) + pfree(ptr->setArg); + + pfree(ptr); +} + +/* ---------------- + * _freeOper + * ---------------- + */ +static void +_freeOper(Oper *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + if (node->op_fcache) + _freeFcache(node->op_fcache); + + pfree(node); +} + +/* ---------------- + * _freeConst + * ---------------- + */ +static void +_freeConst(Const *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + if (!node->constbyval) + pfree((void *)node->constvalue); + + pfree(node); +} + +/* ---------------- + * _freeParam + * ---------------- + */ +static void +_freeParam(Param *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + if (node->paramname != NULL) + pfree(node->paramname); + freeObject(node->param_tlist); + + pfree(node); +} + +/* ---------------- + * _freeFunc + * ---------------- + */ +static void +_freeFunc(Func *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + freeObject(node->func_tlist); + freeObject(node->func_planlist); + if (node->func_fcache) + _freeFcache(node->func_fcache); + + pfree(node); +} + +/* ---------------- + * _freeAggref + * ---------------- + */ +static void +_freeAggref(Aggref *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + pfree(node->aggname); + freeObject(node->target); + + pfree(node); +} + +/* ---------------- + * _freeSubLink + * ---------------- + */ +static void +_freeSubLink(SubLink *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + freeObject(node->lefthand); + freeObject(node->oper); + freeObject(node->subselect); + + pfree(node); +} + +/* ---------------- + * _freeCaseExpr + * ---------------- + */ +static void +_freeCaseExpr(CaseExpr *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + freeObject(node->arg); + freeObject(node->args); + freeObject(node->defresult); + + pfree(node); +} + +/* ---------------- + * _freeCaseWhen + * ---------------- + */ +static void +_freeCaseWhen(CaseWhen *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + freeObject(node->expr); + freeObject(node->result); + + pfree(node); +} + +static void +_freeArray(Array *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + pfree(node); +} + +static void +_freeArrayRef(ArrayRef *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + freeObject(node->refupperindexpr); + freeObject(node->reflowerindexpr); + freeObject(node->refexpr); + freeObject(node->refassgnexpr); + + pfree(node); +} + +/* **************************************************************** + * relation.h free functions + * **************************************************************** + */ + +/* ---------------- + * _freeRelOptInfo + * ---------------- + */ +static void +_freeRelOptInfo(RelOptInfo * node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + freeList(node->relids); + + freeObject(node->targetlist); + freeObject(node->pathlist); + freeObject(node->unorderedpath); + freeObject(node->cheapestpath); + + if (node->classlist) + pfree(node->classlist); + + if (node->indexkeys) + pfree(node->indexkeys); + + freeObject(node->indpred); + + if (node->ordering) + pfree(node->ordering); + + freeObject(node->restrictinfo); + freeObject(node->joininfo); + freeObject(node->innerjoin); + freeObject(node->superrels); + + pfree(node); +} + +/* ---------------- + * FreePathFields + * + * This function frees the fields of the Path node. It is used by + * all the free functions for classes which inherit node Path. + * ---------------- + */ +static void +FreePathFields(Path *node) +{ + if (node->p_ordering.ordtype == SORTOP_ORDER) + { + if (node->p_ordering.ord.sortop) + pfree(node->p_ordering.ord.sortop); + } + else + freeObject(node->p_ordering.ord.merge); + + freeObject(node->keys); + + freeList(node->joinid); + freeObject(node->loc_restrictinfo); +} + +/* ---------------- + * _freePath + * ---------------- + */ +static void +_freePath(Path *node) +{ + FreePathFields(node); + + pfree(node); +} + +/* ---------------- + * _freeIndexPath + * ---------------- + */ +static void +_freeIndexPath(IndexPath *node) +{ + /* ---------------- + * free the node superclass fields + * ---------------- + */ + FreePathFields((Path *) node); + + /* ---------------- + * free remainder of node + * ---------------- + */ + freeList(node->indexid); + freeObject(node->indexqual); + + if (node->indexkeys) + pfree(node->indexkeys); + + pfree(node); +} + +/* ---------------- + * FreeJoinPathFields + * + * This function frees the fields of the JoinPath node. It is used by + * all the free functions for classes which inherit node JoinPath. + * ---------------- + */ +static void +FreeJoinPathFields(JoinPath *node) +{ + freeObject(node->pathinfo); + freeObject(node->outerjoinpath); + freeObject(node->innerjoinpath); +} + +/* ---------------- + * _freeJoinPath + * ---------------- + */ +static void +_freeJoinPath(JoinPath *node) +{ + /* ---------------- + * free the node superclass fields + * ---------------- + */ + FreePathFields((Path *) node); + FreeJoinPathFields(node); + + pfree(node); +} + +/* ---------------- + * _freeMergePath + * ---------------- + */ +static void +_freeMergePath(MergePath *node) +{ + /* ---------------- + * free the node superclass fields + * ---------------- + */ + FreePathFields((Path *) node); + FreeJoinPathFields((JoinPath *) node); + + /* ---------------- + * free the remainder of the node + * ---------------- + */ + freeObject(node->path_mergeclauses); + freeObject(node->outersortkeys); + freeObject(node->innersortkeys); + + pfree(node); +} + +/* ---------------- + * _freeHashPath + * ---------------- + */ +static void +_freeHashPath(HashPath *node) +{ + /* ---------------- + * free the node superclass fields + * ---------------- + */ + FreePathFields((Path *) node); + FreeJoinPathFields((JoinPath *) node); + + /* ---------------- + * free remainder of node + * ---------------- + */ + freeObject(node->path_hashclauses); + freeObject(node->outerhashkeys); + freeObject(node->innerhashkeys); + + pfree(node); +} + +/* ---------------- + * _freeOrderKey + * ---------------- + */ +static void +_freeOrderKey(OrderKey *node) +{ + pfree(node); +} + + +/* ---------------- + * _freeJoinKey + * ---------------- + */ +static void +_freeJoinKey(JoinKey *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + freeObject(node->outer); + freeObject(node->inner); + + pfree(node); +} + +/* ---------------- + * _freeMergeOrder + * ---------------- + */ +static void +_freeMergeOrder(MergeOrder *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + pfree(node); +} + +/* ---------------- + * _freeRestrictInfo + * ---------------- + */ +static void +_freeRestrictInfo(RestrictInfo * node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + freeObject(node->clause); + freeObject(node->indexids); + freeObject(node->mergejoinorder); + freeList(node->restrictinfojoinid); + + pfree(node); +} + +/* ---------------- + * FreeJoinMethodFields + * + * This function frees the fields of the JoinMethod node. It is used by + * all the free functions for classes which inherit node JoinMethod. + * ---------------- + */ +static void +FreeJoinMethodFields(JoinMethod *node) +{ + freeObject(node->jmkeys); + freeObject(node->clauses); + return; +} + +/* ---------------- + * _freeJoinMethod + * ---------------- + */ +static void +_freeJoinMethod(JoinMethod *node) +{ + FreeJoinMethodFields(node); + + pfree(node); +} + +/* ---------------- + * _freeHInfo + * ---------------- + */ +static void +_freeHashInfo(HashInfo *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + FreeJoinMethodFields((JoinMethod *) node); + + pfree(node); +} + +/* ---------------- + * _freeMInfo + * ---------------- + */ +static void +_freeMergeInfo(MergeInfo *node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + FreeJoinMethodFields((JoinMethod *) node); + freeObject(node->m_ordering); + + pfree(node); +} + +/* ---------------- + * _freeJoinInfo + * ---------------- + */ +static void +_freeJoinInfo(JoinInfo * node) +{ + /* ---------------- + * free remainder of node + * ---------------- + */ + freeList(node->otherrels); + freeObject(node->jinfo_restrictinfo); + + pfree(node); +} + +static void +_freeIter(Iter *node) +{ + freeObject(node->iterexpr); + + pfree(node); +} + +static void +_freeStream(Stream *node) +{ + freeObject(node->downstream); + + pfree(node); +} + +/* **************** + * parsenodes.h routines have no free functions + * **************** + */ + +static void +_freeTargetEntry(TargetEntry *node) +{ + freeObject(node->resdom); + freeObject(node->fjoin); + freeObject(node->expr); + + pfree(node); +} + +static void +_freeRangeTblEntry(RangeTblEntry *node) +{ + if (node->relname) + pfree(node->relname); + if (node->refname) + pfree(node->refname); + + pfree(node); +} + +static void +_freeRowMark(RowMark *node) +{ + pfree(node); +} + +static void +_freeSortClause(SortClause *node) +{ + freeObject(node->resdom); + + pfree(node); +} + +static void +_freeAConst(A_Const *node) +{ + freeObject(&(node->val)); + freeObject(node->typename); + + pfree(node); +} + +static void +_freeTypeName(TypeName *node) +{ + if (node->name) + pfree(node->name); + freeObject(node->arrayBounds); + + pfree(node); +} + +static void +_freeQuery(Query *node) +{ + if (node->utilityStmt && nodeTag(node->utilityStmt) == T_NotifyStmt) + { + NotifyStmt *node_notify = (NotifyStmt *) node->utilityStmt; + + pfree(node_notify->relname); + pfree(node_notify); + } + if (node->into) + pfree(node->into); + if (node->uniqueFlag) + pfree(node->uniqueFlag); + + freeObject(node->sortClause); + freeObject(node->rtable); + freeObject(node->targetList); + freeObject(node->qual); + freeObject(node->groupClause); + freeObject(node->havingQual); + freeObject(node->unionClause); + freeObject(node->limitOffset); + freeObject(node->limitCount); + freeObject(node->rowMark); + + pfree(node); +} + + +/* **************** + * mnodes.h routines have no free functions + * **************** + */ + +/* **************************************************************** + * pg_list.h free functions + * **************************************************************** + */ + +static void +_freeValue(Value *node) +{ + switch (node->type) + { + case T_String: + pfree(node->val.str); + break; + default: + break; + } + + pfree(node); +} + +/* ---------------- + * freeObject free's the node or list. If it is a list, it + * recursively frees its items. + * ---------------- + */ +void +freeObject(void *node) +{ + if (node == NULL) + return; + + switch (nodeTag(node)) + { + + /* + * PLAN NODES + */ + case T_Plan: + _freePlan(node); + break; + case T_Result: + _freeResult(node); + break; + case T_Append: + _freeAppend(node); + break; + case T_Scan: + _freeScan(node); + break; + case T_SeqScan: + _freeSeqScan(node); + break; + case T_IndexScan: + _freeIndexScan(node); + break; + case T_Join: + _freeJoin(node); + break; + case T_NestLoop: + _freeNestLoop(node); + break; + case T_MergeJoin: + _freeMergeJoin(node); + break; + case T_HashJoin: + _freeHashJoin(node); + break; + case T_Temp: + _freeTemp(node); + break; + case T_Material: + _freeMaterial(node); + break; + case T_Sort: + _freeSort(node); + break; + case T_Group: + _freeGroup(node); + break; + case T_Agg: + _freeAgg(node); + break; + case T_GroupClause: + _freeGroupClause(node); + break; + case T_Unique: + _freeUnique(node); + break; + case T_Hash: + _freeHash(node); + break; + case T_SubPlan: + _freeSubPlan(node); + break; + + /* + * PRIMITIVE NODES + */ + case T_Resdom: + _freeResdom(node); + break; + case T_Fjoin: + _freeFjoin(node); + break; + case T_Expr: + _freeExpr(node); + break; + case T_Var: + _freeVar(node); + break; + case T_Oper: + _freeOper(node); + break; + case T_Const: + _freeConst(node); + break; + case T_Param: + _freeParam(node); + break; + case T_Func: + _freeFunc(node); + break; + case T_Array: + _freeArray(node); + break; + case T_ArrayRef: + _freeArrayRef(node); + break; + case T_Aggref: + _freeAggref(node); + break; + case T_SubLink: + _freeSubLink(node); + break; + case T_CaseExpr: + _freeCaseExpr(node); + break; + case T_CaseWhen: + _freeCaseWhen(node); + break; + + /* + * RELATION NODES + */ + case T_RelOptInfo: + _freeRelOptInfo(node); + break; + case T_Path: + _freePath(node); + break; + case T_IndexPath: + _freeIndexPath(node); + break; + case T_JoinPath: + _freeJoinPath(node); + break; + case T_MergePath: + _freeMergePath(node); + break; + case T_HashPath: + _freeHashPath(node); + break; + case T_OrderKey: + _freeOrderKey(node); + break; + case T_JoinKey: + _freeJoinKey(node); + break; + case T_MergeOrder: + _freeMergeOrder(node); + break; + case T_RestrictInfo: + _freeRestrictInfo(node); + break; + case T_JoinMethod: + _freeJoinMethod(node); + break; + case T_HashInfo: + _freeHashInfo(node); + break; + case T_MergeInfo: + _freeMergeInfo(node); + break; + case T_JoinInfo: + _freeJoinInfo(node); + break; + case T_Iter: + _freeIter(node); + break; + case T_Stream: + _freeStream(node); + break; + + /* + * PARSE NODES + */ + case T_Query: + _freeQuery(node); + break; + case T_TargetEntry: + _freeTargetEntry(node); + break; + case T_RangeTblEntry: + _freeRangeTblEntry(node); + break; + case T_RowMark: + _freeRowMark(node); + break; + case T_SortClause: + _freeSortClause(node); + break; + case T_A_Const: + _freeAConst(node); + break; + case T_TypeName: + _freeTypeName(node); + break; + + /* + * VALUE NODES + */ + case T_Integer: + case T_String: + case T_Float: + _freeValue(node); + break; + case T_List: + { + List *list = node, + *l; + + foreach(l, list) + freeObject(lfirst(l)); + freeList(list); + } + break; + default: + elog(ERROR, "freeObject: don't know how to free %d", nodeTag(node)); + break; + } +} |