aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/nodeIndexscan.c
diff options
context:
space:
mode:
authorVadim B. Mikheev <vadim4o@yahoo.com>1997-01-22 05:26:50 +0000
committerVadim B. Mikheev <vadim4o@yahoo.com>1997-01-22 05:26:50 +0000
commit8e909781464ad8a33aac250487a4c71c9f69fce5 (patch)
tree5ac245f199b6c9b9bcc6058dda319b5280ed5ba7 /src/backend/executor/nodeIndexscan.c
parent6850a96933fd22abd5bd7753afba3ccb885e0865 (diff)
downloadpostgresql-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.c36
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 */