PostgreSQL Source Code git master
Loading...
Searching...
No Matches
genam.h File Reference
#include "access/htup.h"
#include "access/sdir.h"
#include "access/skey.h"
#include "executor/instrument_node.h"
#include "storage/buf.h"
#include "storage/lockdefs.h"
#include "utils/snapshot.h"
Include dependency graph for genam.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  IndexBuildResult
 
struct  IndexVacuumInfo
 
struct  IndexBulkDeleteResult
 
struct  IndexOrderByDistance
 

Typedefs

typedef struct IndexInfo IndexInfo
 
typedef struct RelationDataRelation
 
typedef struct TIDBitmap TIDBitmap
 
typedef struct TupleTableSlot TupleTableSlot
 
typedef struct IndexBuildResult IndexBuildResult
 
typedef struct IndexVacuumInfo IndexVacuumInfo
 
typedef struct IndexBulkDeleteResult IndexBulkDeleteResult
 
typedef bool(* IndexBulkDeleteCallback) (ItemPointer itemptr, void *state)
 
typedef struct IndexScanDescDataIndexScanDesc
 
typedef struct SysScanDescDataSysScanDesc
 
typedef struct ParallelIndexScanDescDataParallelIndexScanDesc
 
typedef enum IndexUniqueCheck IndexUniqueCheck
 
typedef struct IndexOrderByDistance IndexOrderByDistance
 

Enumerations

enum  IndexUniqueCheck { UNIQUE_CHECK_NO , UNIQUE_CHECK_YES , UNIQUE_CHECK_PARTIAL , UNIQUE_CHECK_EXISTING }
 

Functions

Relation index_open (Oid relationId, LOCKMODE lockmode)
 
Relation try_index_open (Oid relationId, LOCKMODE lockmode)
 
void index_close (Relation relation, LOCKMODE lockmode)
 
bool index_insert (Relation indexRelation, Datum *values, bool *isnull, ItemPointer heap_t_ctid, Relation heapRelation, IndexUniqueCheck checkUnique, bool indexUnchanged, IndexInfo *indexInfo)
 
void index_insert_cleanup (Relation indexRelation, IndexInfo *indexInfo)
 
IndexScanDesc index_beginscan (Relation heapRelation, Relation indexRelation, Snapshot snapshot, IndexScanInstrumentation *instrument, int nkeys, int norderbys, uint32 flags)
 
IndexScanDesc index_beginscan_bitmap (Relation indexRelation, Snapshot snapshot, IndexScanInstrumentation *instrument, int nkeys)
 
void index_rescan (IndexScanDesc scan, ScanKey keys, int nkeys, ScanKey orderbys, int norderbys)
 
void index_endscan (IndexScanDesc scan)
 
void index_markpos (IndexScanDesc scan)
 
void index_restrpos (IndexScanDesc scan)
 
Size index_parallelscan_estimate (Relation indexRelation, int nkeys, int norderbys, Snapshot snapshot)
 
void index_parallelscan_initialize (Relation heapRelation, Relation indexRelation, Snapshot snapshot, ParallelIndexScanDesc target)
 
void index_parallelrescan (IndexScanDesc scan)
 
IndexScanDesc index_beginscan_parallel (Relation heaprel, Relation indexrel, IndexScanInstrumentation *instrument, int nkeys, int norderbys, ParallelIndexScanDesc pscan, uint32 flags)
 
ItemPointer index_getnext_tid (IndexScanDesc scan, ScanDirection direction)
 
bool index_fetch_heap (IndexScanDesc scan, TupleTableSlot *slot)
 
bool index_getnext_slot (IndexScanDesc scan, ScanDirection direction, TupleTableSlot *slot)
 
int64 index_getbitmap (IndexScanDesc scan, TIDBitmap *bitmap)
 
IndexBulkDeleteResultindex_bulk_delete (IndexVacuumInfo *info, IndexBulkDeleteResult *istat, IndexBulkDeleteCallback callback, void *callback_state)
 
IndexBulkDeleteResultindex_vacuum_cleanup (IndexVacuumInfo *info, IndexBulkDeleteResult *istat)
 
bool index_can_return (Relation indexRelation, int attno)
 
RegProcedure index_getprocid (Relation irel, AttrNumber attnum, uint16 procnum)
 
FmgrInfoindex_getprocinfo (Relation irel, AttrNumber attnum, uint16 procnum)
 
void index_store_float8_orderby_distances (IndexScanDesc scan, Oid *orderByTypes, IndexOrderByDistance *distances, bool recheckOrderBy)
 
byteaindex_opclass_options (Relation indrel, AttrNumber attnum, Datum attoptions, bool validate)
 
IndexScanDesc RelationGetIndexScan (Relation indexRelation, int nkeys, int norderbys)
 
void IndexScanEnd (IndexScanDesc scan)
 
charBuildIndexValueDescription (Relation indexRelation, const Datum *values, const bool *isnull)
 
TransactionId index_compute_xid_horizon_for_tuples (Relation irel, Relation hrel, Buffer ibuf, OffsetNumber *itemnos, int nitems)
 
SysScanDesc systable_beginscan (Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
 
HeapTuple systable_getnext (SysScanDesc sysscan)
 
bool systable_recheck_tuple (SysScanDesc sysscan, HeapTuple tup)
 
void systable_endscan (SysScanDesc sysscan)
 
SysScanDesc systable_beginscan_ordered (Relation heapRelation, Relation indexRelation, Snapshot snapshot, int nkeys, ScanKey key)
 
HeapTuple systable_getnext_ordered (SysScanDesc sysscan, ScanDirection direction)
 
void systable_endscan_ordered (SysScanDesc sysscan)
 
void systable_inplace_update_begin (Relation relation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, const ScanKeyData *key, HeapTuple *oldtupcopy, void **state)
 
void systable_inplace_update_finish (void *state, HeapTuple tuple)
 
void systable_inplace_update_cancel (void *state)
 

Typedef Documentation

◆ IndexBuildResult

◆ IndexBulkDeleteCallback

typedef bool(* IndexBulkDeleteCallback) (ItemPointer itemptr, void *state)

Definition at line 95 of file genam.h.

◆ IndexBulkDeleteResult

◆ IndexInfo

Definition at line 29 of file genam.h.

◆ IndexOrderByDistance

◆ IndexScanDesc

Definition at line 98 of file genam.h.

◆ IndexUniqueCheck

◆ IndexVacuumInfo

◆ ParallelIndexScanDesc

Definition at line 101 of file genam.h.

◆ Relation

Definition at line 30 of file genam.h.

◆ SysScanDesc

Definition at line 99 of file genam.h.

◆ TIDBitmap

Definition at line 31 of file genam.h.

◆ TupleTableSlot

Definition at line 32 of file genam.h.

Enumeration Type Documentation

◆ IndexUniqueCheck

Enumerator
UNIQUE_CHECK_NO 
UNIQUE_CHECK_YES 
UNIQUE_CHECK_PARTIAL 
UNIQUE_CHECK_EXISTING 

Definition at line 123 of file genam.h.

124{
125 UNIQUE_CHECK_NO, /* Don't do any uniqueness checking */
126 UNIQUE_CHECK_YES, /* Enforce uniqueness at insertion time */
127 UNIQUE_CHECK_PARTIAL, /* Test uniqueness, but no error */
128 UNIQUE_CHECK_EXISTING, /* Check if existing tuple is unique */
IndexUniqueCheck
Definition genam.h:124
@ UNIQUE_CHECK_NO
Definition genam.h:125
@ UNIQUE_CHECK_EXISTING
Definition genam.h:128
@ UNIQUE_CHECK_PARTIAL
Definition genam.h:127
@ UNIQUE_CHECK_YES
Definition genam.h:126

Function Documentation

◆ BuildIndexValueDescription()

char * BuildIndexValueDescription ( Relation  indexRelation,
const Datum values,
const bool isnull 
)
extern

Definition at line 178 of file genam.c.

180{
183 int indnkeyatts;
184 int i;
185 int keyno;
186 Oid indexrelid = RelationGetRelid(indexRelation);
189
191
192 /*
193 * Check permissions- if the user does not have access to view all of the
194 * key columns then return NULL to avoid leaking data.
195 *
196 * First check if RLS is enabled for the relation. If so, return NULL to
197 * avoid leaking data.
198 *
199 * Next we need to check table-level SELECT access and then, if there is
200 * no access there, check column-level permissions.
201 */
202 idxrec = indexRelation->rd_index;
203 indrelid = idxrec->indrelid;
204 Assert(indexrelid == idxrec->indexrelid);
205
206 /* RLS check- if RLS is enabled then we don't return anything. */
208 return NULL;
209
210 /* Table-level SELECT is enough, if the user has it */
212 if (aclresult != ACLCHECK_OK)
213 {
214 /*
215 * No table-level access, so step through the columns in the index and
216 * make sure the user has SELECT rights on all of them.
217 */
218 for (keyno = 0; keyno < indnkeyatts; keyno++)
219 {
220 AttrNumber attnum = idxrec->indkey.values[keyno];
221
222 /*
223 * Note that if attnum == InvalidAttrNumber, then this is an index
224 * based on an expression and we return no detail rather than try
225 * to figure out what column(s) the expression includes and if the
226 * user has SELECT rights on them.
227 */
228 if (attnum == InvalidAttrNumber ||
231 {
232 /* No access, so clean up and return */
233 return NULL;
234 }
235 }
236 }
237
239 appendStringInfo(&buf, "(%s)=(",
240 pg_get_indexdef_columns(indexrelid, true));
241
242 for (i = 0; i < indnkeyatts; i++)
243 {
244 char *val;
245
246 if (isnull[i])
247 val = "null";
248 else
249 {
250 Oid foutoid;
251 bool typisvarlena;
252
253 /*
254 * The provided data is not necessarily of the type stored in the
255 * index; rather it is of the index opclass's input type. So look
256 * at rd_opcintype not the index tupdesc.
257 *
258 * Note: this is a bit shaky for opclasses that have pseudotype
259 * input types such as ANYARRAY or RECORD. Currently, the
260 * typoutput functions associated with the pseudotypes will work
261 * okay, but we might have to try harder in future.
262 */
263 getTypeOutputInfo(indexRelation->rd_opcintype[i],
264 &foutoid, &typisvarlena);
266 }
267
268 if (i > 0)
271 }
272
274
275 return buf.data;
276}
AclResult
Definition acl.h:183
@ ACLCHECK_OK
Definition acl.h:184
AclResult pg_attribute_aclcheck(Oid table_oid, AttrNumber attnum, Oid roleid, AclMode mode)
Definition aclchk.c:3911
AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode)
Definition aclchk.c:4082
int16 AttrNumber
Definition attnum.h:21
#define InvalidAttrNumber
Definition attnum.h:23
static Datum values[MAXATTR]
Definition bootstrap.c:190
#define Assert(condition)
Definition c.h:943
char * OidOutputFunctionCall(Oid functionId, Datum val)
Definition fmgr.c:1764
long val
Definition informix.c:689
int i
Definition isn.c:77
void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena)
Definition lsyscache.c:3129
Oid GetUserId(void)
Definition miscinit.c:470
#define ACL_SELECT
Definition parsenodes.h:77
int16 attnum
END_CATALOG_STRUCT typedef FormData_pg_index * Form_pg_index
Definition pg_index.h:74
static char buf[DEFAULT_XLOG_SEG_SIZE]
#define InvalidOid
unsigned int Oid
static int fb(int x)
#define RelationGetRelid(relation)
Definition rel.h:516
#define IndexRelationGetNumberOfKeyAttributes(relation)
Definition rel.h:535
int check_enable_rls(Oid relid, Oid checkAsUser, bool noError)
Definition rls.c:52
@ RLS_ENABLED
Definition rls.h:45
char * pg_get_indexdef_columns(Oid indexrelid, bool pretty)
Definition ruleutils.c:1246
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition stringinfo.c:145
void appendStringInfoString(StringInfo str, const char *s)
Definition stringinfo.c:230
void appendStringInfoChar(StringInfo str, char ch)
Definition stringinfo.c:242
void initStringInfo(StringInfo str)
Definition stringinfo.c:97
Oid * rd_opcintype
Definition rel.h:208
Form_pg_index rd_index
Definition rel.h:192

References ACL_SELECT, ACLCHECK_OK, appendStringInfo(), appendStringInfoChar(), appendStringInfoString(), Assert, attnum, buf, check_enable_rls(), fb(), Form_pg_index, getTypeOutputInfo(), GetUserId(), i, IndexRelationGetNumberOfKeyAttributes, initStringInfo(), InvalidAttrNumber, InvalidOid, OidOutputFunctionCall(), pg_attribute_aclcheck(), pg_class_aclcheck(), pg_get_indexdef_columns(), RelationData::rd_index, RelationData::rd_opcintype, RelationGetRelid, RLS_ENABLED, val, and values.

Referenced by _bt_check_unique(), build_index_value_desc(), check_exclusion_or_unique_constraint(), and comparetup_index_btree_tiebreak().

◆ index_beginscan()

IndexScanDesc index_beginscan ( Relation  heapRelation,
Relation  indexRelation,
Snapshot  snapshot,
IndexScanInstrumentation instrument,
int  nkeys,
int  norderbys,
uint32  flags 
)
extern

Definition at line 257 of file indexam.c.

263{
264 IndexScanDesc scan;
265
266 Assert(snapshot != InvalidSnapshot);
267
268 /* Check that a historic snapshot is not used for non-catalog tables */
269 if (IsHistoricMVCCSnapshot(snapshot) &&
271 {
274 errmsg("cannot query non-catalog table \"%s\" during logical decoding",
275 RelationGetRelationName(heapRelation))));
276 }
277
278 scan = index_beginscan_internal(indexRelation, nkeys, norderbys, snapshot, NULL, false);
279
280 /*
281 * Save additional parameters into the scandesc. Everything else was set
282 * up by RelationGetIndexScan.
283 */
284 scan->heapRelation = heapRelation;
285 scan->xs_snapshot = snapshot;
286 scan->instrument = instrument;
287
288 /* prepare to fetch index matches from table */
289 scan->xs_heapfetch = table_index_fetch_begin(heapRelation, flags);
290
291 return scan;
292}
int errcode(int sqlerrcode)
Definition elog.c:874
#define ERROR
Definition elog.h:39
#define ereport(elevel,...)
Definition elog.h:151
static IndexScanDesc index_beginscan_internal(Relation indexRelation, int nkeys, int norderbys, Snapshot snapshot, ParallelIndexScanDesc pscan, bool temp_snap)
Definition indexam.c:326
static char * errmsg
#define RelationGetRelationName(relation)
Definition rel.h:550
#define RelationIsAccessibleInLogicalDecoding(relation)
Definition rel.h:695
#define IsHistoricMVCCSnapshot(snapshot)
Definition snapmgr.h:67
#define InvalidSnapshot
Definition snapshot.h:119
IndexFetchTableData * xs_heapfetch
Definition relscan.h:182
struct IndexScanInstrumentation * instrument
Definition relscan.h:166
struct SnapshotData * xs_snapshot
Definition relscan.h:145
Relation heapRelation
Definition relscan.h:143
static IndexFetchTableData * table_index_fetch_begin(Relation rel, uint32 flags)
Definition tableam.h:1243

References Assert, ereport, errcode(), errmsg, ERROR, fb(), IndexScanDescData::heapRelation, index_beginscan_internal(), IndexScanDescData::instrument, InvalidSnapshot, IsHistoricMVCCSnapshot, RelationGetRelationName, RelationIsAccessibleInLogicalDecoding, table_index_fetch_begin(), IndexScanDescData::xs_heapfetch, and IndexScanDescData::xs_snapshot.

Referenced by check_exclusion_or_unique_constraint(), find_target_tuple(), get_actual_variable_endpoint(), heapam_relation_copy_for_cluster(), IndexNext(), IndexNextWithReorder(), IndexOnlyNext(), RelationFindDeletedTupleInfoByIndex(), RelationFindReplTupleByIndex(), ri_FastPathBatchFlush(), ri_FastPathCheck(), systable_beginscan(), and systable_beginscan_ordered().

◆ index_beginscan_bitmap()

IndexScanDesc index_beginscan_bitmap ( Relation  indexRelation,
Snapshot  snapshot,
IndexScanInstrumentation instrument,
int  nkeys 
)
extern

Definition at line 301 of file indexam.c.

305{
306 IndexScanDesc scan;
307
308 Assert(snapshot != InvalidSnapshot);
309
310 scan = index_beginscan_internal(indexRelation, nkeys, 0, snapshot, NULL, false);
311
312 /*
313 * Save additional parameters into the scandesc. Everything else was set
314 * up by RelationGetIndexScan.
315 */
316 scan->xs_snapshot = snapshot;
317 scan->instrument = instrument;
318
319 return scan;
320}

References Assert, fb(), index_beginscan_internal(), IndexScanDescData::instrument, InvalidSnapshot, and IndexScanDescData::xs_snapshot.

Referenced by ExecInitBitmapIndexScan().

◆ index_beginscan_parallel()

IndexScanDesc index_beginscan_parallel ( Relation  heaprel,
Relation  indexrel,
IndexScanInstrumentation instrument,
int  nkeys,
int  norderbys,
ParallelIndexScanDesc  pscan,
uint32  flags 
)
extern

Definition at line 560 of file indexam.c.

565{
566 Snapshot snapshot;
567 IndexScanDesc scan;
568
569 Assert(RelFileLocatorEquals(heaprel->rd_locator, pscan->ps_locator));
570 Assert(RelFileLocatorEquals(indexrel->rd_locator, pscan->ps_indexlocator));
571
572 snapshot = RestoreSnapshot(pscan->ps_snapshot_data);
573 RegisterSnapshot(snapshot);
574 scan = index_beginscan_internal(indexrel, nkeys, norderbys, snapshot,
575 pscan, true);
576
577 /*
578 * Save additional parameters into the scandesc. Everything else was set
579 * up by index_beginscan_internal.
580 */
581 scan->heapRelation = heaprel;
582 scan->xs_snapshot = snapshot;
583 scan->instrument = instrument;
584
585 /* prepare to fetch index matches from table */
586 scan->xs_heapfetch = table_index_fetch_begin(heaprel, flags);
587
588 return scan;
589}
#define RelFileLocatorEquals(locator1, locator2)
Snapshot RestoreSnapshot(char *start_address)
Definition snapmgr.c:1793
Snapshot RegisterSnapshot(Snapshot snapshot)
Definition snapmgr.c:824
RelFileLocator rd_locator
Definition rel.h:57

References Assert, fb(), IndexScanDescData::heapRelation, index_beginscan_internal(), IndexScanDescData::instrument, RelationData::rd_locator, RegisterSnapshot(), RelFileLocatorEquals, RestoreSnapshot(), table_index_fetch_begin(), IndexScanDescData::xs_heapfetch, and IndexScanDescData::xs_snapshot.

Referenced by ExecIndexOnlyScanInitializeDSM(), ExecIndexOnlyScanInitializeWorker(), ExecIndexScanInitializeDSM(), and ExecIndexScanInitializeWorker().

◆ index_bulk_delete()

IndexBulkDeleteResult * index_bulk_delete ( IndexVacuumInfo info,
IndexBulkDeleteResult istat,
IndexBulkDeleteCallback  callback,
void callback_state 
)
extern

Definition at line 773 of file indexam.c.

777{
778 Relation indexRelation = info->index;
779
781 CHECK_REL_PROCEDURE(ambulkdelete);
782
783 return indexRelation->rd_indam->ambulkdelete(info, istat,
784 callback, callback_state);
785}
#define CHECK_REL_PROCEDURE(pname)
Definition indexam.c:94
#define RELATION_CHECKS
Definition indexam.c:76
ambulkdelete_function ambulkdelete
Definition amapi.h:299
Relation index
Definition genam.h:54
const struct IndexAmRoutine * rd_indam
Definition rel.h:206
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)

References IndexAmRoutine::ambulkdelete, callback(), CHECK_REL_PROCEDURE, IndexVacuumInfo::index, RelationData::rd_indam, and RELATION_CHECKS.

Referenced by vac_bulkdel_one_index(), and validate_index().

◆ index_can_return()

bool index_can_return ( Relation  indexRelation,
int  attno 
)
extern

Definition at line 813 of file indexam.c.

814{
816
817 /* amcanreturn is optional; assume false if not provided by AM */
818 if (indexRelation->rd_indam->amcanreturn == NULL)
819 return false;
820
821 return indexRelation->rd_indam->amcanreturn(indexRelation, attno);
822}
amcanreturn_function amcanreturn
Definition amapi.h:301

References IndexAmRoutine::amcanreturn, fb(), RelationData::rd_indam, and RELATION_CHECKS.

Referenced by get_relation_info(), and indexam_property().

◆ index_close()

void index_close ( Relation  relation,
LOCKMODE  lockmode 
)
extern

Definition at line 178 of file indexam.c.

179{
180 LockRelId relid = relation->rd_lockInfo.lockRelId;
181
182 Assert(lockmode >= NoLock && lockmode < MAX_LOCKMODES);
183
184 /* The relcache does the real work... */
185 RelationClose(relation);
186
187 if (lockmode != NoLock)
188 UnlockRelationId(&relid, lockmode);
189}
void UnlockRelationId(LockRelId *relid, LOCKMODE lockmode)
Definition lmgr.c:214
#define MAX_LOCKMODES
Definition lock.h:85
#define NoLock
Definition lockdefs.h:34
void RelationClose(Relation relation)
Definition relcache.c:2210
LockRelId lockRelId
Definition rel.h:46
LockInfoData rd_lockInfo
Definition rel.h:114

References Assert, LockInfoData::lockRelId, MAX_LOCKMODES, NoLock, RelationData::rd_lockInfo, RelationClose(), and UnlockRelationId().

Referenced by _brin_parallel_build_main(), _bt_parallel_build_main(), _gin_parallel_build_main(), amcheck_lock_relation_and_check(), ATExecAddIndex(), ATExecAddIndexConstraint(), ATExecReplicaIdentity(), AttachPartitionEnsureIndexes(), brin_desummarize_range(), brin_page_items(), brin_summarize_range(), brincostestimate(), build_index_value_desc(), build_indices(), build_new_indexes(), BuildEventTriggerCache(), check_index_is_clusterable(), CheckIndexCompatible(), close_lo_relation(), cluster_rel(), DefineIndex(), DefineRelation(), DetachPartitionFinalize(), enum_endpoint(), enum_range_internal(), ExecCloseIndices(), ExecEndBitmapIndexScan(), ExecEndIndexOnlyScan(), ExecEndIndexScan(), expandTableLikeClause(), FindReplTupleInLocalRel(), FindUsableIndexForReplicaIdentityFull(), get_actual_variable_range(), get_relation_info(), gin_clean_pending_list(), gincostestimate(), gist_page_items(), index_concurrently_build(), index_concurrently_set_dead(), index_create(), index_create_copy(), index_drop(), indexam_property(), infer_arbiter_indexes(), InitCatCachePhase2(), lookup_ts_config_cache(), pg_nextoid(), plan_create_index_workers(), propgraph_element_get_key(), rebuild_relation(), rebuild_relation_finish_concurrent(), refresh_by_match_merge(), RefreshMatViewByOid(), reindex_index(), ReindexRelationConcurrently(), RelationFindDeletedTupleInfoByIndex(), RelationFindReplTupleByIndex(), RelationGetIndexAttrBitmap(), RelationTruncateIndexes(), ri_FastPathCheck(), ri_FastPathTeardown(), SetIndexStorageProperties(), systable_endscan(), toast_close_indexes(), transformIndexConstraint(), TryReuseIndex(), unique_key_recheck(), vac_close_indexes(), vac_open_indexes(), and validate_index().

◆ index_compute_xid_horizon_for_tuples()

TransactionId index_compute_xid_horizon_for_tuples ( Relation  irel,
Relation  hrel,
Buffer  ibuf,
OffsetNumber itemnos,
int  nitems 
)
extern

Definition at line 295 of file genam.c.

300{
302 TransactionId snapshotConflictHorizon = InvalidTransactionId;
304 IndexTuple itup;
305
306 Assert(nitems > 0);
307
308 delstate.irel = irel;
310 delstate.bottomup = false;
311 delstate.bottomupfreespace = 0;
312 delstate.ndeltids = 0;
315
316 /* identify what the index tuples about to be deleted point to */
317 for (int i = 0; i < nitems; i++)
318 {
319 OffsetNumber offnum = itemnos[i];
321
322 iitemid = PageGetItemId(ipage, offnum);
324
326
327 ItemPointerCopy(&itup->t_tid, &delstate.deltids[i].tid);
328 delstate.deltids[i].id = delstate.ndeltids;
329 delstate.status[i].idxoffnum = offnum;
330 delstate.status[i].knowndeletable = true; /* LP_DEAD-marked */
331 delstate.status[i].promising = false; /* unused */
332 delstate.status[i].freespace = 0; /* unused */
333
334 delstate.ndeltids++;
335 }
336
337 /* determine the actual xid horizon */
338 snapshotConflictHorizon = table_index_delete_tuples(hrel, &delstate);
339
340 /* assert tableam agrees that all items are deletable */
341 Assert(delstate.ndeltids == nitems);
342
343 pfree(delstate.deltids);
344 pfree(delstate.status);
345
346 return snapshotConflictHorizon;
347}
BlockNumber BufferGetBlockNumber(Buffer buffer)
Definition bufmgr.c:4446
static Page BufferGetPage(Buffer buffer)
Definition bufmgr.h:468
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
Definition bufpage.h:268
static void * PageGetItem(PageData *page, const ItemIdData *itemId)
Definition bufpage.h:378
PageData * Page
Definition bufpage.h:81
uint32 TransactionId
Definition c.h:736
#define palloc_array(type, count)
Definition fe_memutils.h:76
#define nitems(x)
Definition indent.h:31
#define ItemIdIsDead(itemId)
Definition itemid.h:113
static void ItemPointerCopy(const ItemPointerData *fromPointer, ItemPointerData *toPointer)
Definition itemptr.h:172
IndexTupleData * IndexTuple
Definition itup.h:53
void pfree(void *pointer)
Definition mcxt.c:1616
uint16 OffsetNumber
Definition off.h:24
ItemPointerData t_tid
Definition itup.h:37
static TransactionId table_index_delete_tuples(Relation rel, TM_IndexDeleteOp *delstate)
Definition tableam.h:1409
#define InvalidTransactionId
Definition transam.h:31

References Assert, BufferGetBlockNumber(), BufferGetPage(), fb(), i, InvalidTransactionId, ItemIdIsDead, ItemPointerCopy(), nitems, PageGetItem(), PageGetItemId(), palloc_array, pfree(), IndexTupleData::t_tid, and table_index_delete_tuples().

Referenced by _hash_vacuum_one_page(), and gistprunepage().

◆ index_endscan()

void index_endscan ( IndexScanDesc  scan)
extern

Definition at line 394 of file indexam.c.

395{
397 CHECK_SCAN_PROCEDURE(amendscan);
398
399 /* Release resources (like buffer pins) from table accesses */
400 if (scan->xs_heapfetch)
401 {
403 scan->xs_heapfetch = NULL;
404 }
405
406 /* End the AM's scan */
407 scan->indexRelation->rd_indam->amendscan(scan);
408
409 /* Release index refcount acquired by index_beginscan */
411
412 if (scan->xs_temp_snap)
414
415 /* Release the scan data structure itself */
416 IndexScanEnd(scan);
417}
void IndexScanEnd(IndexScanDesc scan)
Definition genam.c:145
#define CHECK_SCAN_PROCEDURE(pname)
Definition indexam.c:101
#define SCAN_CHECKS
Definition indexam.c:87
void RelationDecrementReferenceCount(Relation rel)
Definition relcache.c:2190
void UnregisterSnapshot(Snapshot snapshot)
Definition snapmgr.c:866
amendscan_function amendscan
Definition amapi.h:313
Relation indexRelation
Definition relscan.h:144
static void table_index_fetch_end(struct IndexFetchTableData *scan)
Definition tableam.h:1272

References IndexAmRoutine::amendscan, CHECK_SCAN_PROCEDURE, fb(), IndexScanDescData::indexRelation, IndexScanEnd(), RelationData::rd_indam, RelationDecrementReferenceCount(), SCAN_CHECKS, table_index_fetch_end(), UnregisterSnapshot(), IndexScanDescData::xs_heapfetch, IndexScanDescData::xs_snapshot, and IndexScanDescData::xs_temp_snap.

Referenced by check_exclusion_or_unique_constraint(), ExecEndBitmapIndexScan(), ExecEndIndexOnlyScan(), ExecEndIndexScan(), find_target_tuple(), get_actual_variable_endpoint(), heapam_relation_copy_for_cluster(), RelationFindDeletedTupleInfoByIndex(), RelationFindReplTupleByIndex(), ri_FastPathBatchFlush(), ri_FastPathCheck(), systable_endscan(), and systable_endscan_ordered().

◆ index_fetch_heap()

bool index_fetch_heap ( IndexScanDesc  scan,
TupleTableSlot slot 
)
extern

Definition at line 657 of file indexam.c.

658{
659 bool all_dead = false;
660 bool found;
661
662 found = table_index_fetch_tuple(scan->xs_heapfetch, &scan->xs_heaptid,
663 scan->xs_snapshot, slot,
664 &scan->xs_heap_continue, &all_dead);
665
666 if (found)
668
669 /*
670 * If we scanned a whole HOT chain and found only dead tuples, tell index
671 * AM to kill its entry for that TID (this will take effect in the next
672 * amgettuple call, in index_getnext_tid). We do not do this when in
673 * recovery because it may violate MVCC to do so. See comments in
674 * RelationGetIndexScan().
675 */
676 if (!scan->xactStartedInRecovery)
678
679 return found;
680}
#define pgstat_count_heap_fetch(rel)
Definition pgstat.h:727
bool xs_heap_continue
Definition relscan.h:180
bool xactStartedInRecovery
Definition relscan.h:156
bool kill_prior_tuple
Definition relscan.h:154
ItemPointerData xs_heaptid
Definition relscan.h:179
static bool table_index_fetch_tuple(struct IndexFetchTableData *scan, ItemPointer tid, Snapshot snapshot, TupleTableSlot *slot, bool *call_again, bool *all_dead)
Definition tableam.h:1302

References fb(), IndexScanDescData::indexRelation, IndexScanDescData::kill_prior_tuple, pgstat_count_heap_fetch, table_index_fetch_tuple(), IndexScanDescData::xactStartedInRecovery, IndexScanDescData::xs_heap_continue, IndexScanDescData::xs_heapfetch, IndexScanDescData::xs_heaptid, and IndexScanDescData::xs_snapshot.

Referenced by get_actual_variable_endpoint(), index_getnext_slot(), and IndexOnlyNext().

◆ index_getbitmap()

int64 index_getbitmap ( IndexScanDesc  scan,
TIDBitmap bitmap 
)
extern

Definition at line 743 of file indexam.c.

744{
745 int64 ntids;
746
748 CHECK_SCAN_PROCEDURE(amgetbitmap);
749
750 /* just make sure this is false... */
751 scan->kill_prior_tuple = false;
752
753 /*
754 * have the am's getbitmap proc do all the work.
755 */
756 ntids = scan->indexRelation->rd_indam->amgetbitmap(scan, bitmap);
757
759
760 return ntids;
761}
int64_t int64
Definition c.h:621
#define pgstat_count_index_tuples(rel, n)
Definition pgstat.h:737
amgetbitmap_function amgetbitmap
Definition amapi.h:312

References IndexAmRoutine::amgetbitmap, CHECK_SCAN_PROCEDURE, IndexScanDescData::indexRelation, IndexScanDescData::kill_prior_tuple, pgstat_count_index_tuples, RelationData::rd_indam, and SCAN_CHECKS.

Referenced by MultiExecBitmapIndexScan().

◆ index_getnext_slot()

bool index_getnext_slot ( IndexScanDesc  scan,
ScanDirection  direction,
TupleTableSlot slot 
)
extern

Definition at line 698 of file indexam.c.

699{
700 for (;;)
701 {
702 if (!scan->xs_heap_continue)
703 {
704 ItemPointer tid;
705
706 /* Time to fetch the next TID from the index */
707 tid = index_getnext_tid(scan, direction);
708
709 /* If we're out of index entries, we're done */
710 if (tid == NULL)
711 break;
712
713 Assert(ItemPointerEquals(tid, &scan->xs_heaptid));
714 }
715
716 /*
717 * Fetch the next (or only) visible heap tuple for this index entry.
718 * If we don't find anything, loop around and grab the next TID from
719 * the index.
720 */
722 if (index_fetch_heap(scan, slot))
723 return true;
724 }
725
726 return false;
727}
ItemPointer index_getnext_tid(IndexScanDesc scan, ScanDirection direction)
Definition indexam.c:599
bool index_fetch_heap(IndexScanDesc scan, TupleTableSlot *slot)
Definition indexam.c:657
bool ItemPointerEquals(const ItemPointerData *pointer1, const ItemPointerData *pointer2)
Definition itemptr.c:35
static bool ItemPointerIsValid(const ItemPointerData *pointer)
Definition itemptr.h:83

References Assert, fb(), index_fetch_heap(), index_getnext_tid(), ItemPointerEquals(), ItemPointerIsValid(), IndexScanDescData::xs_heap_continue, and IndexScanDescData::xs_heaptid.

Referenced by check_exclusion_or_unique_constraint(), find_target_tuple(), heapam_relation_copy_for_cluster(), IndexNext(), IndexNextWithReorder(), RelationFindDeletedTupleInfoByIndex(), RelationFindReplTupleByIndex(), ri_FastPathFlushArray(), ri_FastPathProbeOne(), systable_getnext(), and systable_getnext_ordered().

◆ index_getnext_tid()

ItemPointer index_getnext_tid ( IndexScanDesc  scan,
ScanDirection  direction 
)
extern

Definition at line 599 of file indexam.c.

600{
601 bool found;
602
604 CHECK_SCAN_PROCEDURE(amgettuple);
605
606 /* XXX: we should assert that a snapshot is pushed or registered */
608
609 /*
610 * The AM's amgettuple proc finds the next index entry matching the scan
611 * keys, and puts the TID into scan->xs_heaptid. It should also set
612 * scan->xs_recheck and possibly scan->xs_itup/scan->xs_hitup, though we
613 * pay no attention to those fields here.
614 */
615 found = scan->indexRelation->rd_indam->amgettuple(scan, direction);
616
617 /* Reset kill flag immediately for safety */
618 scan->kill_prior_tuple = false;
619 scan->xs_heap_continue = false;
620
621 /* If we're out of index entries, we're done */
622 if (!found)
623 {
624 /* reset table AM state */
625 if (scan->xs_heapfetch)
627
628 return NULL;
629 }
631
633
634 /* Return the TID of the tuple we found. */
635 return &scan->xs_heaptid;
636}
TransactionId RecentXmin
Definition snapmgr.c:160
amgettuple_function amgettuple
Definition amapi.h:311
static void table_index_fetch_reset(struct IndexFetchTableData *scan)
Definition tableam.h:1263
#define TransactionIdIsValid(xid)
Definition transam.h:41

References IndexAmRoutine::amgettuple, Assert, CHECK_SCAN_PROCEDURE, fb(), IndexScanDescData::indexRelation, ItemPointerIsValid(), IndexScanDescData::kill_prior_tuple, pgstat_count_index_tuples, RelationData::rd_indam, RecentXmin, SCAN_CHECKS, table_index_fetch_reset(), TransactionIdIsValid, IndexScanDescData::xs_heap_continue, IndexScanDescData::xs_heapfetch, and IndexScanDescData::xs_heaptid.

Referenced by get_actual_variable_endpoint(), index_getnext_slot(), and IndexOnlyNext().

◆ index_getprocid()

RegProcedure index_getprocid ( Relation  irel,
AttrNumber  attnum,
uint16  procnum 
)
extern

Definition at line 851 of file indexam.c.

854{
855 RegProcedure *loc;
856 int nproc;
857 int procindex;
858
859 nproc = irel->rd_indam->amsupport;
860
861 Assert(procnum > 0 && procnum <= (uint16) nproc);
862
863 procindex = (nproc * (attnum - 1)) + (procnum - 1);
864
865 loc = irel->rd_support;
866
867 Assert(loc != NULL);
868
869 return loc[procindex];
870}
regproc RegProcedure
Definition c.h:734
uint16_t uint16
Definition c.h:623
uint16 amsupport
Definition amapi.h:242
RegProcedure * rd_support
Definition rel.h:209

References IndexAmRoutine::amsupport, Assert, attnum, fb(), RelationData::rd_indam, and RelationData::rd_support.

Referenced by _hash_init(), bloom_get_procinfo(), GinBufferInit(), gistbuild(), gistcanreturn(), inclusion_get_procinfo(), index_opclass_options(), initGinState(), initGISTstate(), minmax_multi_get_procinfo(), spgdoinsert(), spgGetCache(), and tuplesort_begin_index_gin().

◆ index_getprocinfo()

FmgrInfo * index_getprocinfo ( Relation  irel,
AttrNumber  attnum,
uint16  procnum 
)
extern

Definition at line 885 of file indexam.c.

888{
890 int nproc;
891 int optsproc;
892 int procindex;
893
894 nproc = irel->rd_indam->amsupport;
896
897 Assert(procnum > 0 && procnum <= (uint16) nproc);
898
899 procindex = (nproc * (attnum - 1)) + (procnum - 1);
900
901 locinfo = irel->rd_supportinfo;
902
903 Assert(locinfo != NULL);
904
906
907 /* Initialize the lookup info if first time through */
908 if (locinfo->fn_oid == InvalidOid)
909 {
910 RegProcedure *loc = irel->rd_support;
912
913 Assert(loc != NULL);
914
915 procId = loc[procindex];
916
917 /*
918 * Complain if function was not found during IndexSupportInitialize.
919 * This should not happen unless the system tables contain bogus
920 * entries for the index opclass. (If an AM wants to allow a support
921 * function to be optional, it can use index_getprocid.)
922 */
924 elog(ERROR, "missing support function %d for attribute %d of index \"%s\"",
926
928
929 if (procnum != optsproc)
930 {
931 /* Initialize locinfo->fn_expr with opclass options Const */
932 bytea **attoptions = RelationGetIndexAttOptions(irel, false);
934
935 set_fn_opclass_options(locinfo, attoptions[attnum - 1]);
936
938 }
939 }
940
941 return locinfo;
942}
#define RegProcedureIsValid(p)
Definition c.h:862
#define elog(elevel,...)
Definition elog.h:227
void set_fn_opclass_options(FmgrInfo *flinfo, bytea *options)
Definition fmgr.c:2036
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
Definition fmgr.c:139
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition palloc.h:124
bytea ** RelationGetIndexAttOptions(Relation relation, bool copy)
Definition relcache.c:6002
uint16 amoptsprocnum
Definition amapi.h:244
MemoryContext rd_indexcxt
Definition rel.h:204
struct FmgrInfo * rd_supportinfo
Definition rel.h:210
Definition c.h:776

References IndexAmRoutine::amoptsprocnum, IndexAmRoutine::amsupport, Assert, attnum, elog, ERROR, fb(), fmgr_info_cxt(), InvalidOid, MemoryContextSwitchTo(), RelationData::rd_indam, RelationData::rd_indexcxt, RelationData::rd_support, RelationData::rd_supportinfo, RegProcedureIsValid, RelationGetIndexAttOptions(), RelationGetRelationName, and set_fn_opclass_options().

Referenced by _bt_first(), _bt_mkscankey(), _bt_setup_array_cmp(), _hash_datum2hashkey(), add_values_to_range(), bloom_get_procinfo(), brin_build_desc(), bringetbitmap(), doPickSplit(), inclusion_get_procinfo(), index_opclass_options(), initBloomState(), initGinState(), initGISTstate(), minmax_multi_get_procinfo(), spgbeginscan(), spgdoinsert(), spgGetCache(), and union_tuples().

◆ index_insert()

bool index_insert ( Relation  indexRelation,
Datum values,
bool isnull,
ItemPointer  heap_t_ctid,
Relation  heapRelation,
IndexUniqueCheck  checkUnique,
bool  indexUnchanged,
IndexInfo indexInfo 
)
extern

Definition at line 214 of file indexam.c.

222{
224 CHECK_REL_PROCEDURE(aminsert);
225
226 if (!(indexRelation->rd_indam->ampredlocks))
227 CheckForSerializableConflictIn(indexRelation,
230
231 return indexRelation->rd_indam->aminsert(indexRelation, values, isnull,
232 heap_t_ctid, heapRelation,
234 indexInfo);
235}
#define InvalidBlockNumber
Definition block.h:33
void CheckForSerializableConflictIn(Relation relation, const ItemPointerData *tid, BlockNumber blkno)
Definition predicate.c:4266
aminsert_function aminsert
Definition amapi.h:297
bool ampredlocks
Definition amapi.h:272

References IndexAmRoutine::aminsert, IndexAmRoutine::ampredlocks, CHECK_REL_PROCEDURE, CheckForSerializableConflictIn(), fb(), InvalidBlockNumber, RelationData::rd_indam, RELATION_CHECKS, and values.

Referenced by CatalogIndexInsert(), ExecInsertIndexTuples(), heapam_index_validate_scan(), toast_save_datum(), and unique_key_recheck().

◆ index_insert_cleanup()

void index_insert_cleanup ( Relation  indexRelation,
IndexInfo indexInfo 
)
extern

Definition at line 242 of file indexam.c.

244{
246
247 if (indexRelation->rd_indam->aminsertcleanup)
248 indexRelation->rd_indam->aminsertcleanup(indexRelation, indexInfo);
249}
aminsertcleanup_function aminsertcleanup
Definition amapi.h:298

References IndexAmRoutine::aminsertcleanup, RelationData::rd_indam, and RELATION_CHECKS.

Referenced by ExecCloseIndices(), unique_key_recheck(), and validate_index().

◆ index_markpos()

void index_markpos ( IndexScanDesc  scan)
extern

Definition at line 424 of file indexam.c.

425{
427 CHECK_SCAN_PROCEDURE(ammarkpos);
428
429 scan->indexRelation->rd_indam->ammarkpos(scan);
430}
ammarkpos_function ammarkpos
Definition amapi.h:314

References IndexAmRoutine::ammarkpos, CHECK_SCAN_PROCEDURE, IndexScanDescData::indexRelation, RelationData::rd_indam, and SCAN_CHECKS.

Referenced by ExecIndexMarkPos(), and ExecIndexOnlyMarkPos().

◆ index_opclass_options()

bytea * index_opclass_options ( Relation  indrel,
AttrNumber  attnum,
Datum  attoptions,
bool  validate 
)
extern

Definition at line 1016 of file indexam.c.

1018{
1019 int amoptsprocnum = indrel->rd_indam->amoptsprocnum;
1020 Oid procid = InvalidOid;
1023
1024 /* fetch options support procedure if specified */
1025 if (amoptsprocnum != 0)
1026 procid = index_getprocid(indrel, attnum, amoptsprocnum);
1027
1028 if (!OidIsValid(procid))
1029 {
1030 Oid opclass;
1033
1034 if (!DatumGetPointer(attoptions))
1035 return NULL; /* ok, no options, no procedure */
1036
1037 /*
1038 * Report an error if the opclass's options-parsing procedure does not
1039 * exist but the opclass options are specified.
1040 */
1044 opclass = indclass->values[attnum - 1];
1045
1046 ereport(ERROR,
1048 errmsg("operator class %s has no options",
1049 generate_opclass_name(opclass))));
1050 }
1051
1053
1054 procinfo = index_getprocinfo(indrel, attnum, amoptsprocnum);
1055
1057
1058 return build_local_reloptions(&relopts, attoptions, validate);
1059}
static bool validate(Port *port, const char *auth, const char **logdetail)
Definition auth-oauth.c:672
#define OidIsValid(objectId)
Definition c.h:858
#define FunctionCall1(flinfo, arg1)
Definition fmgr.h:702
FmgrInfo * index_getprocinfo(Relation irel, AttrNumber attnum, uint16 procnum)
Definition indexam.c:885
RegProcedure index_getprocid(Relation irel, AttrNumber attnum, uint16 procnum)
Definition indexam.c:851
static Datum PointerGetDatum(const void *X)
Definition postgres.h:342
uint64_t Datum
Definition postgres.h:70
static Pointer DatumGetPointer(Datum X)
Definition postgres.h:332
void init_local_reloptions(local_relopts *relopts, Size relopt_struct_size)
Definition reloptions.c:792
void * build_local_reloptions(local_relopts *relopts, Datum options, bool validate)
char * generate_opclass_name(Oid opclass)
Definition c.h:815
Datum SysCacheGetAttrNotNull(SysCacheIdentifier cacheId, HeapTuple tup, AttrNumber attributeNumber)
Definition syscache.c:626

References attnum, build_local_reloptions(), DatumGetPointer(), ereport, errcode(), errmsg, ERROR, fb(), FunctionCall1, generate_opclass_name(), index_getprocid(), index_getprocinfo(), init_local_reloptions(), InvalidOid, OidIsValid, PointerGetDatum(), SysCacheGetAttrNotNull(), and validate().

Referenced by index_create(), and RelationGetIndexAttOptions().

◆ index_open()

Relation index_open ( Oid  relationId,
LOCKMODE  lockmode 
)
extern

Definition at line 134 of file indexam.c.

135{
136 Relation r;
137
138 r = relation_open(relationId, lockmode);
139
141
142 return r;
143}
static void validate_relation_as_index(Relation r)
Definition indexam.c:198
Relation relation_open(Oid relationId, LOCKMODE lockmode)
Definition relation.c:48

References fb(), relation_open(), and validate_relation_as_index().

Referenced by _brin_parallel_build_main(), _bt_parallel_build_main(), _gin_parallel_build_main(), amcheck_lock_relation_and_check(), ATExecAddIndex(), ATExecAddIndexConstraint(), ATExecReplicaIdentity(), AttachPartitionEnsureIndexes(), brin_desummarize_range(), brin_page_items(), brin_summarize_range(), brincostestimate(), build_index_value_desc(), build_indices(), build_new_indexes(), BuildEventTriggerCache(), check_index_is_clusterable(), CheckIndexCompatible(), cluster_rel(), DefineIndex(), DefineRelation(), DetachPartitionFinalize(), enum_endpoint(), enum_range_internal(), ExecInitBitmapIndexScan(), ExecInitIndexOnlyScan(), ExecInitIndexScan(), ExecOpenIndices(), expandTableLikeClause(), FindReplTupleInLocalRel(), FindUsableIndexForReplicaIdentityFull(), get_actual_variable_range(), get_relation_info(), gin_clean_pending_list(), gincostestimate(), gist_page_items(), index_concurrently_build(), index_concurrently_set_dead(), index_create_copy(), index_drop(), indexam_property(), infer_arbiter_indexes(), InitCatCachePhase2(), lookup_ts_config_cache(), open_lo_relation(), pg_nextoid(), plan_create_index_workers(), propgraph_element_get_key(), rebuild_relation_finish_concurrent(), refresh_by_match_merge(), RefreshMatViewByOid(), reindex_index(), ReindexRelationConcurrently(), RelationFindDeletedTupleInfoByIndex(), RelationFindReplTupleByIndex(), RelationGetIndexAttrBitmap(), RelationTruncateIndexes(), ri_FastPathCheck(), ri_FastPathGetEntry(), SetIndexStorageProperties(), systable_beginscan(), toast_open_indexes(), transformIndexConstraint(), TryReuseIndex(), unique_key_recheck(), vac_open_indexes(), and validate_index().

◆ index_parallelrescan()

void index_parallelrescan ( IndexScanDesc  scan)
extern

Definition at line 538 of file indexam.c.

539{
541
542 /* reset table AM state for rescan */
543 if (scan->xs_heapfetch)
545
546 /* amparallelrescan is optional; assume no-op if not provided by AM */
549}
amparallelrescan_function amparallelrescan
Definition amapi.h:320

References IndexAmRoutine::amparallelrescan, fb(), IndexScanDescData::indexRelation, RelationData::rd_indam, SCAN_CHECKS, table_index_fetch_reset(), and IndexScanDescData::xs_heapfetch.

Referenced by ExecIndexOnlyScanReInitializeDSM(), and ExecIndexScanReInitializeDSM().

◆ index_parallelscan_estimate()

Size index_parallelscan_estimate ( Relation  indexRelation,
int  nkeys,
int  norderbys,
Snapshot  snapshot 
)
extern

Definition at line 470 of file indexam.c.

472{
473 Size nbytes;
474
476
477 nbytes = offsetof(ParallelIndexScanDescData, ps_snapshot_data);
478 nbytes = add_size(nbytes, EstimateSnapshotSpace(snapshot));
479 nbytes = MAXALIGN(nbytes);
480
481 /*
482 * If parallel scan index AM interface can't be used (or index AM provides
483 * no such interface), assume there is no AM-specific data needed
484 */
485 if (indexRelation->rd_indam->amestimateparallelscan != NULL)
486 nbytes = add_size(nbytes,
487 indexRelation->rd_indam->amestimateparallelscan(indexRelation,
488 nkeys,
489 norderbys));
490
491 return nbytes;
492}
#define MAXALIGN(LEN)
Definition c.h:896
size_t Size
Definition c.h:689
Size add_size(Size s1, Size s2)
Definition shmem.c:1048
Size EstimateSnapshotSpace(Snapshot snapshot)
Definition snapmgr.c:1712
amestimateparallelscan_function amestimateparallelscan
Definition amapi.h:318

References add_size(), IndexAmRoutine::amestimateparallelscan, EstimateSnapshotSpace(), fb(), MAXALIGN, RelationData::rd_indam, and RELATION_CHECKS.

Referenced by ExecIndexOnlyScanEstimate(), and ExecIndexScanEstimate().

◆ index_parallelscan_initialize()

void index_parallelscan_initialize ( Relation  heapRelation,
Relation  indexRelation,
Snapshot  snapshot,
ParallelIndexScanDesc  target 
)
extern

Definition at line 505 of file indexam.c.

508{
509 Size offset;
510
512
513 offset = add_size(offsetof(ParallelIndexScanDescData, ps_snapshot_data),
514 EstimateSnapshotSpace(snapshot));
515 offset = MAXALIGN(offset);
516
517 target->ps_locator = heapRelation->rd_locator;
518 target->ps_indexlocator = indexRelation->rd_locator;
519 target->ps_offset_am = 0;
520 SerializeSnapshot(snapshot, target->ps_snapshot_data);
521
522 /* aminitparallelscan is optional; assume no-op if not provided by AM */
523 if (indexRelation->rd_indam->aminitparallelscan != NULL)
524 {
525 void *amtarget;
526
527 target->ps_offset_am = offset;
528 amtarget = OffsetToPointer(target, target->ps_offset_am);
529 indexRelation->rd_indam->aminitparallelscan(amtarget);
530 }
531}
#define OffsetToPointer(base, offset)
Definition c.h:855
void SerializeSnapshot(Snapshot snapshot, char *start_address)
Definition snapmgr.c:1736
aminitparallelscan_function aminitparallelscan
Definition amapi.h:319
RelFileLocator ps_indexlocator
Definition relscan.h:205
RelFileLocator ps_locator
Definition relscan.h:204
char ps_snapshot_data[FLEXIBLE_ARRAY_MEMBER]
Definition relscan.h:207

References add_size(), IndexAmRoutine::aminitparallelscan, EstimateSnapshotSpace(), fb(), MAXALIGN, OffsetToPointer, ParallelIndexScanDescData::ps_indexlocator, ParallelIndexScanDescData::ps_locator, ParallelIndexScanDescData::ps_offset_am, ParallelIndexScanDescData::ps_snapshot_data, RelationData::rd_indam, RelationData::rd_locator, RELATION_CHECKS, and SerializeSnapshot().

Referenced by ExecIndexOnlyScanInitializeDSM(), and ExecIndexScanInitializeDSM().

◆ index_rescan()

void index_rescan ( IndexScanDesc  scan,
ScanKey  keys,
int  nkeys,
ScanKey  orderbys,
int  norderbys 
)
extern

Definition at line 368 of file indexam.c.

371{
373 CHECK_SCAN_PROCEDURE(amrescan);
374
375 Assert(nkeys == scan->numberOfKeys);
376 Assert(norderbys == scan->numberOfOrderBys);
377
378 /* reset table AM state for rescan */
379 if (scan->xs_heapfetch)
381
382 scan->kill_prior_tuple = false; /* for safety */
383 scan->xs_heap_continue = false;
384
385 scan->indexRelation->rd_indam->amrescan(scan, keys, nkeys,
386 orderbys, norderbys);
387}
amrescan_function amrescan
Definition amapi.h:310

References IndexAmRoutine::amrescan, Assert, CHECK_SCAN_PROCEDURE, IndexScanDescData::indexRelation, IndexScanDescData::kill_prior_tuple, IndexScanDescData::numberOfKeys, IndexScanDescData::numberOfOrderBys, RelationData::rd_indam, SCAN_CHECKS, table_index_fetch_reset(), IndexScanDescData::xs_heap_continue, and IndexScanDescData::xs_heapfetch.

Referenced by check_exclusion_or_unique_constraint(), ExecIndexOnlyScanInitializeDSM(), ExecIndexOnlyScanInitializeWorker(), ExecIndexScanInitializeDSM(), ExecIndexScanInitializeWorker(), ExecInitBitmapIndexScan(), ExecReScanBitmapIndexScan(), ExecReScanIndexOnlyScan(), ExecReScanIndexScan(), find_target_tuple(), get_actual_variable_endpoint(), heapam_relation_copy_for_cluster(), IndexNext(), IndexNextWithReorder(), IndexOnlyNext(), MultiExecBitmapIndexScan(), RelationFindDeletedTupleInfoByIndex(), RelationFindReplTupleByIndex(), ri_FastPathFlushArray(), ri_FastPathProbeOne(), systable_beginscan(), and systable_beginscan_ordered().

◆ index_restrpos()

void index_restrpos ( IndexScanDesc  scan)
extern

Definition at line 448 of file indexam.c.

449{
451
453 CHECK_SCAN_PROCEDURE(amrestrpos);
454
455 /* reset table AM state for restoring the marked position */
456 if (scan->xs_heapfetch)
458
459 scan->kill_prior_tuple = false; /* for safety */
460 scan->xs_heap_continue = false;
461
462 scan->indexRelation->rd_indam->amrestrpos(scan);
463}
#define IsMVCCLikeSnapshot(snapshot)
Definition snapmgr.h:74
amrestrpos_function amrestrpos
Definition amapi.h:315

References IndexAmRoutine::amrestrpos, Assert, CHECK_SCAN_PROCEDURE, IndexScanDescData::indexRelation, IsMVCCLikeSnapshot, IndexScanDescData::kill_prior_tuple, RelationData::rd_indam, SCAN_CHECKS, table_index_fetch_reset(), IndexScanDescData::xs_heap_continue, IndexScanDescData::xs_heapfetch, and IndexScanDescData::xs_snapshot.

Referenced by ExecIndexOnlyRestrPos(), and ExecIndexRestrPos().

◆ index_store_float8_orderby_distances()

void index_store_float8_orderby_distances ( IndexScanDesc  scan,
Oid orderByTypes,
IndexOrderByDistance distances,
bool  recheckOrderBy 
)
extern

Definition at line 953 of file indexam.c.

956{
957 int i;
958
959 Assert(distances || !recheckOrderBy);
960
962
963 for (i = 0; i < scan->numberOfOrderBys; i++)
964 {
965 if (orderByTypes[i] == FLOAT8OID)
966 {
967 if (distances && !distances[i].isnull)
968 {
969 scan->xs_orderbyvals[i] = Float8GetDatum(distances[i].value);
970 scan->xs_orderbynulls[i] = false;
971 }
972 else
973 {
974 scan->xs_orderbyvals[i] = (Datum) 0;
975 scan->xs_orderbynulls[i] = true;
976 }
977 }
978 else if (orderByTypes[i] == FLOAT4OID)
979 {
980 /* convert distance function's result to ORDER BY type */
981 if (distances && !distances[i].isnull)
982 {
983 scan->xs_orderbyvals[i] = Float4GetDatum((float4) distances[i].value);
984 scan->xs_orderbynulls[i] = false;
985 }
986 else
987 {
988 scan->xs_orderbyvals[i] = (Datum) 0;
989 scan->xs_orderbynulls[i] = true;
990 }
991 }
992 else
993 {
994 /*
995 * If the ordering operator's return value is anything else, we
996 * don't know how to convert the float8 bound calculated by the
997 * distance function to that. The executor won't actually need
998 * the order by values we return here, if there are no lossy
999 * results, so only insist on converting if the *recheck flag is
1000 * set.
1001 */
1002 if (scan->xs_recheckorderby)
1003 elog(ERROR, "ORDER BY operator must return float8 or float4 if the distance function is lossy");
1004 scan->xs_orderbynulls[i] = true;
1005 }
1006 }
1007}
float float4
Definition c.h:713
static struct @177 value
static Datum Float4GetDatum(float4 X)
Definition postgres.h:468
static Datum Float8GetDatum(float8 X)
Definition postgres.h:502
bool * xs_orderbynulls
Definition relscan.h:194
bool xs_recheckorderby
Definition relscan.h:195
Datum * xs_orderbyvals
Definition relscan.h:193

References Assert, elog, ERROR, fb(), Float4GetDatum(), Float8GetDatum(), i, IndexScanDescData::numberOfOrderBys, value, IndexScanDescData::xs_orderbynulls, IndexScanDescData::xs_orderbyvals, and IndexScanDescData::xs_recheckorderby.

Referenced by getNextNearest(), and spggettuple().

◆ index_vacuum_cleanup()

IndexBulkDeleteResult * index_vacuum_cleanup ( IndexVacuumInfo info,
IndexBulkDeleteResult istat 
)
extern

Definition at line 794 of file indexam.c.

796{
797 Relation indexRelation = info->index;
798
800 CHECK_REL_PROCEDURE(amvacuumcleanup);
801
802 return indexRelation->rd_indam->amvacuumcleanup(info, istat);
803}
amvacuumcleanup_function amvacuumcleanup
Definition amapi.h:300

References IndexAmRoutine::amvacuumcleanup, CHECK_REL_PROCEDURE, IndexVacuumInfo::index, RelationData::rd_indam, and RELATION_CHECKS.

Referenced by do_analyze_rel(), and vac_cleanup_one_index().

◆ IndexScanEnd()

void IndexScanEnd ( IndexScanDesc  scan)
extern

Definition at line 145 of file genam.c.

146{
147 if (scan->keyData != NULL)
148 pfree(scan->keyData);
149 if (scan->orderByData != NULL)
150 pfree(scan->orderByData);
151
152 pfree(scan);
153}
struct ScanKeyData * keyData
Definition relscan.h:148
struct ScanKeyData * orderByData
Definition relscan.h:149

References fb(), IndexScanDescData::keyData, IndexScanDescData::orderByData, and pfree().

Referenced by index_endscan().

◆ RelationGetIndexScan()

IndexScanDesc RelationGetIndexScan ( Relation  indexRelation,
int  nkeys,
int  norderbys 
)
extern

Definition at line 80 of file genam.c.

81{
82 IndexScanDesc scan;
83
85
86 scan->heapRelation = NULL; /* may be set later */
87 scan->xs_heapfetch = NULL;
88 scan->indexRelation = indexRelation;
89 scan->xs_snapshot = InvalidSnapshot; /* caller must initialize this */
90 scan->numberOfKeys = nkeys;
91 scan->numberOfOrderBys = norderbys;
92
93 /*
94 * We allocate key workspace here, but it won't get filled until amrescan.
95 */
96 if (nkeys > 0)
97 scan->keyData = palloc_array(ScanKeyData, nkeys);
98 else
99 scan->keyData = NULL;
100 if (norderbys > 0)
101 scan->orderByData = palloc_array(ScanKeyData, norderbys);
102 else
103 scan->orderByData = NULL;
104
105 scan->xs_want_itup = false; /* may be set later */
106
107 /*
108 * During recovery we ignore killed tuples and don't bother to kill them
109 * either. We do this because the xmin on the primary node could easily be
110 * later than the xmin on the standby node, so that what the primary
111 * thinks is killed is supposed to be visible on standby. So for correct
112 * MVCC for queries during recovery we must ignore these hints and check
113 * all tuples. Do *not* set ignore_killed_tuples to true when running in a
114 * transaction that was started during recovery. xactStartedInRecovery
115 * should not be altered by index AMs.
116 */
117 scan->kill_prior_tuple = false;
120
121 scan->opaque = NULL;
122 scan->instrument = NULL;
123
124 scan->xs_itup = NULL;
125 scan->xs_itupdesc = NULL;
126 scan->xs_hitup = NULL;
127 scan->xs_hitupdesc = NULL;
128
129 return scan;
130}
#define palloc_object(type)
Definition fe_memutils.h:74
HeapTuple xs_hitup
Definition relscan.h:176
bool ignore_killed_tuples
Definition relscan.h:155
IndexTuple xs_itup
Definition relscan.h:174
struct TupleDescData * xs_hitupdesc
Definition relscan.h:177
struct TupleDescData * xs_itupdesc
Definition relscan.h:175
bool TransactionStartedDuringRecovery(void)
Definition xact.c:1044

References fb(), IndexScanDescData::heapRelation, IndexScanDescData::ignore_killed_tuples, IndexScanDescData::indexRelation, IndexScanDescData::instrument, InvalidSnapshot, IndexScanDescData::keyData, IndexScanDescData::kill_prior_tuple, IndexScanDescData::numberOfKeys, IndexScanDescData::numberOfOrderBys, IndexScanDescData::opaque, IndexScanDescData::orderByData, palloc_array, palloc_object, TransactionStartedDuringRecovery(), IndexScanDescData::xactStartedInRecovery, IndexScanDescData::xs_heapfetch, IndexScanDescData::xs_hitup, IndexScanDescData::xs_hitupdesc, IndexScanDescData::xs_itup, IndexScanDescData::xs_itupdesc, IndexScanDescData::xs_snapshot, and IndexScanDescData::xs_want_itup.

Referenced by blbeginscan(), brinbeginscan(), btbeginscan(), dibeginscan(), ginbeginscan(), gistbeginscan(), hashbeginscan(), and spgbeginscan().

◆ systable_beginscan()

SysScanDesc systable_beginscan ( Relation  heapRelation,
Oid  indexId,
bool  indexOK,
Snapshot  snapshot,
int  nkeys,
ScanKey  key 
)
extern

Definition at line 388 of file genam.c.

393{
395 Relation irel;
396
397 /*
398 * If this backend promised that it won't access shared catalogs during
399 * logical decoding, this it the right place to verify.
400 */
403 !heapRelation->rd_rel->relisshared);
404
405 if (indexOK &&
409 else
410 irel = NULL;
411
413
414 sysscan->heap_rel = heapRelation;
415 sysscan->irel = irel;
416 sysscan->slot = table_slot_create(heapRelation, NULL);
417
418 if (snapshot == NULL)
419 {
420 Oid relid = RelationGetRelid(heapRelation);
421
422 snapshot = RegisterSnapshot(GetCatalogSnapshot(relid));
423 sysscan->snapshot = snapshot;
424 }
425 else
426 {
427 /* Caller is responsible for any snapshot. */
428 sysscan->snapshot = NULL;
429 }
430
431 /*
432 * If CheckXidAlive is set then set a flag to indicate that system table
433 * scan is in-progress. See detailed comments in xact.c where these
434 * variables are declared.
435 */
437 bsysscan = true;
438
439 if (irel)
440 {
441 int i;
443
445
446 /* Convert attribute numbers to be index column numbers. */
447 for (i = 0; i < nkeys; i++)
448 {
449 int j;
450
451 memcpy(&idxkey[i], &key[i], sizeof(ScanKeyData));
452
453 for (j = 0; j < IndexRelationGetNumberOfAttributes(irel); j++)
454 {
455 if (key[i].sk_attno == irel->rd_index->indkey.values[j])
456 {
457 idxkey[i].sk_attno = j + 1;
458 break;
459 }
460 }
462 elog(ERROR, "column is not in index");
463 }
464
465 sysscan->iscan = index_beginscan(heapRelation, irel,
466 snapshot, NULL, nkeys, 0,
467 SO_NONE);
468 index_rescan(sysscan->iscan, idxkey, nkeys, NULL, 0);
469 sysscan->scan = NULL;
470
471 pfree(idxkey);
472 }
473 else
474 {
475 /*
476 * We disallow synchronized scans when forced to use a heapscan on a
477 * catalog. In most cases the desired rows are near the front, so
478 * that the unpredictable start point of a syncscan is a serious
479 * disadvantage; and there are no compensating advantages, because
480 * it's unlikely that such scans will occur in parallel.
481 */
482 sysscan->scan = table_beginscan_strat(heapRelation, snapshot,
483 nkeys, key,
484 true, false);
485 sysscan->iscan = NULL;
486 }
487
488 return sysscan;
489}
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
bool ReindexIsProcessingIndex(Oid indexOid)
Definition index.c:4161
IndexScanDesc index_beginscan(Relation heapRelation, Relation indexRelation, Snapshot snapshot, IndexScanInstrumentation *instrument, int nkeys, int norderbys, uint32 flags)
Definition indexam.c:257
Relation index_open(Oid relationId, LOCKMODE lockmode)
Definition indexam.c:134
void index_rescan(IndexScanDesc scan, ScanKey keys, int nkeys, ScanKey orderbys, int norderbys)
Definition indexam.c:368
int j
Definition isn.c:78
#define AccessShareLock
Definition lockdefs.h:36
bool IgnoreSystemIndexes
Definition miscinit.c:82
#define IndexRelationGetNumberOfAttributes(relation)
Definition rel.h:528
bool accessSharedCatalogsInDecoding
Definition snapbuild.c:163
Snapshot GetCatalogSnapshot(Oid relid)
Definition snapmgr.c:385
bool HistoricSnapshotActive(void)
Definition snapmgr.c:1692
Form_pg_class rd_rel
Definition rel.h:111
TupleTableSlot * table_slot_create(Relation relation, List **reglist)
Definition tableam.c:92
@ SO_NONE
Definition tableam.h:49
static TableScanDesc table_beginscan_strat(Relation rel, Snapshot snapshot, int nkeys, ScanKeyData *key, bool allow_strat, bool allow_sync)
Definition tableam.h:965
bool bsysscan
Definition xact.c:102
TransactionId CheckXidAlive
Definition xact.c:101

References accessSharedCatalogsInDecoding, AccessShareLock, Assert, bsysscan, CheckXidAlive, elog, ERROR, fb(), GetCatalogSnapshot(), HistoricSnapshotActive(), i, IgnoreSystemIndexes, index_beginscan(), index_open(), index_rescan(), IndexRelationGetNumberOfAttributes, j, memcpy(), palloc_array, palloc_object, pfree(), RelationData::rd_index, RelationData::rd_rel, RegisterSnapshot(), ReindexIsProcessingIndex(), RelationGetRelid, SO_NONE, table_beginscan_strat(), table_slot_create(), and TransactionIdIsValid.

Referenced by AfterTriggerSetState(), AlterCheckConstrEnforceabilityRecurse(), AlterConstraintNamespaces(), AlterConstrDeferrabilityRecurse(), AlterConstrTriggerDeferrability(), AlterDatabase(), AlterDatabaseOwner(), AlterDatabaseRefreshColl(), AlterDomainDropConstraint(), AlterDomainValidateConstraint(), AlterExtensionNamespace(), AlterFKConstrEnforceabilityRecurse(), AlterPolicy(), AlterPropGraph(), AlterSeqNamespaces(), AlterSetting(), AlterTypeRecurse(), ApplyExtensionUpdates(), ApplySetting(), ATExecAddOf(), ATExecAlterColumnType(), ATExecAlterConstraint(), ATExecAttachPartition(), ATExecDropConstraint(), ATExecValidateConstraint(), ATPrepChangePersistence(), AttrDefaultFetch(), change_owner_fix_column_acls(), change_owner_recurse_to_sequences(), changeDependenciesOf(), changeDependenciesOn(), changeDependencyFor(), check_element_label_properties(), check_element_properties(), CheckNNConstraintFetch(), checkSharedDependencies(), ChooseConstraintName(), ChooseRelationName(), CloneFkReferenced(), CloneRowTriggersToPartition(), ConstraintNameExists(), ConstraintNameIsUsed(), copy_index_constraints(), CopyStatistics(), copyTemplateDependencies(), CountDBSubscriptions(), CreateComments(), CreateInheritance(), CreatePolicy(), CreateSharedComments(), CreateTriggerFiringOn(), DatabaseExists(), DefineOpClass(), DefineTSConfiguration(), DeleteAttributeTuples(), DeleteComments(), deleteDependencyRecordsFor(), deleteDependencyRecordsForClass(), deleteDependencyRecordsForSpecific(), DeleteInheritsTuple(), DeleteInitPrivs(), deleteOneObject(), DeleteSecurityLabel(), DeleteSharedComments(), DeleteSharedSecurityLabel(), DeleteSystemAttributeTuples(), drop_parent_dependency(), DropClonedTriggersFromPartition(), DropConfigurationMapping(), dropconstraint_internal(), dropDatabaseDependencies(), DropForeignKeyConstraintTriggers(), DropObjectById(), DropRole(), EnableDisableTrigger(), EnumValuesDelete(), EventTriggerSQLDropAddObject(), exec_object_restorecon(), ExecAlterExtensionStmt(), ExecGrant_Largeobject(), extension_config_remove(), fetch_statentries_for_relation(), find_composite_type_dependencies(), find_inheritance_children_extended(), findDependentObjects(), findDomainNotNullConstraint(), findNotNullConstraintAttnum(), get_catalog_object_by_oid_extended(), get_database_oid(), get_db_info(), get_domain_constraint_oid(), get_element_label_property_names(), get_element_property_expr(), get_graph_label_ids(), get_graph_property_ids(), get_index_constraint(), get_index_ref_constraints(), get_label_element_label_ids(), get_labels_for_expr(), get_partition_parent_worker(), get_path_elements_for_path_factor(), get_pg_statistic_ext(), get_pkey_attnames(), get_primary_key_attnos(), get_publication_relations(), get_relation_constraint_attnos(), get_relation_constraint_oid(), get_relation_idx_constraint_oid(), get_relation_policy_oid(), get_rels_with_domain(), get_trigger_oid(), GetAllTablesPublications(), GetAttrDefaultColumnAddress(), GetAttrDefaultOid(), getAutoExtensionsOfObject(), GetComment(), GetDatabaseTuple(), GetDatabaseTupleByOid(), GetDefaultOpClass(), getExtensionOfObject(), getExtensionType(), GetForeignKeyActionTriggers(), GetForeignKeyCheckTriggers(), GetNewOidWithIndex(), getObjectDescription(), getObjectIdentityParts(), getOwnedSequences_internal(), GetParentedForeignKeyRefs(), GetPublicationSchemas(), GetSecurityLabel(), GetSharedSecurityLabel(), GetSubscriptionRelations(), has_superclass(), HasSubscriptionTables(), heap_truncate_find_FKs(), index_concurrently_swap(), IndexSetParentIndex(), insert_property_records(), is_property_associated_with_label(), is_schema_publication(), is_table_publication(), LargeObjectDrop(), LargeObjectExistsWithSnapshot(), load_domaintype_info(), load_enum_cache_data(), LogicalRepSyncSequences(), LookupOpclassInfo(), make_propgraphdef_elements(), make_propgraphdef_labels(), make_propgraphdef_properties(), makeConfigurationDependencies(), MakeConfigurationMapping(), MarkInheritDetached(), MergeConstraintsIntoExisting(), MergeWithExistingConstraint(), movedb(), object_ownercheck(), PartitionHasPendingDetach(), pg_extension_config_dump(), pg_get_constraintdef_worker(), pg_get_database_ddl_internal(), pg_get_role_ddl_internal(), pg_get_serial_sequence(), pg_get_triggerdef_worker(), pg_largeobject_aclmask_snapshot(), QueueFKConstraintValidation(), RangeDelete(), recordExtensionInitPrivWorker(), recordExtObjInitPriv(), relation_has_policies(), RelationBuildPartitionDesc(), RelationBuildRowSecurity(), RelationBuildRuleLock(), RelationBuildTriggers(), RelationBuildTupleDesc(), RelationGetExclusionInfo(), RelationGetFKeyList(), RelationGetIndexList(), RelationGetNotNullConstraints(), RelationGetStatExtList(), RelationRemoveInheritance(), RelidByRelfilenumber(), RememberAllDependentForRebuilding(), RemoveAttrDefault(), RemoveAttrDefaultById(), RemoveExtensionById(), RemoveInheritance(), RemoveInheritedConstraint(), RemovePolicyById(), RemoveRewriteRuleById(), RemoveRoleFromInitPriv(), RemoveRoleFromObjectACL(), RemoveRoleFromObjectPolicy(), RemoveStatistics(), RemoveTriggerById(), RemoveTSConfigurationById(), rename_policy(), renametrig(), renametrig_internal(), renametrig_partition(), ReplaceRoleInInitPriv(), replorigin_create(), ScanPgRelation(), SearchCatCacheList(), SearchCatCacheMiss(), sepgsql_attribute_post_create(), sepgsql_database_post_create(), sepgsql_proc_post_create(), sepgsql_proc_setattr(), sepgsql_relation_post_create(), sepgsql_relation_setattr(), sepgsql_relation_setattr_extra(), sepgsql_schema_post_create(), sequenceIsOwned(), SetSecurityLabel(), SetSharedSecurityLabel(), shdepChangeDep(), shdepDropDependency(), shdepDropOwned(), shdepReassignOwned(), systable_inplace_update_begin(), toastrel_valueid_exists(), TriggerSetParentTrigger(), typeInheritsFrom(), vac_update_datfrozenxid(), and validatePartitionedIndex().

◆ systable_beginscan_ordered()

SysScanDesc systable_beginscan_ordered ( Relation  heapRelation,
Relation  indexRelation,
Snapshot  snapshot,
int  nkeys,
ScanKey  key 
)
extern

Definition at line 659 of file genam.c.

663{
665 int i;
667
668 /* REINDEX can probably be a hard error here ... */
669 if (ReindexIsProcessingIndex(RelationGetRelid(indexRelation)))
672 errmsg("cannot access index \"%s\" while it is being reindexed",
673 RelationGetRelationName(indexRelation))));
674 /* ... but we only throw a warning about violating IgnoreSystemIndexes */
676 elog(WARNING, "using index \"%s\" despite IgnoreSystemIndexes",
677 RelationGetRelationName(indexRelation));
678
680
681 sysscan->heap_rel = heapRelation;
682 sysscan->irel = indexRelation;
683 sysscan->slot = table_slot_create(heapRelation, NULL);
684
685 if (snapshot == NULL)
686 {
687 Oid relid = RelationGetRelid(heapRelation);
688
689 snapshot = RegisterSnapshot(GetCatalogSnapshot(relid));
690 sysscan->snapshot = snapshot;
691 }
692 else
693 {
694 /* Caller is responsible for any snapshot. */
695 sysscan->snapshot = NULL;
696 }
697
699
700 /* Convert attribute numbers to be index column numbers. */
701 for (i = 0; i < nkeys; i++)
702 {
703 int j;
704
705 memcpy(&idxkey[i], &key[i], sizeof(ScanKeyData));
706
707 for (j = 0; j < IndexRelationGetNumberOfAttributes(indexRelation); j++)
708 {
709 if (key[i].sk_attno == indexRelation->rd_index->indkey.values[j])
710 {
711 idxkey[i].sk_attno = j + 1;
712 break;
713 }
714 }
715 if (j == IndexRelationGetNumberOfAttributes(indexRelation))
716 elog(ERROR, "column is not in index");
717 }
718
719 /*
720 * If CheckXidAlive is set then set a flag to indicate that system table
721 * scan is in-progress. See detailed comments in xact.c where these
722 * variables are declared.
723 */
725 bsysscan = true;
726
727 sysscan->iscan = index_beginscan(heapRelation, indexRelation,
728 snapshot, NULL, nkeys, 0,
729 SO_NONE);
730 index_rescan(sysscan->iscan, idxkey, nkeys, NULL, 0);
731 sysscan->scan = NULL;
732
733 pfree(idxkey);
734
735 return sysscan;
736}
#define WARNING
Definition elog.h:36

References bsysscan, CheckXidAlive, elog, ereport, errcode(), errmsg, ERROR, fb(), GetCatalogSnapshot(), i, IgnoreSystemIndexes, index_beginscan(), index_rescan(), IndexRelationGetNumberOfAttributes, j, memcpy(), palloc_array, palloc_object, pfree(), RelationData::rd_index, RegisterSnapshot(), ReindexIsProcessingIndex(), RelationGetRelationName, RelationGetRelid, SO_NONE, table_slot_create(), TransactionIdIsValid, and WARNING.

Referenced by BuildEventTriggerCache(), check_toasted_attribute(), enum_endpoint(), enum_range_internal(), heap_fetch_toast_slice(), inv_getsize(), inv_read(), inv_truncate(), inv_write(), lookup_ts_config_cache(), and toast_delete_datum().

◆ systable_endscan()

void systable_endscan ( SysScanDesc  sysscan)
extern

Definition at line 612 of file genam.c.

613{
614 if (sysscan->slot)
615 {
617 sysscan->slot = NULL;
618 }
619
620 if (sysscan->irel)
621 {
622 index_endscan(sysscan->iscan);
624 }
625 else
626 table_endscan(sysscan->scan);
627
628 if (sysscan->snapshot)
629 UnregisterSnapshot(sysscan->snapshot);
630
631 /*
632 * Reset the bsysscan flag at the end of the systable scan. See detailed
633 * comments in xact.c where these variables are declared.
634 */
636 bsysscan = false;
637
638 pfree(sysscan);
639}
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
void index_close(Relation relation, LOCKMODE lockmode)
Definition indexam.c:178
void index_endscan(IndexScanDesc scan)
Definition indexam.c:394
static void table_endscan(TableScanDesc scan)
Definition tableam.h:1058

References AccessShareLock, bsysscan, CheckXidAlive, ExecDropSingleTupleTableSlot(), fb(), index_close(), index_endscan(), pfree(), table_endscan(), TransactionIdIsValid, and UnregisterSnapshot().

Referenced by AfterTriggerSetState(), AlterCheckConstrEnforceabilityRecurse(), AlterConstraintNamespaces(), AlterConstrDeferrabilityRecurse(), AlterConstrTriggerDeferrability(), AlterDatabase(), AlterDatabaseOwner(), AlterDatabaseRefreshColl(), AlterDomainDropConstraint(), AlterDomainValidateConstraint(), AlterExtensionNamespace(), AlterFKConstrEnforceabilityRecurse(), AlterPolicy(), AlterPropGraph(), AlterSeqNamespaces(), AlterSetting(), AlterTypeRecurse(), ApplyExtensionUpdates(), ApplySetting(), ATExecAddOf(), ATExecAlterColumnType(), ATExecAlterConstraint(), ATExecAttachPartition(), ATExecDropConstraint(), ATExecValidateConstraint(), ATPrepChangePersistence(), AttrDefaultFetch(), change_owner_fix_column_acls(), change_owner_recurse_to_sequences(), changeDependenciesOf(), changeDependenciesOn(), changeDependencyFor(), check_element_label_properties(), check_element_properties(), CheckNNConstraintFetch(), checkSharedDependencies(), ChooseConstraintName(), ChooseRelationName(), CloneFkReferenced(), CloneRowTriggersToPartition(), ConstraintNameExists(), ConstraintNameIsUsed(), copy_index_constraints(), CopyStatistics(), copyTemplateDependencies(), CountDBSubscriptions(), CreateComments(), CreateInheritance(), CreatePolicy(), CreateSharedComments(), CreateTriggerFiringOn(), DatabaseExists(), DefineOpClass(), DefineTSConfiguration(), DeleteAttributeTuples(), DeleteComments(), deleteDependencyRecordsFor(), deleteDependencyRecordsForClass(), deleteDependencyRecordsForSpecific(), DeleteInheritsTuple(), DeleteInitPrivs(), deleteOneObject(), DeleteSecurityLabel(), DeleteSharedComments(), DeleteSharedSecurityLabel(), DeleteSystemAttributeTuples(), drop_parent_dependency(), DropClonedTriggersFromPartition(), DropConfigurationMapping(), dropconstraint_internal(), dropDatabaseDependencies(), DropForeignKeyConstraintTriggers(), DropObjectById(), DropRole(), EnableDisableTrigger(), EnumValuesDelete(), EventTriggerSQLDropAddObject(), exec_object_restorecon(), ExecAlterExtensionStmt(), ExecGrant_Largeobject(), extension_config_remove(), fetch_statentries_for_relation(), find_composite_type_dependencies(), find_inheritance_children_extended(), findDependentObjects(), findDomainNotNullConstraint(), findNotNullConstraintAttnum(), get_catalog_object_by_oid_extended(), get_database_oid(), get_db_info(), get_domain_constraint_oid(), get_element_label_property_names(), get_element_property_expr(), get_graph_label_ids(), get_graph_property_ids(), get_index_constraint(), get_index_ref_constraints(), get_label_element_label_ids(), get_labels_for_expr(), get_partition_parent_worker(), get_path_elements_for_path_factor(), get_pg_statistic_ext(), get_pkey_attnames(), get_primary_key_attnos(), get_publication_relations(), get_relation_constraint_attnos(), get_relation_constraint_oid(), get_relation_idx_constraint_oid(), get_relation_policy_oid(), get_rels_with_domain(), get_trigger_oid(), GetAllTablesPublications(), GetAttrDefaultColumnAddress(), GetAttrDefaultOid(), getAutoExtensionsOfObject(), GetComment(), GetDatabaseTuple(), GetDatabaseTupleByOid(), GetDefaultOpClass(), getExtensionOfObject(), getExtensionType(), GetForeignKeyActionTriggers(), GetForeignKeyCheckTriggers(), GetNewOidWithIndex(), getObjectDescription(), getObjectIdentityParts(), getOwnedSequences_internal(), GetParentedForeignKeyRefs(), GetPublicationSchemas(), GetSecurityLabel(), GetSharedSecurityLabel(), GetSubscriptionRelations(), has_superclass(), HasSubscriptionTables(), heap_truncate_find_FKs(), index_concurrently_swap(), IndexSetParentIndex(), insert_property_records(), is_property_associated_with_label(), is_schema_publication(), is_table_publication(), LargeObjectDrop(), LargeObjectExistsWithSnapshot(), load_domaintype_info(), load_enum_cache_data(), LogicalRepSyncSequences(), LookupOpclassInfo(), make_propgraphdef_elements(), make_propgraphdef_labels(), make_propgraphdef_properties(), makeConfigurationDependencies(), MakeConfigurationMapping(), MarkInheritDetached(), MergeConstraintsIntoExisting(), MergeWithExistingConstraint(), movedb(), object_ownercheck(), PartitionHasPendingDetach(), pg_extension_config_dump(), pg_get_constraintdef_worker(), pg_get_database_ddl_internal(), pg_get_role_ddl_internal(), pg_get_serial_sequence(), pg_get_triggerdef_worker(), pg_largeobject_aclmask_snapshot(), QueueFKConstraintValidation(), RangeDelete(), recordExtensionInitPrivWorker(), recordExtObjInitPriv(), relation_has_policies(), RelationBuildPartitionDesc(), RelationBuildRowSecurity(), RelationBuildRuleLock(), RelationBuildTriggers(), RelationBuildTupleDesc(), RelationGetExclusionInfo(), RelationGetFKeyList(), RelationGetIndexList(), RelationGetNotNullConstraints(), RelationGetStatExtList(), RelationRemoveInheritance(), RelidByRelfilenumber(), RememberAllDependentForRebuilding(), RemoveAttrDefault(), RemoveAttrDefaultById(), RemoveExtensionById(), RemoveInheritance(), RemoveInheritedConstraint(), RemovePolicyById(), RemoveRewriteRuleById(), RemoveRoleFromInitPriv(), RemoveRoleFromObjectACL(), RemoveRoleFromObjectPolicy(), RemoveStatistics(), RemoveTriggerById(), RemoveTSConfigurationById(), rename_policy(), renametrig(), renametrig_internal(), renametrig_partition(), ReplaceRoleInInitPriv(), replorigin_create(), ScanPgRelation(), SearchCatCacheList(), SearchCatCacheMiss(), sepgsql_attribute_post_create(), sepgsql_database_post_create(), sepgsql_proc_post_create(), sepgsql_proc_setattr(), sepgsql_relation_post_create(), sepgsql_relation_setattr(), sepgsql_relation_setattr_extra(), sepgsql_schema_post_create(), sequenceIsOwned(), SetSecurityLabel(), SetSharedSecurityLabel(), shdepChangeDep(), shdepDropDependency(), shdepDropOwned(), shdepReassignOwned(), systable_inplace_update_begin(), systable_inplace_update_cancel(), systable_inplace_update_finish(), toastrel_valueid_exists(), TriggerSetParentTrigger(), typeInheritsFrom(), vac_update_datfrozenxid(), and validatePartitionedIndex().

◆ systable_endscan_ordered()

void systable_endscan_ordered ( SysScanDesc  sysscan)
extern

Definition at line 767 of file genam.c.

768{
769 if (sysscan->slot)
770 {
772 sysscan->slot = NULL;
773 }
774
775 Assert(sysscan->irel);
776 index_endscan(sysscan->iscan);
777 if (sysscan->snapshot)
778 UnregisterSnapshot(sysscan->snapshot);
779
780 /*
781 * Reset the bsysscan flag at the end of the systable scan. See detailed
782 * comments in xact.c where these variables are declared.
783 */
785 bsysscan = false;
786
787 pfree(sysscan);
788}

References Assert, bsysscan, CheckXidAlive, ExecDropSingleTupleTableSlot(), fb(), index_endscan(), pfree(), TransactionIdIsValid, and UnregisterSnapshot().

Referenced by BuildEventTriggerCache(), check_toasted_attribute(), enum_endpoint(), enum_range_internal(), heap_fetch_toast_slice(), inv_getsize(), inv_read(), inv_truncate(), inv_write(), lookup_ts_config_cache(), and toast_delete_datum().

◆ systable_getnext()

HeapTuple systable_getnext ( SysScanDesc  sysscan)
extern

Definition at line 523 of file genam.c.

524{
525 HeapTuple htup = NULL;
526
527 if (sysscan->irel)
528 {
530 {
531 bool shouldFree;
532
533 htup = ExecFetchSlotHeapTuple(sysscan->slot, false, &shouldFree);
535
536 /*
537 * We currently don't need to support lossy index operators for
538 * any system catalog scan. It could be done here, using the scan
539 * keys to drive the operator calls, if we arranged to save the
540 * heap attnums during systable_beginscan(); this is practical
541 * because we still wouldn't need to support indexes on
542 * expressions.
543 */
544 if (sysscan->iscan->xs_recheck)
545 elog(ERROR, "system catalog scans with lossy index conditions are not implemented");
546 }
547 }
548 else
549 {
551 {
552 bool shouldFree;
553
554 htup = ExecFetchSlotHeapTuple(sysscan->slot, false, &shouldFree);
556 }
557 }
558
559 /*
560 * Handle the concurrent abort while fetching the catalog tuple during
561 * logical streaming of a transaction.
562 */
564
565 return htup;
566}
HeapTuple ExecFetchSlotHeapTuple(TupleTableSlot *slot, bool materialize, bool *shouldFree)
static void HandleConcurrentAbort(void)
Definition genam.c:500
bool index_getnext_slot(IndexScanDesc scan, ScanDirection direction, TupleTableSlot *slot)
Definition indexam.c:698
@ ForwardScanDirection
Definition sdir.h:28
static bool table_scan_getnextslot(TableScanDesc sscan, ScanDirection direction, TupleTableSlot *slot)
Definition tableam.h:1093

References Assert, elog, ERROR, ExecFetchSlotHeapTuple(), fb(), ForwardScanDirection, HandleConcurrentAbort(), index_getnext_slot(), and table_scan_getnextslot().

Referenced by AfterTriggerSetState(), AlterCheckConstrEnforceabilityRecurse(), AlterConstraintNamespaces(), AlterConstrDeferrabilityRecurse(), AlterConstrTriggerDeferrability(), AlterDatabase(), AlterDatabaseOwner(), AlterDatabaseRefreshColl(), AlterDomainDropConstraint(), AlterDomainValidateConstraint(), AlterExtensionNamespace(), AlterFKConstrEnforceabilityRecurse(), AlterPolicy(), AlterPropGraph(), AlterSeqNamespaces(), AlterSetting(), AlterTypeRecurse(), ApplyExtensionUpdates(), ApplySetting(), ATExecAddOf(), ATExecAlterColumnType(), ATExecAlterConstraint(), ATExecAttachPartition(), ATExecDropConstraint(), ATExecValidateConstraint(), ATPrepChangePersistence(), AttrDefaultFetch(), change_owner_fix_column_acls(), change_owner_recurse_to_sequences(), changeDependenciesOf(), changeDependenciesOn(), changeDependencyFor(), check_element_label_properties(), check_element_properties(), CheckNNConstraintFetch(), checkSharedDependencies(), ChooseConstraintName(), ChooseRelationName(), CloneFkReferenced(), CloneRowTriggersToPartition(), ConstraintNameExists(), ConstraintNameIsUsed(), copy_index_constraints(), CopyStatistics(), copyTemplateDependencies(), CountDBSubscriptions(), CreateComments(), CreateInheritance(), CreatePolicy(), CreateSharedComments(), CreateTriggerFiringOn(), DatabaseExists(), DefineOpClass(), DefineTSConfiguration(), DeleteAttributeTuples(), DeleteComments(), deleteDependencyRecordsFor(), deleteDependencyRecordsForClass(), deleteDependencyRecordsForSpecific(), DeleteInheritsTuple(), DeleteInitPrivs(), deleteOneObject(), DeleteSecurityLabel(), DeleteSharedComments(), DeleteSharedSecurityLabel(), DeleteSystemAttributeTuples(), drop_parent_dependency(), DropClonedTriggersFromPartition(), DropConfigurationMapping(), dropconstraint_internal(), dropDatabaseDependencies(), DropForeignKeyConstraintTriggers(), DropObjectById(), DropRole(), EnableDisableTrigger(), EnumValuesDelete(), EventTriggerSQLDropAddObject(), exec_object_restorecon(), ExecAlterExtensionStmt(), ExecGrant_Largeobject(), extension_config_remove(), fetch_statentries_for_relation(), find_composite_type_dependencies(), find_inheritance_children_extended(), findDependentObjects(), findDomainNotNullConstraint(), findNotNullConstraintAttnum(), get_catalog_object_by_oid_extended(), get_database_oid(), get_db_info(), get_domain_constraint_oid(), get_element_label_property_names(), get_element_property_expr(), get_graph_label_ids(), get_graph_property_ids(), get_index_constraint(), get_index_ref_constraints(), get_label_element_label_ids(), get_labels_for_expr(), get_partition_parent_worker(), get_path_elements_for_path_factor(), get_pg_statistic_ext(), get_pkey_attnames(), get_primary_key_attnos(), get_publication_relations(), get_relation_constraint_attnos(), get_relation_constraint_oid(), get_relation_idx_constraint_oid(), get_relation_policy_oid(), get_rels_with_domain(), get_trigger_oid(), GetAllTablesPublications(), GetAttrDefaultColumnAddress(), GetAttrDefaultOid(), getAutoExtensionsOfObject(), GetComment(), GetDatabaseTuple(), GetDatabaseTupleByOid(), GetDefaultOpClass(), getExtensionOfObject(), getExtensionType(), GetForeignKeyActionTriggers(), GetForeignKeyCheckTriggers(), GetNewOidWithIndex(), getObjectDescription(), getObjectIdentityParts(), getOwnedSequences_internal(), GetParentedForeignKeyRefs(), GetPublicationSchemas(), GetSecurityLabel(), GetSharedSecurityLabel(), GetSubscriptionRelations(), has_superclass(), HasSubscriptionTables(), heap_truncate_find_FKs(), index_concurrently_swap(), IndexSetParentIndex(), insert_property_records(), is_property_associated_with_label(), is_schema_publication(), is_table_publication(), LargeObjectDrop(), LargeObjectExistsWithSnapshot(), load_domaintype_info(), load_enum_cache_data(), LogicalRepSyncSequences(), LookupOpclassInfo(), make_propgraphdef_elements(), make_propgraphdef_labels(), make_propgraphdef_properties(), makeConfigurationDependencies(), MakeConfigurationMapping(), MarkInheritDetached(), MergeConstraintsIntoExisting(), MergeWithExistingConstraint(), movedb(), object_ownercheck(), PartitionHasPendingDetach(), pg_extension_config_dump(), pg_get_constraintdef_worker(), pg_get_database_ddl_internal(), pg_get_role_ddl_internal(), pg_get_serial_sequence(), pg_get_triggerdef_worker(), pg_largeobject_aclmask_snapshot(), QueueFKConstraintValidation(), RangeDelete(), recordExtensionInitPrivWorker(), recordExtObjInitPriv(), relation_has_policies(), RelationBuildPartitionDesc(), RelationBuildRowSecurity(), RelationBuildRuleLock(), RelationBuildTriggers(), RelationBuildTupleDesc(), RelationGetExclusionInfo(), RelationGetFKeyList(), RelationGetIndexList(), RelationGetNotNullConstraints(), RelationGetStatExtList(), RelationRemoveInheritance(), RelidByRelfilenumber(), RememberAllDependentForRebuilding(), RemoveAttrDefault(), RemoveAttrDefaultById(), RemoveExtensionById(), RemoveInheritance(), RemoveInheritedConstraint(), RemovePolicyById(), RemoveRewriteRuleById(), RemoveRoleFromInitPriv(), RemoveRoleFromObjectACL(), RemoveRoleFromObjectPolicy(), RemoveStatistics(), RemoveTriggerById(), RemoveTSConfigurationById(), rename_policy(), renametrig(), renametrig_internal(), renametrig_partition(), ReplaceRoleInInitPriv(), replorigin_create(), ScanPgRelation(), SearchCatCacheList(), SearchCatCacheMiss(), sepgsql_attribute_post_create(), sepgsql_database_post_create(), sepgsql_proc_post_create(), sepgsql_proc_setattr(), sepgsql_relation_post_create(), sepgsql_relation_setattr(), sepgsql_relation_setattr_extra(), sepgsql_schema_post_create(), sequenceIsOwned(), SetSecurityLabel(), SetSharedSecurityLabel(), shdepChangeDep(), shdepDropDependency(), shdepDropOwned(), shdepReassignOwned(), systable_inplace_update_begin(), toastrel_valueid_exists(), TriggerSetParentTrigger(), typeInheritsFrom(), vac_update_datfrozenxid(), and validatePartitionedIndex().

◆ systable_getnext_ordered()

HeapTuple systable_getnext_ordered ( SysScanDesc  sysscan,
ScanDirection  direction 
)
extern

Definition at line 742 of file genam.c.

743{
744 HeapTuple htup = NULL;
745
746 Assert(sysscan->irel);
747 if (index_getnext_slot(sysscan->iscan, direction, sysscan->slot))
748 htup = ExecFetchSlotHeapTuple(sysscan->slot, false, NULL);
749
750 /* See notes in systable_getnext */
751 if (htup && sysscan->iscan->xs_recheck)
752 elog(ERROR, "system catalog scans with lossy index conditions are not implemented");
753
754 /*
755 * Handle the concurrent abort while fetching the catalog tuple during
756 * logical streaming of a transaction.
757 */
759
760 return htup;
761}

References Assert, elog, ERROR, ExecFetchSlotHeapTuple(), fb(), HandleConcurrentAbort(), and index_getnext_slot().

Referenced by BuildEventTriggerCache(), check_toasted_attribute(), enum_endpoint(), enum_range_internal(), heap_fetch_toast_slice(), inv_getsize(), inv_read(), inv_truncate(), inv_write(), lookup_ts_config_cache(), and toast_delete_datum().

◆ systable_inplace_update_begin()

void systable_inplace_update_begin ( Relation  relation,
Oid  indexId,
bool  indexOK,
Snapshot  snapshot,
int  nkeys,
const ScanKeyData key,
HeapTuple oldtupcopy,
void **  state 
)
extern

Definition at line 818 of file genam.c.

825{
826 int retries = 0;
827 SysScanDesc scan;
830
831 /*
832 * For now, we don't allow parallel updates. Unlike a regular update,
833 * this should never create a combo CID, so it might be possible to relax
834 * this restriction, but not without more thought and testing. It's not
835 * clear that it would be useful, anyway.
836 */
837 if (IsInParallelMode())
840 errmsg("cannot update tuples during a parallel operation")));
841
842 /*
843 * Accept a snapshot argument, for symmetry, but this function advances
844 * its snapshot as needed to reach the tail of the updated tuple chain.
845 */
846 Assert(snapshot == NULL);
847
848 Assert(IsInplaceUpdateRelation(relation) || !IsSystemRelation(relation));
849
850 /* Loop for an exclusive-locked buffer of a non-updated tuple. */
851 do
852 {
853 TupleTableSlot *slot;
854
856
857 /*
858 * Processes issuing heap_update (e.g. GRANT) at maximum speed could
859 * drive us to this error. A hostile table owner has stronger ways to
860 * damage their own table, so that's minor.
861 */
862 if (retries++ > 10000)
863 elog(ERROR, "giving up after too many tries to overwrite row");
864
865 INJECTION_POINT("inplace-before-pin", NULL);
866 scan = systable_beginscan(relation, indexId, indexOK, snapshot,
867 nkeys, unconstify(ScanKeyData *, key));
868 oldtup = systable_getnext(scan);
870 {
871 systable_endscan(scan);
872 *oldtupcopy = NULL;
873 return;
874 }
875
876 slot = scan->slot;
879 } while (!heap_inplace_lock(scan->heap_rel,
880 bslot->base.tuple, bslot->buffer,
881 (void (*) (void *)) systable_endscan, scan));
882
884 *state = scan;
885}
#define unconstify(underlying_type, expr)
Definition c.h:1325
bool IsSystemRelation(Relation relation)
Definition catalog.c:74
bool IsInplaceUpdateRelation(Relation relation)
Definition catalog.c:183
void systable_endscan(SysScanDesc sysscan)
Definition genam.c:612
HeapTuple systable_getnext(SysScanDesc sysscan)
Definition genam.c:523
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
Definition genam.c:388
bool heap_inplace_lock(Relation relation, HeapTuple oldtup_ptr, Buffer buffer, void(*release_callback)(void *), void *arg)
Definition heapam.c:6319
HeapTuple heap_copytuple(HeapTuple tuple)
Definition heaptuple.c:686
#define HeapTupleIsValid(tuple)
Definition htup.h:78
#define INJECTION_POINT(name, arg)
#define CHECK_FOR_INTERRUPTS()
Definition miscadmin.h:125
Relation heap_rel
Definition relscan.h:215
struct TupleTableSlot * slot
Definition relscan.h:220
#define TTS_IS_BUFFERTUPLE(slot)
Definition tuptable.h:256
bool IsInParallelMode(void)
Definition xact.c:1119

References Assert, CHECK_FOR_INTERRUPTS, elog, ereport, errcode(), errmsg, ERROR, fb(), heap_copytuple(), heap_inplace_lock(), SysScanDescData::heap_rel, HeapTupleIsValid, INJECTION_POINT, IsInParallelMode(), IsInplaceUpdateRelation(), IsSystemRelation(), SysScanDescData::slot, systable_beginscan(), systable_endscan(), systable_getnext(), TTS_IS_BUFFERTUPLE, and unconstify.

Referenced by create_toast_table(), dropdb(), EventTriggerOnLogin(), index_update_stats(), vac_update_datfrozenxid(), and vac_update_relstats().

◆ systable_inplace_update_cancel()

void systable_inplace_update_cancel ( void state)
extern

Definition at line 913 of file genam.c.

914{
916 Relation relation = scan->heap_rel;
917 TupleTableSlot *slot = scan->slot;
919 HeapTuple oldtup = bslot->base.tuple;
920 Buffer buffer = bslot->buffer;
921
922 heap_inplace_unlock(relation, oldtup, buffer);
923 systable_endscan(scan);
924}
int Buffer
Definition buf.h:23
struct SysScanDescData * SysScanDesc
Definition genam.h:99
void heap_inplace_unlock(Relation relation, HeapTuple oldtup, Buffer buffer)
Definition heapam.c:6597

References fb(), heap_inplace_unlock(), SysScanDescData::heap_rel, SysScanDescData::slot, and systable_endscan().

Referenced by EventTriggerOnLogin(), index_update_stats(), vac_update_datfrozenxid(), and vac_update_relstats().

◆ systable_inplace_update_finish()

void systable_inplace_update_finish ( void state,
HeapTuple  tuple 
)
extern

Definition at line 894 of file genam.c.

895{
897 Relation relation = scan->heap_rel;
898 TupleTableSlot *slot = scan->slot;
900 HeapTuple oldtup = bslot->base.tuple;
901 Buffer buffer = bslot->buffer;
902
903 heap_inplace_update_and_unlock(relation, oldtup, tuple, buffer);
904 systable_endscan(scan);
905}
void heap_inplace_update_and_unlock(Relation relation, HeapTuple oldtup, HeapTuple tuple, Buffer buffer)
Definition heapam.c:6457

References fb(), heap_inplace_update_and_unlock(), SysScanDescData::heap_rel, SysScanDescData::slot, and systable_endscan().

Referenced by create_toast_table(), dropdb(), EventTriggerOnLogin(), index_update_stats(), vac_update_datfrozenxid(), and vac_update_relstats().

◆ systable_recheck_tuple()

bool systable_recheck_tuple ( SysScanDesc  sysscan,
HeapTuple  tup 
)
extern

Definition at line 582 of file genam.c.

583{
585 bool result;
586
587 Assert(tup == ExecFetchSlotHeapTuple(sysscan->slot, false, NULL));
588
591
593 sysscan->slot,
594 freshsnap);
596
597 /*
598 * Handle the concurrent abort while fetching the catalog tuple during
599 * logical streaming of a transaction.
600 */
602
603 return result;
604}
uint32 result
static bool table_tuple_satisfies_snapshot(Relation rel, TupleTableSlot *slot, Snapshot snapshot)
Definition tableam.h:1388

References Assert, ExecFetchSlotHeapTuple(), fb(), GetCatalogSnapshot(), HandleConcurrentAbort(), RegisterSnapshot(), RelationGetRelid, result, table_tuple_satisfies_snapshot(), and UnregisterSnapshot().

Referenced by findDependentObjects(), and shdepDropOwned().

◆ try_index_open()

Relation try_index_open ( Oid  relationId,
LOCKMODE  lockmode 
)
extern

Definition at line 153 of file indexam.c.

154{
155 Relation r;
156
157 r = try_relation_open(relationId, lockmode);
158
159 /* leave if index does not exist */
160 if (!r)
161 return NULL;
162
164
165 return r;
166}
Relation try_relation_open(Oid relationId, LOCKMODE lockmode)
Definition relation.c:89

References fb(), try_relation_open(), and validate_relation_as_index().

Referenced by reindex_index().