mirror of
https://github.com/postgres/postgres.git
synced 2025-11-09 06:21:09 +03:00
Phase 2 of project to make index operator lossiness be determined at runtime
instead of plan time. Extend the amgettuple API so that the index AM returns a boolean indicating whether the indexquals need to be rechecked, and make that rechecking happen in nodeIndexscan.c (currently the only place where it's expected to be needed; other callers of index_getnext are just erroring out for now). For the moment, GIN and GIST have stub logic that just always sets the recheck flag to TRUE --- I'm hoping to get Teodor to handle pushing that control down to the opclass consistent() functions. The planner no longer pays any attention to amopreqcheck, and that catalog column will go away in due course.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/access/index/genam.c,v 1.67 2008/04/12 23:14:21 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/access/index/genam.c,v 1.68 2008/04/13 19:18:14 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* many of the old access method routines have been turned into
|
||||
@@ -96,9 +96,9 @@ RelationGetIndexScan(Relation indexRelation,
|
||||
ItemPointerSetInvalid(&scan->xs_ctup.t_self);
|
||||
scan->xs_ctup.t_data = NULL;
|
||||
scan->xs_cbuf = InvalidBuffer;
|
||||
scan->xs_prev_xmax = InvalidTransactionId;
|
||||
scan->xs_next_hot = InvalidOffsetNumber;
|
||||
scan->xs_hot_dead = false;
|
||||
scan->xs_next_hot = InvalidOffsetNumber;
|
||||
scan->xs_prev_xmax = InvalidTransactionId;
|
||||
|
||||
/*
|
||||
* Let the AM fill in the key and any opaque data it wants.
|
||||
@@ -233,7 +233,18 @@ systable_getnext(SysScanDesc sysscan)
|
||||
HeapTuple htup;
|
||||
|
||||
if (sysscan->irel)
|
||||
{
|
||||
htup = index_getnext(sysscan->iscan, ForwardScanDirection);
|
||||
/*
|
||||
* We currently don't need to support lossy index operators for
|
||||
* any system catalog scan. It could be done here, using the
|
||||
* scan keys to drive the operator calls, if we arranged to save
|
||||
* the heap attnums during systable_beginscan(); this is practical
|
||||
* because we still wouldn't need to support indexes on expressions.
|
||||
*/
|
||||
if (htup && sysscan->iscan->xs_recheck)
|
||||
elog(ERROR, "system catalog scans with lossy index conditions are not implemented");
|
||||
}
|
||||
else
|
||||
htup = heap_getnext(sysscan->scan, ForwardScanDirection);
|
||||
|
||||
@@ -328,6 +339,9 @@ systable_getnext_ordered(SysScanDesc sysscan, ScanDirection direction)
|
||||
|
||||
Assert(sysscan->irel);
|
||||
htup = index_getnext(sysscan->iscan, direction);
|
||||
/* See notes in systable_getnext */
|
||||
if (htup && sysscan->iscan->xs_recheck)
|
||||
elog(ERROR, "system catalog scans with lossy index conditions are not implemented");
|
||||
|
||||
return htup;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/access/index/indexam.c,v 1.106 2008/04/12 23:14:21 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/access/index/indexam.c,v 1.107 2008/04/13 19:18:14 tgl Exp $
|
||||
*
|
||||
* INTERFACE ROUTINES
|
||||
* index_open - open an index relation by relation OID
|
||||
@@ -402,6 +402,10 @@ index_restrpos(IndexScanDesc scan)
|
||||
* snapshot, or NULL if no more matching tuples exist. On success,
|
||||
* the buffer containing the heap tuple is pinned (the pin will be dropped
|
||||
* at the next index_getnext or index_endscan).
|
||||
*
|
||||
* Note: caller must check scan->xs_recheck, and perform rechecking of the
|
||||
* scan keys if required. We do not do that here because we don't have
|
||||
* enough information to do it efficiently in the general case.
|
||||
* ----------------
|
||||
*/
|
||||
HeapTuple
|
||||
@@ -455,6 +459,8 @@ index_getnext(IndexScanDesc scan, ScanDirection direction)
|
||||
/*
|
||||
* The AM's gettuple proc finds the next index entry matching the
|
||||
* scan keys, and puts the TID in xs_ctup.t_self (ie, *tid).
|
||||
* It should also set scan->xs_recheck, though we pay no
|
||||
* attention to that here.
|
||||
*/
|
||||
found = DatumGetBool(FunctionCall2(procedure,
|
||||
PointerGetDatum(scan),
|
||||
|
||||
Reference in New Issue
Block a user