From: Vadim B. Mikheev Date: Wed, 22 Jan 1997 05:26:50 +0000 (+0000) Subject: Fixing bug in INDEXSCAN_PATCH: X-Git-Tag: REL6_1~680 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8e909781464ad8a33aac250487a4c71c9f69fce5;p=postgresql Fixing bug in INDEXSCAN_PATCH: ExecInitIndexScan now works with operands of Param type and (!!!) postquel_execute() now substitutes param values before calling postquel_start(). --- diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 6a562f8eaa..11c8f91a8d 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.9 1996/11/13 20:48:28 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.10 1997/01/22 05:26:27 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -170,6 +170,11 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count) dest = queryDesc->dest; destination = (void (*)()) DestToFunction(dest); +#if 0 + /* + * It doesn't work in common case (i.g. if function has a aggregate). + * Now we store parameter values before ExecutorStart. - vadim 01/22/97 + */ #ifdef INDEXSCAN_PATCH /* * If the plan is an index scan and some of the scan key are @@ -182,6 +187,7 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count) econtext = ((IndexScan *)plan)->scan.scanstate->cstate.cs_ExprContext; ExecIndexReScan((IndexScan *)plan, econtext, plan); } +#endif #endif switch(feature) { diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c index a1e6bf1c45..d9094c6b65 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.4 1996/11/06 06:47:36 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/functions.c,v 1.5 1997/01/22 05:26:37 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -281,15 +281,26 @@ postquel_execute(execution_state *es, { TupleTableSlot *slot; Datum value; + +#ifdef INDEXSCAN_PATCH + /* + * It's more right place to do it (before postquel_start->ExecutorStart). + * Now ExecutorStart->ExecInitIndexScan->ExecEvalParam works ok. + * (But note: I HOPE we can do it here). - vadim 01/22/97 + */ + if (fcache->nargs > 0) + postquel_sub_params(es, fcache->nargs, args, fcache->nullVect); +#endif if (es->status == F_EXEC_START) { (void) postquel_start(es); es->status = F_EXEC_RUN; } - +#ifndef INDEXSCAN_PATCH if (fcache->nargs > 0) postquel_sub_params(es, fcache->nargs, args, fcache->nullVect); +#endif slot = postquel_getnext(es); diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c index 12b5a9c6c7..0055cf9f1d 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.5 1996/11/08 00:45:57 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.6 1997/01/22 05:26:50 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -609,6 +609,7 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent) Oper *op; /* operator used in scan.. */ Node *leftop; /* expr on lhs of operator */ Node *rightop; /* expr on rhs ... */ + bits16 flags = 0; int scanvar; /* which var identifies varattno */ AttrNumber varattno = 0; /* att number used in scan */ @@ -675,6 +676,21 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent) */ run_keys[ j ] = NO_OP; scanvalue = ((Const*) leftop)->constvalue; +#ifdef INDEXSCAN_PATCH + } else if (IsA(leftop,Param)) { + bool isnull; + /* ---------------- + * if the leftop is a Param node then it means + * it identifies the value to place in our scan key. + * ---------------- + */ + run_keys[ j ] = NO_OP; + scanvalue = ExecEvalParam((Param*) leftop, + scanstate->cstate.cs_ExprContext, + &isnull); + if ( isnull ) + flags |= SK_ISNULL; +#endif } else if (leftop != NULL && is_funcclause(leftop) && var_is_rel(lfirst(((Expr*)leftop)->args))) { @@ -733,7 +749,21 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent) */ run_keys[ j ] = NO_OP; scanvalue = ((Const*) rightop)->constvalue; - +#ifdef INDEXSCAN_PATCH + } else if (IsA(rightop,Param)) { + bool isnull; + /* ---------------- + * if the rightop is a Param node then it means + * it identifies the value to place in our scan key. + * ---------------- + */ + run_keys[ j ] = NO_OP; + scanvalue = ExecEvalParam((Param*) rightop, + scanstate->cstate.cs_ExprContext, + &isnull); + if ( isnull ) + flags |= SK_ISNULL; +#endif } else if (rightop!=NULL && is_funcclause(rightop) && var_is_rel(lfirst(((Expr*)rightop)->args))) { @@ -777,7 +807,7 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent) * ---------------- */ ScanKeyEntryInitialize(&scan_keys[j], - 0, + flags, varattno, /* attribute number to scan */ (RegProcedure) opid, /* reg proc to use */ (Datum) scanvalue); /* constant */