PostgreSQL Source Code git master
Loading...
Searching...
No Matches
genam.c File Reference
#include "postgres.h"
#include "access/genam.h"
#include "access/heapam.h"
#include "access/relscan.h"
#include "access/tableam.h"
#include "access/transam.h"
#include "catalog/index.h"
#include "lib/stringinfo.h"
#include "miscadmin.h"
#include "storage/bufmgr.h"
#include "storage/procarray.h"
#include "utils/acl.h"
#include "utils/injection_point.h"
#include "utils/lsyscache.h"
#include "utils/rel.h"
#include "utils/rls.h"
#include "utils/ruleutils.h"
#include "utils/snapmgr.h"
Include dependency graph for genam.c:

Go to the source code of this file.

Functions

IndexScanDesc RelationGetIndexScan (Relation indexRelation, int nkeys, int norderbys)
 
void IndexScanEnd (IndexScanDesc scan)
 
charBuildIndexValueDescription (Relation indexRelation, const Datum *values, const bool *isnull)
 
TransactionId index_compute_xid_horizon_for_tuples (Relation irel, Relation hrel, Buffer ibuf, OffsetNumber *itemnos, int nitems)
 
SysScanDesc systable_beginscan (Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
 
static void HandleConcurrentAbort (void)
 
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)
 

Function Documentation

◆ BuildIndexValueDescription()

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

Definition at line 178 of file genam.c.

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

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

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

◆ HandleConcurrentAbort()

static void HandleConcurrentAbort ( void  )
inlinestatic

Definition at line 492 of file genam.c.

493{
499 errmsg("transaction aborted during system catalog scan")));
500}
int errcode(int sqlerrcode)
Definition elog.c:874
#define ERROR
Definition elog.h:39
#define ereport(elevel,...)
Definition elog.h:151
static char * errmsg
bool TransactionIdIsInProgress(TransactionId xid)
Definition procarray.c:1393
bool TransactionIdDidCommit(TransactionId transactionId)
Definition transam.c:126
#define TransactionIdIsValid(xid)
Definition transam.h:41
TransactionId CheckXidAlive
Definition xact.c:101

References CheckXidAlive, ereport, errcode(), errmsg, ERROR, fb(), TransactionIdDidCommit(), TransactionIdIsInProgress(), and TransactionIdIsValid.

Referenced by systable_getnext(), systable_getnext_ordered(), and systable_recheck_tuple().

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

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

Referenced by _hash_vacuum_one_page(), and gistprunepage().

◆ 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:148
struct ScanKeyData * orderByData
Definition relscan.h:149

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

Referenced by index_endscan().

◆ RelationGetIndexScan()

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

Definition at line 80 of file genam.c.

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

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

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

◆ systable_beginscan()

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

Definition at line 388 of file genam.c.

393{
395 Relation irel;
396
397 if (indexOK &&
401 else
402 irel = NULL;
403
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 /*
424 * If CheckXidAlive is set then set a flag to indicate that system table
425 * scan is in-progress. See detailed comments in xact.c where these
426 * variables are declared.
427 */
429 bsysscan = true;
430
431 if (irel)
432 {
433 int i;
435
437
438 /* Convert attribute numbers to be index column numbers. */
439 for (i = 0; i < nkeys; i++)
440 {
441 int j;
442
443 memcpy(&idxkey[i], &key[i], sizeof(ScanKeyData));
444
445 for (j = 0; j < IndexRelationGetNumberOfAttributes(irel); j++)
446 {
447 if (key[i].sk_attno == irel->rd_index->indkey.values[j])
448 {
449 idxkey[i].sk_attno = j + 1;
450 break;
451 }
452 }
454 elog(ERROR, "column is not in index");
455 }
456
457 sysscan->iscan = index_beginscan(heapRelation, irel,
458 snapshot, NULL, nkeys, 0,
459 SO_NONE);
460 index_rescan(sysscan->iscan, idxkey, nkeys, NULL, 0);
461 sysscan->scan = NULL;
462
463 pfree(idxkey);
464 }
465 else
466 {
467 /*
468 * We disallow synchronized scans when forced to use a heapscan on a
469 * catalog. In most cases the desired rows are near the front, so
470 * that the unpredictable start point of a syncscan is a serious
471 * disadvantage; and there are no compensating advantages, because
472 * it's unlikely that such scans will occur in parallel.
473 */
474 sysscan->scan = table_beginscan_strat(heapRelation, snapshot,
475 nkeys, key,
476 true, false);
477 sysscan->iscan = NULL;
478 }
479
480 return sysscan;
481}
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
#define elog(elevel,...)
Definition elog.h:227
bool ReindexIsProcessingIndex(Oid indexOid)
Definition index.c:4161
IndexScanDesc index_beginscan(Relation heapRelation, Relation indexRelation, Snapshot snapshot, IndexScanInstrumentation *instrument, int nkeys, int norderbys, uint32 flags)
Definition indexam.c:257
Relation index_open(Oid relationId, LOCKMODE lockmode)
Definition indexam.c:134
void index_rescan(IndexScanDesc scan, ScanKey keys, int nkeys, ScanKey orderbys, int norderbys)
Definition indexam.c:368
int j
Definition isn.c:78
#define AccessShareLock
Definition lockdefs.h:36
bool IgnoreSystemIndexes
Definition miscinit.c:82
#define IndexRelationGetNumberOfAttributes(relation)
Definition rel.h:528
Snapshot GetCatalogSnapshot(Oid relid)
Definition snapmgr.c:385
Snapshot RegisterSnapshot(Snapshot snapshot)
Definition snapmgr.c:824
TupleTableSlot * table_slot_create(Relation relation, List **reglist)
Definition tableam.c:92
@ SO_NONE
Definition tableam.h:49
static TableScanDesc table_beginscan_strat(Relation rel, Snapshot snapshot, int nkeys, ScanKeyData *key, bool allow_strat, bool allow_sync)
Definition tableam.h:965
bool bsysscan
Definition xact.c:102

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

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

◆ systable_beginscan_ordered()

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

Definition at line 651 of file genam.c.

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

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

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

◆ systable_endscan()

void systable_endscan ( SysScanDesc  sysscan)

Definition at line 604 of file genam.c.

605{
606 if (sysscan->slot)
607 {
609 sysscan->slot = NULL;
610 }
611
612 if (sysscan->irel)
613 {
614 index_endscan(sysscan->iscan);
616 }
617 else
618 table_endscan(sysscan->scan);
619
620 if (sysscan->snapshot)
621 UnregisterSnapshot(sysscan->snapshot);
622
623 /*
624 * Reset the bsysscan flag at the end of the systable scan. See detailed
625 * comments in xact.c where these variables are declared.
626 */
628 bsysscan = false;
629
630 pfree(sysscan);
631}
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
void index_close(Relation relation, LOCKMODE lockmode)
Definition indexam.c:178
void index_endscan(IndexScanDesc scan)
Definition indexam.c:394
void UnregisterSnapshot(Snapshot snapshot)
Definition snapmgr.c:866
static void table_endscan(TableScanDesc scan)
Definition tableam.h:1058

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

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

◆ systable_endscan_ordered()

void systable_endscan_ordered ( SysScanDesc  sysscan)

Definition at line 759 of file genam.c.

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

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

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

◆ systable_getnext()

HeapTuple systable_getnext ( SysScanDesc  sysscan)

Definition at line 515 of file genam.c.

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

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

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

◆ systable_getnext_ordered()

HeapTuple systable_getnext_ordered ( SysScanDesc  sysscan,
ScanDirection  direction 
)

Definition at line 734 of file genam.c.

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

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

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

◆ systable_inplace_update_begin()

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

Definition at line 810 of file genam.c.

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

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

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

◆ systable_inplace_update_cancel()

void systable_inplace_update_cancel ( void state)

Definition at line 905 of file genam.c.

906{
908 Relation relation = scan->heap_rel;
909 TupleTableSlot *slot = scan->slot;
911 HeapTuple oldtup = bslot->base.tuple;
912 Buffer buffer = bslot->buffer;
913
914 heap_inplace_unlock(relation, oldtup, buffer);
915 systable_endscan(scan);
916}
int Buffer
Definition buf.h:23
struct SysScanDescData * SysScanDesc
Definition genam.h:99
void heap_inplace_unlock(Relation relation, HeapTuple oldtup, Buffer buffer)
Definition heapam.c:6597

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

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

◆ systable_inplace_update_finish()

void systable_inplace_update_finish ( void state,
HeapTuple  tuple 
)

Definition at line 886 of file genam.c.

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

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

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

◆ systable_recheck_tuple()

bool systable_recheck_tuple ( SysScanDesc  sysscan,
HeapTuple  tup 
)

Definition at line 574 of file genam.c.

575{
577 bool result;
578
579 Assert(tup == ExecFetchSlotHeapTuple(sysscan->slot, false, NULL));
580
583
585 sysscan->slot,
586 freshsnap);
588
589 /*
590 * Handle the concurrent abort while fetching the catalog tuple during
591 * logical streaming of a transaction.
592 */
594
595 return result;
596}
uint32 result
static bool table_tuple_satisfies_snapshot(Relation rel, TupleTableSlot *slot, Snapshot snapshot)
Definition tableam.h:1388

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

Referenced by findDependentObjects(), and shdepDropOwned().