aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/executor/nodeBitmapIndexscan.c112
-rw-r--r--src/include/nodes/execnodes.h6
2 files changed, 30 insertions, 88 deletions
diff --git a/src/backend/executor/nodeBitmapIndexscan.c b/src/backend/executor/nodeBitmapIndexscan.c
index 34aa3b89854..73acd0c9520 100644
--- a/src/backend/executor/nodeBitmapIndexscan.c
+++ b/src/backend/executor/nodeBitmapIndexscan.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/executor/nodeBitmapIndexscan.c,v 1.5 2005/04/24 17:32:46 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/executor/nodeBitmapIndexscan.c,v 1.6 2005/04/24 18:16:38 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -41,6 +41,8 @@ MultiExecBitmapIndexScan(BitmapIndexScanState *node)
{
#define MAX_TIDS 1024
TIDBitmap *tbm;
+ Oid indxid;
+ Relation indexRelation;
IndexScanDesc scandesc;
ItemPointerData tids[MAX_TIDS];
int32 ntids;
@@ -58,9 +60,22 @@ MultiExecBitmapIndexScan(BitmapIndexScanState *node)
ExecReScan((PlanState *) node, NULL);
/*
- * extract necessary information from index scan node
+ * We do not open or lock the base relation here. We assume that an
+ * ancestor BitmapHeapScan node is holding AccessShareLock on the
+ * heap relation throughout the execution of the plan tree.
*/
- scandesc = node->biss_ScanDesc;
+
+ /*
+ * open the index relation and initialize relation and scan
+ * descriptors. Note we acquire no locks here; the index machinery
+ * does its own locks and unlocks.
+ */
+ indxid = ((BitmapIndexScan *) node->ss.ps.plan)->indxid;
+ indexRelation = index_open(indxid);
+ scandesc = index_beginscan_multi(indexRelation,
+ node->ss.ps.state->es_snapshot,
+ node->biss_NumScanKeys,
+ node->biss_ScanKeys);
/*
* Prepare the result bitmap. Normally we just create a new one to pass
@@ -98,6 +113,12 @@ MultiExecBitmapIndexScan(BitmapIndexScanState *node)
CHECK_FOR_INTERRUPTS();
}
+ /*
+ * close the index relation
+ */
+ index_endscan(scandesc);
+ index_close(indexRelation);
+
/* must provide our own instrumentation support */
if (node->ss.ps.instrument)
InstrStopNodeMulti(node->ss.ps.instrument, nTuples);
@@ -109,11 +130,7 @@ MultiExecBitmapIndexScan(BitmapIndexScanState *node)
* ExecBitmapIndexReScan(node)
*
* Recalculates the value of the scan keys whose value depends on
- * information known at runtime and rescans the indexed relation.
- * Updating the scan key was formerly done separately in
- * ExecUpdateIndexScanKeys. Integrating it into ReScan makes
- * rescans of indices and relations/general streams more uniform.
- *
+ * information known at runtime.
* ----------------------------------------------------------------
*/
void
@@ -121,12 +138,10 @@ ExecBitmapIndexReScan(BitmapIndexScanState *node, ExprContext *exprCtxt)
{
ExprContext *econtext;
ExprState **runtimeKeyInfo;
- Index scanrelid;
econtext = node->biss_RuntimeContext; /* context for runtime
* keys */
runtimeKeyInfo = node->biss_RuntimeKeyInfo;
- scanrelid = ((BitmapIndexScan *) node->ss.ps.plan)->scan.scanrelid;
if (econtext)
{
@@ -194,8 +209,6 @@ ExecBitmapIndexReScan(BitmapIndexScanState *node, ExprContext *exprCtxt)
node->biss_RuntimeKeysReady = true;
}
-
- index_rescan(node->biss_ScanDesc, node->biss_ScanKeys);
}
/* ----------------------------------------------------------------
@@ -205,13 +218,6 @@ ExecBitmapIndexReScan(BitmapIndexScanState *node, ExprContext *exprCtxt)
void
ExecEndBitmapIndexScan(BitmapIndexScanState *node)
{
- Relation relation;
-
- /*
- * extract information from the node
- */
- relation = node->ss.ss_currentRelation;
-
/*
* Free the exprcontext ... now dead code, see ExecFreeExprContext
*/
@@ -219,44 +225,12 @@ ExecEndBitmapIndexScan(BitmapIndexScanState *node)
if (node->biss_RuntimeContext)
FreeExprContext(node->biss_RuntimeContext);
#endif
-
- /*
- * close the index relation
- */
- if (node->biss_ScanDesc != NULL)
- index_endscan(node->biss_ScanDesc);
-
- if (node->biss_RelationDesc != NULL)
- index_close(node->biss_RelationDesc);
-
- /*
- * close the heap relation.
- *
- * Currently, we do not release the AccessShareLock acquired by
- * ExecInitBitmapIndexScan. This lock should be held till end of
- * transaction. (There is a faction that considers this too much
- * locking, however.)
- */
- heap_close(relation, NoLock);
}
/* ----------------------------------------------------------------
* ExecInitBitmapIndexScan
*
- * Initializes the index scan's state information, creates
- * scan keys, and opens the base and index relations.
- *
- * Note: index scans have 2 sets of state information because
- * we have to keep track of the base relation and the
- * index relations.
- *
- * old comments
- * Creates the run-time state information for the node and
- * sets the relation id to contain relevant descriptors.
- *
- * Parameters:
- * node: BitmapIndexNode node produced by the planner.
- * estate: the execution state initialized in InitPlan.
+ * Initializes the index scan's state information.
* ----------------------------------------------------------------
*/
BitmapIndexScanState *
@@ -265,10 +239,6 @@ ExecInitBitmapIndexScan(BitmapIndexScan *node, EState *estate)
BitmapIndexScanState *indexstate;
ExprState **runtimeKeyInfo;
bool have_runtime_keys;
- RangeTblEntry *rtentry;
- Index relid;
- Oid reloid;
- Relation currentRelation;
/*
* create state structure
@@ -306,8 +276,6 @@ ExecInitBitmapIndexScan(BitmapIndexScan *node, EState *estate)
indexstate->biss_RuntimeKeyInfo = NULL;
indexstate->biss_RuntimeContext = NULL;
indexstate->biss_RuntimeKeysReady = false;
- indexstate->biss_RelationDesc = NULL;
- indexstate->biss_ScanDesc = NULL;
CXT1_printf("ExecInitBitmapIndexScan: context is %d\n", CurrentMemoryContext);
@@ -459,7 +427,6 @@ ExecInitBitmapIndexScan(BitmapIndexScan *node, EState *estate)
runtimeKeyInfo = run_keys;
}
-
/*
* If all of our keys have the form (var op const), then we have no
* runtime keys so we store NULL in the runtime key info. Otherwise
@@ -489,30 +456,9 @@ ExecInitBitmapIndexScan(BitmapIndexScan *node, EState *estate)
pfree(runtimeKeyInfo);
}
- /*
- * open the base relation and acquire AccessShareLock on it.
- */
- relid = node->scan.scanrelid;
- rtentry = rt_fetch(relid, estate->es_range_table);
- reloid = rtentry->relid;
-
- currentRelation = heap_open(reloid, AccessShareLock);
-
- indexstate->ss.ss_currentRelation = currentRelation;
- indexstate->ss.ss_currentScanDesc = NULL; /* no heap scan here */
-
- /*
- * open the index relation and initialize relation and scan
- * descriptors. Note we acquire no locks here; the index machinery
- * does its own locks and unlocks. (We rely on having AccessShareLock
- * on the parent table to ensure the index won't go away!)
- */
- indexstate->biss_RelationDesc = index_open(node->indxid);
- indexstate->biss_ScanDesc =
- index_beginscan_multi(indexstate->biss_RelationDesc,
- estate->es_snapshot,
- indexstate->biss_NumScanKeys,
- indexstate->biss_ScanKeys);
+ /* We don't keep the table or index open across calls */
+ indexstate->ss.ss_currentRelation = NULL;
+ indexstate->ss.ss_currentScanDesc = NULL;
/*
* all done.
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index 01c50747620..4a3af3cece0 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/nodes/execnodes.h,v 1.127 2005/04/20 15:48:36 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/execnodes.h,v 1.128 2005/04/24 18:16:38 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -908,8 +908,6 @@ typedef struct IndexScanState
* that will be evaluated at runtime
* RuntimeContext expr context for evaling runtime Skeys
* RuntimeKeysReady true if runtime Skeys have been computed
- * RelationDesc relation descriptor
- * ScanDesc scan descriptor
* ----------------
*/
typedef struct BitmapIndexScanState
@@ -921,8 +919,6 @@ typedef struct BitmapIndexScanState
ExprState **biss_RuntimeKeyInfo;
ExprContext *biss_RuntimeContext;
bool biss_RuntimeKeysReady;
- Relation biss_RelationDesc;
- IndexScanDesc biss_ScanDesc;
} BitmapIndexScanState;
/* ----------------