mirror of
https://github.com/postgres/postgres.git
synced 2025-08-31 17:02:12 +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:
@@ -15,9 +15,9 @@
|
||||
|
||||
#include "postgres.h"
|
||||
|
||||
#include "access/heapam.h"
|
||||
#include "access/nbtree.h"
|
||||
#include "access/nbtxlog.h"
|
||||
#include "access/tableam.h"
|
||||
#include "access/transam.h"
|
||||
#include "access/xloginsert.h"
|
||||
#include "miscadmin.h"
|
||||
@@ -431,12 +431,14 @@ _bt_check_unique(Relation rel, BTInsertState insertstate, Relation heapRel,
|
||||
}
|
||||
|
||||
/*
|
||||
* We check the whole HOT-chain to see if there is any tuple
|
||||
* that satisfies SnapshotDirty. This is necessary because we
|
||||
* have just a single index entry for the entire chain.
|
||||
* Check if there's any table tuples for this index entry
|
||||
* satisfying SnapshotDirty. This is necessary because for AMs
|
||||
* with optimizations like heap's HOT, we have just a single
|
||||
* index entry for the entire chain.
|
||||
*/
|
||||
else if (heap_hot_search(&htid, heapRel, &SnapshotDirty,
|
||||
&all_dead))
|
||||
else if (table_index_fetch_tuple_check(heapRel, &htid,
|
||||
&SnapshotDirty,
|
||||
&all_dead))
|
||||
{
|
||||
TransactionId xwait;
|
||||
|
||||
@@ -489,7 +491,8 @@ _bt_check_unique(Relation rel, BTInsertState insertstate, Relation heapRel,
|
||||
* entry.
|
||||
*/
|
||||
htid = itup->t_tid;
|
||||
if (heap_hot_search(&htid, heapRel, SnapshotSelf, NULL))
|
||||
if (table_index_fetch_tuple_check(heapRel, &htid,
|
||||
SnapshotSelf, NULL))
|
||||
{
|
||||
/* Normal case --- it's still live */
|
||||
}
|
||||
|
@@ -57,10 +57,10 @@
|
||||
|
||||
#include "postgres.h"
|
||||
|
||||
#include "access/heapam.h"
|
||||
#include "access/nbtree.h"
|
||||
#include "access/parallel.h"
|
||||
#include "access/relscan.h"
|
||||
#include "access/table.h"
|
||||
#include "access/tableam.h"
|
||||
#include "access/xact.h"
|
||||
#include "access/xlog.h"
|
||||
|
Reference in New Issue
Block a user