diff options
author | Vadim B. Mikheev <vadim4o@yahoo.com> | 1997-01-22 05:26:50 +0000 |
---|---|---|
committer | Vadim B. Mikheev <vadim4o@yahoo.com> | 1997-01-22 05:26:50 +0000 |
commit | 8e909781464ad8a33aac250487a4c71c9f69fce5 (patch) | |
tree | 5ac245f199b6c9b9bcc6058dda319b5280ed5ba7 /src/backend/executor/nodeIndexscan.c | |
parent | 6850a96933fd22abd5bd7753afba3ccb885e0865 (diff) | |
download | postgresql-8e909781464ad8a33aac250487a4c71c9f69fce5.tar.gz postgresql-8e909781464ad8a33aac250487a4c71c9f69fce5.zip |
Fixing bug in INDEXSCAN_PATCH:
ExecInitIndexScan now works with operands of Param type and
(!!!) postquel_execute() now substitutes param values
before calling postquel_start().
Diffstat (limited to 'src/backend/executor/nodeIndexscan.c')
-rw-r--r-- | src/backend/executor/nodeIndexscan.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c index 12b5a9c6c75..0055cf9f1d5 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 */ |