*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/execScan.c,v 1.6 1997/09/08 21:43:02 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/execScan.c,v 1.7 1998/02/26 12:13:09 vadim Exp $
*
*-------------------------------------------------------------------------
*/
/* ----------------
* if the slot returned by the accessMtd contains
* NULL, then it means there is nothing more to scan
- * so we just return the empty slot.
+ * 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
* ----------------
*/
if (TupIsNull(slot))
- return slot;
+ {
+ scanstate->cstate.cs_TupFromTlist = false;
+ resultSlot = scanstate->cstate.cs_ProjInfo->pi_slot;
+ return (TupleTableSlot *)
+ ExecStoreTuple (NULL,
+ resultSlot,
+ InvalidBuffer,
+ true);
+ }
/* ----------------
* place the current tuple into the expr context
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.15 1998/02/26 04:31:26 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.16 1998/02/26 12:13:11 vadim Exp $
*
*-------------------------------------------------------------------------
*/
n_keys = numScanKeys[indexPtr];
run_keys = (int *) runtimeKeyInfo[indexPtr];
scan_keys = (ScanKey) scanKeys[indexPtr];
-
+
/* it's possible in subselects */
if (exprCtxt == NULL)
exprCtxt = node->scan.scanstate->cstate.cs_ExprContext;
-
+
for (j = 0; j < n_keys; j++)
{
indexScanDescs = indexstate->iss_ScanDescs;
scanDesc = indexScanDescs[indexPtr];
- /* ----------------
- * XXX access methods don't return marked positions so
- * ----------------
- */
+#if 0
IndexScanMarkPosition(scanDesc);
- return;
+#endif
+ index_markpos (scanDesc);
}
/* ----------------------------------------------------------------
indexScanDescs = indexstate->iss_ScanDescs;
scanDesc = indexScanDescs[indexPtr];
+#if 0
IndexScanRestorePosition(scanDesc);
+#endif
+ index_restrpos (scanDesc);
}
/* ----------------------------------------------------------------
HeapScanDesc currentScanDesc;
ScanDirection direction;
int baseid;
-
+
List *execParam = NULL;
/* ----------------
* 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;
}
}
* 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;
}
}
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.
* ----------------