mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
tableam: Add helper for indexes to check if a corresponding table tuples exist.
This is, likely exclusively, useful to verify that conflicts detected in a unique index are with live tuples, rather than dead ones. Author: Andres Freund Discussion: https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de
This commit is contained in:
@@ -176,6 +176,40 @@ table_beginscan_parallel(Relation relation, ParallelTableScanDesc parallel_scan)
|
||||
}
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
* Index scan related functions.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
* To perform that check simply start an index scan, create the necessary
|
||||
* slot, do the heap lookup, and shut everything down again. This could be
|
||||
* optimized, but is unlikely to matter from a performance POV. If there
|
||||
* frequently are live index pointers also matching a unique index key, the
|
||||
* CPU overhead of this routine is unlikely to matter.
|
||||
*/
|
||||
bool
|
||||
table_index_fetch_tuple_check(Relation rel,
|
||||
ItemPointer tid,
|
||||
Snapshot snapshot,
|
||||
bool *all_dead)
|
||||
{
|
||||
IndexFetchTableData *scan;
|
||||
TupleTableSlot *slot;
|
||||
bool call_again = false;
|
||||
bool found;
|
||||
|
||||
slot = table_slot_create(rel, NULL);
|
||||
scan = table_index_fetch_begin(rel);
|
||||
found = table_index_fetch_tuple(scan, tid, snapshot, slot, &call_again,
|
||||
all_dead);
|
||||
table_index_fetch_end(scan);
|
||||
ExecDropSingleTupleTableSlot(slot);
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
* Functions to make modifications a bit simpler.
|
||||
* ----------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user