aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/execMain.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/executor/execMain.c')
-rw-r--r--src/backend/executor/execMain.c147
1 files changed, 20 insertions, 127 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index 5523256bbe8..a26acc9a763 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -27,7 +27,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.130 2000/10/16 17:08:06 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.131 2000/10/26 21:35:15 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -52,11 +52,10 @@ static TupleDesc InitPlan(CmdType operation,
EState *estate);
static void EndPlan(Plan *plan, EState *estate);
static TupleTableSlot *ExecutePlan(EState *estate, Plan *plan,
- CmdType operation,
- int offsetTuples,
- int numberTuples,
- ScanDirection direction,
- DestReceiver *destfunc);
+ CmdType operation,
+ long numberTuples,
+ ScanDirection direction,
+ DestReceiver *destfunc);
static void ExecRetrieve(TupleTableSlot *slot,
DestReceiver *destfunc,
EState *estate);
@@ -153,19 +152,18 @@ ExecutorStart(QueryDesc *queryDesc, EState *estate)
* EXEC_RETONE: return one tuple but don't 'retrieve' it
* used in postquel function processing
*
+ * Note: count = 0 is interpreted as "no limit".
+ *
* ----------------------------------------------------------------
*/
TupleTableSlot *
-ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature,
- Node *limoffset, Node *limcount)
+ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, long count)
{
CmdType operation;
Plan *plan;
TupleTableSlot *result;
CommandDest dest;
DestReceiver *destfunc;
- int offset = 0;
- int count = 0;
/*
* sanity checks
@@ -191,111 +189,21 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature,
*/
(*destfunc->setup) (destfunc, (TupleDesc) NULL);
- /*
- * if given get the offset of the LIMIT clause
- */
- if (limoffset != NULL)
- {
- Const *coffset;
- Param *poffset;
- ParamListInfo paramLI;
- int i;
-
- switch (nodeTag(limoffset))
- {
- case T_Const:
- coffset = (Const *) limoffset;
- offset = (int) (coffset->constvalue);
- break;
-
- case T_Param:
- poffset = (Param *) limoffset;
- paramLI = estate->es_param_list_info;
-
- if (paramLI == NULL)
- elog(ERROR, "parameter for limit offset not in executor state");
- for (i = 0; paramLI[i].kind != PARAM_INVALID; i++)
- {
- if (paramLI[i].kind == PARAM_NUM && paramLI[i].id == poffset->paramid)
- break;
- }
- if (paramLI[i].kind == PARAM_INVALID)
- elog(ERROR, "parameter for limit offset not in executor state");
- if (paramLI[i].isnull)
- elog(ERROR, "limit offset cannot be NULL value");
- offset = (int) (paramLI[i].value);
-
- break;
-
- default:
- elog(ERROR, "unexpected node type %d as limit offset", nodeTag(limoffset));
- }
-
- if (offset < 0)
- elog(ERROR, "limit offset cannot be negative");
- }
-
- /*
- * if given get the count of the LIMIT clause
- */
- if (limcount != NULL)
- {
- Const *ccount;
- Param *pcount;
- ParamListInfo paramLI;
- int i;
-
- switch (nodeTag(limcount))
- {
- case T_Const:
- ccount = (Const *) limcount;
- count = (int) (ccount->constvalue);
- break;
-
- case T_Param:
- pcount = (Param *) limcount;
- paramLI = estate->es_param_list_info;
-
- if (paramLI == NULL)
- elog(ERROR, "parameter for limit count not in executor state");
- for (i = 0; paramLI[i].kind != PARAM_INVALID; i++)
- {
- if (paramLI[i].kind == PARAM_NUM && paramLI[i].id == pcount->paramid)
- break;
- }
- if (paramLI[i].kind == PARAM_INVALID)
- elog(ERROR, "parameter for limit count not in executor state");
- if (paramLI[i].isnull)
- elog(ERROR, "limit count cannot be NULL value");
- count = (int) (paramLI[i].value);
-
- break;
-
- default:
- elog(ERROR, "unexpected node type %d as limit count", nodeTag(limcount));
- }
-
- if (count < 0)
- elog(ERROR, "limit count cannot be negative");
- }
-
switch (feature)
{
-
case EXEC_RUN:
result = ExecutePlan(estate,
plan,
operation,
- offset,
count,
ForwardScanDirection,
destfunc);
break;
+
case EXEC_FOR:
result = ExecutePlan(estate,
plan,
operation,
- offset,
count,
ForwardScanDirection,
destfunc);
@@ -308,7 +216,6 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature,
result = ExecutePlan(estate,
plan,
operation,
- offset,
count,
BackwardScanDirection,
destfunc);
@@ -322,14 +229,14 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature,
result = ExecutePlan(estate,
plan,
operation,
- 0,
ONE_TUPLE,
ForwardScanDirection,
destfunc);
break;
+
default:
- result = NULL;
elog(DEBUG, "ExecutorRun: Unknown feature %d", feature);
+ result = NULL;
break;
}
@@ -917,25 +824,22 @@ EndPlan(Plan *plan, EState *estate)
/* ----------------------------------------------------------------
* ExecutePlan
*
- * processes the query plan to retrieve 'tupleCount' tuples in the
+ * processes the query plan to retrieve 'numberTuples' tuples in the
* direction specified.
* Retrieves all tuples if tupleCount is 0
*
- * result is either a slot containing a tuple in the case
+ * result is either a slot containing the last tuple in the case
* of a RETRIEVE or NULL otherwise.
*
+ * Note: the ctid attribute is a 'junk' attribute that is removed before the
+ * user can see it
* ----------------------------------------------------------------
*/
-
-/* the ctid attribute is a 'junk' attribute that is removed before the
- user can see it*/
-
static TupleTableSlot *
ExecutePlan(EState *estate,
Plan *plan,
CmdType operation,
- int offsetTuples,
- int numberTuples,
+ long numberTuples,
ScanDirection direction,
DestReceiver *destfunc)
{
@@ -943,7 +847,7 @@ ExecutePlan(EState *estate,
TupleTableSlot *slot;
ItemPointer tupleid = NULL;
ItemPointerData tuple_ctid;
- int current_tuple_count;
+ long current_tuple_count;
TupleTableSlot *result;
/*
@@ -991,17 +895,6 @@ lnext: ;
}
/*
- * For now we completely execute the plan and skip result tuples
- * if requested by LIMIT offset. Finally we should try to do it in
- * deeper levels if possible (during index scan) - Jan
- */
- if (offsetTuples > 0)
- {
- --offsetTuples;
- continue;
- }
-
- /*
* if we have a junk filter, then project a new tuple with the
* junk removed.
*
@@ -1152,10 +1045,10 @@ lnext: ;
}
/*
- * check our tuple count.. if we've returned the proper number
- * then return, else loop again and process more tuples..
+ * check our tuple count.. if we've processed the proper number
+ * then quit, else loop again and process more tuples..
*/
- current_tuple_count += 1;
+ current_tuple_count++;
if (numberTuples == current_tuple_count)
break;
}