PostgreSQL Source Code git master
Loading...
Searching...
No Matches
rel.h File Reference
#include "access/tupdesc.h"
#include "access/xlog.h"
#include "catalog/catalog.h"
#include "catalog/pg_class.h"
#include "catalog/pg_index.h"
#include "catalog/pg_publication.h"
#include "nodes/bitmapset.h"
#include "partitioning/partdefs.h"
#include "rewrite/prs2lock.h"
#include "storage/block.h"
#include "storage/relfilelocator.h"
#include "storage/smgr.h"
#include "utils/relcache.h"
#include "utils/reltrigger.h"
Include dependency graph for rel.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  LockRelId
 
struct  LockInfoData
 
struct  RelationData
 
struct  ForeignKeyCacheInfo
 
struct  AutoVacOpts
 
struct  StdRdOptions
 
struct  ViewOptions
 

Macros

#define HEAP_MIN_FILLFACTOR   10
 
#define HEAP_DEFAULT_FILLFACTOR   100
 
#define RelationGetToastTupleTarget(relation, defaulttarg)
 
#define RelationGetFillFactor(relation, defaultff)
 
#define RelationGetTargetPageUsage(relation, defaultff)    (BLCKSZ * RelationGetFillFactor(relation, defaultff) / 100)
 
#define RelationGetTargetPageFreeSpace(relation, defaultff)    (BLCKSZ * (100 - RelationGetFillFactor(relation, defaultff)) / 100)
 
#define RelationIsUsedAsCatalogTable(relation)
 
#define RelationGetParallelWorkers(relation, defaultpw)
 
#define RelationIsSecurityView(relation)
 
#define RelationHasSecurityInvoker(relation)
 
#define RelationHasCheckOption(relation)
 
#define RelationHasLocalCheckOption(relation)
 
#define RelationHasCascadedCheckOption(relation)
 
#define RelationIsValid(relation)   ((relation) != NULL)
 
#define RelationHasReferenceCountZero(relation)    ((bool)((relation)->rd_refcnt == 0))
 
#define RelationGetForm(relation)   ((relation)->rd_rel)
 
#define RelationGetRelid(relation)   ((relation)->rd_id)
 
#define RelationGetNumberOfAttributes(relation)   ((relation)->rd_rel->relnatts)
 
#define IndexRelationGetNumberOfAttributes(relation)    ((relation)->rd_index->indnatts)
 
#define IndexRelationGetNumberOfKeyAttributes(relation)    ((relation)->rd_index->indnkeyatts)
 
#define RelationGetDescr(relation)   ((relation)->rd_att)
 
#define RelationGetRelationName(relation)    (NameStr((relation)->rd_rel->relname))
 
#define RelationGetNamespace(relation)    ((relation)->rd_rel->relnamespace)
 
#define RelationIsMapped(relation)
 
#define RelationGetTargetBlock(relation)    ( (relation)->rd_smgr != NULL ? (relation)->rd_smgr->smgr_targblock : InvalidBlockNumber )
 
#define RelationSetTargetBlock(relation, targblock)
 
#define RelationIsPermanent(relation)    ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
 
#define RelationNeedsWAL(relation)
 
#define RelationUsesLocalBuffers(relation)    ((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP)
 
#define RELATION_IS_LOCAL(relation)
 
#define RELATION_IS_OTHER_TEMP(relation)
 
#define RelationIsScannable(relation)   ((relation)->rd_rel->relispopulated)
 
#define RelationIsPopulated(relation)   ((relation)->rd_rel->relispopulated)
 
#define RelationIsAccessibleInLogicalDecoding(relation)
 
#define RelationIsLogicallyLogged(relation)
 

Typedefs

typedef struct LockRelId LockRelId
 
typedef struct LockInfoData LockInfoData
 
typedef LockInfoDataLockInfo
 
typedef struct RelationData RelationData
 
typedef struct ForeignKeyCacheInfo ForeignKeyCacheInfo
 
typedef struct AutoVacOpts AutoVacOpts
 
typedef enum StdRdOptIndexCleanup StdRdOptIndexCleanup
 
typedef struct StdRdOptions StdRdOptions
 
typedef enum ViewOptCheckOption ViewOptCheckOption
 
typedef struct ViewOptions ViewOptions
 

Enumerations

enum  StdRdOptIndexCleanup { STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO = 0 , STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF , STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON }
 
enum  ViewOptCheckOption { VIEW_OPTION_CHECK_OPTION_NOT_SET , VIEW_OPTION_CHECK_OPTION_LOCAL , VIEW_OPTION_CHECK_OPTION_CASCADED }
 

Functions

static SMgrRelation RelationGetSmgr (Relation rel)
 
static void RelationCloseSmgr (Relation relation)
 
void RelationIncrementReferenceCount (Relation rel)
 
void RelationDecrementReferenceCount (Relation rel)
 

Macro Definition Documentation

◆ HEAP_DEFAULT_FILLFACTOR

#define HEAP_DEFAULT_FILLFACTOR   100

Definition at line 362 of file rel.h.

◆ HEAP_MIN_FILLFACTOR

#define HEAP_MIN_FILLFACTOR   10

Definition at line 361 of file rel.h.

◆ IndexRelationGetNumberOfAttributes

#define IndexRelationGetNumberOfAttributes (   relation)     ((relation)->rd_index->indnatts)

Definition at line 528 of file rel.h.

578{
579 if (unlikely(rel->rd_smgr == NULL))
580 {
581 rel->rd_smgr = smgropen(rel->rd_locator, rel->rd_backend);
582 smgrpin(rel->rd_smgr);
583 }
584 return rel->rd_smgr;
585}
586
587/*
588 * RelationCloseSmgr
589 * Close the relation at the smgr level, if not already done.
590 */
591static inline void
593{
594 if (relation->rd_smgr != NULL)
595 {
596 smgrunpin(relation->rd_smgr);
597 smgrclose(relation->rd_smgr);
598 relation->rd_smgr = NULL;
599 }
600}
601#endif /* !FRONTEND */
602
603/*
604 * RelationGetTargetBlock
605 * Fetch relation's current insertion target block.
606 *
607 * Returns InvalidBlockNumber if there is no current target block. Note
608 * that the target block status is discarded on any smgr-level invalidation,
609 * so there's no need to re-open the smgr handle if it's not currently open.
610 */
611#define RelationGetTargetBlock(relation) \
612 ( (relation)->rd_smgr != NULL ? (relation)->rd_smgr->smgr_targblock : InvalidBlockNumber )
613
614/*
615 * RelationSetTargetBlock
616 * Set relation's current insertion target block.
617 */
618#define RelationSetTargetBlock(relation, targblock) \
619 do { \
620 RelationGetSmgr(relation)->smgr_targblock = (targblock); \
621 } while (0)
622
623/*
624 * RelationIsPermanent
625 * True if relation is permanent.
626 */
627#define RelationIsPermanent(relation) \
628 ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
629
630/*
631 * RelationNeedsWAL
632 * True if relation needs WAL.
633 *
634 * Returns false if wal_level = minimal and this relation is created or
635 * truncated in the current transaction. See "Skipping WAL for New
636 * RelFileLocator" in src/backend/access/transam/README.
637 */
638#define RelationNeedsWAL(relation) \
639 (RelationIsPermanent(relation) && (XLogIsNeeded() || \
640 (relation->rd_createSubid == InvalidSubTransactionId && \
641 relation->rd_firstRelfilelocatorSubid == InvalidSubTransactionId)))
642
643/*
644 * RelationUsesLocalBuffers
645 * True if relation's pages are stored in local buffers.
646 */
647#define RelationUsesLocalBuffers(relation) \
648 ((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP)
649
650/*
651 * RELATION_IS_LOCAL
652 * If a rel is either temp or newly created in the current transaction,
653 * it can be assumed to be accessible only to the current backend.
654 * This is typically used to decide that we can skip acquiring locks.
655 *
656 * Beware of multiple eval of argument
657 */
658#define RELATION_IS_LOCAL(relation) \
659 ((relation)->rd_islocaltemp || \
660 (relation)->rd_createSubid != InvalidSubTransactionId)
661
662/*
663 * RELATION_IS_OTHER_TEMP
664 * Test for a temporary relation that belongs to some other session.
665 *
666 * Beware of multiple eval of argument
667 */
668#define RELATION_IS_OTHER_TEMP(relation) \
669 ((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP && \
670 !(relation)->rd_islocaltemp)
671
672
673/*
674 * RelationIsScannable
675 * Currently can only be false for a materialized view which has not been
676 * populated by its query. This is likely to get more complicated later,
677 * so use a macro which looks like a function.
678 */
679#define RelationIsScannable(relation) ((relation)->rd_rel->relispopulated)
680
681/*
682 * RelationIsPopulated
683 * Currently, we don't physically distinguish the "populated" and
684 * "scannable" properties of matviews, but that may change later.
685 * Hence, use the appropriate one of these macros in code tests.
686 */
687#define RelationIsPopulated(relation) ((relation)->rd_rel->relispopulated)
688
689/*
690 * RelationIsAccessibleInLogicalDecoding
691 * True if we need to log enough information to have access via
692 * decoding snapshot.
693 */
694#define RelationIsAccessibleInLogicalDecoding(relation) \
695 (XLogLogicalInfoActive() && \
696 RelationNeedsWAL(relation) && \
697 (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
698
699/*
700 * RelationIsLogicallyLogged
701 * True if we need to log enough information to extract the data from the
702 * WAL stream.
703 *
704 * We don't log information for unlogged tables (since they don't WAL log
705 * anyway), for foreign tables (since they don't WAL log, either),
706 * and for system tables (their content is hard to make sense of, and
707 * it would complicate decoding slightly for little gain). Note that we *do*
708 * log information for user defined catalog tables since they presumably are
709 * interesting to the user...
710 */
711#define RelationIsLogicallyLogged(relation) \
712 (XLogLogicalInfoActive() && \
713 RelationNeedsWAL(relation) && \
714 (relation)->rd_rel->relkind != RELKIND_FOREIGN_TABLE && \
715 !IsCatalogRelation(relation))
716
717/* routines in utils/cache/relcache.c */
720
721#endif /* REL_H */
#define unlikely(x)
Definition c.h:438
static int fb(int x)
void RelationDecrementReferenceCount(Relation rel)
Definition relcache.c:2190
void RelationIncrementReferenceCount(Relation rel)
Definition relcache.c:2177
static void RelationCloseSmgr(Relation relation)
Definition rel.h:593
SMgrRelation smgropen(RelFileLocator rlocator, ProcNumber backend)
Definition smgr.c:240
void smgrpin(SMgrRelation reln)
Definition smgr.c:296
void smgrunpin(SMgrRelation reln)
Definition smgr.c:311
void smgrclose(SMgrRelation reln)
Definition smgr.c:374
SMgrRelation rd_smgr
Definition rel.h:58

◆ IndexRelationGetNumberOfKeyAttributes

#define IndexRelationGetNumberOfKeyAttributes (   relation)     ((relation)->rd_index->indnkeyatts)

Definition at line 535 of file rel.h.

◆ RELATION_IS_LOCAL

#define RELATION_IS_LOCAL (   relation)
Value:
((relation)->rd_islocaltemp || \
(relation)->rd_createSubid != InvalidSubTransactionId)
#define InvalidSubTransactionId
Definition c.h:742

Definition at line 659 of file rel.h.

◆ RELATION_IS_OTHER_TEMP

#define RELATION_IS_OTHER_TEMP (   relation)
Value:
((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP && \
!(relation)->rd_islocaltemp)

Definition at line 669 of file rel.h.

◆ RelationGetDescr

#define RelationGetDescr (   relation)    ((relation)->rd_att)

Definition at line 542 of file rel.h.

◆ RelationGetFillFactor

#define RelationGetFillFactor (   relation,
  defaultff 
)
Value:
((relation)->rd_options ? \
((StdRdOptions *) (relation)->rd_options)->fillfactor : (defaultff))

Definition at line 376 of file rel.h.

378 : (defaultff))

◆ RelationGetForm

#define RelationGetForm (   relation)    ((relation)->rd_rel)

Definition at line 510 of file rel.h.

◆ RelationGetNamespace

#define RelationGetNamespace (   relation)     ((relation)->rd_rel->relnamespace)

Definition at line 557 of file rel.h.

◆ RelationGetNumberOfAttributes

#define RelationGetNumberOfAttributes (   relation)    ((relation)->rd_rel->relnatts)

Definition at line 522 of file rel.h.

◆ RelationGetParallelWorkers

#define RelationGetParallelWorkers (   relation,
  defaultpw 
)
Value:
((relation)->rd_options ? \
((StdRdOptions *) (relation)->rd_options)->parallel_workers : (defaultpw))

Definition at line 410 of file rel.h.

412 : (defaultpw))

◆ RelationGetRelationName

#define RelationGetRelationName (   relation)     (NameStr((relation)->rd_rel->relname))

Definition at line 550 of file rel.h.

◆ RelationGetRelid

#define RelationGetRelid (   relation)    ((relation)->rd_id)

Definition at line 516 of file rel.h.

◆ RelationGetTargetBlock

#define RelationGetTargetBlock (   relation)     ( (relation)->rd_smgr != NULL ? (relation)->rd_smgr->smgr_targblock : InvalidBlockNumber )

Definition at line 612 of file rel.h.

#define InvalidBlockNumber
Definition block.h:33

◆ RelationGetTargetPageFreeSpace

#define RelationGetTargetPageFreeSpace (   relation,
  defaultff 
)     (BLCKSZ * (100 - RelationGetFillFactor(relation, defaultff)) / 100)

Definition at line 391 of file rel.h.

◆ RelationGetTargetPageUsage

#define RelationGetTargetPageUsage (   relation,
  defaultff 
)     (BLCKSZ * RelationGetFillFactor(relation, defaultff) / 100)

Definition at line 384 of file rel.h.

◆ RelationGetToastTupleTarget

#define RelationGetToastTupleTarget (   relation,
  defaulttarg 
)
Value:
((relation)->rd_options ? \
((StdRdOptions *) (relation)->rd_options)->toast_tuple_target : (defaulttarg))

Definition at line 368 of file rel.h.

370 : (defaulttarg))

◆ RelationHasCascadedCheckOption

#define RelationHasCascadedCheckOption (   relation)
Value:
(AssertMacro(relation->rd_rel->relkind == RELKIND_VIEW), \
(relation)->rd_options && \
((ViewOptions *) (relation)->rd_options)->check_option == \
#define AssertMacro(condition)
Definition c.h:944
@ VIEW_OPTION_CHECK_OPTION_CASCADED
Definition rel.h:419

Definition at line 481 of file rel.h.

◆ RelationHasCheckOption

#define RelationHasCheckOption (   relation)
Value:
(AssertMacro(relation->rd_rel->relkind == RELKIND_VIEW), \
(relation)->rd_options && \
((ViewOptions *) (relation)->rd_options)->check_option != \
@ VIEW_OPTION_CHECK_OPTION_NOT_SET
Definition rel.h:417

Definition at line 459 of file rel.h.

◆ RelationHasLocalCheckOption

#define RelationHasLocalCheckOption (   relation)
Value:
(AssertMacro(relation->rd_rel->relkind == RELKIND_VIEW), \
(relation)->rd_options && \
((ViewOptions *) (relation)->rd_options)->check_option == \
@ VIEW_OPTION_CHECK_OPTION_LOCAL
Definition rel.h:418

Definition at line 470 of file rel.h.

◆ RelationHasReferenceCountZero

#define RelationHasReferenceCountZero (   relation)     ((bool)((relation)->rd_refcnt == 0))

Definition at line 500 of file rel.h.

◆ RelationHasSecurityInvoker

#define RelationHasSecurityInvoker (   relation)
Value:
(AssertMacro(relation->rd_rel->relkind == RELKIND_VIEW), \
(relation)->rd_options ? \
((ViewOptions *) (relation)->rd_options)->security_invoker : false)

Definition at line 449 of file rel.h.

452 : false)

◆ RelationIsAccessibleInLogicalDecoding

#define RelationIsAccessibleInLogicalDecoding (   relation)
Value:
RelationNeedsWAL(relation) && \
bool IsCatalogRelation(Relation relation)
Definition catalog.c:104
#define RelationIsUsedAsCatalogTable(relation)
Definition rel.h:399
#define XLogLogicalInfoActive()
Definition xlog.h:137

Definition at line 695 of file rel.h.

◆ RelationIsLogicallyLogged

#define RelationIsLogicallyLogged (   relation)
Value:
RelationNeedsWAL(relation) && \
(relation)->rd_rel->relkind != RELKIND_FOREIGN_TABLE && \
!IsCatalogRelation(relation))

Definition at line 712 of file rel.h.

◆ RelationIsMapped

#define RelationIsMapped (   relation)
Value:
(RELKIND_HAS_STORAGE((relation)->rd_rel->relkind) && \
((relation)->rd_rel->relfilenode == InvalidRelFileNumber))
#define InvalidRelFileNumber
Definition relpath.h:26

Definition at line 565 of file rel.h.

◆ RelationIsPermanent

#define RelationIsPermanent (   relation)     ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)

Definition at line 628 of file rel.h.

◆ RelationIsPopulated

#define RelationIsPopulated (   relation)    ((relation)->rd_rel->relispopulated)

Definition at line 688 of file rel.h.

◆ RelationIsScannable

#define RelationIsScannable (   relation)    ((relation)->rd_rel->relispopulated)

Definition at line 680 of file rel.h.

◆ RelationIsSecurityView

#define RelationIsSecurityView (   relation)
Value:
(AssertMacro(relation->rd_rel->relkind == RELKIND_VIEW), \
(relation)->rd_options ? \
((ViewOptions *) (relation)->rd_options)->security_barrier : false)

Definition at line 439 of file rel.h.

442 : false)

◆ RelationIsUsedAsCatalogTable

#define RelationIsUsedAsCatalogTable (   relation)
Value:
((relation)->rd_options && \
((relation)->rd_rel->relkind == RELKIND_RELATION || \
(relation)->rd_rel->relkind == RELKIND_MATVIEW) ? \
((StdRdOptions *) (relation)->rd_options)->user_catalog_table : false)
#define false

Definition at line 399 of file rel.h.

403 : false)

◆ RelationIsValid

#define RelationIsValid (   relation)    ((relation) != NULL)

Definition at line 491 of file rel.h.

◆ RelationNeedsWAL

#define RelationNeedsWAL (   relation)
Value:
(RelationIsPermanent(relation) && (XLogIsNeeded() || \
(relation->rd_createSubid == InvalidSubTransactionId && \
relation->rd_firstRelfilelocatorSubid == InvalidSubTransactionId)))
#define RelationIsPermanent(relation)
Definition rel.h:628
#define XLogIsNeeded()
Definition xlog.h:112

Definition at line 639 of file rel.h.

◆ RelationSetTargetBlock

#define RelationSetTargetBlock (   relation,
  targblock 
)
Value:
do { \
RelationGetSmgr(relation)->smgr_targblock = (targblock); \
} while (0)

Definition at line 619 of file rel.h.

620 { \
621 RelationGetSmgr(relation)->smgr_targblock = (targblock); \
622 } while (0)

◆ RelationUsesLocalBuffers

#define RelationUsesLocalBuffers (   relation)     ((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP)

Definition at line 648 of file rel.h.

Typedef Documentation

◆ AutoVacOpts

◆ ForeignKeyCacheInfo

◆ LockInfo

Definition at line 49 of file rel.h.

◆ LockInfoData

◆ LockRelId

◆ RelationData

◆ StdRdOptIndexCleanup

◆ StdRdOptions

◆ ViewOptCheckOption

◆ ViewOptions

Enumeration Type Documentation

◆ StdRdOptIndexCleanup

Enumerator
STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO 
STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF 
STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON 

Definition at line 336 of file rel.h.

337{
StdRdOptIndexCleanup
Definition rel.h:337
@ STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO
Definition rel.h:338
@ STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF
Definition rel.h:339
@ STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON
Definition rel.h:340

◆ ViewOptCheckOption

Enumerator
VIEW_OPTION_CHECK_OPTION_NOT_SET 
VIEW_OPTION_CHECK_OPTION_LOCAL 
VIEW_OPTION_CHECK_OPTION_CASCADED 

Definition at line 415 of file rel.h.

Function Documentation

◆ RelationCloseSmgr()

static void RelationCloseSmgr ( Relation  relation)
inlinestatic

Definition at line 593 of file rel.h.

594{
595 if (relation->rd_smgr != NULL)
596 {
597 smgrunpin(relation->rd_smgr);
598 smgrclose(relation->rd_smgr);
599 relation->rd_smgr = NULL;
600 }
601}

References fb(), RelationData::rd_smgr, smgrclose(), and smgrunpin().

Referenced by RelationCacheInvalidate(), RelationDestroyRelation(), RelationDropStorage(), and RelationInvalidateRelation().

◆ RelationDecrementReferenceCount()

void RelationDecrementReferenceCount ( Relation  rel)
extern

Definition at line 2190 of file relcache.c.

2191{
2192 Assert(rel->rd_refcnt > 0);
2193 rel->rd_refcnt -= 1;
2196}
#define Assert(condition)
Definition c.h:943
#define IsBootstrapProcessingMode()
Definition miscadmin.h:495
static void ResourceOwnerForgetRelationRef(ResourceOwner owner, Relation rel)
Definition relcache.c:2163
ResourceOwner CurrentResourceOwner
Definition resowner.c:173
int rd_refcnt
Definition rel.h:59

References Assert, CurrentResourceOwner, IsBootstrapProcessingMode, RelationData::rd_refcnt, and ResourceOwnerForgetRelationRef().

Referenced by DestroyPartitionDirectory(), heap_endscan(), index_endscan(), RelationCacheInitializePhase3(), RelationClose(), and RelationFlushRelation().

◆ RelationGetSmgr()

◆ RelationIncrementReferenceCount()