diff options
Diffstat (limited to 'src/backend/executor')
-rw-r--r-- | src/backend/executor/execAmi.c | 5 | ||||
-rw-r--r-- | src/backend/executor/execFlatten.c | 5 | ||||
-rw-r--r-- | src/backend/executor/execMain.c | 45 | ||||
-rw-r--r-- | src/backend/executor/execQual.c | 19 | ||||
-rw-r--r-- | src/backend/executor/execScan.c | 16 | ||||
-rw-r--r-- | src/backend/executor/execUtils.c | 7 | ||||
-rw-r--r-- | src/backend/executor/functions.c | 11 | ||||
-rw-r--r-- | src/backend/executor/nodeAgg.c | 647 | ||||
-rw-r--r-- | src/backend/executor/nodeAppend.c | 10 | ||||
-rw-r--r-- | src/backend/executor/nodeGroup.c | 5 | ||||
-rw-r--r-- | src/backend/executor/nodeHash.c | 5 | ||||
-rw-r--r-- | src/backend/executor/nodeHashjoin.c | 8 | ||||
-rw-r--r-- | src/backend/executor/nodeIndexscan.c | 108 | ||||
-rw-r--r-- | src/backend/executor/nodeMaterial.c | 4 | ||||
-rw-r--r-- | src/backend/executor/nodeMergejoin.c | 63 | ||||
-rw-r--r-- | src/backend/executor/nodeSeqscan.c | 8 | ||||
-rw-r--r-- | src/backend/executor/nodeSubplan.c | 4 | ||||
-rw-r--r-- | src/backend/executor/nodeTee.c | 36 | ||||
-rw-r--r-- | src/backend/executor/spi.c | 5 |
19 files changed, 504 insertions, 507 deletions
diff --git a/src/backend/executor/execAmi.c b/src/backend/executor/execAmi.c index 210d2d50726..e8c9bec3123 100644 --- a/src/backend/executor/execAmi.c +++ b/src/backend/executor/execAmi.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execAmi.c,v 1.24 1998/07/27 19:37:54 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execAmi.c,v 1.25 1998/09/01 04:28:13 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -54,8 +54,7 @@ #include "access/heapam.h" #include "catalog/heap.h" -static Pointer -ExecBeginScan(Relation relation, int nkeys, ScanKey skeys, +static Pointer ExecBeginScan(Relation relation, int nkeys, ScanKey skeys, bool isindex, ScanDirection dir, Snapshot snapshot); static Relation ExecOpenR(Oid relationOid, bool isindex); diff --git a/src/backend/executor/execFlatten.c b/src/backend/executor/execFlatten.c index 24b524fbf55..729232d9d42 100644 --- a/src/backend/executor/execFlatten.c +++ b/src/backend/executor/execFlatten.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/Attic/execFlatten.c,v 1.6 1998/09/01 03:22:11 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/Attic/execFlatten.c,v 1.7 1998/09/01 04:28:14 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -33,8 +33,7 @@ #include "executor/execFlatten.h" #ifdef SETS_FIXED -static bool -FjoinBumpOuterNodes(TargetEntry *tlist, ExprContext *econtext, +static bool FjoinBumpOuterNodes(TargetEntry *tlist, ExprContext *econtext, DatumPtr results, char *nulls); #endif diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 3d782f34b0a..f470abb6b64 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -26,7 +26,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.54 1998/09/01 03:22:14 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.55 1998/09/01 04:28:16 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -54,31 +54,25 @@ #include "catalog/heap.h" #include "commands/trigger.h" -void -ExecCheckPerms(CmdType operation, int resultRelation, List *rangeTable, +void ExecCheckPerms(CmdType operation, int resultRelation, List *rangeTable, Query *parseTree); /* decls for local routines only used within this module */ -static TupleDesc -InitPlan(CmdType operation, Query *parseTree, +static TupleDesc InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate); static void EndPlan(Plan *plan, EState *estate); -static TupleTableSlot * -ExecutePlan(EState *estate, Plan *plan, +static TupleTableSlot *ExecutePlan(EState *estate, Plan *plan, Query *parseTree, CmdType operation, int numberTuples, ScanDirection direction, void (*printfunc) ()); static void ExecRetrieve(TupleTableSlot *slot, void (*printfunc) (), EState *estate); -static void -ExecAppend(TupleTableSlot *slot, ItemPointer tupleid, +static void ExecAppend(TupleTableSlot *slot, ItemPointer tupleid, EState *estate); -static void -ExecDelete(TupleTableSlot *slot, ItemPointer tupleid, +static void ExecDelete(TupleTableSlot *slot, ItemPointer tupleid, EState *estate); -static void -ExecReplace(TupleTableSlot *slot, ItemPointer tupleid, +static void ExecReplace(TupleTableSlot *slot, ItemPointer tupleid, EState *estate, Query *parseTree); /* end of local decls */ @@ -124,7 +118,7 @@ ExecutorStart(QueryDesc *queryDesc, EState *estate) palloc(queryDesc->plantree->nParamExec * sizeof(ParamExecData)); memset(estate->es_param_exec_vals, 0, queryDesc->plantree->nParamExec * sizeof(ParamExecData)); } - + estate->es_snapshot = SnapshotNow; result = InitPlan(queryDesc->operation, @@ -315,8 +309,8 @@ ExecCheckPerms(CmdType operation, relid = rte->relid; htup = SearchSysCacheTuple(RELOID, - ObjectIdGetDatum(relid), - 0, 0, 0); + ObjectIdGetDatum(relid), + 0, 0, 0); if (!HeapTupleIsValid(htup)) elog(ERROR, "ExecCheckPerms: bogus RT relid: %d", relid); @@ -521,19 +515,19 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate) * NOTE: in the future we might want to initialize the junk * filter for all queries. * ---------------- - * SELECT added by daveh@insightdist.com 5/20/98 to allow - * ORDER/GROUP BY have an identifier missing from the target. + * SELECT added by daveh@insightdist.com 5/20/98 to allow + * ORDER/GROUP BY have an identifier missing from the target. */ { - bool junk_filter_needed = false; - List *tlist; - + bool junk_filter_needed = false; + List *tlist; + if (operation == CMD_SELECT) { foreach(tlist, targetList) { - TargetEntry *tle = lfirst(tlist); - + TargetEntry *tle = lfirst(tlist); + if (tle->resdom->resjunk) { junk_filter_needed = true; @@ -547,6 +541,7 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate) (operation == CMD_SELECT && junk_filter_needed)) { JunkFilter *j = (JunkFilter *) ExecInitJunkFilter(targetList); + estate->es_junkFilter = j; if (operation == CMD_SELECT) @@ -555,7 +550,7 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate) else estate->es_junkFilter = NULL; } - + /* ---------------- * initialize the "into" relation * ---------------- @@ -588,7 +583,7 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate) tupdesc = CreateTupleDescCopy(tupType); intoRelationId = heap_create_with_catalog(intoName, - tupdesc, RELKIND_RELATION); + tupdesc, RELKIND_RELATION); FreeTupleDesc(tupdesc); diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c index 72de0b8faf7..f3d12b1319b 100644 --- a/src/backend/executor/execQual.c +++ b/src/backend/executor/execQual.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.35 1998/09/01 03:22:18 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.36 1998/09/01 04:28:18 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -68,24 +68,19 @@ int execConstLen; /* static functions decls */ static Datum ExecEvalAggreg(Aggreg *agg, ExprContext *econtext, bool *isNull); -static Datum -ExecEvalArrayRef(ArrayRef *arrayRef, ExprContext *econtext, +static Datum ExecEvalArrayRef(ArrayRef *arrayRef, ExprContext *econtext, bool *isNull, bool *isDone); static Datum ExecEvalAnd(Expr *andExpr, ExprContext *econtext, bool *isNull); -static Datum -ExecEvalFunc(Expr *funcClause, ExprContext *econtext, +static Datum ExecEvalFunc(Expr *funcClause, ExprContext *econtext, bool *isNull, bool *isDone); -static void -ExecEvalFuncArgs(FunctionCachePtr fcache, ExprContext *econtext, +static void ExecEvalFuncArgs(FunctionCachePtr fcache, ExprContext *econtext, List *argList, Datum argV[], bool *argIsDone); static Datum ExecEvalNot(Expr *notclause, ExprContext *econtext, bool *isNull); -static Datum -ExecEvalOper(Expr *opClause, ExprContext *econtext, +static Datum ExecEvalOper(Expr *opClause, ExprContext *econtext, bool *isNull); static Datum ExecEvalOr(Expr *orExpr, ExprContext *econtext, bool *isNull); static Datum ExecEvalVar(Var *variable, ExprContext *econtext, bool *isNull); -static Datum -ExecMakeFunctionResult(Node *node, List *arguments, +static Datum ExecMakeFunctionResult(Node *node, List *arguments, ExprContext *econtext, bool *isNull, bool *isDone); static bool ExecQualClause(Node *clause, ExprContext *econtext); @@ -200,7 +195,7 @@ ExecEvalArrayRef(ArrayRef *arrayRef, static Datum ExecEvalAggreg(Aggreg *agg, ExprContext *econtext, bool *isNull) { - *isNull = econtext->ecxt_nulls[agg->aggno]; + *isNull = econtext->ecxt_nulls[agg->aggno]; return econtext->ecxt_values[agg->aggno]; } diff --git a/src/backend/executor/execScan.c b/src/backend/executor/execScan.c index e04876c3317..30b1166e807 100644 --- a/src/backend/executor/execScan.c +++ b/src/backend/executor/execScan.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execScan.c,v 1.7 1998/02/26 12:13:09 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execScan.c,v 1.8 1998/09/01 04:28:20 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -106,9 +106,9 @@ ExecScan(Scan *node, * NULL, then it means there is nothing more to scan * so we just return the empty slot... * - * ... with invalid TupleDesc (not the same as in - * projInfo->pi_slot) and break upper MergeJoin node. - * New code below do what ExecProject() does. - vadim 02/26/98 + * ... with invalid TupleDesc (not the same as in + * projInfo->pi_slot) and break upper MergeJoin node. + * New code below do what ExecProject() does. - vadim 02/26/98 * ---------------- */ if (TupIsNull(slot)) @@ -116,10 +116,10 @@ ExecScan(Scan *node, scanstate->cstate.cs_TupFromTlist = false; resultSlot = scanstate->cstate.cs_ProjInfo->pi_slot; return (TupleTableSlot *) - ExecStoreTuple (NULL, - resultSlot, - InvalidBuffer, - true); + ExecStoreTuple(NULL, + resultSlot, + InvalidBuffer, + true); } /* ---------------- diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index 7cc53dce485..fb83fd6e55a 100644 --- a/src/backend/executor/execUtils.c +++ b/src/backend/executor/execUtils.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.37 1998/09/01 03:22:21 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.38 1998/09/01 04:28:22 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -57,8 +57,7 @@ #include "utils/lsyscache.h" #include "utils/mcxt.h" -static void -ExecGetIndexKeyInfo(Form_pg_index indexTuple, int *numAttsOutP, +static void ExecGetIndexKeyInfo(Form_pg_index indexTuple, int *numAttsOutP, AttrNumber **attsOutP, FuncIndexInfoPtr fInfoP); /* ---------------------------------------------------------------- @@ -750,7 +749,7 @@ ExecOpenIndices(Oid resultRelationOid, */ indexSd = heap_beginscan(indexRd, /* scan desc */ false, /* scan backward flag */ - SnapshotNow, /* NOW snapshot */ + SnapshotNow, /* NOW snapshot */ 1, /* number scan keys */ &key); /* scan keys */ diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c index 4d23d27178f..fd095e7864a 100644 --- a/src/backend/executor/functions.c +++ b/src/backend/executor/functions.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/functions.c,v 1.19 1998/09/01 03:22:22 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/functions.c,v 1.20 1998/09/01 04:28:23 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -57,16 +57,13 @@ typedef struct local_es /* non-export function prototypes */ static TupleDesc postquel_start(execution_state *es); -static execution_state * -init_execution_state(FunctionCachePtr fcache, +static execution_state *init_execution_state(FunctionCachePtr fcache, char *args[]); static TupleTableSlot *postquel_getnext(execution_state *es); static void postquel_end(execution_state *es); -static void -postquel_sub_params(execution_state *es, int nargs, +static void postquel_sub_params(execution_state *es, int nargs, char *args[], bool *nullV); -static Datum -postquel_execute(execution_state *es, FunctionCachePtr fcache, +static Datum postquel_execute(execution_state *es, FunctionCachePtr fcache, List *fTlist, char **args, bool *isNull); diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 28f50bdd4f4..c7e69d1a72f 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -109,388 +109,397 @@ ExecAgg(Agg *node) bool isNull = FALSE, isNull1 = FALSE, isNull2 = FALSE; - bool qual_result; - + bool qual_result; + /* --------------------- * get state info from node * --------------------- */ - /* We loop retrieving groups until we find one matching node->plan.qual */ - do { + /* + * We loop retrieving groups until we find one matching + * node->plan.qual + */ + do + { - aggstate = node->aggstate; - if (aggstate->agg_done) - return NULL; + aggstate = node->aggstate; + if (aggstate->agg_done) + return NULL; - estate = node->plan.state; - econtext = aggstate->csstate.cstate.cs_ExprContext; + estate = node->plan.state; + econtext = aggstate->csstate.cstate.cs_ExprContext; - nagg = length(node->aggs); + nagg = length(node->aggs); - aggregates = (Aggreg **) palloc(sizeof(Aggreg *) * nagg); + aggregates = (Aggreg **) palloc(sizeof(Aggreg *) * nagg); - /* take List* and make it an array that can be quickly indexed */ - alist = node->aggs; - for (i = 0; i < nagg; i++) - { - aggregates[i] = lfirst(alist); - aggregates[i]->aggno = i; - alist = lnext(alist); - } - - value1 = node->aggstate->csstate.cstate.cs_ExprContext->ecxt_values; - nulls = node->aggstate->csstate.cstate.cs_ExprContext->ecxt_nulls; + /* take List* and make it an array that can be quickly indexed */ + alist = node->aggs; + for (i = 0; i < nagg; i++) + { + aggregates[i] = lfirst(alist); + aggregates[i]->aggno = i; + alist = lnext(alist); + } - value2 = (Datum *) palloc(sizeof(Datum) * nagg); - MemSet(value2, 0, sizeof(Datum) * nagg); + value1 = node->aggstate->csstate.cstate.cs_ExprContext->ecxt_values; + nulls = node->aggstate->csstate.cstate.cs_ExprContext->ecxt_nulls; - aggFuncInfo = (AggFuncInfo *) palloc(sizeof(AggFuncInfo) * nagg); - MemSet(aggFuncInfo, 0, sizeof(AggFuncInfo) * nagg); + value2 = (Datum *) palloc(sizeof(Datum) * nagg); + MemSet(value2, 0, sizeof(Datum) * nagg); - noInitValue = (int *) palloc(sizeof(int) * nagg); - MemSet(noInitValue, 0, sizeof(noInitValue) * nagg); + aggFuncInfo = (AggFuncInfo *) palloc(sizeof(AggFuncInfo) * nagg); + MemSet(aggFuncInfo, 0, sizeof(AggFuncInfo) * nagg); - outerPlan = outerPlan(node); - oneTuple = NULL; + noInitValue = (int *) palloc(sizeof(int) * nagg); + MemSet(noInitValue, 0, sizeof(noInitValue) * nagg); - projInfo = aggstate->csstate.cstate.cs_ProjInfo; + outerPlan = outerPlan(node); + oneTuple = NULL; - for (i = 0; i < nagg; i++) - { - Aggreg *agg; - char *aggname; - HeapTuple aggTuple; - Form_pg_aggregate aggp; - Oid xfn1_oid, - xfn2_oid, - finalfn_oid; - - agg = aggregates[i]; - - /* --------------------- - * find transfer functions of all the aggregates and initialize - * their initial values - * --------------------- - */ - aggname = agg->aggname; - aggTuple = SearchSysCacheTuple(AGGNAME, - PointerGetDatum(aggname), - ObjectIdGetDatum(agg->basetype), - 0, 0); - if (!HeapTupleIsValid(aggTuple)) - elog(ERROR, "ExecAgg: cache lookup failed for aggregate \"%s\"(%s)", - aggname, - typeidTypeName(agg->basetype)); - aggp = (Form_pg_aggregate) GETSTRUCT(aggTuple); - - xfn1_oid = aggp->aggtransfn1; - xfn2_oid = aggp->aggtransfn2; - finalfn_oid = aggp->aggfinalfn; - - if (OidIsValid(finalfn_oid)) - { - fmgr_info(finalfn_oid, &aggFuncInfo[i].finalfn); - aggFuncInfo[i].finalfn_oid = finalfn_oid; - } + projInfo = aggstate->csstate.cstate.cs_ProjInfo; - if (OidIsValid(xfn2_oid)) + for (i = 0; i < nagg; i++) { - fmgr_info(xfn2_oid, &aggFuncInfo[i].xfn2); - aggFuncInfo[i].xfn2_oid = xfn2_oid; - value2[i] = (Datum) AggNameGetInitVal((char *) aggname, - aggp->aggbasetype, - 2, - &isNull2); - /* ------------------------------------------ - * If there is a second transition function, its initial - * value must exist -- as it does not depend on data values, - * we have no other way of determining an initial value. - * ------------------------------------------ + Aggreg *agg; + char *aggname; + HeapTuple aggTuple; + Form_pg_aggregate aggp; + Oid xfn1_oid, + xfn2_oid, + finalfn_oid; + + agg = aggregates[i]; + + /* --------------------- + * find transfer functions of all the aggregates and initialize + * their initial values + * --------------------- */ - if (isNull2) - elog(ERROR, "ExecAgg: agginitval2 is null"); - } + aggname = agg->aggname; + aggTuple = SearchSysCacheTuple(AGGNAME, + PointerGetDatum(aggname), + ObjectIdGetDatum(agg->basetype), + 0, 0); + if (!HeapTupleIsValid(aggTuple)) + elog(ERROR, "ExecAgg: cache lookup failed for aggregate \"%s\"(%s)", + aggname, + typeidTypeName(agg->basetype)); + aggp = (Form_pg_aggregate) GETSTRUCT(aggTuple); + + xfn1_oid = aggp->aggtransfn1; + xfn2_oid = aggp->aggtransfn2; + finalfn_oid = aggp->aggfinalfn; + + if (OidIsValid(finalfn_oid)) + { + fmgr_info(finalfn_oid, &aggFuncInfo[i].finalfn); + aggFuncInfo[i].finalfn_oid = finalfn_oid; + } - if (OidIsValid(xfn1_oid)) - { - fmgr_info(xfn1_oid, &aggFuncInfo[i].xfn1); - aggFuncInfo[i].xfn1_oid = xfn1_oid; - value1[i] = (Datum) AggNameGetInitVal((char *) aggname, - aggp->aggbasetype, - 1, - &isNull1); - - /* ------------------------------------------ - * If the initial value for the first transition function - * doesn't exist in the pg_aggregate table then we let - * the first value returned from the outer procNode become - * the initial value. (This is useful for aggregates like - * max{} and min{}.) - * ------------------------------------------ - */ - if (isNull1) + if (OidIsValid(xfn2_oid)) { - noInitValue[i] = 1; - nulls[i] = 1; + fmgr_info(xfn2_oid, &aggFuncInfo[i].xfn2); + aggFuncInfo[i].xfn2_oid = xfn2_oid; + value2[i] = (Datum) AggNameGetInitVal((char *) aggname, + aggp->aggbasetype, + 2, + &isNull2); + /* ------------------------------------------ + * If there is a second transition function, its initial + * value must exist -- as it does not depend on data values, + * we have no other way of determining an initial value. + * ------------------------------------------ + */ + if (isNull2) + elog(ERROR, "ExecAgg: agginitval2 is null"); } - } - } - - /* ---------------- - * for each tuple from the the outer plan, apply all the aggregates - * ---------------- - */ - for (;;) - { - HeapTuple outerTuple = NULL; - TupleTableSlot *outerslot; - - isNull = isNull1 = isNull2 = 0; - outerslot = ExecProcNode(outerPlan, (Plan *) node); - if (outerslot) - outerTuple = outerslot->val; - if (!HeapTupleIsValid(outerTuple)) - { - /* - * when the outerplan doesn't return a single tuple, create a - * dummy heaptuple anyway because we still need to return a - * valid aggregate value. The value returned will be the - * initial values of the transition functions - */ - if (nTuplesAgged == 0) + if (OidIsValid(xfn1_oid)) { - TupleDesc tupType; - Datum *tupValue; - char *null_array; - - tupType = aggstate->csstate.css_ScanTupleSlot->ttc_tupleDescriptor; - tupValue = projInfo->pi_tupValue; - - /* initially, set all the values to NULL */ - null_array = palloc(tupType->natts); - for (i = 0; i < tupType->natts; i++) - null_array[i] = 'n'; - oneTuple = heap_formtuple(tupType, tupValue, null_array); - pfree(null_array); + fmgr_info(xfn1_oid, &aggFuncInfo[i].xfn1); + aggFuncInfo[i].xfn1_oid = xfn1_oid; + value1[i] = (Datum) AggNameGetInitVal((char *) aggname, + aggp->aggbasetype, + 1, + &isNull1); + + /* ------------------------------------------ + * If the initial value for the first transition function + * doesn't exist in the pg_aggregate table then we let + * the first value returned from the outer procNode become + * the initial value. (This is useful for aggregates like + * max{} and min{}.) + * ------------------------------------------ + */ + if (isNull1) + { + noInitValue[i] = 1; + nulls[i] = 1; + } } - break; } - for (i = 0; i < nagg; i++) + /* ---------------- + * for each tuple from the the outer plan, apply all the aggregates + * ---------------- + */ + for (;;) { - AttrNumber attnum; - int2 attlen = 0; - Datum newVal = (Datum) NULL; - AggFuncInfo *aggfns = &aggFuncInfo[i]; - Datum args[2]; - Node *tagnode = NULL; - - switch (nodeTag(aggregates[i]->target)) + HeapTuple outerTuple = NULL; + TupleTableSlot *outerslot; + + isNull = isNull1 = isNull2 = 0; + outerslot = ExecProcNode(outerPlan, (Plan *) node); + if (outerslot) + outerTuple = outerslot->val; + if (!HeapTupleIsValid(outerTuple)) { - case T_Var: - tagnode = NULL; - newVal = aggGetAttr(outerslot, - aggregates[i], - &isNull); - break; - case T_Expr: - tagnode = ((Expr *) aggregates[i]->target)->oper; - econtext->ecxt_scantuple = outerslot; - newVal = ExecEvalExpr(aggregates[i]->target, econtext, - &isNull, &isDone); - break; - case T_Const: - tagnode = NULL; - econtext->ecxt_scantuple = outerslot; - newVal = ExecEvalExpr(aggregates[i]->target, econtext, - &isNull, &isDone); - break; - default: - elog(ERROR, "ExecAgg: Bad Agg->Target for Agg %d", i); - } - if (isNull && !aggregates[i]->usenulls) - continue; /* ignore this tuple for this agg */ + /* + * when the outerplan doesn't return a single tuple, + * create a dummy heaptuple anyway because we still need + * to return a valid aggregate value. The value returned + * will be the initial values of the transition functions + */ + if (nTuplesAgged == 0) + { + TupleDesc tupType; + Datum *tupValue; + char *null_array; + + tupType = aggstate->csstate.css_ScanTupleSlot->ttc_tupleDescriptor; + tupValue = projInfo->pi_tupValue; + + /* initially, set all the values to NULL */ + null_array = palloc(tupType->natts); + for (i = 0; i < tupType->natts; i++) + null_array[i] = 'n'; + oneTuple = heap_formtuple(tupType, tupValue, null_array); + pfree(null_array); + } + break; + } - if (aggfns->xfn1.fn_addr != NULL) + for (i = 0; i < nagg; i++) { - if (noInitValue[i]) + AttrNumber attnum; + int2 attlen = 0; + Datum newVal = (Datum) NULL; + AggFuncInfo *aggfns = &aggFuncInfo[i]; + Datum args[2]; + Node *tagnode = NULL; + + switch (nodeTag(aggregates[i]->target)) + { + case T_Var: + tagnode = NULL; + newVal = aggGetAttr(outerslot, + aggregates[i], + &isNull); + break; + case T_Expr: + tagnode = ((Expr *) aggregates[i]->target)->oper; + econtext->ecxt_scantuple = outerslot; + newVal = ExecEvalExpr(aggregates[i]->target, econtext, + &isNull, &isDone); + break; + case T_Const: + tagnode = NULL; + econtext->ecxt_scantuple = outerslot; + newVal = ExecEvalExpr(aggregates[i]->target, econtext, + &isNull, &isDone); + break; + default: + elog(ERROR, "ExecAgg: Bad Agg->Target for Agg %d", i); + } + + if (isNull && !aggregates[i]->usenulls) + continue; /* ignore this tuple for this agg */ + + if (aggfns->xfn1.fn_addr != NULL) { - int byVal = 0; - - /* - * value1 and value2 has not been initialized. This is - * the first non-NULL value. We use it as the initial - * value. - */ - - /* - * but we can't just use it straight, we have to make - * a copy of it since the tuple from which it came - * will be freed on the next iteration of the scan - */ - switch (nodeTag(aggregates[i]->target)) + if (noInitValue[i]) { - case T_Var: - attnum = ((Var *) aggregates[i]->target)->varattno; - attlen = outerslot->ttc_tupleDescriptor->attrs[attnum - 1]->attlen; - byVal = outerslot->ttc_tupleDescriptor->attrs[attnum - 1]->attbyval; - - break; - case T_Expr: - { - FunctionCachePtr fcache_ptr; - - if (nodeTag(tagnode) == T_Func) - fcache_ptr = ((Func *) tagnode)->func_fcache; - else - fcache_ptr = ((Oper *) tagnode)->op_fcache; - attlen = fcache_ptr->typlen; - byVal = fcache_ptr->typbyval; + int byVal = 0; + + /* + * value1 and value2 has not been initialized. + * This is the first non-NULL value. We use it as + * the initial value. + */ + + /* + * but we can't just use it straight, we have to + * make a copy of it since the tuple from which it + * came will be freed on the next iteration of the + * scan + */ + switch (nodeTag(aggregates[i]->target)) + { + case T_Var: + attnum = ((Var *) aggregates[i]->target)->varattno; + attlen = outerslot->ttc_tupleDescriptor->attrs[attnum - 1]->attlen; + byVal = outerslot->ttc_tupleDescriptor->attrs[attnum - 1]->attbyval; + + break; + case T_Expr: + { + FunctionCachePtr fcache_ptr; + + if (nodeTag(tagnode) == T_Func) + fcache_ptr = ((Func *) tagnode)->func_fcache; + else + fcache_ptr = ((Oper *) tagnode)->op_fcache; + attlen = fcache_ptr->typlen; + byVal = fcache_ptr->typbyval; + + break; + } + case T_Const: + attlen = ((Const *) aggregates[i]->target)->constlen; + byVal = ((Const *) aggregates[i]->target)->constbyval; break; - } - case T_Const: - attlen = ((Const *) aggregates[i]->target)->constlen; - byVal = ((Const *) aggregates[i]->target)->constbyval; - - break; - default: - elog(ERROR, "ExecAgg: Bad Agg->Target for Agg %d", i); + default: + elog(ERROR, "ExecAgg: Bad Agg->Target for Agg %d", i); + } + if (attlen == -1) + { + /* variable length */ + attlen = VARSIZE((struct varlena *) newVal); + } + value1[i] = (Datum) palloc(attlen); + if (byVal) + value1[i] = newVal; + else + memmove((char *) (value1[i]), (char *) newVal, attlen); + noInitValue[i] = 0; + nulls[i] = 0; } - if (attlen == -1) + else { - /* variable length */ - attlen = VARSIZE((struct varlena *) newVal); + + /* + * apply the transition functions. + */ + args[0] = value1[i]; + args[1] = newVal; + value1[i] = + (Datum) fmgr_c(&aggfns->xfn1, + (FmgrValues *) args, + &isNull1); + Assert(!isNull1); } - value1[i] = (Datum) palloc(attlen); - if (byVal) - value1[i] = newVal; - else - memmove((char *) (value1[i]), (char *) newVal, attlen); - noInitValue[i] = 0; - nulls[i] = 0; } - else + + if (aggfns->xfn2.fn_addr != NULL) { + Datum xfn2_val = value2[i]; - /* - * apply the transition functions. - */ - args[0] = value1[i]; - args[1] = newVal; - value1[i] = - (Datum) fmgr_c(&aggfns->xfn1, - (FmgrValues *) args, - &isNull1); - Assert(!isNull1); + value2[i] = + (Datum) fmgr_c(&aggfns->xfn2, + (FmgrValues *) &xfn2_val, &isNull2); + Assert(!isNull2); } } - if (aggfns->xfn2.fn_addr != NULL) - { - Datum xfn2_val = value2[i]; + /* + * keep this for the projection (we only need one of these - + * all the tuples we aggregate over share the same group + * column) + */ + if (!oneTuple) + oneTuple = heap_copytuple(outerslot->val); - value2[i] = - (Datum) fmgr_c(&aggfns->xfn2, - (FmgrValues *) &xfn2_val, &isNull2); - Assert(!isNull2); - } + nTuplesAgged++; } - /* - * keep this for the projection (we only need one of these - all - * the tuples we aggregate over share the same group column) + /* -------------- + * finalize the aggregate (if necessary), and get the resultant value + * -------------- */ - if (!oneTuple) - oneTuple = heap_copytuple(outerslot->val); - - nTuplesAgged++; - } - - /* -------------- - * finalize the aggregate (if necessary), and get the resultant value - * -------------- - */ - for (i = 0; i < nagg; i++) - { - char *args[2]; - AggFuncInfo *aggfns = &aggFuncInfo[i]; - - if (noInitValue[i]) + for (i = 0; i < nagg; i++) { + char *args[2]; + AggFuncInfo *aggfns = &aggFuncInfo[i]; - /* - * No values found for this agg; return current state. This - * seems to fix behavior for avg() aggregate. -tgl 12/96 - */ - } - else if (aggfns->finalfn.fn_addr != NULL && nTuplesAgged > 0) - { - if (aggfns->finalfn.fn_nargs > 1) + if (noInitValue[i]) { - args[0] = (char *) value1[i]; - args[1] = (char *) value2[i]; + + /* + * No values found for this agg; return current state. + * This seems to fix behavior for avg() aggregate. -tgl + * 12/96 + */ + } + else if (aggfns->finalfn.fn_addr != NULL && nTuplesAgged > 0) + { + if (aggfns->finalfn.fn_nargs > 1) + { + args[0] = (char *) value1[i]; + args[1] = (char *) value2[i]; + } + else if (aggfns->xfn1.fn_addr != NULL) + args[0] = (char *) value1[i]; + else if (aggfns->xfn2.fn_addr != NULL) + args[0] = (char *) value2[i]; + else + elog(NOTICE, "ExecAgg: no valid transition functions??"); + value1[i] = (Datum) fmgr_c(&aggfns->finalfn, + (FmgrValues *) args, &(nulls[i])); } else if (aggfns->xfn1.fn_addr != NULL) - args[0] = (char *) value1[i]; + { + + /* + * value in the right place, ignore. (If you remove this + * case, fix the else part. -ay 2/95) + */ + } else if (aggfns->xfn2.fn_addr != NULL) - args[0] = (char *) value2[i]; + value1[i] = value2[i]; else - elog(NOTICE, "ExecAgg: no valid transition functions??"); - value1[i] = (Datum) fmgr_c(&aggfns->finalfn, - (FmgrValues *) args, &(nulls[i])); + elog(ERROR, "ExecAgg: no valid transition functions??"); } - else if (aggfns->xfn1.fn_addr != NULL) - { - /* - * value in the right place, ignore. (If you remove this case, - * fix the else part. -ay 2/95) - */ + /* + * whether the aggregation is done depends on whether we are doing + * aggregation over groups or the entire table + */ + if (nodeTag(outerPlan) == T_Group) + { + /* aggregation over groups */ + aggstate->agg_done = ((Group *) outerPlan)->grpstate->grp_done; } - else if (aggfns->xfn2.fn_addr != NULL) - value1[i] = value2[i]; else - elog(ERROR, "ExecAgg: no valid transition functions??"); - } + aggstate->agg_done = TRUE; - /* - * whether the aggregation is done depends on whether we are doing - * aggregation over groups or the entire table - */ - if (nodeTag(outerPlan) == T_Group) - { - /* aggregation over groups */ - aggstate->agg_done = ((Group *) outerPlan)->grpstate->grp_done; - } - else - aggstate->agg_done = TRUE; + /* ---------------- + * form a projection tuple, store it in the result tuple + * slot and return it. + * ---------------- + */ - /* ---------------- - * form a projection tuple, store it in the result tuple - * slot and return it. - * ---------------- - */ - - ExecStoreTuple(oneTuple, - aggstate->csstate.css_ScanTupleSlot, - InvalidBuffer, - false); - econtext->ecxt_scantuple = aggstate->csstate.css_ScanTupleSlot; - - resultSlot = ExecProject(projInfo, &isDone); - - /* As long as the retrieved group does not match the qualifications it is ignored and - * the next group is fetched */ - qual_result=ExecQual(fix_opids(node->plan.qual),econtext); - if (oneTuple) - pfree(oneTuple); - } - while((node->plan.qual!=NULL) && (qual_result!=true)); + ExecStoreTuple(oneTuple, + aggstate->csstate.css_ScanTupleSlot, + InvalidBuffer, + false); + econtext->ecxt_scantuple = aggstate->csstate.css_ScanTupleSlot; + + resultSlot = ExecProject(projInfo, &isDone); + + /* + * As long as the retrieved group does not match the + * qualifications it is ignored and the next group is fetched + */ + qual_result = ExecQual(fix_opids(node->plan.qual), econtext); + if (oneTuple) + pfree(oneTuple); + } + while ((node->plan.qual != NULL) && (qual_result != true)); return resultSlot; } diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c index aea18739344..1c2217cdc4d 100644 --- a/src/backend/executor/nodeAppend.c +++ b/src/backend/executor/nodeAppend.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeAppend.c,v 1.14 1998/07/15 22:16:18 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeAppend.c,v 1.15 1998/09/01 04:28:26 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -158,7 +158,7 @@ exec_append_initialize_next(Append *node) { estate->es_result_relation_info = (RelationInfo *) nth(whichplan, - appendstate->as_result_relation_info_list); + appendstate->as_result_relation_info_list); } result_slot->ttc_whichplan = whichplan; @@ -505,8 +505,8 @@ void ExecReScanAppend(Append *node, ExprContext *exprCtxt, Plan *parent) { AppendState *appendstate = node->appendstate; - int nplans = length(node->appendplans); - int i; + int nplans = length(node->appendplans); + int i; for (i = 0; i < nplans; i++) { @@ -517,7 +517,7 @@ ExecReScanAppend(Append *node, ExprContext *exprCtxt, Plan *parent) if (rescanNode->chgParam == NULL) { exec_append_initialize_next(node); - ExecReScan((Plan *)rescanNode, exprCtxt, (Plan *) node); + ExecReScan((Plan *) rescanNode, exprCtxt, (Plan *) node); } } appendstate->as_whichplan = 0; diff --git a/src/backend/executor/nodeGroup.c b/src/backend/executor/nodeGroup.c index cecae67b784..1fdf6bedc32 100644 --- a/src/backend/executor/nodeGroup.c +++ b/src/backend/executor/nodeGroup.c @@ -13,7 +13,7 @@ * columns. (ie. tuples from the same group are consecutive) * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeGroup.c,v 1.21 1998/07/16 02:58:09 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeGroup.c,v 1.22 1998/09/01 04:28:28 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -30,8 +30,7 @@ static TupleTableSlot *ExecGroupEveryTuple(Group *node); static TupleTableSlot *ExecGroupOneTuple(Group *node); -static bool -sameGroup(HeapTuple oldslot, HeapTuple newslot, +static bool sameGroup(HeapTuple oldslot, HeapTuple newslot, int numCols, AttrNumber *grpColIdx, TupleDesc tupdesc); /* --------------------------------------- diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c index 9fa3f011905..634411a7c64 100644 --- a/src/backend/executor/nodeHash.c +++ b/src/backend/executor/nodeHash.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeHash.c,v 1.22 1998/09/01 03:22:23 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeHash.c,v 1.23 1998/09/01 04:28:29 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -45,8 +45,7 @@ static void mk_hj_temp(char *tempname); static int hashFunc(char *key, int len); static int ExecHashPartition(Hash *node); static RelativeAddr hashTableAlloc(int size, HashJoinTable hashtable); -static void -ExecHashOverflowInsert(HashJoinTable hashtable, +static void ExecHashOverflowInsert(HashJoinTable hashtable, HashBucket bucket, HeapTuple heapTuple); diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c index c4a52fe9101..deef8895224 100644 --- a/src/backend/executor/nodeHashjoin.c +++ b/src/backend/executor/nodeHashjoin.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v 1.12 1998/09/01 03:22:25 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v 1.13 1998/09/01 04:28:31 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -28,12 +28,10 @@ static TupleTableSlot * ExecHashJoinOuterGetTuple(Plan *node, Plan *parent, HashJoinState *hjstate); -static TupleTableSlot * -ExecHashJoinGetSavedTuple(HashJoinState *hjstate, char *buffer, +static TupleTableSlot *ExecHashJoinGetSavedTuple(HashJoinState *hjstate, char *buffer, File file, TupleTableSlot *tupleSlot, int *block, char **position); -static int -ExecHashJoinGetBatch(int bucketno, HashJoinTable hashtable, +static int ExecHashJoinGetBatch(int bucketno, HashJoinTable hashtable, int nbatch); static int ExecHashJoinNewBatch(HashJoinState *hjstate); diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c index 03b43f09b55..2df3b98a441 100644 --- a/src/backend/executor/nodeIndexscan.c +++ b/src/backend/executor/nodeIndexscan.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.26 1998/09/01 03:22:26 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.27 1998/09/01 04:28:32 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -85,8 +85,8 @@ IndexNext(IndexScan *node) EState *estate; CommonScanState *scanstate; IndexScanState *indexstate; - ScanDirection direction; - Snapshot snapshot; + ScanDirection direction; + Snapshot snapshot; IndexScanDescPtr scanDescs; IndexScanDesc scandesc; Relation heapRelation; @@ -95,7 +95,7 @@ IndexNext(IndexScan *node) TupleTableSlot *slot; Buffer buffer = InvalidBuffer; int numIndices; - + /* ---------------- * extract necessary information from index scan node * ---------------- @@ -122,39 +122,40 @@ IndexNext(IndexScan *node) while ((result = index_getnext(scandesc, direction)) != NULL) { tuple = heap_fetch(heapRelation, snapshot, - &result->heap_iptr, &buffer); + &result->heap_iptr, &buffer); pfree(result); if (tuple != NULL) { bool prev_matches = false; int prev_index; - + /* ---------------- - * store the scanned tuple in the scan tuple slot of - * the scan state. Eventually we will only do this and not - * return a tuple. Note: we pass 'false' because tuples - * returned by amgetnext are pointers onto disk pages and - * were not created with palloc() and so should not be pfree()'d. - * ---------------- - */ - ExecStoreTuple(tuple, /* tuple to store */ - slot, /* slot to store in */ - buffer, /* buffer associated with tuple */ - false); /* don't pfree */ + * store the scanned tuple in the scan tuple slot of + * the scan state. Eventually we will only do this and not + * return a tuple. Note: we pass 'false' because tuples + * returned by amgetnext are pointers onto disk pages and + * were not created with palloc() and so should not be pfree()'d. + * ---------------- + */ + ExecStoreTuple(tuple, /* tuple to store */ + slot, /* slot to store in */ + buffer, /* buffer associated with tuple */ + false); /* don't pfree */ /* - * We must check to see if the current tuple would have been - * matched by an earlier index, so we don't double report it. - * We do this by passing the tuple through ExecQual and look - * for failure with all previous qualifications. + * We must check to see if the current tuple would have + * been matched by an earlier index, so we don't double + * report it. We do this by passing the tuple through + * ExecQual and look for failure with all previous + * qualifications. */ for (prev_index = 0; prev_index < indexstate->iss_IndexPtr; - prev_index++) + prev_index++) { scanstate->cstate.cs_ExprContext->ecxt_scantuple = slot; if (ExecQual(nth(prev_index, node->indxqual), - scanstate->cstate.cs_ExprContext)) + scanstate->cstate.cs_ExprContext)) { prev_matches = true; break; @@ -259,17 +260,16 @@ ExecIndexReScan(IndexScan *node, ExprContext *exprCtxt, Plan *parent) indxqual = node->indxqual; numScanKeys = indexstate->iss_NumScanKeys; indexstate->iss_IndexPtr = 0; - + /* it's possible in subselects */ if (exprCtxt == NULL) exprCtxt = node->scan.scanstate->cstate.cs_ExprContext; node->scan.scanstate->cstate.cs_ExprContext->ecxt_outertuple = exprCtxt->ecxt_outertuple; - + /* - * get the index qualifications and recalculate the appropriate - * values + * get the index qualifications and recalculate the appropriate values */ for (i = 0; i < numIndices; i++) { @@ -282,17 +282,19 @@ ExecIndexReScan(IndexScan *node, ExprContext *exprCtxt, Plan *parent) run_keys = (int *) runtimeKeyInfo[i]; for (j = 0; j < n_keys; j++) { + /* * If we have a run-time key, then extract the run-time * expression and evaluate it with respect to the current - * outer tuple. We then stick the result into the scan key. + * outer tuple. We then stick the result into the scan + * key. */ if (run_keys[j] != NO_OP) { clause = nth(j, qual); scanexpr = (run_keys[j] == RIGHT_OP) ? (Node *) get_rightop(clause) : (Node *) get_leftop(clause); - + /* * pass in isDone but ignore it. We don't iterate in * quals @@ -333,7 +335,7 @@ ExecEndIndexScan(IndexScan *node) IndexScanState *indexstate; Pointer *runtimeKeyInfo; ScanKey *scanKeys; - List *indxqual; + List *indxqual; int *numScanKeys; int numIndices; int i; @@ -342,7 +344,7 @@ ExecEndIndexScan(IndexScan *node) indexstate = node->indxstate; indxqual = node->indxqual; runtimeKeyInfo = (Pointer *) indexstate->iss_RuntimeKeyInfo; - + /* ---------------- * extract information from the node * ---------------- @@ -381,7 +383,7 @@ ExecEndIndexScan(IndexScan *node) pfree(numScanKeys); if (runtimeKeyInfo) - { + { for (i = 0; i < numIndices; i++) { List *qual; @@ -394,7 +396,7 @@ ExecEndIndexScan(IndexScan *node) } pfree(runtimeKeyInfo); } - + /* ---------------- * clear out tuple table slots * ---------------- @@ -428,7 +430,7 @@ ExecIndexMarkPos(IndexScan *node) #if 0 IndexScanMarkPosition(scanDesc); #endif - index_markpos (scanDesc); + index_markpos(scanDesc); } /* ---------------------------------------------------------------- @@ -457,7 +459,7 @@ ExecIndexRestrPos(IndexScan *node) #if 0 IndexScanRestorePosition(scanDesc); #endif - index_restrpos (scanDesc); + index_restrpos(scanDesc); } /* ---------------------------------------------------------------- @@ -504,7 +506,7 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent) HeapScanDesc currentScanDesc; ScanDirection direction; int baseid; - + List *execParam = NULL; /* ---------------- @@ -727,22 +729,22 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent) * it identifies the value to place in our scan key. * ---------------- */ - + /* Life was so easy before ... subselects */ - if ( ((Param *) leftop)->paramkind == PARAM_EXEC ) + if (((Param *) leftop)->paramkind == PARAM_EXEC) { have_runtime_keys = true; run_keys[j] = LEFT_OP; - execParam = lappendi (execParam, ((Param*) leftop)->paramid); + execParam = lappendi(execParam, ((Param *) leftop)->paramid); } else { scanvalue = ExecEvalParam((Param *) leftop, - scanstate->cstate.cs_ExprContext, + scanstate->cstate.cs_ExprContext, &isnull); if (isnull) flags |= SK_ISNULL; - + run_keys[j] = NO_OP; } } @@ -820,22 +822,22 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent) * it identifies the value to place in our scan key. * ---------------- */ - + /* Life was so easy before ... subselects */ - if ( ((Param *) rightop)->paramkind == PARAM_EXEC ) + if (((Param *) rightop)->paramkind == PARAM_EXEC) { have_runtime_keys = true; run_keys[j] = RIGHT_OP; - execParam = lappendi (execParam, ((Param*) rightop)->paramid); + execParam = lappendi(execParam, ((Param *) rightop)->paramid); } else { scanvalue = ExecEvalParam((Param *) rightop, - scanstate->cstate.cs_ExprContext, + scanstate->cstate.cs_ExprContext, &isnull); if (isnull) flags |= SK_ISNULL; - + run_keys[j] = NO_OP; } } @@ -992,13 +994,13 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent) indexstate->iss_ScanDescs = scanDescs; indexstate->cstate.cs_TupFromTlist = false; - - /* - * if there are some PARAM_EXEC in skankeys then - * force index rescan on first scan. + + /* + * if there are some PARAM_EXEC in skankeys then force index rescan on + * first scan. */ - ((Plan*) node)->chgParam = execParam; - + ((Plan *) node)->chgParam = execParam; + /* ---------------- * all done. * ---------------- @@ -1010,5 +1012,5 @@ int ExecCountSlotsIndexScan(IndexScan *node) { return ExecCountSlotsNode(outerPlan((Plan *) node)) + - ExecCountSlotsNode(innerPlan((Plan *) node)) + INDEXSCAN_NSLOTS; + ExecCountSlotsNode(innerPlan((Plan *) node)) + INDEXSCAN_NSLOTS; } diff --git a/src/backend/executor/nodeMaterial.c b/src/backend/executor/nodeMaterial.c index 1c957d76612..95c8a6f56f3 100644 --- a/src/backend/executor/nodeMaterial.c +++ b/src/backend/executor/nodeMaterial.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeMaterial.c,v 1.16 1998/09/01 03:22:27 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeMaterial.c,v 1.17 1998/09/01 04:28:34 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -173,7 +173,7 @@ ExecMaterial(Material *node) return ExecStoreTuple(heapTuple, /* tuple to store */ slot, /* slot to store in */ - currentScanDesc->rs_cbuf, /* buffer for this tuple */ + currentScanDesc->rs_cbuf, /* buffer for this tuple */ false); /* don't pfree this pointer */ } diff --git a/src/backend/executor/nodeMergejoin.c b/src/backend/executor/nodeMergejoin.c index 805b6ed3340..30c11e8b2f4 100644 --- a/src/backend/executor/nodeMergejoin.c +++ b/src/backend/executor/nodeMergejoin.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeMergejoin.c,v 1.18 1998/07/19 10:05:19 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeMergejoin.c,v 1.19 1998/09/01 04:28:35 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -480,8 +480,8 @@ ExecMergeJoin(MergeJoin *node) * means that this is the first time ExecMergeJoin() has * been called and so we have to initialize the inner, * outer and marked tuples as well as various stuff in the - * expression context. - * ******************************** + * expression context. ******************************** + * */ case EXEC_MJ_INITIALIZE: MJ_printf("ExecMergeJoin: EXEC_MJ_INITIALIZE\n"); @@ -514,7 +514,7 @@ ExecMergeJoin(MergeJoin *node) mergestate->mj_MarkedTupleSlot->ttc_tupleDescriptor = innerTupleSlot->ttc_tupleDescriptor; - + /* ---------------- * initialize merge join state to skip inner tuples. * ---------------- @@ -526,8 +526,8 @@ ExecMergeJoin(MergeJoin *node) * ******************************** EXEC_MJ_JOINMARK means * we have just found a new outer tuple and a possible * matching inner tuple. This is the case after the - * INITIALIZE, SKIPOUTER or SKIPINNER states. - * ******************************** + * INITIALIZE, SKIPOUTER or SKIPINNER states. ******************************** + * */ case EXEC_MJ_JOINMARK: MJ_printf("ExecMergeJoin: EXEC_MJ_JOINMARK\n"); @@ -655,8 +655,8 @@ ExecMergeJoin(MergeJoin *node) break; /* - * ******************************** EXEC_MJ_TESTOUTER - * If the new outer tuple and the marked tuple satisify the + * ******************************** EXEC_MJ_TESTOUTER If + * the new outer tuple and the marked tuple satisify the * merge clause then we know we have duplicates in the * outer scan so we have to restore the inner scan to the * marked tuple and proceed to join the new outer tuples @@ -680,7 +680,9 @@ ExecMergeJoin(MergeJoin *node) * * new outer tuple > marked tuple * - * **************************** + *************************** + * + * */ case EXEC_MJ_TESTOUTER: MJ_printf("ExecMergeJoin: EXEC_MJ_TESTOUTER\n"); @@ -698,13 +700,14 @@ ExecMergeJoin(MergeJoin *node) if (qualResult) { - /* - * the merge clause matched so now we juggle the slots - * back the way they were and proceed to JOINTEST. + + /* + * the merge clause matched so now we juggle the slots + * back the way they were and proceed to JOINTEST. * - * I can't understand why we have to go to JOINTEST - * and compare outer tuple with the same inner one - * again -> go to JOINTUPLES... - vadim 02/27/98 + * I can't understand why we have to go to JOINTEST and + * compare outer tuple with the same inner one again + * -> go to JOINTUPLES... - vadim 02/27/98 */ ExecRestrPos(innerPlan); @@ -738,7 +741,7 @@ ExecMergeJoin(MergeJoin *node) return NULL; } - /* continue on to skip outer tuples */ + /* continue on to skip outer tuples */ mergestate->mj_JoinState = EXEC_MJ_SKIPOUTER; } break; @@ -756,7 +759,9 @@ ExecMergeJoin(MergeJoin *node) * we have to advance the outer scan until we find the outer * 8. * - **************************** + ************************** + * + * * * * @@ -856,7 +861,9 @@ ExecMergeJoin(MergeJoin *node) * we have to advance the inner scan until we find the inner * 12. * - **************************** + ************************** + * + * * * * @@ -988,10 +995,10 @@ bool ExecInitMergeJoin(MergeJoin *node, EState *estate, Plan *parent) { MergeJoinState *mergestate; - List *joinclauses; - RegProcedure rightsortop; - RegProcedure leftsortop; - RegProcedure sortop; + List *joinclauses; + RegProcedure rightsortop; + RegProcedure leftsortop; + RegProcedure sortop; TupleTableSlot *mjSlot; List *OSortopI; @@ -1042,7 +1049,7 @@ ExecInitMergeJoin(MergeJoin *node, EState *estate, Plan *parent) mjSlot->ttc_whichplan = -1; mjSlot->ttc_descIsNew = true; mergestate->mj_MarkedTupleSlot = mjSlot; - + /* ---------------- * get merge sort operators. * @@ -1166,9 +1173,9 @@ ExecEndMergeJoin(MergeJoin *node) */ ExecClearTuple(mergestate->jstate.cs_ResultTupleSlot); ExecClearTuple(mergestate->mj_MarkedTupleSlot); - pfree (mergestate->mj_MarkedTupleSlot); + pfree(mergestate->mj_MarkedTupleSlot); mergestate->mj_MarkedTupleSlot = NULL; - + MJ1_printf("ExecEndMergeJoin: %s\n", "node processing ended"); } @@ -1185,12 +1192,12 @@ ExecReScanMergeJoin(MergeJoin *node, ExprContext *exprCtxt, Plan *parent) mjSlot->ttc_tupleDescriptor = NULL; mjSlot->ttc_whichplan = -1; mjSlot->ttc_descIsNew = true; - + mergestate->mj_JoinState = EXEC_MJ_INITIALIZE; /* - * if chgParam of subnodes is not null then plans will be re-scanned by - * first ExecProcNode. + * if chgParam of subnodes is not null then plans will be re-scanned + * by first ExecProcNode. */ if (((Plan *) node)->lefttree->chgParam == NULL) ExecReScan(((Plan *) node)->lefttree, exprCtxt, (Plan *) node); diff --git a/src/backend/executor/nodeSeqscan.c b/src/backend/executor/nodeSeqscan.c index 6b2972d4102..c5bceea06b2 100644 --- a/src/backend/executor/nodeSeqscan.c +++ b/src/backend/executor/nodeSeqscan.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeSeqscan.c,v 1.13 1998/09/01 03:22:28 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeSeqscan.c,v 1.14 1998/09/01 04:28:37 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -30,8 +30,7 @@ #include "access/heapam.h" #include "parser/parsetree.h" -static Oid -InitScanRelation(SeqScan *node, EState *estate, +static Oid InitScanRelation(SeqScan *node, EState *estate, CommonScanState *scanstate, Plan *outerPlan); static TupleTableSlot *SeqNext(SeqScan *node); @@ -83,7 +82,8 @@ SeqNext(SeqScan *node) slot = ExecStoreTuple(tuple,/* tuple to store */ slot, /* slot to store in */ - scandesc->rs_cbuf,/* buffer associated with this tuple */ + scandesc->rs_cbuf, /* buffer associated with + * this tuple */ false); /* don't pfree this pointer */ /* ---------------- diff --git a/src/backend/executor/nodeSubplan.c b/src/backend/executor/nodeSubplan.c index 95fa2f0afe2..94abb9aae64 100644 --- a/src/backend/executor/nodeSubplan.c +++ b/src/backend/executor/nodeSubplan.c @@ -112,8 +112,8 @@ ExecInitSubPlan(SubPlan *node, EState *estate, Plan *parent) { EState *sp_estate = CreateExecutorState(); - ExecCheckPerms (CMD_SELECT, 0, node->rtable, (Query*) NULL); - + ExecCheckPerms(CMD_SELECT, 0, node->rtable, (Query *) NULL); + sp_estate->es_range_table = node->rtable; sp_estate->es_param_list_info = estate->es_param_list_info; sp_estate->es_param_exec_vals = estate->es_param_exec_vals; diff --git a/src/backend/executor/nodeTee.c b/src/backend/executor/nodeTee.c index b96cac45adc..9a39e649a9e 100644 --- a/src/backend/executor/nodeTee.c +++ b/src/backend/executor/nodeTee.c @@ -15,7 +15,7 @@ * ExecEndTee * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/Attic/nodeTee.c,v 1.22 1998/09/01 03:22:32 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/Attic/nodeTee.c,v 1.23 1998/09/01 04:28:40 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -168,8 +168,8 @@ ExecInitTee(Tee *node, EState *currentEstate, Plan *parent) bufferRel = heap_openr(teeState->tee_bufferRelname); else bufferRel = heap_open( - heap_create_with_catalog(teeState->tee_bufferRelname, - tupType, RELKIND_RELATION)); + heap_create_with_catalog(teeState->tee_bufferRelname, + tupType, RELKIND_RELATION)); } else { @@ -178,8 +178,8 @@ ExecInitTee(Tee *node, EState *currentEstate, Plan *parent) newoid()); /* bufferRel = ExecCreatR(len, tupType, _TEMP_RELATION_ID); */ bufferRel = heap_open( - heap_create_with_catalog(teeState->tee_bufferRelname, - tupType, RELKIND_RELATION)); + heap_create_with_catalog(teeState->tee_bufferRelname, + tupType, RELKIND_RELATION)); } teeState->tee_bufferRel = bufferRel; @@ -228,11 +228,11 @@ ExecCountSlotsTee(Tee *node) static void initTeeScanDescs(Tee *node) { - TeeState *teeState; - Relation bufferRel; - ScanDirection dir; - Snapshot snapshot; - MemoryContext orig; + TeeState *teeState; + Relation bufferRel; + ScanDirection dir; + Snapshot snapshot; + MemoryContext orig; teeState = node->teestate; if (teeState->tee_leftScanDesc && teeState->tee_rightScanDesc) @@ -250,18 +250,18 @@ initTeeScanDescs(Tee *node) { teeState->tee_leftScanDesc = heap_beginscan(bufferRel, ScanDirectionIsBackward(dir), - snapshot, - 0, /* num scan keys */ - NULL /* scan keys */ + snapshot, + 0, /* num scan keys */ + NULL /* scan keys */ ); } if (teeState->tee_rightScanDesc == NULL) { teeState->tee_rightScanDesc = heap_beginscan(bufferRel, ScanDirectionIsBackward(dir), - snapshot, - 0, /* num scan keys */ - NULL /* scan keys */ + snapshot, + 0, /* num scan keys */ + NULL /* scan keys */ ); } @@ -365,7 +365,7 @@ ExecTee(Tee *node, Plan *parent) HeapTuple throwAway; /* Buffer buffer; */ - throwAway = heap_getnext(scanDesc,ScanDirectionIsBackward(dir)); + throwAway = heap_getnext(scanDesc, ScanDirectionIsBackward(dir)); } /* @@ -406,7 +406,7 @@ ExecTee(Tee *node, Plan *parent) result = ExecStoreTuple(heapTuple, /* tuple to store */ slot, /* slot to store in */ - scanDesc->rs_cbuf, /* this tuple's buffer */ + scanDesc->rs_cbuf, /* this tuple's buffer */ false); /* don't free stuff from * heap_getnext */ diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index 17f81537eea..f034dd064de 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -47,8 +47,7 @@ static int _SPI_pquery(QueryDesc *queryDesc, EState *state, int tcount); static void _SPI_fetch(FetchStmt *stmt); #endif -static int -_SPI_execute_plan(_SPI_plan *plan, +static int _SPI_execute_plan(_SPI_plan *plan, Datum *Values, char *Nulls, int tcount); #define _SPI_CPLAN_CURCXT 0 @@ -466,7 +465,7 @@ SPI_gettype(TupleDesc tupdesc, int fnumber) } typeTuple = SearchSysCacheTuple(TYPOID, - ObjectIdGetDatum(tupdesc->attrs[fnumber - 1]->atttypid), + ObjectIdGetDatum(tupdesc->attrs[fnumber - 1]->atttypid), 0, 0, 0); if (!HeapTupleIsValid(typeTuple)) |