Thanks to visit codestin.com
Credit goes to doxygen.postgresql.org

PostgreSQL Source Code git master
genam.h File Reference
#include "access/htup.h"
#include "access/sdir.h"
#include "access/skey.h"
#include "nodes/tidbitmap.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  IndexScanInstrumentation
 
struct  SharedIndexScanInstrumentation
 
struct  IndexBuildResult
 
struct  IndexVacuumInfo
 
struct  IndexBulkDeleteResult
 
struct  IndexOrderByDistance
 

Typedefs

typedef struct IndexInfo IndexInfo
 
typedef struct TupleTableSlot TupleTableSlot
 
typedef struct RelationDataRelation
 
typedef struct IndexScanInstrumentation IndexScanInstrumentation
 
typedef struct SharedIndexScanInstrumentation SharedIndexScanInstrumentation
 
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)
 
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, bool instrument, bool parallel_aware, int nworkers)
 
void index_parallelscan_initialize (Relation heapRelation, Relation indexRelation, Snapshot snapshot, bool instrument, bool parallel_aware, int nworkers, SharedIndexScanInstrumentation **sharedinfo, ParallelIndexScanDesc target)
 
void index_parallelrescan (IndexScanDesc scan)
 
IndexScanDesc index_beginscan_parallel (Relation heaprel, Relation indexrel, IndexScanInstrumentation *instrument, int nkeys, int norderbys, ParallelIndexScanDesc pscan)
 
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)
 
char * BuildIndexValueDescription (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 114 of file genam.h.

◆ IndexBulkDeleteResult

◆ IndexInfo

typedef struct IndexInfo IndexInfo

Definition at line 26 of file genam.h.

◆ IndexOrderByDistance

◆ IndexScanDesc

Definition at line 117 of file genam.h.

◆ IndexScanInstrumentation

◆ IndexUniqueCheck

◆ IndexVacuumInfo

◆ ParallelIndexScanDesc

Definition at line 120 of file genam.h.

◆ Relation

typedef struct RelationData* Relation

Definition at line 30 of file genam.h.

◆ SharedIndexScanInstrumentation

◆ SysScanDesc

typedef struct SysScanDescData* SysScanDesc

Definition at line 118 of file genam.h.

◆ TupleTableSlot

Definition at line 27 of file genam.h.

Enumeration Type Documentation

◆ IndexUniqueCheck

Enumerator
UNIQUE_CHECK_NO 
UNIQUE_CHECK_YES 
UNIQUE_CHECK_PARTIAL 
UNIQUE_CHECK_EXISTING 

Definition at line 142 of file genam.h.

143{
144 UNIQUE_CHECK_NO, /* Don't do any uniqueness checking */
145 UNIQUE_CHECK_YES, /* Enforce uniqueness at insertion time */
146 UNIQUE_CHECK_PARTIAL, /* Test uniqueness, but no error */
147 UNIQUE_CHECK_EXISTING, /* Check if existing tuple is unique */
IndexUniqueCheck
Definition: genam.h:143
@ UNIQUE_CHECK_NO
Definition: genam.h:144
@ UNIQUE_CHECK_EXISTING
Definition: genam.h:147
@ UNIQUE_CHECK_PARTIAL
Definition: genam.h:146
@ UNIQUE_CHECK_YES
Definition: genam.h:145

Function Documentation

◆ BuildIndexValueDescription()

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

Definition at line 178 of file genam.c.

180{
182 Form_pg_index idxrec;
183 int indnkeyatts;
184 int i;
185 int keyno;
186 Oid indexrelid = RelationGetRelid(indexRelation);
187 Oid indrelid;
188 AclResult aclresult;
189
190 indnkeyatts = IndexRelationGetNumberOfKeyAttributes(indexRelation);
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. */
207 if (check_enable_rls(indrelid, InvalidOid, true) == RLS_ENABLED)
208 return NULL;
209
210 /* Table-level SELECT is enough, if the user has it */
211 aclresult = pg_class_aclcheck(indrelid, GetUserId(), ACL_SELECT);
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);
265 val = OidOutputFunctionCall(foutoid, values[i]);
266 }
267
268 if (i > 0)
271 }
272
274
275 return buf.data;
276}
AclResult
Definition: acl.h:182
@ ACLCHECK_OK
Definition: acl.h:183
AclResult pg_attribute_aclcheck(Oid table_oid, AttrNumber attnum, Oid roleid, AclMode mode)
Definition: aclchk.c:3866
AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode)
Definition: aclchk.c:4037
int16 AttrNumber
Definition: attnum.h:21
#define InvalidAttrNumber
Definition: attnum.h:23
static Datum values[MAXATTR]
Definition: bootstrap.c:153
char * OidOutputFunctionCall(Oid functionId, Datum val)
Definition: fmgr.c:1762
Assert(PointerIsAligned(start, uint64))
long val
Definition: informix.c:689
int i
Definition: isn.c:77
void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena)
Definition: lsyscache.c:3074
Oid GetUserId(void)
Definition: miscinit.c:469
#define ACL_SELECT
Definition: parsenodes.h:77
int16 attnum
Definition: pg_attribute.h:74
FormData_pg_index * Form_pg_index
Definition: pg_index.h:70
static char * buf
Definition: pg_test_fsync.c:72
#define InvalidOid
Definition: postgres_ext.h:37
unsigned int Oid
Definition: postgres_ext.h:32
#define RelationGetRelid(relation)
Definition: rel.h:514
#define IndexRelationGetNumberOfKeyAttributes(relation)
Definition: rel.h:533
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:1235
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(), 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 
)

Definition at line 256 of file indexam.c.

261{
262 IndexScanDesc scan;
263
264 Assert(snapshot != InvalidSnapshot);
265
266 /* Check that a historic snapshot is not used for non-catalog tables */
267 if (IsHistoricMVCCSnapshot(snapshot) &&
269 {
271 (errcode(ERRCODE_INVALID_TRANSACTION_STATE),
272 errmsg("cannot query non-catalog table \"%s\" during logical decoding",
273 RelationGetRelationName(heapRelation))));
274 }
275
276 scan = index_beginscan_internal(indexRelation, nkeys, norderbys, snapshot, NULL, false);
277
278 /*
279 * Save additional parameters into the scandesc. Everything else was set
280 * up by RelationGetIndexScan.
281 */
282 scan->heapRelation = heapRelation;
283 scan->xs_snapshot = snapshot;
284 scan->instrument = instrument;
285
286 /* prepare to fetch index matches from table */
287 scan->xs_heapfetch = table_index_fetch_begin(heapRelation);
288
289 return scan;
290}
int errcode(int sqlerrcode)
Definition: elog.c:854
int errmsg(const char *fmt,...)
Definition: elog.c:1071
#define ERROR
Definition: elog.h:39
#define ereport(elevel,...)
Definition: elog.h:150
static IndexScanDesc index_beginscan_internal(Relation indexRelation, int nkeys, int norderbys, Snapshot snapshot, ParallelIndexScanDesc pscan, bool temp_snap)
Definition: indexam.c:324
#define RelationGetRelationName(relation)
Definition: rel.h:548
#define RelationIsAccessibleInLogicalDecoding(relation)
Definition: rel.h:693
#define IsHistoricMVCCSnapshot(snapshot)
Definition: snapmgr.h:59
#define InvalidSnapshot
Definition: snapshot.h:119
IndexFetchTableData * xs_heapfetch
Definition: relscan.h:175
struct IndexScanInstrumentation * instrument
Definition: relscan.h:159
struct SnapshotData * xs_snapshot
Definition: relscan.h:138
Relation heapRelation
Definition: relscan.h:136
static IndexFetchTableData * table_index_fetch_begin(Relation rel)
Definition: tableam.h:1157

References Assert(), ereport, errcode(), errmsg(), ERROR, 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(), get_actual_variable_endpoint(), heapam_relation_copy_for_cluster(), IndexNext(), IndexNextWithReorder(), IndexOnlyNext(), RelationFindDeletedTupleInfoByIndex(), RelationFindReplTupleByIndex(), systable_beginscan(), and systable_beginscan_ordered().

◆ index_beginscan_bitmap()

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

Definition at line 299 of file indexam.c.

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

References Assert(), 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 
)

Definition at line 593 of file indexam.c.

597{
598 Snapshot snapshot;
599 IndexScanDesc scan;
600
603
604 snapshot = RestoreSnapshot(pscan->ps_snapshot_data);
605 RegisterSnapshot(snapshot);
606 scan = index_beginscan_internal(indexrel, nkeys, norderbys, snapshot,
607 pscan, true);
608
609 /*
610 * Save additional parameters into the scandesc. Everything else was set
611 * up by index_beginscan_internal.
612 */
613 scan->heapRelation = heaprel;
614 scan->xs_snapshot = snapshot;
615 scan->instrument = instrument;
616
617 /* prepare to fetch index matches from table */
618 scan->xs_heapfetch = table_index_fetch_begin(heaprel);
619
620 return scan;
621}
#define RelFileLocatorEquals(locator1, locator2)
Snapshot RestoreSnapshot(char *start_address)
Definition: snapmgr.c:1791
Snapshot RegisterSnapshot(Snapshot snapshot)
Definition: snapmgr.c:822
RelFileLocator ps_indexlocator
Definition: relscan.h:198
RelFileLocator ps_locator
Definition: relscan.h:197
char ps_snapshot_data[FLEXIBLE_ARRAY_MEMBER]
Definition: relscan.h:201
RelFileLocator rd_locator
Definition: rel.h:57

References Assert(), IndexScanDescData::heapRelation, index_beginscan_internal(), IndexScanDescData::instrument, ParallelIndexScanDescData::ps_indexlocator, ParallelIndexScanDescData::ps_locator, ParallelIndexScanDescData::ps_snapshot_data, 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 
)

Definition at line 805 of file indexam.c.

809{
810 Relation indexRelation = info->index;
811
813 CHECK_REL_PROCEDURE(ambulkdelete);
814
815 return indexRelation->rd_indam->ambulkdelete(info, istat,
816 callback, callback_state);
817}
#define CHECK_REL_PROCEDURE(pname)
Definition: indexam.c:93
#define RELATION_CHECKS
Definition: indexam.c:75
ambulkdelete_function ambulkdelete
Definition: amapi.h:299
Relation index
Definition: genam.h:73
struct IndexAmRoutine * rd_indam
Definition: rel.h:206
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
Definition: test_ifaddrs.c:46

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 
)

Definition at line 845 of file indexam.c.

846{
848
849 /* amcanreturn is optional; assume false if not provided by AM */
850 if (indexRelation->rd_indam->amcanreturn == NULL)
851 return false;
852
853 return indexRelation->rd_indam->amcanreturn(indexRelation, attno);
854}
amcanreturn_function amcanreturn
Definition: amapi.h:301

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

Referenced by get_relation_info(), and indexam_property().

◆ index_close()

void index_close ( Relation  relation,
LOCKMODE  lockmode 
)

Definition at line 177 of file indexam.c.

178{
179 LockRelId relid = relation->rd_lockInfo.lockRelId;
180
181 Assert(lockmode >= NoLock && lockmode < MAX_LOCKMODES);
182
183 /* The relcache does the real work... */
184 RelationClose(relation);
185
186 if (lockmode != NoLock)
187 UnlockRelationId(&relid, lockmode);
188}
void UnlockRelationId(LockRelId *relid, LOCKMODE lockmode)
Definition: lmgr.c:214
#define MAX_LOCKMODES
Definition: lock.h:84
#define NoLock
Definition: lockdefs.h:34
void RelationClose(Relation relation)
Definition: relcache.c:2220
LockRelId lockRelId
Definition: rel.h:46
Definition: rel.h:39
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_page_items(), brincostestimate(), build_index_value_desc(), build_indices(), BuildEventTriggerCache(), check_index_is_clusterable(), CheckIndexCompatible(), close_lo_relation(), 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(), hash_bitmap_info(), index_concurrently_build(), index_concurrently_create_copy(), index_concurrently_set_dead(), index_create(), index_drop(), indexam_property(), infer_arbiter_indexes(), InitCatCachePhase2(), lookup_ts_config_cache(), pg_nextoid(), pgstathashindex(), plan_create_index_workers(), rebuild_relation(), refresh_by_match_merge(), RefreshMatViewByOid(), reindex_index(), ReindexRelationConcurrently(), RelationFindDeletedTupleInfoByIndex(), RelationFindReplTupleByIndex(), RelationGetIndexAttrBitmap(), RelationTruncateIndexes(), SetIndexStorageProperties(), systable_endscan(), toast_close_indexes(), TryReuseIndex(), 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 
)

Definition at line 295 of file genam.c.

300{
301 TM_IndexDeleteOp delstate;
302 TransactionId snapshotConflictHorizon = InvalidTransactionId;
303 Page ipage = BufferGetPage(ibuf);
304 IndexTuple itup;
305
306 Assert(nitems > 0);
307
308 delstate.irel = irel;
309 delstate.iblknum = BufferGetBlockNumber(ibuf);
310 delstate.bottomup = false;
311 delstate.bottomupfreespace = 0;
312 delstate.ndeltids = 0;
313 delstate.deltids = palloc(nitems * sizeof(TM_IndexDelete));
314 delstate.status = palloc(nitems * sizeof(TM_IndexStatus));
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];
320 ItemId iitemid;
321
322 iitemid = PageGetItemId(ipage, offnum);
323 itup = (IndexTuple) PageGetItem(ipage, iitemid);
324
325 Assert(ItemIdIsDead(iitemid));
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:4198
static Page BufferGetPage(Buffer buffer)
Definition: bufmgr.h:417
static Item PageGetItem(const PageData *page, const ItemIdData *itemId)
Definition: bufpage.h:354
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
Definition: bufpage.h:244
PageData * Page
Definition: bufpage.h:82
uint32 TransactionId
Definition: c.h:657
#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:1594
void * palloc(Size size)
Definition: mcxt.c:1365
uint16 OffsetNumber
Definition: off.h:24
ItemPointerData t_tid
Definition: itup.h:37
TM_IndexStatus * status
Definition: tableam.h:254
int bottomupfreespace
Definition: tableam.h:249
Relation irel
Definition: tableam.h:246
TM_IndexDelete * deltids
Definition: tableam.h:253
BlockNumber iblknum
Definition: tableam.h:247
ItemPointerData tid
Definition: tableam.h:212
bool knowndeletable
Definition: tableam.h:219
bool promising
Definition: tableam.h:222
int16 freespace
Definition: tableam.h:223
OffsetNumber idxoffnum
Definition: tableam.h:218
static TransactionId table_index_delete_tuples(Relation rel, TM_IndexDeleteOp *delstate)
Definition: tableam.h:1321
#define InvalidTransactionId
Definition: transam.h:31

References Assert(), TM_IndexDeleteOp::bottomup, TM_IndexDeleteOp::bottomupfreespace, BufferGetBlockNumber(), BufferGetPage(), TM_IndexDeleteOp::deltids, TM_IndexStatus::freespace, i, TM_IndexDeleteOp::iblknum, TM_IndexDelete::id, TM_IndexStatus::idxoffnum, InvalidTransactionId, TM_IndexDeleteOp::irel, ItemIdIsDead, ItemPointerCopy(), TM_IndexStatus::knowndeletable, TM_IndexDeleteOp::ndeltids, nitems, PageGetItem(), PageGetItemId(), palloc(), pfree(), TM_IndexStatus::promising, TM_IndexDeleteOp::status, IndexTupleData::t_tid, table_index_delete_tuples(), and TM_IndexDelete::tid.

Referenced by _hash_vacuum_one_page(), and gistprunepage().

◆ index_endscan()

void index_endscan ( IndexScanDesc  scan)

Definition at line 392 of file indexam.c.

393{
395 CHECK_SCAN_PROCEDURE(amendscan);
396
397 /* Release resources (like buffer pins) from table accesses */
398 if (scan->xs_heapfetch)
399 {
401 scan->xs_heapfetch = NULL;
402 }
403
404 /* End the AM's scan */
405 scan->indexRelation->rd_indam->amendscan(scan);
406
407 /* Release index refcount acquired by index_beginscan */
409
410 if (scan->xs_temp_snap)
412
413 /* Release the scan data structure itself */
414 IndexScanEnd(scan);
415}
void IndexScanEnd(IndexScanDesc scan)
Definition: genam.c:145
#define CHECK_SCAN_PROCEDURE(pname)
Definition: indexam.c:100
#define SCAN_CHECKS
Definition: indexam.c:86
void RelationDecrementReferenceCount(Relation rel)
Definition: relcache.c:2200
void UnregisterSnapshot(Snapshot snapshot)
Definition: snapmgr.c:864
amendscan_function amendscan
Definition: amapi.h:313
Relation indexRelation
Definition: relscan.h:137
static void table_index_fetch_end(struct IndexFetchTableData *scan)
Definition: tableam.h:1176

References IndexAmRoutine::amendscan, CHECK_SCAN_PROCEDURE, 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(), get_actual_variable_endpoint(), heapam_relation_copy_for_cluster(), RelationFindDeletedTupleInfoByIndex(), RelationFindReplTupleByIndex(), systable_endscan(), and systable_endscan_ordered().

◆ index_fetch_heap()

bool index_fetch_heap ( IndexScanDesc  scan,
TupleTableSlot slot 
)

Definition at line 689 of file indexam.c.

690{
691 bool all_dead = false;
692 bool found;
693
694 found = table_index_fetch_tuple(scan->xs_heapfetch, &scan->xs_heaptid,
695 scan->xs_snapshot, slot,
696 &scan->xs_heap_continue, &all_dead);
697
698 if (found)
700
701 /*
702 * If we scanned a whole HOT chain and found only dead tuples, tell index
703 * AM to kill its entry for that TID (this will take effect in the next
704 * amgettuple call, in index_getnext_tid). We do not do this when in
705 * recovery because it may violate MVCC to do so. See comments in
706 * RelationGetIndexScan().
707 */
708 if (!scan->xactStartedInRecovery)
709 scan->kill_prior_tuple = all_dead;
710
711 return found;
712}
#define pgstat_count_heap_fetch(rel)
Definition: pgstat.h:690
bool xs_heap_continue
Definition: relscan.h:173
bool xactStartedInRecovery
Definition: relscan.h:149
bool kill_prior_tuple
Definition: relscan.h:147
ItemPointerData xs_heaptid
Definition: relscan.h:172
static bool table_index_fetch_tuple(struct IndexFetchTableData *scan, ItemPointer tid, Snapshot snapshot, TupleTableSlot *slot, bool *call_again, bool *all_dead)
Definition: tableam.h:1206

References 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 
)

Definition at line 775 of file indexam.c.

776{
777 int64 ntids;
778
780 CHECK_SCAN_PROCEDURE(amgetbitmap);
781
782 /* just make sure this is false... */
783 scan->kill_prior_tuple = false;
784
785 /*
786 * have the am's getbitmap proc do all the work.
787 */
788 ntids = scan->indexRelation->rd_indam->amgetbitmap(scan, bitmap);
789
791
792 return ntids;
793}
int64_t int64
Definition: c.h:535
#define pgstat_count_index_tuples(rel, n)
Definition: pgstat.h:700
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 
)

Definition at line 730 of file indexam.c.

731{
732 for (;;)
733 {
734 if (!scan->xs_heap_continue)
735 {
736 ItemPointer tid;
737
738 /* Time to fetch the next TID from the index */
739 tid = index_getnext_tid(scan, direction);
740
741 /* If we're out of index entries, we're done */
742 if (tid == NULL)
743 break;
744
745 Assert(ItemPointerEquals(tid, &scan->xs_heaptid));
746 }
747
748 /*
749 * Fetch the next (or only) visible heap tuple for this index entry.
750 * If we don't find anything, loop around and grab the next TID from
751 * the index.
752 */
754 if (index_fetch_heap(scan, slot))
755 return true;
756 }
757
758 return false;
759}
ItemPointer index_getnext_tid(IndexScanDesc scan, ScanDirection direction)
Definition: indexam.c:631
bool index_fetch_heap(IndexScanDesc scan, TupleTableSlot *slot)
Definition: indexam.c:689
bool ItemPointerEquals(ItemPointer pointer1, ItemPointer pointer2)
Definition: itemptr.c:35
static bool ItemPointerIsValid(const ItemPointerData *pointer)
Definition: itemptr.h:83

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

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

◆ index_getnext_tid()

ItemPointer index_getnext_tid ( IndexScanDesc  scan,
ScanDirection  direction 
)

Definition at line 631 of file indexam.c.

632{
633 bool found;
634
636 CHECK_SCAN_PROCEDURE(amgettuple);
637
638 /* XXX: we should assert that a snapshot is pushed or registered */
640
641 /*
642 * The AM's amgettuple proc finds the next index entry matching the scan
643 * keys, and puts the TID into scan->xs_heaptid. It should also set
644 * scan->xs_recheck and possibly scan->xs_itup/scan->xs_hitup, though we
645 * pay no attention to those fields here.
646 */
647 found = scan->indexRelation->rd_indam->amgettuple(scan, direction);
648
649 /* Reset kill flag immediately for safety */
650 scan->kill_prior_tuple = false;
651 scan->xs_heap_continue = false;
652
653 /* If we're out of index entries, we're done */
654 if (!found)
655 {
656 /* release resources (like buffer pins) from table accesses */
657 if (scan->xs_heapfetch)
659
660 return NULL;
661 }
663
665
666 /* Return the TID of the tuple we found. */
667 return &scan->xs_heaptid;
668}
TransactionId RecentXmin
Definition: snapmgr.c:159
amgettuple_function amgettuple
Definition: amapi.h:311
static void table_index_fetch_reset(struct IndexFetchTableData *scan)
Definition: tableam.h:1167
#define TransactionIdIsValid(xid)
Definition: transam.h:41

References IndexAmRoutine::amgettuple, Assert(), CHECK_SCAN_PROCEDURE, 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 
)

Definition at line 883 of file indexam.c.

886{
887 RegProcedure *loc;
888 int nproc;
889 int procindex;
890
891 nproc = irel->rd_indam->amsupport;
892
893 Assert(procnum > 0 && procnum <= (uint16) nproc);
894
895 procindex = (nproc * (attnum - 1)) + (procnum - 1);
896
897 loc = irel->rd_support;
898
899 Assert(loc != NULL);
900
901 return loc[procindex];
902}
regproc RegProcedure
Definition: c.h:655
uint16_t uint16
Definition: c.h:537
uint16 amsupport
Definition: amapi.h:242
RegProcedure * rd_support
Definition: rel.h:209

References IndexAmRoutine::amsupport, Assert(), attnum, 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(), and spgGetCache().

◆ index_getprocinfo()

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

Definition at line 917 of file indexam.c.

920{
921 FmgrInfo *locinfo;
922 int nproc;
923 int optsproc;
924 int procindex;
925
926 nproc = irel->rd_indam->amsupport;
927 optsproc = irel->rd_indam->amoptsprocnum;
928
929 Assert(procnum > 0 && procnum <= (uint16) nproc);
930
931 procindex = (nproc * (attnum - 1)) + (procnum - 1);
932
933 locinfo = irel->rd_supportinfo;
934
935 Assert(locinfo != NULL);
936
937 locinfo += procindex;
938
939 /* Initialize the lookup info if first time through */
940 if (locinfo->fn_oid == InvalidOid)
941 {
942 RegProcedure *loc = irel->rd_support;
943 RegProcedure procId;
944
945 Assert(loc != NULL);
946
947 procId = loc[procindex];
948
949 /*
950 * Complain if function was not found during IndexSupportInitialize.
951 * This should not happen unless the system tables contain bogus
952 * entries for the index opclass. (If an AM wants to allow a support
953 * function to be optional, it can use index_getprocid.)
954 */
955 if (!RegProcedureIsValid(procId))
956 elog(ERROR, "missing support function %d for attribute %d of index \"%s\"",
957 procnum, attnum, RelationGetRelationName(irel));
958
959 fmgr_info_cxt(procId, locinfo, irel->rd_indexcxt);
960
961 if (procnum != optsproc)
962 {
963 /* Initialize locinfo->fn_expr with opclass options Const */
964 bytea **attoptions = RelationGetIndexAttOptions(irel, false);
966
967 set_fn_opclass_options(locinfo, attoptions[attnum - 1]);
968
969 MemoryContextSwitchTo(oldcxt);
970 }
971 }
972
973 return locinfo;
974}
#define RegProcedureIsValid(p)
Definition: c.h:776
#define elog(elevel,...)
Definition: elog.h:226
void set_fn_opclass_options(FmgrInfo *flinfo, bytea *options)
Definition: fmgr.c:2034
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
Definition: fmgr.c:137
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:124
bytea ** RelationGetIndexAttOptions(Relation relation, bool copy)
Definition: relcache.c:5988
Definition: fmgr.h:57
Oid fn_oid
Definition: fmgr.h:59
uint16 amoptsprocnum
Definition: amapi.h:244
MemoryContext rd_indexcxt
Definition: rel.h:204
struct FmgrInfo * rd_supportinfo
Definition: rel.h:210
Definition: c.h:692

References IndexAmRoutine::amoptsprocnum, IndexAmRoutine::amsupport, Assert(), attnum, elog, ERROR, fmgr_info_cxt(), FmgrInfo::fn_oid, 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 
)

Definition at line 213 of file indexam.c.

221{
223 CHECK_REL_PROCEDURE(aminsert);
224
225 if (!(indexRelation->rd_indam->ampredlocks))
226 CheckForSerializableConflictIn(indexRelation,
227 (ItemPointer) NULL,
229
230 return indexRelation->rd_indam->aminsert(indexRelation, values, isnull,
231 heap_t_ctid, heapRelation,
232 checkUnique, indexUnchanged,
233 indexInfo);
234}
#define InvalidBlockNumber
Definition: block.h:33
void CheckForSerializableConflictIn(Relation relation, ItemPointer tid, BlockNumber blkno)
Definition: predicate.c:4336
aminsert_function aminsert
Definition: amapi.h:297
bool ampredlocks
Definition: amapi.h:272

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

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

◆ index_insert_cleanup()

void index_insert_cleanup ( Relation  indexRelation,
IndexInfo indexInfo 
)

Definition at line 241 of file indexam.c.

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

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

Referenced by ExecCloseIndices(), and validate_index().

◆ index_markpos()

void index_markpos ( IndexScanDesc  scan)

Definition at line 422 of file indexam.c.

423{
425 CHECK_SCAN_PROCEDURE(ammarkpos);
426
427 scan->indexRelation->rd_indam->ammarkpos(scan);
428}
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 
)

Definition at line 1048 of file indexam.c.

1050{
1051 int amoptsprocnum = indrel->rd_indam->amoptsprocnum;
1052 Oid procid = InvalidOid;
1053 FmgrInfo *procinfo;
1054 local_relopts relopts;
1055
1056 /* fetch options support procedure if specified */
1057 if (amoptsprocnum != 0)
1058 procid = index_getprocid(indrel, attnum, amoptsprocnum);
1059
1060 if (!OidIsValid(procid))
1061 {
1062 Oid opclass;
1063 Datum indclassDatum;
1064 oidvector *indclass;
1065
1066 if (!DatumGetPointer(attoptions))
1067 return NULL; /* ok, no options, no procedure */
1068
1069 /*
1070 * Report an error if the opclass's options-parsing procedure does not
1071 * exist but the opclass options are specified.
1072 */
1073 indclassDatum = SysCacheGetAttrNotNull(INDEXRELID, indrel->rd_indextuple,
1074 Anum_pg_index_indclass);
1075 indclass = (oidvector *) DatumGetPointer(indclassDatum);
1076 opclass = indclass->values[attnum - 1];
1077
1078 ereport(ERROR,
1079 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1080 errmsg("operator class %s has no options",
1081 generate_opclass_name(opclass))));
1082 }
1083
1084 init_local_reloptions(&relopts, 0);
1085
1086 procinfo = index_getprocinfo(indrel, attnum, amoptsprocnum);
1087
1088 (void) FunctionCall1(procinfo, PointerGetDatum(&relopts));
1089
1090 return build_local_reloptions(&relopts, attoptions, validate);
1091}
static bool validate(Port *port, const char *auth)
Definition: auth-oauth.c:638
#define OidIsValid(objectId)
Definition: c.h:774
#define FunctionCall1(flinfo, arg1)
Definition: fmgr.h:700
FmgrInfo * index_getprocinfo(Relation irel, AttrNumber attnum, uint16 procnum)
Definition: indexam.c:917
RegProcedure index_getprocid(Relation irel, AttrNumber attnum, uint16 procnum)
Definition: indexam.c:883
static Datum PointerGetDatum(const void *X)
Definition: postgres.h:332
uint64_t Datum
Definition: postgres.h:70
static Pointer DatumGetPointer(Datum X)
Definition: postgres.h:322
void init_local_reloptions(local_relopts *relopts, Size relopt_struct_size)
Definition: reloptions.c:745
void * build_local_reloptions(local_relopts *relopts, Datum options, bool validate)
Definition: reloptions.c:1980
char * generate_opclass_name(Oid opclass)
Definition: ruleutils.c:12900
struct HeapTupleData * rd_indextuple
Definition: rel.h:194
Definition: c.h:731
Oid values[FLEXIBLE_ARRAY_MEMBER]
Definition: c.h:738
Datum SysCacheGetAttrNotNull(int cacheId, HeapTuple tup, AttrNumber attributeNumber)
Definition: syscache.c:625

References IndexAmRoutine::amoptsprocnum, attnum, build_local_reloptions(), DatumGetPointer(), ereport, errcode(), errmsg(), ERROR, FunctionCall1, generate_opclass_name(), index_getprocid(), index_getprocinfo(), init_local_reloptions(), InvalidOid, OidIsValid, PointerGetDatum(), RelationData::rd_indam, RelationData::rd_indextuple, SysCacheGetAttrNotNull(), validate(), and oidvector::values.

Referenced by index_create(), and RelationGetIndexAttOptions().

◆ index_open()

Relation index_open ( Oid  relationId,
LOCKMODE  lockmode 
)

Definition at line 133 of file indexam.c.

134{
135 Relation r;
136
137 r = relation_open(relationId, lockmode);
138
140
141 return r;
142}
static void validate_relation_kind(Relation r)
Definition: indexam.c:197
Relation relation_open(Oid relationId, LOCKMODE lockmode)
Definition: relation.c:47

References relation_open(), and validate_relation_kind().

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(), 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_create_copy(), index_concurrently_set_dead(), index_drop(), indexam_property(), infer_arbiter_indexes(), InitCatCachePhase2(), lookup_ts_config_cache(), open_lo_relation(), pg_nextoid(), plan_create_index_workers(), refresh_by_match_merge(), RefreshMatViewByOid(), reindex_index(), ReindexRelationConcurrently(), RelationFindDeletedTupleInfoByIndex(), RelationFindReplTupleByIndex(), RelationGetIndexAttrBitmap(), RelationTruncateIndexes(), SetIndexStorageProperties(), systable_beginscan(), toast_open_indexes(), transformIndexConstraint(), TryReuseIndex(), vac_open_indexes(), and validate_index().

◆ index_parallelrescan()

void index_parallelrescan ( IndexScanDesc  scan)

Definition at line 575 of file indexam.c.

576{
578
579 if (scan->xs_heapfetch)
581
582 /* amparallelrescan is optional; assume no-op if not provided by AM */
583 if (scan->indexRelation->rd_indam->amparallelrescan != NULL)
585}
amparallelrescan_function amparallelrescan
Definition: amapi.h:320

References IndexAmRoutine::amparallelrescan, 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,
bool  instrument,
bool  parallel_aware,
int  nworkers 
)

Definition at line 471 of file indexam.c.

474{
475 Size nbytes;
476
477 Assert(instrument || parallel_aware);
478
480
481 nbytes = offsetof(ParallelIndexScanDescData, ps_snapshot_data);
482 nbytes = add_size(nbytes, EstimateSnapshotSpace(snapshot));
483 nbytes = MAXALIGN(nbytes);
484
485 if (instrument)
486 {
487 Size sharedinfosz;
488
489 sharedinfosz = offsetof(SharedIndexScanInstrumentation, winstrument) +
490 nworkers * sizeof(IndexScanInstrumentation);
491 nbytes = add_size(nbytes, sharedinfosz);
492 nbytes = MAXALIGN(nbytes);
493 }
494
495 /*
496 * If parallel scan index AM interface can't be used (or index AM provides
497 * no such interface), assume there is no AM-specific data needed
498 */
499 if (parallel_aware &&
500 indexRelation->rd_indam->amestimateparallelscan != NULL)
501 nbytes = add_size(nbytes,
502 indexRelation->rd_indam->amestimateparallelscan(indexRelation,
503 nkeys,
504 norderbys));
505
506 return nbytes;
507}
#define MAXALIGN(LEN)
Definition: c.h:810
size_t Size
Definition: c.h:610
struct IndexScanInstrumentation IndexScanInstrumentation
Size add_size(Size s1, Size s2)
Definition: shmem.c:493
Size EstimateSnapshotSpace(Snapshot snapshot)
Definition: snapmgr.c:1710
amestimateparallelscan_function amestimateparallelscan
Definition: amapi.h:318

References add_size(), IndexAmRoutine::amestimateparallelscan, Assert(), EstimateSnapshotSpace(), 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,
bool  instrument,
bool  parallel_aware,
int  nworkers,
SharedIndexScanInstrumentation **  sharedinfo,
ParallelIndexScanDesc  target 
)

Definition at line 520 of file indexam.c.

525{
526 Size offset;
527
528 Assert(instrument || parallel_aware);
529
531
532 offset = add_size(offsetof(ParallelIndexScanDescData, ps_snapshot_data),
533 EstimateSnapshotSpace(snapshot));
534 offset = MAXALIGN(offset);
535
536 target->ps_locator = heapRelation->rd_locator;
537 target->ps_indexlocator = indexRelation->rd_locator;
538 target->ps_offset_ins = 0;
539 target->ps_offset_am = 0;
540 SerializeSnapshot(snapshot, target->ps_snapshot_data);
541
542 if (instrument)
543 {
544 Size sharedinfosz;
545
546 target->ps_offset_ins = offset;
547 sharedinfosz = offsetof(SharedIndexScanInstrumentation, winstrument) +
548 nworkers * sizeof(IndexScanInstrumentation);
549 offset = add_size(offset, sharedinfosz);
550 offset = MAXALIGN(offset);
551
552 /* Set leader's *sharedinfo pointer, and initialize stats */
553 *sharedinfo = (SharedIndexScanInstrumentation *)
554 OffsetToPointer(target, target->ps_offset_ins);
555 memset(*sharedinfo, 0, sharedinfosz);
556 (*sharedinfo)->num_workers = nworkers;
557 }
558
559 /* aminitparallelscan is optional; assume no-op if not provided by AM */
560 if (parallel_aware && indexRelation->rd_indam->aminitparallelscan != NULL)
561 {
562 void *amtarget;
563
564 target->ps_offset_am = offset;
565 amtarget = OffsetToPointer(target, target->ps_offset_am);
566 indexRelation->rd_indam->aminitparallelscan(amtarget);
567 }
568}
#define OffsetToPointer(base, offset)
Definition: c.h:771
void SerializeSnapshot(Snapshot snapshot, char *start_address)
Definition: snapmgr.c:1734
aminitparallelscan_function aminitparallelscan
Definition: amapi.h:319

References add_size(), IndexAmRoutine::aminitparallelscan, Assert(), EstimateSnapshotSpace(), MAXALIGN, OffsetToPointer, ParallelIndexScanDescData::ps_indexlocator, ParallelIndexScanDescData::ps_locator, ParallelIndexScanDescData::ps_offset_am, ParallelIndexScanDescData::ps_offset_ins, 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 
)

Definition at line 366 of file indexam.c.

369{
371 CHECK_SCAN_PROCEDURE(amrescan);
372
373 Assert(nkeys == scan->numberOfKeys);
374 Assert(norderbys == scan->numberOfOrderBys);
375
376 /* Release resources (like buffer pins) from table accesses */
377 if (scan->xs_heapfetch)
379
380 scan->kill_prior_tuple = false; /* for safety */
381 scan->xs_heap_continue = false;
382
383 scan->indexRelation->rd_indam->amrescan(scan, keys, nkeys,
384 orderbys, norderbys);
385}
amrescan_function amrescan
Definition: amapi.h:310
int numberOfOrderBys
Definition: relscan.h:140

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(), get_actual_variable_endpoint(), heapam_relation_copy_for_cluster(), IndexNext(), IndexNextWithReorder(), IndexOnlyNext(), MultiExecBitmapIndexScan(), RelationFindDeletedTupleInfoByIndex(), RelationFindReplTupleByIndex(), systable_beginscan(), and systable_beginscan_ordered().

◆ index_restrpos()

void index_restrpos ( IndexScanDesc  scan)

Definition at line 446 of file indexam.c.

447{
449
451 CHECK_SCAN_PROCEDURE(amrestrpos);
452
453 /* release resources (like buffer pins) from table accesses */
454 if (scan->xs_heapfetch)
456
457 scan->kill_prior_tuple = false; /* for safety */
458 scan->xs_heap_continue = false;
459
460 scan->indexRelation->rd_indam->amrestrpos(scan);
461}
#define IsMVCCSnapshot(snapshot)
Definition: snapmgr.h:55
amrestrpos_function amrestrpos
Definition: amapi.h:315

References IndexAmRoutine::amrestrpos, Assert(), CHECK_SCAN_PROCEDURE, IndexScanDescData::indexRelation, IsMVCCSnapshot, 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 
)

Definition at line 985 of file indexam.c.

988{
989 int i;
990
991 Assert(distances || !recheckOrderBy);
992
993 scan->xs_recheckorderby = recheckOrderBy;
994
995 for (i = 0; i < scan->numberOfOrderBys; i++)
996 {
997 if (orderByTypes[i] == FLOAT8OID)
998 {
999 if (distances && !distances[i].isnull)
1000 {
1001 scan->xs_orderbyvals[i] = Float8GetDatum(distances[i].value);
1002 scan->xs_orderbynulls[i] = false;
1003 }
1004 else
1005 {
1006 scan->xs_orderbyvals[i] = (Datum) 0;
1007 scan->xs_orderbynulls[i] = true;
1008 }
1009 }
1010 else if (orderByTypes[i] == FLOAT4OID)
1011 {
1012 /* convert distance function's result to ORDER BY type */
1013 if (distances && !distances[i].isnull)
1014 {
1015 scan->xs_orderbyvals[i] = Float4GetDatum((float4) distances[i].value);
1016 scan->xs_orderbynulls[i] = false;
1017 }
1018 else
1019 {
1020 scan->xs_orderbyvals[i] = (Datum) 0;
1021 scan->xs_orderbynulls[i] = true;
1022 }
1023 }
1024 else
1025 {
1026 /*
1027 * If the ordering operator's return value is anything else, we
1028 * don't know how to convert the float8 bound calculated by the
1029 * distance function to that. The executor won't actually need
1030 * the order by values we return here, if there are no lossy
1031 * results, so only insist on converting if the *recheck flag is
1032 * set.
1033 */
1034 if (scan->xs_recheckorderby)
1035 elog(ERROR, "ORDER BY operator must return float8 or float4 if the distance function is lossy");
1036 scan->xs_orderbynulls[i] = true;
1037 }
1038 }
1039}
float float4
Definition: c.h:634
static struct @168 value
static Datum Float4GetDatum(float4 X)
Definition: postgres.h:458
static Datum Float8GetDatum(float8 X)
Definition: postgres.h:492
bool * xs_orderbynulls
Definition: relscan.h:187
bool xs_recheckorderby
Definition: relscan.h:188
Datum * xs_orderbyvals
Definition: relscan.h:186

References Assert(), elog, ERROR, 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 
)

Definition at line 826 of file indexam.c.

828{
829 Relation indexRelation = info->index;
830
832 CHECK_REL_PROCEDURE(amvacuumcleanup);
833
834 return indexRelation->rd_indam->amvacuumcleanup(info, istat);
835}
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)

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:141
struct ScanKeyData * orderByData
Definition: relscan.h:142

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

Referenced by index_endscan().

◆ RelationGetIndexScan()

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

Definition at line 80 of file genam.c.

81{
82 IndexScanDesc scan;
83
84 scan = (IndexScanDesc) palloc(sizeof(IndexScanDescData));
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 = (ScanKey) palloc(sizeof(ScanKeyData) * nkeys);
98 else
99 scan->keyData = NULL;
100 if (norderbys > 0)
101 scan->orderByData = (ScanKey) palloc(sizeof(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}
struct IndexScanDescData * IndexScanDesc
Definition: genam.h:117
ScanKeyData * ScanKey
Definition: skey.h:75
HeapTuple xs_hitup
Definition: relscan.h:169
bool ignore_killed_tuples
Definition: relscan.h:148
IndexTuple xs_itup
Definition: relscan.h:167
struct TupleDescData * xs_hitupdesc
Definition: relscan.h:170
struct TupleDescData * xs_itupdesc
Definition: relscan.h:168
bool TransactionStartedDuringRecovery(void)
Definition: xact.c:1042

References 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(), 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 
)

Definition at line 388 of file genam.c.

393{
394 SysScanDesc sysscan;
395 Relation irel;
396
397 if (indexOK &&
399 !ReindexIsProcessingIndex(indexId))
400 irel = index_open(indexId, AccessShareLock);
401 else
402 irel = NULL;
403
404 sysscan = (SysScanDesc) palloc(sizeof(SysScanDescData));
405
406 sysscan->heap_rel = heapRelation;
407 sysscan->irel = irel;
408 sysscan->slot = table_slot_create(heapRelation, NULL);
409
410 if (snapshot == NULL)
411 {
412 Oid relid = RelationGetRelid(heapRelation);
413
414 snapshot = RegisterSnapshot(GetCatalogSnapshot(relid));
415 sysscan->snapshot = snapshot;
416 }
417 else
418 {
419 /* Caller is responsible for any snapshot. */
420 sysscan->snapshot = NULL;
421 }
422
423 if (irel)
424 {
425 int i;
426 ScanKey idxkey;
427
428 idxkey = palloc_array(ScanKeyData, nkeys);
429
430 /* Convert attribute numbers to be index column numbers. */
431 for (i = 0; i < nkeys; i++)
432 {
433 int j;
434
435 memcpy(&idxkey[i], &key[i], sizeof(ScanKeyData));
436
437 for (j = 0; j < IndexRelationGetNumberOfAttributes(irel); j++)
438 {
439 if (key[i].sk_attno == irel->rd_index->indkey.values[j])
440 {
441 idxkey[i].sk_attno = j + 1;
442 break;
443 }
444 }
446 elog(ERROR, "column is not in index");
447 }
448
449 sysscan->iscan = index_beginscan(heapRelation, irel,
450 snapshot, NULL, nkeys, 0);
451 index_rescan(sysscan->iscan, idxkey, nkeys, NULL, 0);
452 sysscan->scan = NULL;
453
454 pfree(idxkey);
455 }
456 else
457 {
458 /*
459 * We disallow synchronized scans when forced to use a heapscan on a
460 * catalog. In most cases the desired rows are near the front, so
461 * that the unpredictable start point of a syncscan is a serious
462 * disadvantage; and there are no compensating advantages, because
463 * it's unlikely that such scans will occur in parallel.
464 */
465 sysscan->scan = table_beginscan_strat(heapRelation, snapshot,
466 nkeys, key,
467 true, false);
468 sysscan->iscan = NULL;
469 }
470
471 /*
472 * If CheckXidAlive is set then set a flag to indicate that system table
473 * scan is in-progress. See detailed comments in xact.c where these
474 * variables are declared.
475 */
477 bsysscan = true;
478
479 return sysscan;
480}
#define palloc_array(type, count)
Definition: fe_memutils.h:76
struct SysScanDescData * SysScanDesc
Definition: genam.h:118
bool ReindexIsProcessingIndex(Oid indexOid)
Definition: index.c:4140
IndexScanDesc index_beginscan(Relation heapRelation, Relation indexRelation, Snapshot snapshot, IndexScanInstrumentation *instrument, int nkeys, int norderbys)
Definition: indexam.c:256
Relation index_open(Oid relationId, LOCKMODE lockmode)
Definition: indexam.c:133
void index_rescan(IndexScanDesc scan, ScanKey keys, int nkeys, ScanKey orderbys, int norderbys)
Definition: indexam.c:366
int j
Definition: isn.c:78
#define AccessShareLock
Definition: lockdefs.h:36
bool IgnoreSystemIndexes
Definition: miscinit.c:81
#define IndexRelationGetNumberOfAttributes(relation)
Definition: rel.h:526
Snapshot GetCatalogSnapshot(Oid relid)
Definition: snapmgr.c:384
AttrNumber sk_attno
Definition: skey.h:67
Relation irel
Definition: relscan.h:210
Relation heap_rel
Definition: relscan.h:209
struct SnapshotData * snapshot
Definition: relscan.h:213
struct IndexScanDescData * iscan
Definition: relscan.h:212
struct TupleTableSlot * slot
Definition: relscan.h:214
struct TableScanDescData * scan
Definition: relscan.h:211
TupleTableSlot * table_slot_create(Relation relation, List **reglist)
Definition: tableam.c:92
static TableScanDesc table_beginscan_strat(Relation rel, Snapshot snapshot, int nkeys, ScanKeyData *key, bool allow_strat, bool allow_sync)
Definition: tableam.h:900
bool bsysscan
Definition: xact.c:100
TransactionId CheckXidAlive
Definition: xact.c:99

References AccessShareLock, bsysscan, CheckXidAlive, elog, ERROR, GetCatalogSnapshot(), SysScanDescData::heap_rel, i, IgnoreSystemIndexes, index_beginscan(), index_open(), index_rescan(), IndexRelationGetNumberOfAttributes, SysScanDescData::irel, SysScanDescData::iscan, j, sort-test::key, palloc(), palloc_array, pfree(), RelationData::rd_index, RegisterSnapshot(), ReindexIsProcessingIndex(), RelationGetRelid, SysScanDescData::scan, ScanKeyData::sk_attno, SysScanDescData::slot, SysScanDescData::snapshot, table_beginscan_strat(), table_slot_create(), and TransactionIdIsValid.

Referenced by AfterTriggerSetState(), AlterConstraintNamespaces(), AlterConstrDeferrabilityRecurse(), AlterConstrEnforceabilityRecurse(), AlterConstrTriggerDeferrability(), AlterDatabase(), AlterDatabaseOwner(), AlterDatabaseRefreshColl(), AlterDomainDropConstraint(), AlterDomainValidateConstraint(), AlterExtensionNamespace(), AlterPolicy(), 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(), CheckNNConstraintFetch(), checkSharedDependencies(), ChooseConstraintName(), ChooseRelationName(), CloneFkReferenced(), CloneRowTriggersToPartition(), ConstraintNameExists(), ConstraintNameIsUsed(), CopyStatistics(), copyTemplateDependencies(), CountDBSubscriptions(), CreateComments(), CreateInheritance(), CreatePolicy(), CreateSharedComments(), CreateTriggerFiringOn(), 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_index_constraint(), get_index_ref_constraints(), get_partition_parent_worker(), get_pkey_attnames(), get_primary_key_attnos(), 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(), GetForeignKeyActionTriggers(), GetForeignKeyCheckTriggers(), GetNewOidWithIndex(), getObjectDescription(), getObjectIdentityParts(), getOwnedSequences_internal(), GetParentedForeignKeyRefs(), GetPublicationRelations(), GetPublicationSchemas(), GetSecurityLabel(), GetSharedSecurityLabel(), GetSubscriptionRelations(), has_superclass(), HasSubscriptionRelations(), heap_truncate_find_FKs(), index_concurrently_swap(), IndexSetParentIndex(), is_schema_publication(), LargeObjectDrop(), LargeObjectExistsWithSnapshot(), load_domaintype_info(), load_enum_cache_data(), LookupOpclassInfo(), makeConfigurationDependencies(), MakeConfigurationMapping(), MarkInheritDetached(), MergeConstraintsIntoExisting(), MergeWithExistingConstraint(), movedb(), object_ownercheck(), PartitionHasPendingDetach(), pg_extension_config_dump(), pg_get_constraintdef_worker(), 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 
)

Definition at line 650 of file genam.c.

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

References bsysscan, CheckXidAlive, elog, ereport, errcode(), errmsg(), ERROR, GetCatalogSnapshot(), SysScanDescData::heap_rel, i, IgnoreSystemIndexes, index_beginscan(), index_rescan(), IndexRelationGetNumberOfAttributes, SysScanDescData::irel, SysScanDescData::iscan, j, sort-test::key, palloc(), palloc_array, pfree(), RelationData::rd_index, RegisterSnapshot(), ReindexIsProcessingIndex(), RelationGetRelationName, RelationGetRelid, SysScanDescData::scan, ScanKeyData::sk_attno, SysScanDescData::slot, SysScanDescData::snapshot, 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)

Definition at line 603 of file genam.c.

604{
605 if (sysscan->slot)
606 {
608 sysscan->slot = NULL;
609 }
610
611 if (sysscan->irel)
612 {
613 index_endscan(sysscan->iscan);
615 }
616 else
617 table_endscan(sysscan->scan);
618
619 if (sysscan->snapshot)
621
622 /*
623 * Reset the bsysscan flag at the end of the systable scan. See detailed
624 * comments in xact.c where these variables are declared.
625 */
627 bsysscan = false;
628
629 pfree(sysscan);
630}
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
Definition: execTuples.c:1443
void index_close(Relation relation, LOCKMODE lockmode)
Definition: indexam.c:177
void index_endscan(IndexScanDesc scan)
Definition: indexam.c:392
static void table_endscan(TableScanDesc scan)
Definition: tableam.h:985

References AccessShareLock, bsysscan, CheckXidAlive, ExecDropSingleTupleTableSlot(), index_close(), index_endscan(), SysScanDescData::irel, SysScanDescData::iscan, pfree(), SysScanDescData::scan, SysScanDescData::slot, SysScanDescData::snapshot, table_endscan(), TransactionIdIsValid, and UnregisterSnapshot().

Referenced by AfterTriggerSetState(), AlterConstraintNamespaces(), AlterConstrDeferrabilityRecurse(), AlterConstrEnforceabilityRecurse(), AlterConstrTriggerDeferrability(), AlterDatabase(), AlterDatabaseOwner(), AlterDatabaseRefreshColl(), AlterDomainDropConstraint(), AlterDomainValidateConstraint(), AlterExtensionNamespace(), AlterPolicy(), 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(), CheckNNConstraintFetch(), checkSharedDependencies(), ChooseConstraintName(), ChooseRelationName(), CloneFkReferenced(), CloneRowTriggersToPartition(), ConstraintNameExists(), ConstraintNameIsUsed(), CopyStatistics(), copyTemplateDependencies(), CountDBSubscriptions(), CreateComments(), CreateInheritance(), CreatePolicy(), CreateSharedComments(), CreateTriggerFiringOn(), 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_index_constraint(), get_index_ref_constraints(), get_partition_parent_worker(), get_pkey_attnames(), get_primary_key_attnos(), 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(), GetForeignKeyActionTriggers(), GetForeignKeyCheckTriggers(), GetNewOidWithIndex(), getObjectDescription(), getObjectIdentityParts(), getOwnedSequences_internal(), GetParentedForeignKeyRefs(), GetPublicationRelations(), GetPublicationSchemas(), GetSecurityLabel(), GetSharedSecurityLabel(), GetSubscriptionRelations(), has_superclass(), HasSubscriptionRelations(), heap_truncate_find_FKs(), index_concurrently_swap(), IndexSetParentIndex(), is_schema_publication(), LargeObjectDrop(), LargeObjectExistsWithSnapshot(), load_domaintype_info(), load_enum_cache_data(), LookupOpclassInfo(), makeConfigurationDependencies(), MakeConfigurationMapping(), MarkInheritDetached(), MergeConstraintsIntoExisting(), MergeWithExistingConstraint(), movedb(), object_ownercheck(), PartitionHasPendingDetach(), pg_extension_config_dump(), pg_get_constraintdef_worker(), 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)

Definition at line 757 of file genam.c.

758{
759 if (sysscan->slot)
760 {
762 sysscan->slot = NULL;
763 }
764
765 Assert(sysscan->irel);
766 index_endscan(sysscan->iscan);
767 if (sysscan->snapshot)
769
770 /*
771 * Reset the bsysscan flag at the end of the systable scan. See detailed
772 * comments in xact.c where these variables are declared.
773 */
775 bsysscan = false;
776
777 pfree(sysscan);
778}

References Assert(), bsysscan, CheckXidAlive, ExecDropSingleTupleTableSlot(), index_endscan(), SysScanDescData::irel, SysScanDescData::iscan, pfree(), SysScanDescData::slot, SysScanDescData::snapshot, 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)

Definition at line 514 of file genam.c.

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

References Assert(), elog, ERROR, ExecFetchSlotHeapTuple(), ForwardScanDirection, HandleConcurrentAbort(), index_getnext_slot(), SysScanDescData::irel, SysScanDescData::iscan, SysScanDescData::scan, SysScanDescData::slot, table_scan_getnextslot(), and IndexScanDescData::xs_recheck.

Referenced by AfterTriggerSetState(), AlterConstraintNamespaces(), AlterConstrDeferrabilityRecurse(), AlterConstrEnforceabilityRecurse(), AlterConstrTriggerDeferrability(), AlterDatabase(), AlterDatabaseOwner(), AlterDatabaseRefreshColl(), AlterDomainDropConstraint(), AlterDomainValidateConstraint(), AlterExtensionNamespace(), AlterPolicy(), 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(), CheckNNConstraintFetch(), checkSharedDependencies(), ChooseConstraintName(), ChooseRelationName(), CloneFkReferenced(), CloneRowTriggersToPartition(), ConstraintNameExists(), ConstraintNameIsUsed(), CopyStatistics(), copyTemplateDependencies(), CountDBSubscriptions(), CreateComments(), CreateInheritance(), CreatePolicy(), CreateSharedComments(), CreateTriggerFiringOn(), 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_index_constraint(), get_index_ref_constraints(), get_partition_parent_worker(), get_pkey_attnames(), get_primary_key_attnos(), 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(), GetForeignKeyActionTriggers(), GetForeignKeyCheckTriggers(), GetNewOidWithIndex(), getObjectDescription(), getObjectIdentityParts(), getOwnedSequences_internal(), GetParentedForeignKeyRefs(), GetPublicationRelations(), GetPublicationSchemas(), GetSecurityLabel(), GetSharedSecurityLabel(), GetSubscriptionRelations(), has_superclass(), HasSubscriptionRelations(), heap_truncate_find_FKs(), index_concurrently_swap(), IndexSetParentIndex(), is_schema_publication(), LargeObjectDrop(), LargeObjectExistsWithSnapshot(), load_domaintype_info(), load_enum_cache_data(), LookupOpclassInfo(), makeConfigurationDependencies(), MakeConfigurationMapping(), MarkInheritDetached(), MergeConstraintsIntoExisting(), MergeWithExistingConstraint(), movedb(), object_ownercheck(), PartitionHasPendingDetach(), pg_extension_config_dump(), pg_get_constraintdef_worker(), 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 
)

Definition at line 732 of file genam.c.

733{
734 HeapTuple htup = NULL;
735
736 Assert(sysscan->irel);
737 if (index_getnext_slot(sysscan->iscan, direction, sysscan->slot))
738 htup = ExecFetchSlotHeapTuple(sysscan->slot, false, NULL);
739
740 /* See notes in systable_getnext */
741 if (htup && sysscan->iscan->xs_recheck)
742 elog(ERROR, "system catalog scans with lossy index conditions are not implemented");
743
744 /*
745 * Handle the concurrent abort while fetching the catalog tuple during
746 * logical streaming of a transaction.
747 */
749
750 return htup;
751}

References Assert(), elog, ERROR, ExecFetchSlotHeapTuple(), HandleConcurrentAbort(), index_getnext_slot(), SysScanDescData::irel, SysScanDescData::iscan, SysScanDescData::slot, and IndexScanDescData::xs_recheck.

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 
)

Definition at line 807 of file genam.c.

814{
815 int retries = 0;
816 SysScanDesc scan;
817 HeapTuple oldtup;
819
820 /*
821 * For now, we don't allow parallel updates. Unlike a regular update,
822 * this should never create a combo CID, so it might be possible to relax
823 * this restriction, but not without more thought and testing. It's not
824 * clear that it would be useful, anyway.
825 */
826 if (IsInParallelMode())
828 (errcode(ERRCODE_INVALID_TRANSACTION_STATE),
829 errmsg("cannot update tuples during a parallel operation")));
830
831 /*
832 * Accept a snapshot argument, for symmetry, but this function advances
833 * its snapshot as needed to reach the tail of the updated tuple chain.
834 */
835 Assert(snapshot == NULL);
836
837 Assert(IsInplaceUpdateRelation(relation) || !IsSystemRelation(relation));
838
839 /* Loop for an exclusive-locked buffer of a non-updated tuple. */
840 do
841 {
842 TupleTableSlot *slot;
843
845
846 /*
847 * Processes issuing heap_update (e.g. GRANT) at maximum speed could
848 * drive us to this error. A hostile table owner has stronger ways to
849 * damage their own table, so that's minor.
850 */
851 if (retries++ > 10000)
852 elog(ERROR, "giving up after too many tries to overwrite row");
853
854 INJECTION_POINT("inplace-before-pin", NULL);
855 scan = systable_beginscan(relation, indexId, indexOK, snapshot,
856 nkeys, unconstify(ScanKeyData *, key));
857 oldtup = systable_getnext(scan);
858 if (!HeapTupleIsValid(oldtup))
859 {
860 systable_endscan(scan);
861 *oldtupcopy = NULL;
862 return;
863 }
864
865 slot = scan->slot;
867 bslot = (BufferHeapTupleTableSlot *) slot;
868 } while (!heap_inplace_lock(scan->heap_rel,
869 bslot->base.tuple, bslot->buffer,
870 (void (*) (void *)) systable_endscan, scan));
871
872 *oldtupcopy = heap_copytuple(oldtup);
873 *state = scan;
874}
#define unconstify(underlying_type, expr)
Definition: c.h:1244
bool IsSystemRelation(Relation relation)
Definition: catalog.c:74
bool IsInplaceUpdateRelation(Relation relation)
Definition: catalog.c:183
void systable_endscan(SysScanDesc sysscan)
Definition: genam.c:603
HeapTuple systable_getnext(SysScanDesc sysscan)
Definition: genam.c:514
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:6354
HeapTuple heap_copytuple(HeapTuple tuple)
Definition: heaptuple.c:778
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
#define INJECTION_POINT(name, arg)
#define CHECK_FOR_INTERRUPTS()
Definition: miscadmin.h:122
Definition: regguts.h:323
#define TTS_IS_BUFFERTUPLE(slot)
Definition: tuptable.h:241
bool IsInParallelMode(void)
Definition: xact.c:1089

References Assert(), BufferHeapTupleTableSlot::buffer, CHECK_FOR_INTERRUPTS, elog, ereport, errcode(), errmsg(), ERROR, heap_copytuple(), heap_inplace_lock(), SysScanDescData::heap_rel, HeapTupleIsValid, INJECTION_POINT, IsInParallelMode(), IsInplaceUpdateRelation(), IsSystemRelation(), sort-test::key, 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)

Definition at line 902 of file genam.c.

903{
905 Relation relation = scan->heap_rel;
906 TupleTableSlot *slot = scan->slot;
908 HeapTuple oldtup = bslot->base.tuple;
909 Buffer buffer = bslot->buffer;
910
911 heap_inplace_unlock(relation, oldtup, buffer);
912 systable_endscan(scan);
913}
int Buffer
Definition: buf.h:23
void heap_inplace_unlock(Relation relation, HeapTuple oldtup, Buffer buffer)
Definition: heapam.c:6643

References BufferHeapTupleTableSlot::buffer, 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 
)

Definition at line 883 of file genam.c.

884{
886 Relation relation = scan->heap_rel;
887 TupleTableSlot *slot = scan->slot;
889 HeapTuple oldtup = bslot->base.tuple;
890 Buffer buffer = bslot->buffer;
891
892 heap_inplace_update_and_unlock(relation, oldtup, tuple, buffer);
893 systable_endscan(scan);
894}
void heap_inplace_update_and_unlock(Relation relation, HeapTuple oldtup, HeapTuple tuple, Buffer buffer)
Definition: heapam.c:6490

References BufferHeapTupleTableSlot::buffer, 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 
)

Definition at line 573 of file genam.c.

574{
575 Snapshot freshsnap;
576 bool result;
577
578 Assert(tup == ExecFetchSlotHeapTuple(sysscan->slot, false, NULL));
579
580 freshsnap = GetCatalogSnapshot(RelationGetRelid(sysscan->heap_rel));
581 freshsnap = RegisterSnapshot(freshsnap);
582
584 sysscan->slot,
585 freshsnap);
586 UnregisterSnapshot(freshsnap);
587
588 /*
589 * Handle the concurrent abort while fetching the catalog tuple during
590 * logical streaming of a transaction.
591 */
593
594 return result;
595}
static bool table_tuple_satisfies_snapshot(Relation rel, TupleTableSlot *slot, Snapshot snapshot)
Definition: tableam.h:1300

References Assert(), ExecFetchSlotHeapTuple(), GetCatalogSnapshot(), HandleConcurrentAbort(), SysScanDescData::heap_rel, RegisterSnapshot(), RelationGetRelid, SysScanDescData::slot, table_tuple_satisfies_snapshot(), and UnregisterSnapshot().

Referenced by findDependentObjects(), and shdepDropOwned().

◆ try_index_open()

Relation try_index_open ( Oid  relationId,
LOCKMODE  lockmode 
)

Definition at line 152 of file indexam.c.

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

References try_relation_open(), and validate_relation_kind().

Referenced by reindex_index().