aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/access/heap/heapam.c40
-rw-r--r--src/backend/executor/nodeBitmapHeapscan.c23
2 files changed, 40 insertions, 23 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index a0b561c209e..2c9dc9a949c 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.235 2007/06/08 18:23:52 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.236 2007/06/09 18:49:54 tgl Exp $
*
*
* INTERFACE ROUTINES
@@ -58,6 +58,10 @@
#include "utils/syscache.h"
+static HeapScanDesc heap_beginscan_internal(Relation relation,
+ Snapshot snapshot,
+ int nkeys, ScanKey key,
+ bool is_bitmapscan);
static XLogRecPtr log_heap_update(Relation reln, Buffer oldbuf,
ItemPointerData from, Buffer newbuf, HeapTuple newtup, bool move);
@@ -95,8 +99,9 @@ initscan(HeapScanDesc scan, ScanKey key)
*
* During a rescan, don't make a new strategy object if we don't have to.
*/
- if (scan->rs_nblocks > NBuffers / 4 &&
- !scan->rs_rd->rd_istemp)
+ if (!scan->rs_bitmapscan &&
+ !scan->rs_rd->rd_istemp &&
+ scan->rs_nblocks > NBuffers / 4)
{
if (scan->rs_strategy == NULL)
scan->rs_strategy = GetAccessStrategy(BAS_BULKREAD);
@@ -114,8 +119,6 @@ initscan(HeapScanDesc scan, ScanKey key)
scan->rs_startblock = 0;
}
- /* rs_pageatatime was set when the snapshot was filled in */
-
scan->rs_inited = false;
scan->rs_ctup.t_data = NULL;
ItemPointerSetInvalid(&scan->rs_ctup.t_self);
@@ -133,7 +136,12 @@ initscan(HeapScanDesc scan, ScanKey key)
if (key != NULL)
memcpy(scan->rs_key, key, scan->rs_nkeys * sizeof(ScanKeyData));
- pgstat_count_heap_scan(scan->rs_rd);
+ /*
+ * Currently, we don't have a stats counter for bitmap heap scans
+ * (but the underlying bitmap index scans will be counted).
+ */
+ if (!scan->rs_bitmapscan)
+ pgstat_count_heap_scan(scan->rs_rd);
}
/*
@@ -1037,12 +1045,31 @@ heap_openrv(const RangeVar *relation, LOCKMODE lockmode)
/* ----------------
* heap_beginscan - begin relation scan
+ *
+ * heap_beginscan_bm is an alternate entry point for setting up a HeapScanDesc
+ * for a bitmap heap scan. Although that scan technology is really quite
+ * unlike a standard seqscan, there is just enough commonality to make it
+ * worth using the same data structure.
* ----------------
*/
HeapScanDesc
heap_beginscan(Relation relation, Snapshot snapshot,
int nkeys, ScanKey key)
{
+ return heap_beginscan_internal(relation, snapshot, nkeys, key, false);
+}
+
+HeapScanDesc
+heap_beginscan_bm(Relation relation, Snapshot snapshot,
+ int nkeys, ScanKey key)
+{
+ return heap_beginscan_internal(relation, snapshot, nkeys, key, true);
+}
+
+static HeapScanDesc
+heap_beginscan_internal(Relation relation, Snapshot snapshot,
+ int nkeys, ScanKey key, bool is_bitmapscan)
+{
HeapScanDesc scan;
/*
@@ -1062,6 +1089,7 @@ heap_beginscan(Relation relation, Snapshot snapshot,
scan->rs_rd = relation;
scan->rs_snapshot = snapshot;
scan->rs_nkeys = nkeys;
+ scan->rs_bitmapscan = is_bitmapscan;
scan->rs_strategy = NULL; /* set in initscan */
/*
diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c
index 07729da2be6..c2ae755e014 100644
--- a/src/backend/executor/nodeBitmapHeapscan.c
+++ b/src/backend/executor/nodeBitmapHeapscan.c
@@ -21,7 +21,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/executor/nodeBitmapHeapscan.c,v 1.17 2007/05/27 03:50:39 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/executor/nodeBitmapHeapscan.c,v 1.18 2007/06/09 18:49:55 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -388,9 +388,6 @@ ExecBitmapHeapReScan(BitmapHeapScanState *node, ExprContext *exprCtxt)
/* rescan to release any page pin */
heap_rescan(node->ss.ss_currentScanDesc, NULL);
- /* undo bogus "seq scan" count (see notes in ExecInitBitmapHeapScan) */
- pgstat_discount_heap_scan(node->ss.ss_currentScanDesc->rs_rd);
-
if (node->tbm)
tbm_free(node->tbm);
node->tbm = NULL;
@@ -522,20 +519,12 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags)
/*
* Even though we aren't going to do a conventional seqscan, it is useful
- * to create a HeapScanDesc --- this checks the relation size and sets up
- * statistical infrastructure for us.
- */
- scanstate->ss.ss_currentScanDesc = heap_beginscan(currentRelation,
- estate->es_snapshot,
- 0,
- NULL);
-
- /*
- * One problem is that heap_beginscan counts a "sequential scan" start,
- * when we actually aren't doing any such thing. Reverse out the added
- * scan count. (Eventually we may want to count bitmap scans separately.)
+ * to create a HeapScanDesc --- most of the fields in it are usable.
*/
- pgstat_discount_heap_scan(scanstate->ss.ss_currentScanDesc->rs_rd);
+ scanstate->ss.ss_currentScanDesc = heap_beginscan_bm(currentRelation,
+ estate->es_snapshot,
+ 0,
+ NULL);
/*
* get the scan type from the relation descriptor.