PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
miscadmin.h File Reference
#include <signal.h>
#include "datatype/timestamp.h"
#include "pgtime.h"
Include dependency graph for miscadmin.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define InvalidPid   (-1)
 
#define INTERRUPTS_PENDING_CONDITION()    (unlikely(InterruptPending))
 
#define CHECK_FOR_INTERRUPTS()
 
#define INTERRUPTS_CAN_BE_PROCESSED()
 
#define HOLD_INTERRUPTS()   (InterruptHoldoffCount++)
 
#define RESUME_INTERRUPTS()
 
#define HOLD_CANCEL_INTERRUPTS()   (QueryCancelHoldoffCount++)
 
#define RESUME_CANCEL_INTERRUPTS()
 
#define START_CRIT_SECTION()   (CritSectionCount++)
 
#define END_CRIT_SECTION()
 
#define USE_POSTGRES_DATES   0
 
#define USE_ISO_DATES   1
 
#define USE_SQL_DATES   2
 
#define USE_GERMAN_DATES   3
 
#define USE_XSD_DATES   4
 
#define DATEORDER_YMD   0
 
#define DATEORDER_DMY   1
 
#define DATEORDER_MDY   2
 
#define INTSTYLE_POSTGRES   0
 
#define INTSTYLE_POSTGRES_VERBOSE   1
 
#define INTSTYLE_SQL_STANDARD   2
 
#define INTSTYLE_ISO_8601   3
 
#define MAXTZLEN   10 /* max TZ name len, not counting tr. null */
 
#define MIN_BAS_VAC_RING_SIZE_KB   128
 
#define MAX_BAS_VAC_RING_SIZE_KB   (16 * 1024 * 1024)
 
#define STACK_DEPTH_SLOP   (512 * 1024)
 
#define SECURITY_LOCAL_USERID_CHANGE   0x0001
 
#define SECURITY_RESTRICTED_OPERATION   0x0002
 
#define SECURITY_NOFORCE_RLS   0x0004
 
#define BACKEND_NUM_TYPES   (B_LOGGER + 1)
 
#define AmRegularBackendProcess()   (MyBackendType == B_BACKEND)
 
#define AmAutoVacuumLauncherProcess()   (MyBackendType == B_AUTOVAC_LAUNCHER)
 
#define AmAutoVacuumWorkerProcess()   (MyBackendType == B_AUTOVAC_WORKER)
 
#define AmBackgroundWorkerProcess()   (MyBackendType == B_BG_WORKER)
 
#define AmWalSenderProcess()   (MyBackendType == B_WAL_SENDER)
 
#define AmLogicalSlotSyncWorkerProcess()   (MyBackendType == B_SLOTSYNC_WORKER)
 
#define AmArchiverProcess()   (MyBackendType == B_ARCHIVER)
 
#define AmBackgroundWriterProcess()   (MyBackendType == B_BG_WRITER)
 
#define AmCheckpointerProcess()   (MyBackendType == B_CHECKPOINTER)
 
#define AmStartupProcess()   (MyBackendType == B_STARTUP)
 
#define AmWalReceiverProcess()   (MyBackendType == B_WAL_RECEIVER)
 
#define AmWalSummarizerProcess()   (MyBackendType == B_WAL_SUMMARIZER)
 
#define AmWalWriterProcess()   (MyBackendType == B_WAL_WRITER)
 
#define AmIoWorkerProcess()   (MyBackendType == B_IO_WORKER)
 
#define AmSpecialWorkerProcess()
 
#define IsExternalConnectionBackend(backend_type)    (backend_type == B_BACKEND || backend_type == B_WAL_SENDER)
 
#define IsBootstrapProcessingMode()   (Mode == BootstrapProcessing)
 
#define IsInitProcessingMode()   (Mode == InitProcessing)
 
#define IsNormalProcessingMode()   (Mode == NormalProcessing)
 
#define GetProcessingMode()   Mode
 
#define SetProcessingMode(mode)
 
#define INIT_PG_LOAD_SESSION_LIBS   0x0001
 
#define INIT_PG_OVERRIDE_ALLOW_CONNS   0x0002
 
#define INIT_PG_OVERRIDE_ROLE_LOGIN   0x0004
 

Typedefs

typedef char * pg_stack_base_t
 
typedef enum BackendType BackendType
 
typedef enum ProcessingMode ProcessingMode
 
typedef void(* shmem_request_hook_type) (void)
 

Enumerations

enum  BackendType {
  B_INVALID = 0 , B_BACKEND , B_DEAD_END_BACKEND , B_AUTOVAC_LAUNCHER ,
  B_AUTOVAC_WORKER , B_BG_WORKER , B_WAL_SENDER , B_SLOTSYNC_WORKER ,
  B_STANDALONE_BACKEND , B_ARCHIVER , B_BG_WRITER , B_CHECKPOINTER ,
  B_IO_WORKER , B_STARTUP , B_WAL_RECEIVER , B_WAL_SUMMARIZER ,
  B_WAL_WRITER , B_LOGGER
}
 
enum  ProcessingMode { BootstrapProcessing , InitProcessing , NormalProcessing }
 

Functions

void ProcessInterrupts (void)
 
pg_stack_base_t set_stack_base (void)
 
void restore_stack_base (pg_stack_base_t base)
 
void check_stack_depth (void)
 
bool stack_is_too_deep (void)
 
ssize_t get_stack_depth_rlimit (void)
 
void PreventCommandIfReadOnly (const char *cmdname)
 
void PreventCommandIfParallelMode (const char *cmdname)
 
void PreventCommandDuringRecovery (const char *cmdname)
 
void InitPostmasterChild (void)
 
void InitStandaloneProcess (const char *argv0)
 
void InitProcessLocalLatch (void)
 
void SwitchToSharedLatch (void)
 
void SwitchBackToLocalLatch (void)
 
const char * GetBackendTypeDesc (BackendType backendType)
 
void SetDatabasePath (const char *path)
 
void checkDataDir (void)
 
void SetDataDir (const char *dir)
 
void ChangeToDataDir (void)
 
char * GetUserNameFromId (Oid roleid, bool noerr)
 
Oid GetUserId (void)
 
Oid GetOuterUserId (void)
 
Oid GetSessionUserId (void)
 
bool GetSessionUserIsSuperuser (void)
 
Oid GetAuthenticatedUserId (void)
 
void SetAuthenticatedUserId (Oid userid)
 
void GetUserIdAndSecContext (Oid *userid, int *sec_context)
 
void SetUserIdAndSecContext (Oid userid, int sec_context)
 
bool InLocalUserIdChange (void)
 
bool InSecurityRestrictedOperation (void)
 
bool InNoForceRLSOperation (void)
 
void GetUserIdAndContext (Oid *userid, bool *sec_def_context)
 
void SetUserIdAndContext (Oid userid, bool sec_def_context)
 
void InitializeSessionUserId (const char *rolename, Oid roleid, bool bypass_login_check)
 
void InitializeSessionUserIdStandalone (void)
 
void SetSessionAuthorization (Oid userid, bool is_superuser)
 
Oid GetCurrentRoleId (void)
 
void SetCurrentRoleId (Oid roleid, bool is_superuser)
 
void InitializeSystemUser (const char *authn_id, const char *auth_method)
 
const char * GetSystemUser (void)
 
bool superuser (void)
 
bool superuser_arg (Oid roleid)
 
void pg_split_opts (char **argv, int *argcp, const char *optstr)
 
void InitializeMaxBackends (void)
 
void InitializeFastPathLocks (void)
 
void InitPostgres (const char *in_dbname, Oid dboid, const char *username, Oid useroid, bits32 flags, char *out_dbname)
 
void BaseInit (void)
 
void CreateDataDirLockFile (bool amPostmaster)
 
void CreateSocketLockFile (const char *socketfile, bool amPostmaster, const char *socketDir)
 
void TouchSocketLockFiles (void)
 
void AddToDataDirLockFile (int target_line, const char *str)
 
bool RecheckDataDirLockFile (void)
 
void ValidatePgVersion (const char *path)
 
void process_shared_preload_libraries (void)
 
void process_session_preload_libraries (void)
 
void process_shmem_requests (void)
 
void pg_bindtextdomain (const char *domain)
 
bool has_rolreplication (Oid roleid)
 
Size EstimateClientConnectionInfoSpace (void)
 
void SerializeClientConnectionInfo (Size maxsize, char *start_address)
 
void RestoreClientConnectionInfo (char *conninfo)
 
size_t get_hash_memory_limit (void)
 

Variables

PGDLLIMPORT volatile sig_atomic_t InterruptPending
 
PGDLLIMPORT volatile sig_atomic_t QueryCancelPending
 
PGDLLIMPORT volatile sig_atomic_t ProcDiePending
 
PGDLLIMPORT volatile sig_atomic_t IdleInTransactionSessionTimeoutPending
 
PGDLLIMPORT volatile sig_atomic_t TransactionTimeoutPending
 
PGDLLIMPORT volatile sig_atomic_t IdleSessionTimeoutPending
 
PGDLLIMPORT volatile sig_atomic_t ProcSignalBarrierPending
 
PGDLLIMPORT volatile sig_atomic_t LogMemoryContextPending
 
PGDLLIMPORT volatile sig_atomic_t IdleStatsUpdateTimeoutPending
 
PGDLLIMPORT volatile sig_atomic_t PublishMemoryContextPending
 
PGDLLIMPORT volatile sig_atomic_t CheckClientConnectionPending
 
PGDLLIMPORT volatile sig_atomic_t ClientConnectionLost
 
PGDLLIMPORT volatile uint32 InterruptHoldoffCount
 
PGDLLIMPORT volatile uint32 QueryCancelHoldoffCount
 
PGDLLIMPORT volatile uint32 CritSectionCount
 
PGDLLIMPORT pid_t PostmasterPid
 
PGDLLIMPORT bool IsPostmasterEnvironment
 
PGDLLIMPORT bool IsUnderPostmaster
 
PGDLLIMPORT bool IsBinaryUpgrade
 
PGDLLIMPORT bool ExitOnAnyError
 
PGDLLIMPORT char * DataDir
 
PGDLLIMPORT int data_directory_mode
 
PGDLLIMPORT int NBuffers
 
PGDLLIMPORT int MaxBackends
 
PGDLLIMPORT int MaxConnections
 
PGDLLIMPORT int max_worker_processes
 
PGDLLIMPORT int max_parallel_workers
 
PGDLLIMPORT int commit_timestamp_buffers
 
PGDLLIMPORT int multixact_member_buffers
 
PGDLLIMPORT int multixact_offset_buffers
 
PGDLLIMPORT int notify_buffers
 
PGDLLIMPORT int serializable_buffers
 
PGDLLIMPORT int subtransaction_buffers
 
PGDLLIMPORT int transaction_buffers
 
PGDLLIMPORT int MyProcPid
 
PGDLLIMPORT pg_time_t MyStartTime
 
PGDLLIMPORT TimestampTz MyStartTimestamp
 
PGDLLIMPORT struct PortMyProcPort
 
PGDLLIMPORT struct LatchMyLatch
 
PGDLLIMPORT char MyCancelKey []
 
PGDLLIMPORT int MyCancelKeyLength
 
PGDLLIMPORT int MyPMChildSlot
 
PGDLLIMPORT char OutputFileName []
 
PGDLLIMPORT char my_exec_path []
 
PGDLLIMPORT char pkglib_path []
 
PGDLLIMPORT Oid MyDatabaseId
 
PGDLLIMPORT Oid MyDatabaseTableSpace
 
PGDLLIMPORT bool MyDatabaseHasLoginEventTriggers
 
PGDLLIMPORT int DateStyle
 
PGDLLIMPORT int DateOrder
 
PGDLLIMPORT int IntervalStyle
 
PGDLLIMPORT bool enableFsync
 
PGDLLIMPORT bool allowSystemTableMods
 
PGDLLIMPORT int work_mem
 
PGDLLIMPORT double hash_mem_multiplier
 
PGDLLIMPORT int maintenance_work_mem
 
PGDLLIMPORT int max_parallel_maintenance_workers
 
PGDLLIMPORT int VacuumBufferUsageLimit
 
PGDLLIMPORT int VacuumCostPageHit
 
PGDLLIMPORT int VacuumCostPageMiss
 
PGDLLIMPORT int VacuumCostPageDirty
 
PGDLLIMPORT int VacuumCostLimit
 
PGDLLIMPORT double VacuumCostDelay
 
PGDLLIMPORT int VacuumCostBalance
 
PGDLLIMPORT bool VacuumCostActive
 
PGDLLIMPORT int max_stack_depth
 
PGDLLIMPORT char * DatabasePath
 
PGDLLIMPORT BackendType MyBackendType
 
PGDLLIMPORT ProcessingMode Mode
 
PGDLLIMPORT bool IgnoreSystemIndexes
 
PGDLLIMPORT bool process_shared_preload_libraries_in_progress
 
PGDLLIMPORT bool process_shared_preload_libraries_done
 
PGDLLIMPORT bool process_shmem_requests_in_progress
 
PGDLLIMPORT char * session_preload_libraries_string
 
PGDLLIMPORT char * shared_preload_libraries_string
 
PGDLLIMPORT char * local_preload_libraries_string
 
PGDLLIMPORT shmem_request_hook_type shmem_request_hook
 

Macro Definition Documentation

◆ AmArchiverProcess

#define AmArchiverProcess ( )    (MyBackendType == B_ARCHIVER)

Definition at line 387 of file miscadmin.h.

◆ AmAutoVacuumLauncherProcess

#define AmAutoVacuumLauncherProcess ( )    (MyBackendType == B_AUTOVAC_LAUNCHER)

Definition at line 382 of file miscadmin.h.

◆ AmAutoVacuumWorkerProcess

#define AmAutoVacuumWorkerProcess ( )    (MyBackendType == B_AUTOVAC_WORKER)

Definition at line 383 of file miscadmin.h.

◆ AmBackgroundWorkerProcess

#define AmBackgroundWorkerProcess ( )    (MyBackendType == B_BG_WORKER)

Definition at line 384 of file miscadmin.h.

◆ AmBackgroundWriterProcess

#define AmBackgroundWriterProcess ( )    (MyBackendType == B_BG_WRITER)

Definition at line 388 of file miscadmin.h.

◆ AmCheckpointerProcess

#define AmCheckpointerProcess ( )    (MyBackendType == B_CHECKPOINTER)

Definition at line 389 of file miscadmin.h.

◆ AmIoWorkerProcess

#define AmIoWorkerProcess ( )    (MyBackendType == B_IO_WORKER)

Definition at line 394 of file miscadmin.h.

◆ AmLogicalSlotSyncWorkerProcess

#define AmLogicalSlotSyncWorkerProcess ( )    (MyBackendType == B_SLOTSYNC_WORKER)

Definition at line 386 of file miscadmin.h.

◆ AmRegularBackendProcess

#define AmRegularBackendProcess ( )    (MyBackendType == B_BACKEND)

Definition at line 381 of file miscadmin.h.

◆ AmSpecialWorkerProcess

#define AmSpecialWorkerProcess ( )
Value:
AmLogicalSlotSyncWorkerProcess())
#define AmAutoVacuumLauncherProcess()
Definition: miscadmin.h:382

Definition at line 396 of file miscadmin.h.

◆ AmStartupProcess

#define AmStartupProcess ( )    (MyBackendType == B_STARTUP)

Definition at line 390 of file miscadmin.h.

◆ AmWalReceiverProcess

#define AmWalReceiverProcess ( )    (MyBackendType == B_WAL_RECEIVER)

Definition at line 391 of file miscadmin.h.

◆ AmWalSenderProcess

#define AmWalSenderProcess ( )    (MyBackendType == B_WAL_SENDER)

Definition at line 385 of file miscadmin.h.

◆ AmWalSummarizerProcess

#define AmWalSummarizerProcess ( )    (MyBackendType == B_WAL_SUMMARIZER)

Definition at line 392 of file miscadmin.h.

◆ AmWalWriterProcess

#define AmWalWriterProcess ( )    (MyBackendType == B_WAL_WRITER)

Definition at line 393 of file miscadmin.h.

◆ BACKEND_NUM_TYPES

#define BACKEND_NUM_TYPES   (B_LOGGER + 1)

Definition at line 377 of file miscadmin.h.

◆ CHECK_FOR_INTERRUPTS

#define CHECK_FOR_INTERRUPTS ( )
Value:
do { \
ProcessInterrupts(); \
} while(0)
#define INTERRUPTS_PENDING_CONDITION()
Definition: miscadmin.h:114

Definition at line 123 of file miscadmin.h.

◆ DATEORDER_DMY

#define DATEORDER_DMY   1

Definition at line 244 of file miscadmin.h.

◆ DATEORDER_MDY

#define DATEORDER_MDY   2

Definition at line 245 of file miscadmin.h.

◆ DATEORDER_YMD

#define DATEORDER_YMD   0

Definition at line 243 of file miscadmin.h.

◆ END_CRIT_SECTION

#define END_CRIT_SECTION ( )
Value:
do { \
Assert(CritSectionCount > 0); \
CritSectionCount--; \
} while(0)
PGDLLIMPORT volatile uint32 CritSectionCount
Definition: globals.c:46

Definition at line 152 of file miscadmin.h.

◆ GetProcessingMode

#define GetProcessingMode ( )    Mode

Definition at line 481 of file miscadmin.h.

◆ HOLD_CANCEL_INTERRUPTS

#define HOLD_CANCEL_INTERRUPTS ( )    (QueryCancelHoldoffCount++)

Definition at line 142 of file miscadmin.h.

◆ HOLD_INTERRUPTS

#define HOLD_INTERRUPTS ( )    (InterruptHoldoffCount++)

Definition at line 134 of file miscadmin.h.

◆ INIT_PG_LOAD_SESSION_LIBS

#define INIT_PG_LOAD_SESSION_LIBS   0x0001

Definition at line 499 of file miscadmin.h.

◆ INIT_PG_OVERRIDE_ALLOW_CONNS

#define INIT_PG_OVERRIDE_ALLOW_CONNS   0x0002

Definition at line 500 of file miscadmin.h.

◆ INIT_PG_OVERRIDE_ROLE_LOGIN

#define INIT_PG_OVERRIDE_ROLE_LOGIN   0x0004

Definition at line 501 of file miscadmin.h.

◆ INTERRUPTS_CAN_BE_PROCESSED

#define INTERRUPTS_CAN_BE_PROCESSED ( )
Value:
QueryCancelHoldoffCount == 0)
PGDLLIMPORT volatile uint32 InterruptHoldoffCount
Definition: globals.c:44

Definition at line 130 of file miscadmin.h.

◆ INTERRUPTS_PENDING_CONDITION

#define INTERRUPTS_PENDING_CONDITION ( )     (unlikely(InterruptPending))

Definition at line 114 of file miscadmin.h.

◆ INTSTYLE_ISO_8601

#define INTSTYLE_ISO_8601   3

Definition at line 260 of file miscadmin.h.

◆ INTSTYLE_POSTGRES

#define INTSTYLE_POSTGRES   0

Definition at line 257 of file miscadmin.h.

◆ INTSTYLE_POSTGRES_VERBOSE

#define INTSTYLE_POSTGRES_VERBOSE   1

Definition at line 258 of file miscadmin.h.

◆ INTSTYLE_SQL_STANDARD

#define INTSTYLE_SQL_STANDARD   2

Definition at line 259 of file miscadmin.h.

◆ InvalidPid

#define InvalidPid   (-1)

Definition at line 32 of file miscadmin.h.

◆ IsBootstrapProcessingMode

#define IsBootstrapProcessingMode ( )    (Mode == BootstrapProcessing)

Definition at line 477 of file miscadmin.h.

◆ IsExternalConnectionBackend

#define IsExternalConnectionBackend (   backend_type)     (backend_type == B_BACKEND || backend_type == B_WAL_SENDER)

Definition at line 405 of file miscadmin.h.

◆ IsInitProcessingMode

#define IsInitProcessingMode ( )    (Mode == InitProcessing)

Definition at line 478 of file miscadmin.h.

◆ IsNormalProcessingMode

#define IsNormalProcessingMode ( )    (Mode == NormalProcessing)

Definition at line 479 of file miscadmin.h.

◆ MAX_BAS_VAC_RING_SIZE_KB

#define MAX_BAS_VAC_RING_SIZE_KB   (16 * 1024 * 1024)

Definition at line 279 of file miscadmin.h.

◆ MAXTZLEN

#define MAXTZLEN   10 /* max TZ name len, not counting tr. null */

Definition at line 264 of file miscadmin.h.

◆ MIN_BAS_VAC_RING_SIZE_KB

#define MIN_BAS_VAC_RING_SIZE_KB   128

Definition at line 278 of file miscadmin.h.

◆ RESUME_CANCEL_INTERRUPTS

#define RESUME_CANCEL_INTERRUPTS ( )
Value:
do { \
Assert(QueryCancelHoldoffCount > 0); \
QueryCancelHoldoffCount--; \
} while(0)
PGDLLIMPORT volatile uint32 QueryCancelHoldoffCount
Definition: globals.c:45

Definition at line 144 of file miscadmin.h.

◆ RESUME_INTERRUPTS

#define RESUME_INTERRUPTS ( )
Value:
do { \
Assert(InterruptHoldoffCount > 0); \
InterruptHoldoffCount--; \
} while(0)

Definition at line 136 of file miscadmin.h.

◆ SECURITY_LOCAL_USERID_CHANGE

#define SECURITY_LOCAL_USERID_CHANGE   0x0001

Definition at line 318 of file miscadmin.h.

◆ SECURITY_NOFORCE_RLS

#define SECURITY_NOFORCE_RLS   0x0004

Definition at line 320 of file miscadmin.h.

◆ SECURITY_RESTRICTED_OPERATION

#define SECURITY_RESTRICTED_OPERATION   0x0002

Definition at line 319 of file miscadmin.h.

◆ SetProcessingMode

#define SetProcessingMode (   mode)
Value:
do { \
Assert((mode) == BootstrapProcessing || \
(mode) == InitProcessing || \
Mode = (mode); \
} while(0)
@ NormalProcessing
Definition: miscadmin.h:472
@ InitProcessing
Definition: miscadmin.h:471
@ BootstrapProcessing
Definition: miscadmin.h:470
static PgChecksumMode mode
Definition: pg_checksums.c:55

Definition at line 483 of file miscadmin.h.

◆ STACK_DEPTH_SLOP

#define STACK_DEPTH_SLOP   (512 * 1024)

Definition at line 297 of file miscadmin.h.

◆ START_CRIT_SECTION

#define START_CRIT_SECTION ( )    (CritSectionCount++)

Definition at line 150 of file miscadmin.h.

◆ USE_GERMAN_DATES

#define USE_GERMAN_DATES   3

Definition at line 239 of file miscadmin.h.

◆ USE_ISO_DATES

#define USE_ISO_DATES   1

Definition at line 237 of file miscadmin.h.

◆ USE_POSTGRES_DATES

#define USE_POSTGRES_DATES   0

Definition at line 236 of file miscadmin.h.

◆ USE_SQL_DATES

#define USE_SQL_DATES   2

Definition at line 238 of file miscadmin.h.

◆ USE_XSD_DATES

#define USE_XSD_DATES   4

Definition at line 240 of file miscadmin.h.

Typedef Documentation

◆ BackendType

typedef enum BackendType BackendType

◆ pg_stack_base_t

typedef char* pg_stack_base_t

Definition at line 299 of file miscadmin.h.

◆ ProcessingMode

◆ shmem_request_hook_type

typedef void(* shmem_request_hook_type) (void)

Definition at line 533 of file miscadmin.h.

Enumeration Type Documentation

◆ BackendType

Enumerator
B_INVALID 
B_BACKEND 
B_DEAD_END_BACKEND 
B_AUTOVAC_LAUNCHER 
B_AUTOVAC_WORKER 
B_BG_WORKER 
B_WAL_SENDER 
B_SLOTSYNC_WORKER 
B_STANDALONE_BACKEND 
B_ARCHIVER 
B_BG_WRITER 
B_CHECKPOINTER 
B_IO_WORKER 
B_STARTUP 
B_WAL_RECEIVER 
B_WAL_SUMMARIZER 
B_WAL_WRITER 
B_LOGGER 

Definition at line 337 of file miscadmin.h.

338{
339 B_INVALID = 0,
340
341 /* Backends and other backend-like processes */
342 B_BACKEND,
349
351
352 /*
353 * Auxiliary processes. These have PGPROC entries, but they are not
354 * attached to any particular database, and cannot run transactions or
355 * even take heavyweight locks. There can be only one of each of these
356 * running at a time.
357 *
358 * If you modify these, make sure to update NUM_AUXILIARY_PROCS and the
359 * glossary in the docs.
360 */
365 B_STARTUP,
369
370 /*
371 * Logger is not connected to shared memory and does not have a PGPROC
372 * entry.
373 */
374 B_LOGGER,
BackendType
Definition: miscadmin.h:338
@ B_WAL_SUMMARIZER
Definition: miscadmin.h:367
@ B_WAL_WRITER
Definition: miscadmin.h:368
@ B_WAL_RECEIVER
Definition: miscadmin.h:366
@ B_CHECKPOINTER
Definition: miscadmin.h:363
@ B_WAL_SENDER
Definition: miscadmin.h:347
@ B_IO_WORKER
Definition: miscadmin.h:364
@ B_LOGGER
Definition: miscadmin.h:374
@ B_STARTUP
Definition: miscadmin.h:365
@ B_BG_WORKER
Definition: miscadmin.h:346
@ B_INVALID
Definition: miscadmin.h:339
@ B_STANDALONE_BACKEND
Definition: miscadmin.h:350
@ B_BG_WRITER
Definition: miscadmin.h:362
@ B_BACKEND
Definition: miscadmin.h:342
@ B_ARCHIVER
Definition: miscadmin.h:361
@ B_AUTOVAC_LAUNCHER
Definition: miscadmin.h:344
@ B_SLOTSYNC_WORKER
Definition: miscadmin.h:348
@ B_DEAD_END_BACKEND
Definition: miscadmin.h:343
@ B_AUTOVAC_WORKER
Definition: miscadmin.h:345

◆ ProcessingMode

Enumerator
BootstrapProcessing 
InitProcessing 
NormalProcessing 

Definition at line 468 of file miscadmin.h.

469{
470 BootstrapProcessing, /* bootstrap creation of template database */
471 InitProcessing, /* initializing system */
472 NormalProcessing, /* normal processing */
ProcessingMode
Definition: miscadmin.h:469

Function Documentation

◆ AddToDataDirLockFile()

void AddToDataDirLockFile ( int  target_line,
const char *  str 
)

Definition at line 1570 of file miscinit.c.

1571{
1572 int fd;
1573 int len;
1574 int lineno;
1575 char *srcptr;
1576 char *destptr;
1577 char srcbuffer[BLCKSZ];
1578 char destbuffer[BLCKSZ];
1579
1580 fd = open(DIRECTORY_LOCK_FILE, O_RDWR | PG_BINARY, 0);
1581 if (fd < 0)
1582 {
1583 ereport(LOG,
1585 errmsg("could not open file \"%s\": %m",
1587 return;
1588 }
1589 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ);
1590 len = read(fd, srcbuffer, sizeof(srcbuffer) - 1);
1592 if (len < 0)
1593 {
1594 ereport(LOG,
1596 errmsg("could not read from file \"%s\": %m",
1598 close(fd);
1599 return;
1600 }
1601 srcbuffer[len] = '\0';
1602
1603 /*
1604 * Advance over lines we are not supposed to rewrite, then copy them to
1605 * destbuffer.
1606 */
1607 srcptr = srcbuffer;
1608 for (lineno = 1; lineno < target_line; lineno++)
1609 {
1610 char *eol = strchr(srcptr, '\n');
1611
1612 if (eol == NULL)
1613 break; /* not enough lines in file yet */
1614 srcptr = eol + 1;
1615 }
1616 memcpy(destbuffer, srcbuffer, srcptr - srcbuffer);
1617 destptr = destbuffer + (srcptr - srcbuffer);
1618
1619 /*
1620 * Fill in any missing lines before the target line, in case lines are
1621 * added to the file out of order.
1622 */
1623 for (; lineno < target_line; lineno++)
1624 {
1625 if (destptr < destbuffer + sizeof(destbuffer))
1626 *destptr++ = '\n';
1627 }
1628
1629 /*
1630 * Write or rewrite the target line.
1631 */
1632 snprintf(destptr, destbuffer + sizeof(destbuffer) - destptr, "%s\n", str);
1633 destptr += strlen(destptr);
1634
1635 /*
1636 * If there are more lines in the old file, append them to destbuffer.
1637 */
1638 if ((srcptr = strchr(srcptr, '\n')) != NULL)
1639 {
1640 srcptr++;
1641 snprintf(destptr, destbuffer + sizeof(destbuffer) - destptr, "%s",
1642 srcptr);
1643 }
1644
1645 /*
1646 * And rewrite the data. Since we write in a single kernel call, this
1647 * update should appear atomic to onlookers.
1648 */
1649 len = strlen(destbuffer);
1650 errno = 0;
1651 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE);
1652 if (pg_pwrite(fd, destbuffer, len, 0) != len)
1653 {
1655 /* if write didn't set errno, assume problem is no disk space */
1656 if (errno == 0)
1657 errno = ENOSPC;
1658 ereport(LOG,
1660 errmsg("could not write to file \"%s\": %m",
1662 close(fd);
1663 return;
1664 }
1666 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC);
1667 if (pg_fsync(fd) != 0)
1668 {
1669 ereport(LOG,
1671 errmsg("could not write to file \"%s\": %m",
1673 }
1675 if (close(fd) != 0)
1676 {
1677 ereport(LOG,
1679 errmsg("could not write to file \"%s\": %m",
1681 }
1682}
#define PG_BINARY
Definition: c.h:1244
int errcode_for_file_access(void)
Definition: elog.c:877
int errmsg(const char *fmt,...)
Definition: elog.c:1071
#define LOG
Definition: elog.h:31
#define ereport(elevel,...)
Definition: elog.h:149
int pg_fsync(int fd)
Definition: fd.c:386
const char * str
#define close(a)
Definition: win32.h:12
#define read(a, b, c)
Definition: win32.h:13
#define DIRECTORY_LOCK_FILE
Definition: miscinit.c:60
const void size_t len
#define pg_pwrite
Definition: port.h:227
#define snprintf
Definition: port.h:239
static int fd(const char *x, int i)
Definition: preproc-init.c:105
static void pgstat_report_wait_start(uint32 wait_event_info)
Definition: wait_event.h:85
static void pgstat_report_wait_end(void)
Definition: wait_event.h:101

References close, DIRECTORY_LOCK_FILE, ereport, errcode_for_file_access(), errmsg(), fd(), len, LOG, PG_BINARY, pg_fsync(), pg_pwrite, pgstat_report_wait_end(), pgstat_report_wait_start(), read, snprintf, and str.

Referenced by InternalIpcMemoryCreate(), PostmasterMain(), process_pm_child_exit(), process_pm_pmsignal(), and process_pm_shutdown_request().

◆ BaseInit()

void BaseInit ( void  )

Definition at line 616 of file postinit.c.

617{
618 Assert(MyProc != NULL);
619
620 /*
621 * Initialize our input/output/debugging file descriptors.
622 */
624
625 /*
626 * Initialize file access. Done early so other subsystems can access
627 * files.
628 */
630
631 /*
632 * Initialize statistics reporting. This needs to happen early to ensure
633 * that pgstat's shutdown callback runs after the shutdown callbacks of
634 * all subsystems that can produce stats (like e.g. transaction commits
635 * can).
636 */
638
639 /*
640 * Initialize AIO before infrastructure that might need to actually
641 * execute AIO.
642 */
644
645 /* Do local initialization of storage and buffer managers */
646 InitSync();
647 smgrinit();
649
650 /*
651 * Initialize temporary file access after pgstat, so that the temporary
652 * file shutdown hook can report temporary file statistics.
653 */
655
656 /*
657 * Initialize local buffers for WAL record construction, in case we ever
658 * try to insert XLOG.
659 */
661
662 /* Initialize lock manager's local structs */
664
665 /*
666 * Initialize replication slots after pgstat. The exit hook might need to
667 * drop ephemeral slots, which in turn triggers stats reporting.
668 */
670
671 /*
672 * The before shmem exit callback frees the DSA memory occupied by the
673 * latest memory context statistics that could be published by this proc
674 * if requested.
675 */
677}
void pgaio_init_backend(void)
Definition: aio_init.c:222
void InitBufferManagerAccess(void)
Definition: bufmgr.c:4006
void DebugFileOpen(void)
Definition: elog.c:2133
void InitFileAccess(void)
Definition: fd.c:903
void InitTemporaryFileAccess(void)
Definition: fd.c:933
Assert(PointerIsAligned(start, uint64))
void before_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:337
void InitLockManagerAccess(void)
Definition: lock.c:501
void AtProcExit_memstats_cleanup(int code, Datum arg)
Definition: mcxt.c:1908
void pgstat_initialize(void)
Definition: pgstat.c:638
void ReplicationSlotInitialize(void)
Definition: slot.c:239
void smgrinit(void)
Definition: smgr.c:188
PGPROC * MyProc
Definition: proc.c:67
void InitSync(void)
Definition: sync.c:124
void InitXLogInsert(void)
Definition: xloginsert.c:1348

References Assert(), AtProcExit_memstats_cleanup(), before_shmem_exit(), DebugFileOpen(), InitBufferManagerAccess(), InitFileAccess(), InitLockManagerAccess(), InitSync(), InitTemporaryFileAccess(), InitXLogInsert(), MyProc, pgaio_init_backend(), pgstat_initialize(), ReplicationSlotInitialize(), and smgrinit().

Referenced by AutoVacLauncherMain(), AutoVacWorkerMain(), AuxiliaryProcessMainCommon(), BackgroundWorkerMain(), BootstrapModeMain(), PostgresMain(), and ReplSlotSyncWorkerMain().

◆ ChangeToDataDir()

void ChangeToDataDir ( void  )

Definition at line 460 of file miscinit.c.

461{
463
464 if (chdir(DataDir) < 0)
467 errmsg("could not change directory to \"%s\": %m",
468 DataDir)));
469}
#define FATAL
Definition: elog.h:41
char * DataDir
Definition: globals.c:72

References Assert(), DataDir, ereport, errcode_for_file_access(), errmsg(), and FATAL.

Referenced by BootstrapModeMain(), PostgresSingleUserMain(), and PostmasterMain().

◆ check_stack_depth()

void check_stack_depth ( void  )

Definition at line 95 of file stack_depth.c.

96{
98 {
100 (errcode(ERRCODE_STATEMENT_TOO_COMPLEX),
101 errmsg("stack depth limit exceeded"),
102 errhint("Increase the configuration parameter \"max_stack_depth\" (currently %dkB), "
103 "after ensuring the platform's stack depth limit is adequate.",
105 }
106}
int errhint(const char *fmt,...)
Definition: elog.c:1318
int errcode(int sqlerrcode)
Definition: elog.c:854
#define ERROR
Definition: elog.h:39
int max_stack_depth
Definition: stack_depth.c:26
bool stack_is_too_deep(void)
Definition: stack_depth.c:109

References ereport, errcode(), errhint(), errmsg(), ERROR, max_stack_depth, and stack_is_too_deep().

Referenced by _jumbleNode(), AlterTypeRecurse(), apply_scanjoin_target_to_paths(), ATAddCheckNNConstraint(), ATExecAddColumn(), ATExecAlterConstrDeferrability(), ATExecAlterConstrEnforceability(), ATExecDropColumn(), ATExecSetNotNull(), CheckAttributeType(), checkCond(), clean_NOT_intree(), clean_stopword_intree(), cntsize(), contains_required_value(), convertJsonbValue(), copyObjectImpl(), Cover(), create_plan_recurse(), datum_to_json_internal(), datum_to_jsonb_internal(), dofindsubquery(), dropconstraint_internal(), emit_jsp_gin_entries(), equal(), eval_const_expressions_mutator(), EventTriggerInvoke(), ExecEndNode(), ExecEvalSubPlan(), ExecInitExprRec(), ExecInitNode(), ExecMakeFunctionResultSet(), ExecProcNodeFirst(), ExecShutdownNode_walker(), execute(), executeAnyItem(), executeBoolItem(), executeItemOptUnwrapTarget(), expand_partitioned_rtentry(), expression_tree_mutator_impl(), expression_tree_walker_impl(), extract_jsp_bool_expr(), fillQT(), find_composite_type_dependencies(), find_matching_subplans_recurse(), findDependentObjects(), findoprnd(), findoprnd_recurse(), flatten_grouping_sets(), flattenJsonPathParseItem(), FreePageManagerDumpBtree(), freetree(), generate_partition_qual(), generate_partitionwise_join_paths(), get_query_def(), get_rels_with_domain(), get_rule_expr(), get_setop_query(), get_steps_using_prefix_recurse(), gistSplit(), hash_range(), hash_range_extended(), hash_record(), hash_record_extended(), hk_depth_search(), infix(), inline_set_returning_function(), int_query_opr_selec(), is_simple_union_all_recurse(), JsonbDeepContains(), lseg_inside_poly(), ltree_execute(), makepol(), maketree(), MatchText(), MultiExecProcNode(), outNode(), p_ishost(), p_isURLPath(), parse_array(), parse_object(), parseNodeString(), plainnode(), planstate_tree_walker_impl(), plperl_hash_from_tuple(), plperl_sv_to_datum(), PLy_input_setup_func(), PLy_output_setup_func(), populate_array_dim_jsonb(), populate_record_field(), printJsonPathItem(), pull_up_sublinks_jointree_recurse(), pull_up_subqueries_recurse(), QT2QTN(), QTNBinary(), QTNClearFlags(), QTNCopy(), QTNFree(), QTNodeCompare(), QTNSort(), QTNTernary(), range_cmp(), range_in(), range_out(), range_recv(), range_send(), raw_expression_tree_walker_impl(), record_cmp(), record_eq(), record_in(), record_out(), record_recv(), record_send(), recurse_set_operations(), regex_selectivity_sub(), relation_is_updatable(), resolve_special_varno(), set_append_rel_size(), setPath(), split_array(), SplitToVariants(), standard_ProcessUtility(), transformExprRecurse(), transformFromClauseItem(), transformSetOperationTree(), traverse_lacons(), try_partitionwise_join(), TS_execute_locations_recurse(), TS_execute_recurse(), TS_phrase_execute(), tsquery_opr_selec(), and tsquery_requires_match().

◆ checkDataDir()

void checkDataDir ( void  )

Definition at line 347 of file miscinit.c.

348{
349 struct stat stat_buf;
350
352
353 if (stat(DataDir, &stat_buf) != 0)
354 {
355 if (errno == ENOENT)
358 errmsg("data directory \"%s\" does not exist",
359 DataDir)));
360 else
363 errmsg("could not read permissions of directory \"%s\": %m",
364 DataDir)));
365 }
366
367 /* eventual chdir would fail anyway, but let's test ... */
368 if (!S_ISDIR(stat_buf.st_mode))
370 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
371 errmsg("specified data directory \"%s\" is not a directory",
372 DataDir)));
373
374 /*
375 * Check that the directory belongs to my userid; if not, reject.
376 *
377 * This check is an essential part of the interlock that prevents two
378 * postmasters from starting in the same directory (see CreateLockFile()).
379 * Do not remove or weaken it.
380 *
381 * XXX can we safely enable this check on Windows?
382 */
383#if !defined(WIN32) && !defined(__CYGWIN__)
384 if (stat_buf.st_uid != geteuid())
386 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
387 errmsg("data directory \"%s\" has wrong ownership",
388 DataDir),
389 errhint("The server must be started by the user that owns the data directory.")));
390#endif
391
392 /*
393 * Check if the directory has correct permissions. If not, reject.
394 *
395 * Only two possible modes are allowed, 0700 and 0750. The latter mode
396 * indicates that group read/execute should be allowed on all newly
397 * created files and directories.
398 *
399 * XXX temporarily suppress check when on Windows, because there may not
400 * be proper support for Unix-y file permissions. Need to think of a
401 * reasonable check to apply on Windows.
402 */
403#if !defined(WIN32) && !defined(__CYGWIN__)
404 if (stat_buf.st_mode & PG_MODE_MASK_GROUP)
406 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
407 errmsg("data directory \"%s\" has invalid permissions",
408 DataDir),
409 errdetail("Permissions should be u=rwx (0700) or u=rwx,g=rx (0750).")));
410#endif
411
412 /*
413 * Reset creation modes and mask based on the mode of the data directory.
414 *
415 * The mask was set earlier in startup to disallow group permissions on
416 * newly created files and directories. However, if group read/execute
417 * are present on the data directory then modify the create modes and mask
418 * to allow group read/execute on newly created files and directories and
419 * set the data_directory_mode GUC.
420 *
421 * Suppress when on Windows, because there may not be proper support for
422 * Unix-y file permissions.
423 */
424#if !defined(WIN32) && !defined(__CYGWIN__)
425 SetDataDirectoryCreatePerm(stat_buf.st_mode);
426
427 umask(pg_mode_mask);
429#endif
430
431 /* Check for PG_VERSION */
433}
int errdetail(const char *fmt,...)
Definition: elog.c:1204
void SetDataDirectoryCreatePerm(int dataDirMode)
Definition: file_perm.c:34
int pg_mode_mask
Definition: file_perm.c:25
int pg_dir_create_mode
Definition: file_perm.c:18
#define PG_MODE_MASK_GROUP
Definition: file_perm.h:29
int data_directory_mode
Definition: globals.c:78
void ValidatePgVersion(const char *path)
Definition: miscinit.c:1769
#define stat
Definition: win32_port.h:274
#define S_ISDIR(m)
Definition: win32_port.h:315

References Assert(), data_directory_mode, DataDir, ereport, errcode(), errcode_for_file_access(), errdetail(), errhint(), errmsg(), FATAL, pg_dir_create_mode, pg_mode_mask, PG_MODE_MASK_GROUP, S_ISDIR, SetDataDirectoryCreatePerm(), stat::st_mode, stat::st_uid, stat, and ValidatePgVersion().

Referenced by BootstrapModeMain(), PostgresSingleUserMain(), and PostmasterMain().

◆ CreateDataDirLockFile()

void CreateDataDirLockFile ( bool  amPostmaster)

Definition at line 1514 of file miscinit.c.

1515{
1516 CreateLockFile(DIRECTORY_LOCK_FILE, amPostmaster, "", true, DataDir);
1517}
static void CreateLockFile(const char *filename, bool amPostmaster, const char *socketDir, bool isDDLock, const char *refName)
Definition: miscinit.c:1209

References CreateLockFile(), DataDir, and DIRECTORY_LOCK_FILE.

Referenced by BootstrapModeMain(), PostgresSingleUserMain(), and PostmasterMain().

◆ CreateSocketLockFile()

void CreateSocketLockFile ( const char *  socketfile,
bool  amPostmaster,
const char *  socketDir 
)

Definition at line 1523 of file miscinit.c.

1525{
1526 char lockfile[MAXPGPATH];
1527
1528 snprintf(lockfile, sizeof(lockfile), "%s.lock", socketfile);
1529 CreateLockFile(lockfile, amPostmaster, socketDir, false, socketfile);
1530}
#define MAXPGPATH

References CreateLockFile(), MAXPGPATH, and snprintf.

Referenced by Lock_AF_UNIX().

◆ EstimateClientConnectionInfoSpace()

Size EstimateClientConnectionInfoSpace ( void  )

Definition at line 1086 of file miscinit.c.

1087{
1088 Size size = 0;
1089
1090 size = add_size(size, sizeof(SerializedClientConnectionInfo));
1091
1093 size = add_size(size, strlen(MyClientConnectionInfo.authn_id) + 1);
1094
1095 return size;
1096}
size_t Size
Definition: c.h:576
ClientConnectionInfo MyClientConnectionInfo
Definition: miscinit.c:1069
Size add_size(Size s1, Size s2)
Definition: shmem.c:493
const char * authn_id
Definition: libpq-be.h:99

References add_size(), ClientConnectionInfo::authn_id, and MyClientConnectionInfo.

Referenced by InitializeParallelDSM().

◆ get_hash_memory_limit()

size_t get_hash_memory_limit ( void  )

Definition at line 3616 of file nodeHash.c.

3617{
3618 double mem_limit;
3619
3620 /* Do initial calculation in double arithmetic */
3621 mem_limit = (double) work_mem * hash_mem_multiplier * 1024.0;
3622
3623 /* Clamp in case it doesn't fit in size_t */
3624 mem_limit = Min(mem_limit, (double) SIZE_MAX);
3625
3626 return (size_t) mem_limit;
3627}
#define Min(x, y)
Definition: c.h:975
double hash_mem_multiplier
Definition: globals.c:133
int work_mem
Definition: globals.c:132

References hash_mem_multiplier, Min, and work_mem.

Referenced by BuildTupleHashTable(), consider_groupingsets_paths(), cost_memoize_rescan(), create_setop_path(), create_unique_path(), ExecChooseHashTableSize(), ExecInitMemoize(), ExecParallelHashIncreaseNumBatches(), final_cost_hashjoin(), hash_agg_set_limits(), hash_choose_num_partitions(), subpath_is_hashable(), and subplan_is_hashable().

◆ get_stack_depth_rlimit()

ssize_t get_stack_depth_rlimit ( void  )

Definition at line 176 of file stack_depth.c.

177{
178#if defined(HAVE_GETRLIMIT)
179 static ssize_t val = 0;
180
181 /* This won't change after process launch, so check just once */
182 if (val == 0)
183 {
184 struct rlimit rlim;
185
186 if (getrlimit(RLIMIT_STACK, &rlim) < 0)
187 val = -1;
188 else if (rlim.rlim_cur == RLIM_INFINITY)
189 val = SSIZE_MAX;
190 /* rlim_cur is probably of an unsigned type, so check for overflow */
191 else if (rlim.rlim_cur >= SSIZE_MAX)
192 val = SSIZE_MAX;
193 else
194 val = rlim.rlim_cur;
195 }
196 return val;
197#else
198 /* On Windows we set the backend stack size in src/backend/Makefile */
199 return WIN32_STACK_RLIMIT;
200#endif
201}
long val
Definition: informix.c:689

References val.

Referenced by check_max_stack_depth(), and InitializeGUCOptionsFromEnvironment().

◆ GetAuthenticatedUserId()

Oid GetAuthenticatedUserId ( void  )

Definition at line 596 of file miscinit.c.

597{
599 return AuthenticatedUserId;
600}
#define OidIsValid(objectId)
Definition: c.h:746
static Oid AuthenticatedUserId
Definition: miscinit.c:500

References Assert(), AuthenticatedUserId, and OidIsValid.

Referenced by check_session_authorization(), and InitializeParallelDSM().

◆ GetBackendTypeDesc()

const char * GetBackendTypeDesc ( BackendType  backendType)

Definition at line 263 of file miscinit.c.

264{
265 const char *backendDesc = gettext_noop("unknown process type");
266
267 switch (backendType)
268 {
269 case B_INVALID:
270 backendDesc = gettext_noop("not initialized");
271 break;
272 case B_ARCHIVER:
273 backendDesc = gettext_noop("archiver");
274 break;
276 backendDesc = gettext_noop("autovacuum launcher");
277 break;
278 case B_AUTOVAC_WORKER:
279 backendDesc = gettext_noop("autovacuum worker");
280 break;
281 case B_BACKEND:
282 backendDesc = gettext_noop("client backend");
283 break;
285 backendDesc = gettext_noop("dead-end client backend");
286 break;
287 case B_BG_WORKER:
288 backendDesc = gettext_noop("background worker");
289 break;
290 case B_BG_WRITER:
291 backendDesc = gettext_noop("background writer");
292 break;
293 case B_CHECKPOINTER:
294 backendDesc = gettext_noop("checkpointer");
295 break;
296 case B_IO_WORKER:
297 backendDesc = gettext_noop("io worker");
298 break;
299 case B_LOGGER:
300 backendDesc = gettext_noop("logger");
301 break;
303 backendDesc = gettext_noop("slotsync worker");
304 break;
306 backendDesc = gettext_noop("standalone backend");
307 break;
308 case B_STARTUP:
309 backendDesc = gettext_noop("startup");
310 break;
311 case B_WAL_RECEIVER:
312 backendDesc = gettext_noop("walreceiver");
313 break;
314 case B_WAL_SENDER:
315 backendDesc = gettext_noop("walsender");
316 break;
317 case B_WAL_SUMMARIZER:
318 backendDesc = gettext_noop("walsummarizer");
319 break;
320 case B_WAL_WRITER:
321 backendDesc = gettext_noop("walwriter");
322 break;
323 }
324
325 return backendDesc;
326}
#define gettext_noop(x)
Definition: c.h:1167

References B_ARCHIVER, B_AUTOVAC_LAUNCHER, B_AUTOVAC_WORKER, B_BACKEND, B_BG_WORKER, B_BG_WRITER, B_CHECKPOINTER, B_DEAD_END_BACKEND, B_INVALID, B_IO_WORKER, B_LOGGER, B_SLOTSYNC_WORKER, B_STANDALONE_BACKEND, B_STARTUP, B_WAL_RECEIVER, B_WAL_SENDER, B_WAL_SUMMARIZER, B_WAL_WRITER, and gettext_noop.

Referenced by BackendInitialize(), BackendStartup(), CleanupBackend(), CountChildren(), get_backend_type_for_log(), init_ps_display(), pg_stat_get_activity(), pg_stat_io_build_tuples(), and signal_child().

◆ GetCurrentRoleId()

Oid GetCurrentRoleId ( void  )

Definition at line 986 of file miscinit.c.

987{
988 if (SetRoleIsActive)
989 return OuterUserId;
990 else
991 return InvalidOid;
992}
static Oid OuterUserId
Definition: miscinit.c:502
static bool SetRoleIsActive
Definition: miscinit.c:512
#define InvalidOid
Definition: postgres_ext.h:35

References InvalidOid, OuterUserId, and SetRoleIsActive.

Referenced by check_role(), InitializeParallelDSM(), and show_role().

◆ GetOuterUserId()

Oid GetOuterUserId ( void  )

Definition at line 531 of file miscinit.c.

532{
534 return OuterUserId;
535}

References Assert(), OidIsValid, and OuterUserId.

Referenced by DropRole(), and RenameRole().

◆ GetSessionUserId()

◆ GetSessionUserIsSuperuser()

bool GetSessionUserIsSuperuser ( void  )

Definition at line 566 of file miscinit.c.

567{
570}
static bool SessionUserIsSuperuser
Definition: miscinit.c:507

References Assert(), OidIsValid, SessionUserId, and SessionUserIsSuperuser.

Referenced by check_session_authorization(), and InitializeParallelDSM().

◆ GetSystemUser()

const char * GetSystemUser ( void  )

Definition at line 586 of file miscinit.c.

587{
588 return SystemUser;
589}
static const char * SystemUser
Definition: miscinit.c:504

References SystemUser.

Referenced by system_user().

◆ GetUserId()

Oid GetUserId ( void  )

Definition at line 520 of file miscinit.c.

521{
523 return CurrentUserId;
524}
static Oid CurrentUserId
Definition: miscinit.c:503

References Assert(), CurrentUserId, and OidIsValid.

Referenced by AfterTriggerSaveEvent(), AggregateCreate(), AlterCollation(), AlterDatabase(), AlterDatabaseOwner(), AlterDatabaseRefreshColl(), AlterDatabaseSet(), AlterEventTrigger(), AlterEventTriggerOwner_internal(), AlterExtensionNamespace(), AlterForeignServer(), AlterForeignServerOwner_internal(), AlterFunction(), AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), AlterOperator(), AlterOpFamilyAdd(), AlterPublication(), AlterPublicationOwner_internal(), AlterRole(), AlterRoleSet(), AlterSchemaOwner_internal(), AlterStatistics(), AlterSubscription(), AlterSubscriptionOwner_internal(), AlterSystemSetConfigFile(), AlterTableMoveAll(), AlterTableSpaceOptions(), AlterTSConfiguration(), AlterTSDictionary(), AlterType(), AlterTypeNamespace_oid(), AlterTypeOwner(), ATExecChangeOwner(), ATPrepAlterColumnType(), ATPrepSetTableSpace(), ATSimplePermissions(), bbsink_server_new(), be_lo_unlink(), binary_upgrade_create_empty_extension(), binary_upgrade_logical_slot_has_caught_up(), brin_desummarize_range(), BuildCachedPlan(), BuildDescForRelation(), BuildIndexValueDescription(), calculate_database_size(), calculate_tablespace_size(), call_pltcl_start_proc(), check_enable_rls(), check_search_path(), check_temp_tablespaces(), CheckCachedPlan(), checkDomainOwner(), checkEnumOwner(), checkFkeyPermissions(), CheckFunctionValidatorAccess(), CheckMyDatabase(), CheckSlotPermissions(), CommentObject(), compile_plperl_function(), compile_pltcl_function(), CompleteCachedPlan(), compute_return_type(), ConfigOptionIsVisible(), convert_and_check_filename(), CreateCast(), CreateConversionCommand(), createdb(), CreateEventTrigger(), CreateExtensionInternal(), CreateForeignDataWrapper(), CreateForeignServer(), CreateForeignTable(), CreateFunction(), CreateOpFamily(), CreateProceduralLanguage(), CreatePublication(), CreateRole(), CreateStatistics(), CreateSubscription(), CreateTableSpace(), CreateTransform(), CreateTriggerFiringOn(), current_user(), currtid_internal(), currval_oid(), DefineAggregate(), DefineCollation(), DefineDomain(), DefineEnum(), DefineIndex(), DefineOpClass(), DefineOperator(), DefineOpFamily(), DefineQueryRewrite(), DefineRange(), DefineRelation(), DefineTSConfiguration(), DefineTSDictionary(), DefineType(), do_setval(), DoCopy(), dropdb(), DropOwnedObjects(), DropRole(), DropSubscription(), DropTableSpace(), emit_audit_message(), EnableDisableRule(), examine_simple_variable(), examine_variable(), ExecAlterDefaultPrivilegesStmt(), ExecAlterExtensionContentsStmt(), ExecAlterExtensionStmt(), ExecAlterObjectDependsStmt(), ExecBuildGroupingEqual(), ExecBuildParamSetEqual(), ExecBuildSlotPartitionKeyDescription(), ExecBuildSlotValueDescription(), ExecCheckOneRelPerms(), ExecGetResultRelCheckAsUser(), ExecGrant_Attribute(), ExecGrant_common(), ExecGrant_Largeobject(), ExecGrant_Parameter(), ExecGrant_Relation(), ExecInitAgg(), ExecInitExprRec(), ExecInitFunc(), ExecInitWindowAgg(), ExecReindex(), ExecSecLabelStmt(), execute_extension_script(), ExecuteCallStmt(), ExecuteDoStmt(), ExecuteGrantStmt(), ExecuteTruncateGuts(), extension_is_trusted(), file_fdw_validator(), findRangeCanonicalFunction(), findRangeSubtypeDiffFunction(), FinishPreparedTransaction(), fmgr_security_definer(), get_connect_string(), get_other_operator(), get_rel_from_relname(), get_rolespec_oid(), get_rolespec_tuple(), get_row_security_policies(), get_tables_to_cluster(), get_tables_to_cluster_partitioned(), GetConfigOptionValues(), gin_clean_pending_list(), GrantRole(), HandleFunctionRequest(), has_any_column_privilege_id(), has_any_column_privilege_name(), has_column_privilege_id_attnum(), has_column_privilege_id_name(), has_column_privilege_name_attnum(), has_column_privilege_name_name(), has_database_privilege_id(), has_database_privilege_name(), has_foreign_data_wrapper_privilege_id(), has_foreign_data_wrapper_privilege_name(), has_function_privilege_id(), has_function_privilege_name(), has_language_privilege_id(), has_language_privilege_name(), has_largeobject_privilege_id(), has_parameter_privilege_name(), has_schema_privilege_id(), has_schema_privilege_name(), has_sequence_privilege_id(), has_sequence_privilege_name(), has_server_privilege_id(), has_server_privilege_name(), has_table_privilege_id(), has_table_privilege_name(), has_tablespace_privilege_id(), has_tablespace_privilege_name(), has_type_privilege_id(), has_type_privilege_name(), have_createdb_privilege(), have_createrole_privilege(), heap_force_common(), ImportForeignSchema(), init_sexpr(), InitializeSearchPath(), InitPostgres(), InitTempTableNamespace(), inline_function(), inline_set_returning_function(), insert_username(), interpret_function_parameter_list(), inv_create(), inv_open(), LargeObjectCreate(), lastval(), LockViewRecurse(), LogicalRepSyncTableStart(), lookup_agg_function(), LookupCreationNamespace(), LookupExplicitNamespace(), MergeAttributes(), movedb(), nextval_internal(), OperatorCreate(), OperatorShellMake(), pg_get_sequence_data(), pg_has_role_id(), pg_has_role_name(), pg_import_system_collations(), pg_prewarm(), pg_sequence_last_value(), pg_sequence_parameters(), pg_signal_backend(), pg_stat_get_wal_receiver(), pg_stat_get_wal_senders(), pg_stat_statements_internal(), pgrowlocks(), pgss_store(), pgstat_get_backend_current_activity(), pltcl_fetch_interp(), postgresBeginDirectModify(), postgresBeginForeignScan(), postgresExecForeignTruncate(), postgresGetForeignRelSize(), postgresImportForeignSchema(), PrepareTempTablespaces(), PrepareTransaction(), PublicationAddTables(), RangeVarCallbackForAlterRelation(), RangeVarCallbackForDropRelation(), RangeVarCallbackForLockTable(), RangeVarCallbackForPolicy(), RangeVarCallbackForReindexIndex(), RangeVarCallbackForRenameRule(), RangeVarCallbackForRenameTrigger(), RangeVarCallbackMaintainsTable(), RangeVarCallbackOwnsRelation(), RangeVarGetAndCheckCreationNamespace(), ReassignOwnedObjects(), recomputeNamespacePath(), REGRESS_exec_check_perms(), REGRESS_object_access_hook(), REGRESS_object_access_hook_str(), REGRESS_utility_command(), ReindexMultipleInternal(), ReindexMultipleTables(), RemoveObjects(), renameatt_check(), RenameDatabase(), RenameRole(), RenameSchema(), RenameTableSpace(), RenameType(), RevalidateCachedQuery(), RI_Initial_Check(), ri_ReportViolation(), select_perl_context(), set_config_option(), set_foreign_rel_properties(), shell_check_detail(), standard_ProcessUtility(), statext_is_compatible_clause(), stats_lock_check_privileges(), superuser(), TargetPrivilegesCheck(), TerminateOtherDBBackends(), transformTableLikeClause(), truncate_check_perms(), user_mapping_ddl_aclcheck(), vacuum_is_permitted_for_relation(), validate_option_array_item(), ValidateJoinEstimator(), ValidateOperatorReference(), and ValidateRestrictionEstimator().

◆ GetUserIdAndContext()

void GetUserIdAndContext ( Oid userid,
bool *  sec_def_context 
)

Definition at line 712 of file miscinit.c.

713{
714 *userid = CurrentUserId;
715 *sec_def_context = InLocalUserIdChange();
716}
bool InLocalUserIdChange(void)
Definition: miscinit.c:681

References CurrentUserId, and InLocalUserIdChange().

◆ GetUserIdAndSecContext()

◆ GetUserNameFromId()

char * GetUserNameFromId ( Oid  roleid,
bool  noerr 
)

Definition at line 1039 of file miscinit.c.

1040{
1041 HeapTuple tuple;
1042 char *result;
1043
1044 tuple = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
1045 if (!HeapTupleIsValid(tuple))
1046 {
1047 if (!noerr)
1048 ereport(ERROR,
1049 (errcode(ERRCODE_UNDEFINED_OBJECT),
1050 errmsg("invalid role OID: %u", roleid)));
1051 result = NULL;
1052 }
1053 else
1054 {
1055 result = pstrdup(NameStr(((Form_pg_authid) GETSTRUCT(tuple))->rolname));
1056 ReleaseSysCache(tuple);
1057 }
1058 return result;
1059}
#define NameStr(name)
Definition: c.h:717
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
static void * GETSTRUCT(const HeapTupleData *tuple)
Definition: htup_details.h:728
char * pstrdup(const char *in)
Definition: mcxt.c:2322
NameData rolname
Definition: pg_authid.h:34
FormData_pg_authid * Form_pg_authid
Definition: pg_authid.h:56
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:257
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:269
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:221

References ereport, errcode(), errmsg(), ERROR, GETSTRUCT(), HeapTupleIsValid, NameStr, ObjectIdGetDatum(), pstrdup(), ReleaseSysCache(), rolname, and SearchSysCache1().

Referenced by AddRoleMems(), check_can_set_role(), check_object_ownership(), check_role_grantor(), check_role_membership_authorization(), current_user(), DelRoleMems(), DropOwnedObjects(), execute_extension_script(), getObjectDescription(), getObjectIdentityParts(), insert_username(), LogicalRepSyncTableStart(), ReassignOwnedObjects(), regroleout(), session_user(), SwitchToUntrustedUser(), and TargetPrivilegesCheck().

◆ has_rolreplication()

bool has_rolreplication ( Oid  roleid)

Definition at line 739 of file miscinit.c.

740{
741 bool result = false;
742 HeapTuple utup;
743
744 /* Superusers bypass all permission checking. */
745 if (superuser_arg(roleid))
746 return true;
747
748 utup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
749 if (HeapTupleIsValid(utup))
750 {
751 result = ((Form_pg_authid) GETSTRUCT(utup))->rolreplication;
752 ReleaseSysCache(utup);
753 }
754 return result;
755}
bool rolreplication
Definition: pg_authid.h:40
bool superuser_arg(Oid roleid)
Definition: superuser.c:56

References GETSTRUCT(), HeapTupleIsValid, ObjectIdGetDatum(), ReleaseSysCache(), rolreplication, SearchSysCache1(), and superuser_arg().

Referenced by AlterRole(), binary_upgrade_logical_slot_has_caught_up(), CheckSlotPermissions(), CreateRole(), and InitPostgres().

◆ InitializeFastPathLocks()

void InitializeFastPathLocks ( void  )

Definition at line 587 of file postinit.c.

588{
589 /* Should be initialized only once. */
591
592 /* we need at least one group */
594
596 {
597 /* stop once we exceed max_locks_per_xact */
599 break;
600
602 }
603
605}
int max_locks_per_xact
Definition: lock.c:53
int FastPathLockGroupsPerBackend
Definition: lock.c:202
#define FP_LOCK_GROUPS_PER_BACKEND_MAX
Definition: proc.h:83
#define FastPathLockSlotsPerBackend()
Definition: proc.h:85

References Assert(), FastPathLockGroupsPerBackend, FastPathLockSlotsPerBackend, FP_LOCK_GROUPS_PER_BACKEND_MAX, and max_locks_per_xact.

Referenced by BootstrapModeMain(), PostgresSingleUserMain(), and PostmasterMain().

◆ InitializeMaxBackends()

void InitializeMaxBackends ( void  )

Definition at line 555 of file postinit.c.

556{
557 Assert(MaxBackends == 0);
558
559 /* Note that this does not include "auxiliary" processes */
562
565 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
566 errmsg("too many server processes configured"),
567 errdetail("\"max_connections\" (%d) plus \"autovacuum_worker_slots\" (%d) plus \"max_worker_processes\" (%d) plus \"max_wal_senders\" (%d) must be less than %d.",
571}
int autovacuum_worker_slots
Definition: autovacuum.c:119
int MaxConnections
Definition: globals.c:144
int MaxBackends
Definition: globals.c:147
int max_worker_processes
Definition: globals.c:145
#define NUM_SPECIAL_WORKER_PROCS
Definition: proc.h:434
#define MAX_BACKENDS
Definition: procnumber.h:39
int max_wal_senders
Definition: walsender.c:126

References Assert(), autovacuum_worker_slots, ereport, errcode(), errdetail(), errmsg(), ERROR, MAX_BACKENDS, max_wal_senders, max_worker_processes, MaxBackends, MaxConnections, and NUM_SPECIAL_WORKER_PROCS.

Referenced by BootstrapModeMain(), PostgresSingleUserMain(), and PostmasterMain().

◆ InitializeSessionUserId()

void InitializeSessionUserId ( const char *  rolename,
Oid  roleid,
bool  bypass_login_check 
)

Definition at line 761 of file miscinit.c.

763{
764 HeapTuple roleTup;
765 Form_pg_authid rform;
766 char *rname;
767 bool is_superuser;
768
769 /*
770 * In a parallel worker, we don't have to do anything here.
771 * ParallelWorkerMain already set our output variables, and we aren't
772 * going to enforce either rolcanlogin or rolconnlimit. Furthermore, we
773 * don't really want to perform a catalog lookup for the role: we don't
774 * want to fail if it's been dropped.
775 */
777 {
778 Assert(bypass_login_check);
779 return;
780 }
781
782 /*
783 * Don't do scans if we're bootstrapping, none of the system catalogs
784 * exist yet, and they should be owned by postgres anyway.
785 */
787
788 /*
789 * Make sure syscache entries are flushed for recent catalog changes. This
790 * allows us to find roles that were created on-the-fly during
791 * authentication.
792 */
794
795 /*
796 * Look up the role, either by name if that's given or by OID if not.
797 */
798 if (rolename != NULL)
799 {
800 roleTup = SearchSysCache1(AUTHNAME, PointerGetDatum(rolename));
801 if (!HeapTupleIsValid(roleTup))
803 (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
804 errmsg("role \"%s\" does not exist", rolename)));
805 }
806 else
807 {
808 roleTup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
809 if (!HeapTupleIsValid(roleTup))
811 (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
812 errmsg("role with OID %u does not exist", roleid)));
813 }
814
815 rform = (Form_pg_authid) GETSTRUCT(roleTup);
816 roleid = rform->oid;
817 rname = NameStr(rform->rolname);
818 is_superuser = rform->rolsuper;
819
821
822 /*
823 * Set SessionUserId and related variables, including "role", via the GUC
824 * mechanisms.
825 *
826 * Note: ideally we would use PGC_S_DYNAMIC_DEFAULT here, so that
827 * session_authorization could subsequently be changed from
828 * pg_db_role_setting entries. Instead, session_authorization in
829 * pg_db_role_setting has no effect. Changing that would require solving
830 * two problems:
831 *
832 * 1. If pg_db_role_setting has values for both session_authorization and
833 * role, we could not be sure which order those would be applied in, and
834 * it would matter.
835 *
836 * 2. Sites may have years-old session_authorization entries. There's not
837 * been any particular reason to remove them. Ending the dormancy of
838 * those entries could seriously change application behavior, so only a
839 * major release should do that.
840 */
841 SetConfigOption("session_authorization", rname,
843
844 /*
845 * These next checks are not enforced when in standalone mode, so that
846 * there is a way to recover from sillinesses like "UPDATE pg_authid SET
847 * rolcanlogin = false;".
848 */
850 {
851 /*
852 * Is role allowed to login at all? (But background workers can
853 * override this by setting bypass_login_check.)
854 */
855 if (!bypass_login_check && !rform->rolcanlogin)
857 (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
858 errmsg("role \"%s\" is not permitted to log in",
859 rname)));
860
861 /*
862 * Check connection limit for this role. We enforce the limit only
863 * for regular backends, since other process types have their own
864 * PGPROC pools.
865 *
866 * There is a race condition here --- we create our PGPROC before
867 * checking for other PGPROCs. If two backends did this at about the
868 * same time, they might both think they were over the limit, while
869 * ideally one should succeed and one fail. Getting that to work
870 * exactly seems more trouble than it is worth, however; instead we
871 * just document that the connection limit is approximate.
872 */
873 if (rform->rolconnlimit >= 0 &&
875 !is_superuser &&
876 CountUserBackends(roleid) > rform->rolconnlimit)
878 (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
879 errmsg("too many connections for role \"%s\"",
880 rname)));
881 }
882
883 ReleaseSysCache(roleTup);
884}
bool InitializingParallelWorker
Definition: parallel.c:121
bool IsUnderPostmaster
Definition: globals.c:121
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition: guc.c:4332
@ PGC_S_OVERRIDE
Definition: guc.h:123
@ PGC_BACKEND
Definition: guc.h:77
void AcceptInvalidationMessages(void)
Definition: inval.c:929
#define IsBootstrapProcessingMode()
Definition: miscadmin.h:477
#define AmRegularBackendProcess()
Definition: miscadmin.h:381
void SetAuthenticatedUserId(Oid userid)
Definition: miscinit.c:603
static bool is_superuser(Archive *fout)
Definition: pg_dump.c:4899
static Datum PointerGetDatum(const void *X)
Definition: postgres.h:327
int CountUserBackends(Oid roleid)
Definition: procarray.c:3700

References AcceptInvalidationMessages(), AmRegularBackendProcess, Assert(), CountUserBackends(), ereport, errcode(), errmsg(), FATAL, GETSTRUCT(), HeapTupleIsValid, InitializingParallelWorker, is_superuser(), IsBootstrapProcessingMode, IsUnderPostmaster, NameStr, ObjectIdGetDatum(), PGC_BACKEND, PGC_S_OVERRIDE, PointerGetDatum(), ReleaseSysCache(), SearchSysCache1(), SetAuthenticatedUserId(), and SetConfigOption().

Referenced by InitPostgres().

◆ InitializeSessionUserIdStandalone()

void InitializeSessionUserIdStandalone ( void  )

Definition at line 891 of file miscinit.c.

892{
893 /*
894 * This function should only be called in single-user mode, in autovacuum
895 * workers, in slot sync worker and in background workers.
896 */
899
900 /* call only once */
902
903 AuthenticatedUserId = BOOTSTRAP_SUPERUSERID;
904
905 /*
906 * XXX Ideally we'd do this via SetConfigOption("session_authorization"),
907 * but we lack the role name needed to do that, and we can't fetch it
908 * because one reason for this special case is to be able to start up even
909 * if something's happened to the BOOTSTRAP_SUPERUSERID's pg_authid row.
910 * Since we don't set the GUC itself, C code will see the value as NULL,
911 * and current_setting() will report an empty string within this session.
912 */
913 SetSessionAuthorization(BOOTSTRAP_SUPERUSERID, true);
914
915 /* We could do SetConfigOption("role"), but let's be consistent */
917}
#define AmAutoVacuumWorkerProcess()
Definition: miscadmin.h:383
#define AmBackgroundWorkerProcess()
Definition: miscadmin.h:384
#define AmLogicalSlotSyncWorkerProcess()
Definition: miscadmin.h:386
void SetSessionAuthorization(Oid userid, bool is_superuser)
Definition: miscinit.c:971
void SetCurrentRoleId(Oid roleid, bool is_superuser)
Definition: miscinit.c:1007

References AmAutoVacuumWorkerProcess, AmBackgroundWorkerProcess, AmLogicalSlotSyncWorkerProcess, Assert(), AuthenticatedUserId, InvalidOid, IsUnderPostmaster, OidIsValid, SetCurrentRoleId(), and SetSessionAuthorization().

Referenced by InitPostgres().

◆ InitializeSystemUser()

void InitializeSystemUser ( const char *  authn_id,
const char *  auth_method 
)

Definition at line 925 of file miscinit.c.

926{
927 char *system_user;
928
929 /* call only once */
930 Assert(SystemUser == NULL);
931
932 /*
933 * InitializeSystemUser should be called only when authn_id is not NULL,
934 * meaning that auth_method is valid.
935 */
936 Assert(authn_id != NULL);
937
938 system_user = psprintf("%s:%s", auth_method, authn_id);
939
940 /* Store SystemUser in long-lived storage */
943}
char * MemoryContextStrdup(MemoryContext context, const char *string)
Definition: mcxt.c:2309
void pfree(void *pointer)
Definition: mcxt.c:2147
MemoryContext TopMemoryContext
Definition: mcxt.c:165
Datum system_user(PG_FUNCTION_ARGS)
Definition: miscinit.c:949
char * psprintf(const char *fmt,...)
Definition: psprintf.c:43
static char * authn_id
Definition: validator.c:41

References Assert(), authn_id, MemoryContextStrdup(), pfree(), psprintf(), system_user(), SystemUser, and TopMemoryContext.

Referenced by InitPostgres(), and ParallelWorkerMain().

◆ InitPostgres()

void InitPostgres ( const char *  in_dbname,
Oid  dboid,
const char *  username,
Oid  useroid,
bits32  flags,
char *  out_dbname 
)

Definition at line 723 of file postinit.c.

727{
728 bool bootstrap = IsBootstrapProcessingMode();
729 bool am_superuser;
730 char *fullpath;
731 char dbname[NAMEDATALEN];
732 int nfree = 0;
733
734 elog(DEBUG3, "InitPostgres");
735
736 /*
737 * Add my PGPROC struct to the ProcArray.
738 *
739 * Once I have done this, I am visible to other backends!
740 */
742
743 /* Initialize status reporting */
745
746 /*
747 * And initialize an entry in the PgBackendStatus array. That way, if
748 * LWLocks or third-party authentication should happen to hang, it is
749 * possible to retrieve some information about what is going on.
750 */
751 if (!bootstrap)
752 {
754 INJECTION_POINT("init-pre-auth");
755 }
756
757 /*
758 * Initialize my entry in the shared-invalidation manager's array of
759 * per-backend data.
760 */
762
764
765 /*
766 * Also set up timeout handlers needed for backend operation. We need
767 * these in every case except bootstrap.
768 */
769 if (!bootstrap)
770 {
781 }
782
783 /*
784 * If this is either a bootstrap process or a standalone backend, start up
785 * the XLOG machinery, and register to have it closed down at exit. In
786 * other cases, the startup process is responsible for starting up the
787 * XLOG machinery, and the checkpointer for closing it down.
788 */
790 {
791 /*
792 * We don't yet have an aux-process resource owner, but StartupXLOG
793 * and ShutdownXLOG will need one. Hence, create said resource owner
794 * (and register a callback to clean it up after ShutdownXLOG runs).
795 */
797
798 StartupXLOG();
799 /* Release (and warn about) any buffer pins leaked in StartupXLOG */
801 /* Reset CurrentResourceOwner to nothing for the moment */
803
804 /*
805 * Use before_shmem_exit() so that ShutdownXLOG() can rely on DSM
806 * segments etc to work (which in turn is required for pgstats).
807 */
810 }
811
812 /*
813 * Initialize the relation cache and the system catalog caches. Note that
814 * no catalog access happens here; we only set up the hashtable structure.
815 * We must do this before starting a transaction because transaction abort
816 * would try to touch these hashtables.
817 */
821
822 /* Initialize portal manager */
824
825 /*
826 * Load relcache entries for the shared system catalogs. This must create
827 * at least entries for pg_database and catalogs used for authentication.
828 */
830
831 /*
832 * Set up process-exit callback to do pre-shutdown cleanup. This is the
833 * one of the first before_shmem_exit callbacks we register; thus, this
834 * will be one the last things we do before low-level modules like the
835 * buffer manager begin to close down. We need to have this in place
836 * before we begin our first transaction --- if we fail during the
837 * initialization transaction, as is entirely possible, we need the
838 * AbortTransaction call to clean up.
839 */
841
842 /* The autovacuum launcher is done here */
844 {
845 /* fill in the remainder of this entry in the PgBackendStatus array */
847
848 return;
849 }
850
851 /*
852 * Start a new transaction here before first access to db.
853 */
854 if (!bootstrap)
855 {
856 /* statement_timestamp must be set for timeouts to work correctly */
859
860 /*
861 * transaction_isolation will have been set to the default by the
862 * above. If the default is "serializable", and we are in hot
863 * standby, we will fail if we don't change it to something lower.
864 * Fortunately, "read committed" is plenty good enough.
865 */
867 }
868
869 /*
870 * Perform client authentication if necessary, then figure out our
871 * postgres user ID, and see if we are a superuser.
872 *
873 * In standalone mode, autovacuum worker processes and slot sync worker
874 * process, we use a fixed ID, otherwise we figure it out from the
875 * authenticated user name.
876 */
878 {
880 am_superuser = true;
881 }
882 else if (!IsUnderPostmaster)
883 {
885 am_superuser = true;
888 (errcode(ERRCODE_UNDEFINED_OBJECT),
889 errmsg("no roles are defined in this database system"),
890 errhint("You should immediately run CREATE USER \"%s\" SUPERUSER;.",
891 username != NULL ? username : "postgres")));
892 }
893 else if (AmBackgroundWorkerProcess())
894 {
895 if (username == NULL && !OidIsValid(useroid))
896 {
898 am_superuser = true;
899 }
900 else
901 {
903 (flags & INIT_PG_OVERRIDE_ROLE_LOGIN) != 0);
904 am_superuser = superuser();
905 }
906 }
907 else
908 {
909 /* normal multiuser case */
910 Assert(MyProcPort != NULL);
912 InitializeSessionUserId(username, useroid, false);
913 /* ensure that auth_method is actually valid, aka authn_id is not NULL */
917 am_superuser = superuser();
918 }
919
920 /* Report any SSL/GSS details for the session. */
921 if (MyProcPort != NULL)
922 {
923 Assert(!bootstrap);
924
926 }
927
928 /*
929 * Binary upgrades only allowed super-user connections
930 */
931 if (IsBinaryUpgrade && !am_superuser)
932 {
934 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
935 errmsg("must be superuser to connect in binary upgrade mode")));
936 }
937
938 /*
939 * The last few regular connection slots are reserved for superusers and
940 * roles with privileges of pg_use_reserved_connections. We do not apply
941 * these limits to background processes, since they all have their own
942 * pools of PGPROC slots.
943 *
944 * Note: At this point, the new backend has already claimed a proc struct,
945 * so we must check whether the number of free slots is strictly less than
946 * the reserved connection limits.
947 */
948 if (AmRegularBackendProcess() && !am_superuser &&
951 {
954 (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
955 errmsg("remaining connection slots are reserved for roles with the %s attribute",
956 "SUPERUSER")));
957
958 if (!has_privs_of_role(GetUserId(), ROLE_PG_USE_RESERVED_CONNECTIONS))
960 (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
961 errmsg("remaining connection slots are reserved for roles with privileges of the \"%s\" role",
962 "pg_use_reserved_connections")));
963 }
964
965 /* Check replication permissions needed for walsender processes. */
966 if (am_walsender)
967 {
968 Assert(!bootstrap);
969
972 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
973 errmsg("permission denied to start WAL sender"),
974 errdetail("Only roles with the %s attribute may start a WAL sender process.",
975 "REPLICATION")));
976 }
977
978 /*
979 * If this is a plain walsender only supporting physical replication, we
980 * don't want to connect to any particular database. Just finish the
981 * backend startup by processing any options from the startup packet, and
982 * we're done.
983 */
985 {
986 /* process any options passed in the startup packet */
987 if (MyProcPort != NULL)
988 process_startup_options(MyProcPort, am_superuser);
989
990 /* Apply PostAuthDelay as soon as we've read all options */
991 if (PostAuthDelay > 0)
992 pg_usleep(PostAuthDelay * 1000000L);
993
994 /* initialize client encoding */
996
997 /* fill in the remainder of this entry in the PgBackendStatus array */
999
1000 /* close the transaction we started above */
1002
1003 return;
1004 }
1005
1006 /*
1007 * Set up the global variables holding database id and default tablespace.
1008 * But note we won't actually try to touch the database just yet.
1009 *
1010 * We take a shortcut in the bootstrap case, otherwise we have to look up
1011 * the db's entry in pg_database.
1012 */
1013 if (bootstrap)
1014 {
1015 dboid = Template1DbOid;
1016 MyDatabaseTableSpace = DEFAULTTABLESPACE_OID;
1017 }
1018 else if (in_dbname != NULL)
1019 {
1020 HeapTuple tuple;
1021 Form_pg_database dbform;
1022
1023 tuple = GetDatabaseTuple(in_dbname);
1024 if (!HeapTupleIsValid(tuple))
1025 ereport(FATAL,
1026 (errcode(ERRCODE_UNDEFINED_DATABASE),
1027 errmsg("database \"%s\" does not exist", in_dbname)));
1028 dbform = (Form_pg_database) GETSTRUCT(tuple);
1029 dboid = dbform->oid;
1030 }
1031 else if (!OidIsValid(dboid))
1032 {
1033 /*
1034 * If this is a background worker not bound to any particular
1035 * database, we're done now. Everything that follows only makes sense
1036 * if we are bound to a specific database. We do need to close the
1037 * transaction we started before returning.
1038 */
1039 if (!bootstrap)
1040 {
1043 }
1044 return;
1045 }
1046
1047 /*
1048 * Now, take a writer's lock on the database we are trying to connect to.
1049 * If there is a concurrently running DROP DATABASE on that database, this
1050 * will block us until it finishes (and has committed its update of
1051 * pg_database).
1052 *
1053 * Note that the lock is not held long, only until the end of this startup
1054 * transaction. This is OK since we will advertise our use of the
1055 * database in the ProcArray before dropping the lock (in fact, that's the
1056 * next thing to do). Anyone trying a DROP DATABASE after this point will
1057 * see us in the array once they have the lock. Ordering is important for
1058 * this because we don't want to advertise ourselves as being in this
1059 * database until we have the lock; otherwise we create what amounts to a
1060 * deadlock with CountOtherDBBackends().
1061 *
1062 * Note: use of RowExclusiveLock here is reasonable because we envision
1063 * our session as being a concurrent writer of the database. If we had a
1064 * way of declaring a session as being guaranteed-read-only, we could use
1065 * AccessShareLock for such sessions and thereby not conflict against
1066 * CREATE DATABASE.
1067 */
1068 if (!bootstrap)
1069 LockSharedObject(DatabaseRelationId, dboid, 0, RowExclusiveLock);
1070
1071 /*
1072 * Recheck pg_database to make sure the target database hasn't gone away.
1073 * If there was a concurrent DROP DATABASE, this ensures we will die
1074 * cleanly without creating a mess.
1075 */
1076 if (!bootstrap)
1077 {
1078 HeapTuple tuple;
1079 Form_pg_database datform;
1080
1081 tuple = GetDatabaseTupleByOid(dboid);
1082 if (HeapTupleIsValid(tuple))
1083 datform = (Form_pg_database) GETSTRUCT(tuple);
1084
1085 if (!HeapTupleIsValid(tuple) ||
1086 (in_dbname && namestrcmp(&datform->datname, in_dbname)))
1087 {
1088 if (in_dbname)
1089 ereport(FATAL,
1090 (errcode(ERRCODE_UNDEFINED_DATABASE),
1091 errmsg("database \"%s\" does not exist", in_dbname),
1092 errdetail("It seems to have just been dropped or renamed.")));
1093 else
1094 ereport(FATAL,
1095 (errcode(ERRCODE_UNDEFINED_DATABASE),
1096 errmsg("database %u does not exist", dboid)));
1097 }
1098
1099 strlcpy(dbname, NameStr(datform->datname), sizeof(dbname));
1100
1101 if (database_is_invalid_form(datform))
1102 {
1103 ereport(FATAL,
1104 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
1105 errmsg("cannot connect to invalid database \"%s\"", dbname),
1106 errhint("Use DROP DATABASE to drop invalid databases."));
1107 }
1108
1109 MyDatabaseTableSpace = datform->dattablespace;
1110 MyDatabaseHasLoginEventTriggers = datform->dathasloginevt;
1111 /* pass the database name back to the caller */
1112 if (out_dbname)
1113 strcpy(out_dbname, dbname);
1114 }
1115
1116 /*
1117 * Now that we rechecked, we are certain to be connected to a database and
1118 * thus can set MyDatabaseId.
1119 *
1120 * It is important that MyDatabaseId only be set once we are sure that the
1121 * target database can no longer be concurrently dropped or renamed. For
1122 * example, without this guarantee, pgstat_update_dbstats() could create
1123 * entries for databases that were just dropped in the pgstat shutdown
1124 * callback, which could confuse other code paths like the autovacuum
1125 * scheduler.
1126 */
1127 MyDatabaseId = dboid;
1128
1129 /*
1130 * Now we can mark our PGPROC entry with the database ID.
1131 *
1132 * We assume this is an atomic store so no lock is needed; though actually
1133 * things would work fine even if it weren't atomic. Anyone searching the
1134 * ProcArray for this database's ID should hold the database lock, so they
1135 * would not be executing concurrently with this store. A process looking
1136 * for another database's ID could in theory see a chance match if it read
1137 * a partially-updated databaseId value; but as long as all such searches
1138 * wait and retry, as in CountOtherDBBackends(), they will certainly see
1139 * the correct value on their next try.
1140 */
1142
1143 /*
1144 * We established a catalog snapshot while reading pg_authid and/or
1145 * pg_database; but until we have set up MyDatabaseId, we won't react to
1146 * incoming sinval messages for unshared catalogs, so we won't realize it
1147 * if the snapshot has been invalidated. Assume it's no good anymore.
1148 */
1150
1151 /*
1152 * Now we should be able to access the database directory safely. Verify
1153 * it's there and looks reasonable.
1154 */
1156
1157 if (!bootstrap)
1158 {
1159 if (access(fullpath, F_OK) == -1)
1160 {
1161 if (errno == ENOENT)
1162 ereport(FATAL,
1163 (errcode(ERRCODE_UNDEFINED_DATABASE),
1164 errmsg("database \"%s\" does not exist",
1165 dbname),
1166 errdetail("The database subdirectory \"%s\" is missing.",
1167 fullpath)));
1168 else
1169 ereport(FATAL,
1171 errmsg("could not access directory \"%s\": %m",
1172 fullpath)));
1173 }
1174
1175 ValidatePgVersion(fullpath);
1176 }
1177
1178 SetDatabasePath(fullpath);
1179 pfree(fullpath);
1180
1181 /*
1182 * It's now possible to do real access to the system catalogs.
1183 *
1184 * Load relcache entries for the system catalogs. This must create at
1185 * least the minimum set of "nailed-in" cache entries.
1186 */
1188
1189 /* set up ACL framework (so CheckMyDatabase can check permissions) */
1191
1192 /*
1193 * Re-read the pg_database row for our database, check permissions and set
1194 * up database-specific GUC settings. We can't do this until all the
1195 * database-access infrastructure is up. (Also, it wants to know if the
1196 * user is a superuser, so the above stuff has to happen first.)
1197 */
1198 if (!bootstrap)
1199 CheckMyDatabase(dbname, am_superuser,
1200 (flags & INIT_PG_OVERRIDE_ALLOW_CONNS) != 0);
1201
1202 /*
1203 * Now process any command-line switches and any additional GUC variable
1204 * settings passed in the startup packet. We couldn't do this before
1205 * because we didn't know if client is a superuser.
1206 */
1207 if (MyProcPort != NULL)
1208 process_startup_options(MyProcPort, am_superuser);
1209
1210 /* Process pg_db_role_setting options */
1212
1213 /* Apply PostAuthDelay as soon as we've read all options */
1214 if (PostAuthDelay > 0)
1215 pg_usleep(PostAuthDelay * 1000000L);
1216
1217 /*
1218 * Initialize various default states that can't be set up until we've
1219 * selected the active user and gotten the right GUC settings.
1220 */
1221
1222 /* set default namespace search path */
1224
1225 /* initialize client encoding */
1227
1228 /* Initialize this backend's session state. */
1230
1231 /*
1232 * If this is an interactive session, load any libraries that should be
1233 * preloaded at backend start. Since those are determined by GUCs, this
1234 * can't happen until GUC settings are complete, but we want it to happen
1235 * during the initial transaction in case anything that requires database
1236 * access needs to be done.
1237 */
1238 if ((flags & INIT_PG_LOAD_SESSION_LIBS) != 0)
1240
1241 /* fill in the remainder of this entry in the PgBackendStatus array */
1242 if (!bootstrap)
1244
1245 /* close the transaction we started above */
1246 if (!bootstrap)
1248}
void initialize_acl(void)
Definition: acl.c:5024
bool has_privs_of_role(Oid member, Oid role)
Definition: acl.c:5268
void pgstat_bestart_security(void)
void pgstat_bestart_initial(void)
void pgstat_beinit(void)
void pgstat_bestart_final(void)
bool database_is_invalid_form(Form_pg_database datform)
Definition: dbcommands.c:3212
#define DEBUG3
Definition: elog.h:28
#define WARNING
Definition: elog.h:36
#define elog(elevel,...)
Definition: elog.h:226
bool MyDatabaseHasLoginEventTriggers
Definition: globals.c:99
int MyCancelKeyLength
Definition: globals.c:54
bool IsBinaryUpgrade
Definition: globals.c:122
Oid MyDatabaseTableSpace
Definition: globals.c:97
char MyCancelKey[MAX_CANCEL_KEY_LENGTH]
Definition: globals.c:53
struct Port * MyProcPort
Definition: globals.c:52
Oid MyDatabaseId
Definition: globals.c:95
const char * hba_authname(UserAuth auth_method)
Definition: hba.c:3123
static char * username
Definition: initdb.c:153
#define INJECTION_POINT(name)
void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
Definition: lmgr.c:1082
#define RowExclusiveLock
Definition: lockdefs.h:38
void InitializeClientEncoding(void)
Definition: mbutils.c:281
#define INIT_PG_LOAD_SESSION_LIBS
Definition: miscadmin.h:499
#define INIT_PG_OVERRIDE_ROLE_LOGIN
Definition: miscadmin.h:501
#define INIT_PG_OVERRIDE_ALLOW_CONNS
Definition: miscadmin.h:500
void InitializeSessionUserId(const char *rolename, Oid roleid, bool bypass_login_check)
Definition: miscinit.c:761
void InitializeSystemUser(const char *authn_id, const char *auth_method)
Definition: miscinit.c:925
void InitializeSessionUserIdStandalone(void)
Definition: miscinit.c:891
void process_session_preload_libraries(void)
Definition: miscinit.c:1916
Oid GetUserId(void)
Definition: miscinit.c:520
Oid GetSessionUserId(void)
Definition: miscinit.c:559
void SetDatabasePath(const char *path)
Definition: miscinit.c:334
bool has_rolreplication(Oid roleid)
Definition: miscinit.c:739
int namestrcmp(Name name, const char *str)
Definition: name.c:247
void InitializeSearchPath(void)
Definition: namespace.c:4736
#define NAMEDATALEN
FormData_pg_database * Form_pg_database
Definition: pg_database.h:96
void pgstat_before_server_shutdown(int code, Datum arg)
Definition: pgstat.c:559
void InitPlanCache(void)
Definition: plancache.c:147
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition: strlcpy.c:45
void EnablePortalManager(void)
Definition: portalmem.c:104
int PostAuthDelay
Definition: postgres.c:99
static void ShutdownPostgres(int code, Datum arg)
Definition: postinit.c:1354
static void IdleInTransactionSessionTimeoutHandler(void)
Definition: postinit.c:1411
static void LockTimeoutHandler(void)
Definition: postinit.c:1393
static void IdleStatsUpdateTimeoutHandler(void)
Definition: postinit.c:1427
static void process_settings(Oid databaseid, Oid roleid)
Definition: postinit.c:1320
static void IdleSessionTimeoutHandler(void)
Definition: postinit.c:1419
static void process_startup_options(Port *port, bool am_superuser)
Definition: postinit.c:1255
static void StatementTimeoutHandler(void)
Definition: postinit.c:1371
static void CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connections)
Definition: postinit.c:323
static bool ThereIsAtLeastOneRole(void)
Definition: postinit.c:1446
static void PerformAuthentication(Port *port)
Definition: postinit.c:194
static void ClientCheckTimeoutHandler(void)
Definition: postinit.c:1435
static HeapTuple GetDatabaseTuple(const char *dbname)
Definition: postinit.c:105
static HeapTuple GetDatabaseTupleByOid(Oid dboid)
Definition: postinit.c:148
static void TransactionTimeoutHandler(void)
Definition: postinit.c:1403
int ReservedConnections
Definition: postmaster.c:230
int SuperuserReservedConnections
Definition: postmaster.c:229
short access
Definition: preproc-type.c:36
void ProcSignalInit(char *cancel_key, int cancel_key_len)
Definition: procsignal.c:165
void RelationCacheInitializePhase3(void)
Definition: relcache.c:4093
void RelationCacheInitialize(void)
Definition: relcache.c:3988
void RelationCacheInitializePhase2(void)
Definition: relcache.c:4034
char * GetDatabasePath(Oid dbOid, Oid spcOid)
Definition: relpath.c:110
void ReleaseAuxProcessResources(bool isCommit)
Definition: resowner.c:1019
ResourceOwner CurrentResourceOwner
Definition: resowner.c:173
void CreateAuxProcessResourceOwner(void)
Definition: resowner.c:999
void InitializeSession(void)
Definition: session.c:54
void pg_usleep(long microsec)
Definition: signal.c:53
void SharedInvalBackendInit(bool sendOnly)
Definition: sinvaladt.c:271
void InvalidateCatalogSnapshot(void)
Definition: snapmgr.c:443
bool HaveNFreeProcs(int n, int *nfree)
Definition: proc.c:783
void CheckDeadLockAlert(void)
Definition: proc.c:1874
void InitProcessPhase2(void)
Definition: proc.c:581
char * dbname
Definition: streamutil.c:49
UserAuth auth_method
Definition: libpq-be.h:105
Oid databaseId
Definition: proc.h:208
bool superuser(void)
Definition: superuser.c:46
void InitCatalogCache(void)
Definition: syscache.c:110
TimeoutId RegisterTimeout(TimeoutId id, timeout_handler_proc handler)
Definition: timeout.c:505
@ IDLE_SESSION_TIMEOUT
Definition: timeout.h:35
@ IDLE_IN_TRANSACTION_SESSION_TIMEOUT
Definition: timeout.h:33
@ LOCK_TIMEOUT
Definition: timeout.h:28
@ STATEMENT_TIMEOUT
Definition: timeout.h:29
@ DEADLOCK_TIMEOUT
Definition: timeout.h:27
@ TRANSACTION_TIMEOUT
Definition: timeout.h:34
@ IDLE_STATS_UPDATE_TIMEOUT
Definition: timeout.h:36
@ CLIENT_CONNECTION_CHECK_TIMEOUT
Definition: timeout.h:37
bool am_walsender
Definition: walsender.c:120
bool am_db_walsender
Definition: walsender.c:123
void StartTransactionCommand(void)
Definition: xact.c:3059
int XactIsoLevel
Definition: xact.c:79
void SetCurrentStatementStartTimestamp(void)
Definition: xact.c:914
void CommitTransactionCommand(void)
Definition: xact.c:3157
#define XACT_READ_COMMITTED
Definition: xact.h:37
void StartupXLOG(void)
Definition: xlog.c:5614
void ShutdownXLOG(int code, Datum arg)
Definition: xlog.c:6790

References am_db_walsender, am_walsender, AmAutoVacuumLauncherProcess, AmAutoVacuumWorkerProcess, AmBackgroundWorkerProcess, AmLogicalSlotSyncWorkerProcess, AmRegularBackendProcess, Assert(), ClientConnectionInfo::auth_method, ClientConnectionInfo::authn_id, before_shmem_exit(), CheckDeadLockAlert(), CheckMyDatabase(), CLIENT_CONNECTION_CHECK_TIMEOUT, ClientCheckTimeoutHandler(), CommitTransactionCommand(), CreateAuxProcessResourceOwner(), CurrentResourceOwner, database_is_invalid_form(), PGPROC::databaseId, dbname, DEADLOCK_TIMEOUT, DEBUG3, elog, EnablePortalManager(), ereport, errcode(), errcode_for_file_access(), errdetail(), errhint(), errmsg(), FATAL, GetDatabasePath(), GetDatabaseTuple(), GetDatabaseTupleByOid(), GetSessionUserId(), GETSTRUCT(), GetUserId(), has_privs_of_role(), has_rolreplication(), HaveNFreeProcs(), hba_authname(), HeapTupleIsValid, IDLE_IN_TRANSACTION_SESSION_TIMEOUT, IDLE_SESSION_TIMEOUT, IDLE_STATS_UPDATE_TIMEOUT, IdleInTransactionSessionTimeoutHandler(), IdleSessionTimeoutHandler(), IdleStatsUpdateTimeoutHandler(), INIT_PG_LOAD_SESSION_LIBS, INIT_PG_OVERRIDE_ALLOW_CONNS, INIT_PG_OVERRIDE_ROLE_LOGIN, InitCatalogCache(), initialize_acl(), InitializeClientEncoding(), InitializeSearchPath(), InitializeSession(), InitializeSessionUserId(), InitializeSessionUserIdStandalone(), InitializeSystemUser(), InitPlanCache(), InitProcessPhase2(), INJECTION_POINT, InvalidateCatalogSnapshot(), IsBinaryUpgrade, IsBootstrapProcessingMode, IsUnderPostmaster, LOCK_TIMEOUT, LockSharedObject(), LockTimeoutHandler(), MyCancelKey, MyCancelKeyLength, MyClientConnectionInfo, MyDatabaseHasLoginEventTriggers, MyDatabaseId, MyDatabaseTableSpace, MyProc, MyProcPort, NAMEDATALEN, NameStr, namestrcmp(), OidIsValid, PerformAuthentication(), pfree(), pg_usleep(), pgstat_before_server_shutdown(), pgstat_beinit(), pgstat_bestart_final(), pgstat_bestart_initial(), pgstat_bestart_security(), PostAuthDelay, process_session_preload_libraries(), process_settings(), process_startup_options(), ProcSignalInit(), RegisterTimeout(), RelationCacheInitialize(), RelationCacheInitializePhase2(), RelationCacheInitializePhase3(), ReleaseAuxProcessResources(), ReservedConnections, RowExclusiveLock, SetCurrentStatementStartTimestamp(), SetDatabasePath(), SharedInvalBackendInit(), ShutdownPostgres(), ShutdownXLOG(), StartTransactionCommand(), StartupXLOG(), STATEMENT_TIMEOUT, StatementTimeoutHandler(), strlcpy(), superuser(), SuperuserReservedConnections, ThereIsAtLeastOneRole(), TRANSACTION_TIMEOUT, TransactionTimeoutHandler(), username, ValidatePgVersion(), WARNING, XACT_READ_COMMITTED, and XactIsoLevel.

Referenced by AutoVacLauncherMain(), AutoVacWorkerMain(), BackgroundWorkerInitializeConnection(), BackgroundWorkerInitializeConnectionByOid(), BootstrapModeMain(), PostgresMain(), and ReplSlotSyncWorkerMain().

◆ InitPostmasterChild()

void InitPostmasterChild ( void  )

Definition at line 96 of file miscinit.c.

97{
98 IsUnderPostmaster = true; /* we are a postmaster subprocess now */
99
100 /*
101 * Start our win32 signal implementation. This has to be done after we
102 * read the backend variables, because we need to pick up the signal pipe
103 * from the parent process.
104 */
105#ifdef WIN32
107#endif
108
110
111 /*
112 * make sure stderr is in binary mode before anything can possibly be
113 * written to it, in case it's actually the syslogger pipe, so the pipe
114 * chunking protocol isn't disturbed. Non-logpipe data gets translated on
115 * redirection (e.g. via pg_ctl -l) anyway.
116 */
117#ifdef WIN32
118 _setmode(fileno(stderr), _O_BINARY);
119#endif
120
121 /* We don't want the postmaster's proc_exit() handlers */
123
124 /* In EXEC_BACKEND case we will not have inherited BlockSig etc values */
125#ifdef EXEC_BACKEND
126 pqinitmask();
127#endif
128
129 /* Initialize process-local latch support */
133
134 /*
135 * If possible, make this process a group leader, so that the postmaster
136 * can signal any child processes too. Not all processes will have
137 * children, but for consistency we make all postmaster child processes do
138 * this.
139 */
140#ifdef HAVE_SETSID
141 if (setsid() < 0)
142 elog(FATAL, "setsid() failed: %m");
143#endif
144
145 /*
146 * Every postmaster child process is expected to respond promptly to
147 * SIGQUIT at all times. Therefore we centrally remove SIGQUIT from
148 * BlockSig and install a suitable signal handler. (Client-facing
149 * processes may choose to replace this default choice of handler with
150 * quickdie().) All other blockable signals remain blocked for now.
151 */
153
154 sigdelset(&BlockSig, SIGQUIT);
155 sigprocmask(SIG_SETMASK, &BlockSig, NULL);
156
157 /* Request a signal if the postmaster dies, if possible. */
159
160 /* Don't give the pipe to subprograms that we execute. */
161#ifndef WIN32
162 if (fcntl(postmaster_alive_fds[POSTMASTER_FD_WATCH], F_SETFD, FD_CLOEXEC) < 0)
165 errmsg_internal("could not set postmaster death monitoring pipe to FD_CLOEXEC mode: %m")));
166#endif
167}
void pqinitmask(void)
Definition: pqsignal.c:41
sigset_t BlockSig
Definition: pqsignal.c:23
int errcode_for_socket_access(void)
Definition: elog.c:954
int errmsg_internal(const char *fmt,...)
Definition: elog.c:1158
void SignalHandlerForCrashExit(SIGNAL_ARGS)
Definition: interrupt.c:77
void on_exit_reset(void)
Definition: ipc.c:416
void InitializeLatchWaitSet(void)
Definition: latch.c:35
void InitProcessLocalLatch(void)
Definition: miscinit.c:235
void PostmasterDeathSignalInit(void)
Definition: pmsignal.c:407
#define pqsignal
Definition: port.h:531
void InitProcessGlobals(void)
Definition: postmaster.c:1932
int postmaster_alive_fds[2]
Definition: postmaster.c:483
#define POSTMASTER_FD_WATCH
Definition: postmaster.h:83
void pgwin32_signal_initialize(void)
Definition: signal.c:79
void InitializeWaitEventSupport(void)
Definition: waiteventset.c:240
#define SIGQUIT
Definition: win32_port.h:159

References BlockSig, elog, ereport, errcode_for_socket_access(), errmsg_internal(), FATAL, InitializeLatchWaitSet(), InitializeWaitEventSupport(), InitProcessGlobals(), InitProcessLocalLatch(), IsUnderPostmaster, on_exit_reset(), pgwin32_signal_initialize(), postmaster_alive_fds, POSTMASTER_FD_WATCH, PostmasterDeathSignalInit(), pqinitmask(), pqsignal, SignalHandlerForCrashExit(), and SIGQUIT.

Referenced by postmaster_child_launch().

◆ InitProcessLocalLatch()

void InitProcessLocalLatch ( void  )

Definition at line 235 of file miscinit.c.

236{
239}
struct Latch * MyLatch
Definition: globals.c:64
void InitLatch(Latch *latch)
Definition: latch.c:63
static Latch LocalLatchData
Definition: miscinit.c:69

References InitLatch(), LocalLatchData, and MyLatch.

Referenced by InitPostmasterChild(), InitStandaloneProcess(), and PostmasterMain().

◆ InitStandaloneProcess()

void InitStandaloneProcess ( const char *  argv0)

Definition at line 175 of file miscinit.c.

176{
178
180
181 /*
182 * Start our win32 signal implementation
183 */
184#ifdef WIN32
186#endif
187
189
190 /* Initialize process-local latch support */
194
195 /*
196 * For consistency with InitPostmasterChild, initialize signal mask here.
197 * But we don't unblock SIGQUIT or provide a default handler for it.
198 */
199 pqinitmask();
200 sigprocmask(SIG_SETMASK, &BlockSig, NULL);
201
202 /* Compute paths, no postmaster to inherit from */
203 if (my_exec_path[0] == '\0')
204 {
206 elog(FATAL, "%s: could not locate my own executable path",
207 argv0);
208 }
209
210 if (pkglib_path[0] == '\0')
212}
int find_my_exec(const char *argv0, char *retpath)
Definition: exec.c:160
char pkglib_path[MAXPGPATH]
Definition: globals.c:83
bool IsPostmasterEnvironment
Definition: globals.c:120
char my_exec_path[MAXPGPATH]
Definition: globals.c:82
BackendType MyBackendType
Definition: miscinit.c:64
static char * argv0
Definition: pg_ctl.c:93
void get_pkglib_path(const char *my_exec_path, char *ret_path)
Definition: path.c:956

References argv0, Assert(), B_STANDALONE_BACKEND, BlockSig, elog, FATAL, find_my_exec(), get_pkglib_path(), InitializeLatchWaitSet(), InitializeWaitEventSupport(), InitProcessGlobals(), InitProcessLocalLatch(), IsPostmasterEnvironment, my_exec_path, MyBackendType, pgwin32_signal_initialize(), pkglib_path, and pqinitmask().

Referenced by BootstrapModeMain(), and PostgresSingleUserMain().

◆ InLocalUserIdChange()

bool InLocalUserIdChange ( void  )

Definition at line 681 of file miscinit.c.

682{
684}
#define SECURITY_LOCAL_USERID_CHANGE
Definition: miscadmin.h:318

References SECURITY_LOCAL_USERID_CHANGE, and SecurityRestrictionContext.

Referenced by GetUserIdAndContext(), and set_config_with_handle().

◆ InNoForceRLSOperation()

bool InNoForceRLSOperation ( void  )

Definition at line 699 of file miscinit.c.

700{
702}
#define SECURITY_NOFORCE_RLS
Definition: miscadmin.h:320

References SECURITY_NOFORCE_RLS, and SecurityRestrictionContext.

Referenced by check_enable_rls().

◆ InSecurityRestrictedOperation()

bool InSecurityRestrictedOperation ( void  )

◆ pg_bindtextdomain()

void pg_bindtextdomain ( const char *  domain)

Definition at line 1939 of file miscinit.c.

1940{
1941#ifdef ENABLE_NLS
1942 if (my_exec_path[0] != '\0')
1943 {
1944 char locale_path[MAXPGPATH];
1945
1946 get_locale_path(my_exec_path, locale_path);
1947 bindtextdomain(domain, locale_path);
1948 pg_bind_textdomain_codeset(domain);
1949 }
1950#endif
1951}
void get_locale_path(const char *my_exec_path, char *ret_path)
Definition: path.c:965

References get_locale_path(), MAXPGPATH, and my_exec_path.

Referenced by _PG_init().

◆ pg_split_opts()

void pg_split_opts ( char **  argv,
int *  argcp,
const char *  optstr 
)

Definition at line 497 of file postinit.c.

498{
500
501 initStringInfo(&s);
502
503 while (*optstr)
504 {
505 bool last_was_escape = false;
506
507 resetStringInfo(&s);
508
509 /* skip over leading space */
510 while (isspace((unsigned char) *optstr))
511 optstr++;
512
513 if (*optstr == '\0')
514 break;
515
516 /*
517 * Parse a single option, stopping at the first space, unless it's
518 * escaped.
519 */
520 while (*optstr)
521 {
522 if (isspace((unsigned char) *optstr) && !last_was_escape)
523 break;
524
525 if (!last_was_escape && *optstr == '\\')
526 last_was_escape = true;
527 else
528 {
529 last_was_escape = false;
530 appendStringInfoChar(&s, *optstr);
531 }
532
533 optstr++;
534 }
535
536 /* now store the option in the next argv[] position */
537 argv[(*argcp)++] = pstrdup(s.data);
538 }
539
540 pfree(s.data);
541}
void resetStringInfo(StringInfo str)
Definition: stringinfo.c:126
void appendStringInfoChar(StringInfo str, char ch)
Definition: stringinfo.c:242
void initStringInfo(StringInfo str)
Definition: stringinfo.c:97

References appendStringInfoChar(), StringInfoData::data, initStringInfo(), pfree(), pstrdup(), and resetStringInfo().

Referenced by process_startup_options().

◆ PreventCommandDuringRecovery()

void PreventCommandDuringRecovery ( const char *  cmdname)

Definition at line 441 of file utility.c.

442{
443 if (RecoveryInProgress())
445 (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
446 /* translator: %s is name of a SQL command, eg CREATE */
447 errmsg("cannot execute %s during recovery",
448 cmdname)));
449}
bool RecoveryInProgress(void)
Definition: xlog.c:6522

References ereport, errcode(), errmsg(), ERROR, and RecoveryInProgress().

Referenced by pg_current_xact_id(), pg_notify(), and standard_ProcessUtility().

◆ PreventCommandIfParallelMode()

void PreventCommandIfParallelMode ( const char *  cmdname)

Definition at line 422 of file utility.c.

423{
424 if (IsInParallelMode())
426 (errcode(ERRCODE_INVALID_TRANSACTION_STATE),
427 /* translator: %s is name of a SQL command, eg CREATE */
428 errmsg("cannot execute %s during a parallel operation",
429 cmdname)));
430}
bool IsInParallelMode(void)
Definition: xact.c:1089

References ereport, errcode(), errmsg(), ERROR, and IsInParallelMode().

Referenced by do_setval(), ExecCheckXactReadOnly(), nextval_internal(), and standard_ProcessUtility().

◆ PreventCommandIfReadOnly()

void PreventCommandIfReadOnly ( const char *  cmdname)

Definition at line 404 of file utility.c.

405{
406 if (XactReadOnly)
408 (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
409 /* translator: %s is name of a SQL command, eg CREATE */
410 errmsg("cannot execute %s in a read-only transaction",
411 cmdname)));
412}
bool XactReadOnly
Definition: xact.c:82

References ereport, errcode(), errmsg(), ERROR, and XactReadOnly.

Referenced by be_lo_creat(), be_lo_create(), be_lo_from_bytea(), be_lo_open(), be_lo_put(), be_lo_truncate(), be_lo_truncate64(), be_lo_unlink(), be_lowrite(), do_setval(), DoCopy(), ExecCheckXactReadOnly(), lo_import_internal(), nextval_internal(), and standard_ProcessUtility().

◆ process_session_preload_libraries()

void process_session_preload_libraries ( void  )

Definition at line 1916 of file miscinit.c.

1917{
1919 "session_preload_libraries",
1920 false);
1922 "local_preload_libraries",
1923 true);
1924}
char * session_preload_libraries_string
Definition: miscinit.c:1832
char * local_preload_libraries_string
Definition: miscinit.c:1834
static void load_libraries(const char *libraries, const char *gucname, bool restricted)
Definition: miscinit.c:1850

References load_libraries(), local_preload_libraries_string, and session_preload_libraries_string.

Referenced by InitPostgres().

◆ process_shared_preload_libraries()

void process_shared_preload_libraries ( void  )

Definition at line 1902 of file miscinit.c.

1903{
1906 "shared_preload_libraries",
1907 false);
1910}
bool process_shared_preload_libraries_done
Definition: miscinit.c:1838
char * shared_preload_libraries_string
Definition: miscinit.c:1833
bool process_shared_preload_libraries_in_progress
Definition: miscinit.c:1837

References load_libraries(), process_shared_preload_libraries_done, process_shared_preload_libraries_in_progress, and shared_preload_libraries_string.

Referenced by PostgresSingleUserMain(), and PostmasterMain().

◆ process_shmem_requests()

void process_shmem_requests ( void  )

Definition at line 1930 of file miscinit.c.

1931{
1936}
bool process_shmem_requests_in_progress
Definition: miscinit.c:1841
shmem_request_hook_type shmem_request_hook
Definition: miscinit.c:1840

References process_shmem_requests_in_progress, and shmem_request_hook.

Referenced by PostgresSingleUserMain(), and PostmasterMain().

◆ ProcessInterrupts()

void ProcessInterrupts ( void  )

Definition at line 3300 of file postgres.c.

3301{
3302 /* OK to accept any interrupts now? */
3303 if (InterruptHoldoffCount != 0 || CritSectionCount != 0)
3304 return;
3305 InterruptPending = false;
3306
3307 if (ProcDiePending)
3308 {
3309 ProcDiePending = false;
3310 QueryCancelPending = false; /* ProcDie trumps QueryCancel */
3312 /* As in quickdie, don't risk sending to client during auth */
3316 ereport(FATAL,
3317 (errcode(ERRCODE_QUERY_CANCELED),
3318 errmsg("canceling authentication due to timeout")));
3319 else if (AmAutoVacuumWorkerProcess())
3320 ereport(FATAL,
3321 (errcode(ERRCODE_ADMIN_SHUTDOWN),
3322 errmsg("terminating autovacuum process due to administrator command")));
3323 else if (IsLogicalWorker())
3324 ereport(FATAL,
3325 (errcode(ERRCODE_ADMIN_SHUTDOWN),
3326 errmsg("terminating logical replication worker due to administrator command")));
3327 else if (IsLogicalLauncher())
3328 {
3330 (errmsg_internal("logical replication launcher shutting down")));
3331
3332 /*
3333 * The logical replication launcher can be stopped at any time.
3334 * Use exit status 1 so the background worker is restarted.
3335 */
3336 proc_exit(1);
3337 }
3338 else if (AmWalReceiverProcess())
3339 ereport(FATAL,
3340 (errcode(ERRCODE_ADMIN_SHUTDOWN),
3341 errmsg("terminating walreceiver process due to administrator command")));
3342 else if (AmBackgroundWorkerProcess())
3343 ereport(FATAL,
3344 (errcode(ERRCODE_ADMIN_SHUTDOWN),
3345 errmsg("terminating background worker \"%s\" due to administrator command",
3347 else if (AmIoWorkerProcess())
3348 {
3350 (errmsg_internal("io worker shutting down due to administrator command")));
3351
3352 proc_exit(0);
3353 }
3354 else
3355 ereport(FATAL,
3356 (errcode(ERRCODE_ADMIN_SHUTDOWN),
3357 errmsg("terminating connection due to administrator command")));
3358 }
3359
3361 {
3363
3364 /*
3365 * Check for lost connection and re-arm, if still configured, but not
3366 * if we've arrived back at DoingCommandRead state. We don't want to
3367 * wake up idle sessions, and they already know how to detect lost
3368 * connections.
3369 */
3371 {
3372 if (!pq_check_connection())
3373 ClientConnectionLost = true;
3374 else
3377 }
3378 }
3379
3381 {
3382 QueryCancelPending = false; /* lost connection trumps QueryCancel */
3384 /* don't send to client, we already know the connection to be dead. */
3386 ereport(FATAL,
3387 (errcode(ERRCODE_CONNECTION_FAILURE),
3388 errmsg("connection to client lost")));
3389 }
3390
3391 /*
3392 * Don't allow query cancel interrupts while reading input from the
3393 * client, because we might lose sync in the FE/BE protocol. (Die
3394 * interrupts are OK, because we won't read any further messages from the
3395 * client in that case.)
3396 *
3397 * See similar logic in ProcessRecoveryConflictInterrupts().
3398 */
3400 {
3401 /*
3402 * Re-arm InterruptPending so that we process the cancel request as
3403 * soon as we're done reading the message. (XXX this is seriously
3404 * ugly: it complicates INTERRUPTS_CAN_BE_PROCESSED(), and it means we
3405 * can't use that macro directly as the initial test in this function,
3406 * meaning that this code also creates opportunities for other bugs to
3407 * appear.)
3408 */
3409 InterruptPending = true;
3410 }
3411 else if (QueryCancelPending)
3412 {
3413 bool lock_timeout_occurred;
3414 bool stmt_timeout_occurred;
3415
3416 QueryCancelPending = false;
3417
3418 /*
3419 * If LOCK_TIMEOUT and STATEMENT_TIMEOUT indicators are both set, we
3420 * need to clear both, so always fetch both.
3421 */
3422 lock_timeout_occurred = get_timeout_indicator(LOCK_TIMEOUT, true);
3423 stmt_timeout_occurred = get_timeout_indicator(STATEMENT_TIMEOUT, true);
3424
3425 /*
3426 * If both were set, we want to report whichever timeout completed
3427 * earlier; this ensures consistent behavior if the machine is slow
3428 * enough that the second timeout triggers before we get here. A tie
3429 * is arbitrarily broken in favor of reporting a lock timeout.
3430 */
3431 if (lock_timeout_occurred && stmt_timeout_occurred &&
3433 lock_timeout_occurred = false; /* report stmt timeout */
3434
3435 if (lock_timeout_occurred)
3436 {
3438 ereport(ERROR,
3439 (errcode(ERRCODE_LOCK_NOT_AVAILABLE),
3440 errmsg("canceling statement due to lock timeout")));
3441 }
3442 if (stmt_timeout_occurred)
3443 {
3445 ereport(ERROR,
3446 (errcode(ERRCODE_QUERY_CANCELED),
3447 errmsg("canceling statement due to statement timeout")));
3448 }
3450 {
3452 ereport(ERROR,
3453 (errcode(ERRCODE_QUERY_CANCELED),
3454 errmsg("canceling autovacuum task")));
3455 }
3456
3457 /*
3458 * If we are reading a command from the client, just ignore the cancel
3459 * request --- sending an extra error message won't accomplish
3460 * anything. Otherwise, go ahead and throw the error.
3461 */
3462 if (!DoingCommandRead)
3463 {
3465 ereport(ERROR,
3466 (errcode(ERRCODE_QUERY_CANCELED),
3467 errmsg("canceling statement due to user request")));
3468 }
3469 }
3470
3473
3475 {
3476 /*
3477 * If the GUC has been reset to zero, ignore the signal. This is
3478 * important because the GUC update itself won't disable any pending
3479 * interrupt. We need to unset the flag before the injection point,
3480 * otherwise we could loop in interrupts checking.
3481 */
3484 {
3485 INJECTION_POINT("idle-in-transaction-session-timeout");
3486 ereport(FATAL,
3487 (errcode(ERRCODE_IDLE_IN_TRANSACTION_SESSION_TIMEOUT),
3488 errmsg("terminating connection due to idle-in-transaction timeout")));
3489 }
3490 }
3491
3493 {
3494 /* As above, ignore the signal if the GUC has been reset to zero. */
3496 if (TransactionTimeout > 0)
3497 {
3498 INJECTION_POINT("transaction-timeout");
3499 ereport(FATAL,
3500 (errcode(ERRCODE_TRANSACTION_TIMEOUT),
3501 errmsg("terminating connection due to transaction timeout")));
3502 }
3503 }
3504
3506 {
3507 /* As above, ignore the signal if the GUC has been reset to zero. */
3509 if (IdleSessionTimeout > 0)
3510 {
3511 INJECTION_POINT("idle-session-timeout");
3512 ereport(FATAL,
3513 (errcode(ERRCODE_IDLE_SESSION_TIMEOUT),
3514 errmsg("terminating connection due to idle-session timeout")));
3515 }
3516 }
3517
3518 /*
3519 * If there are pending stats updates and we currently are truly idle
3520 * (matching the conditions in PostgresMain(), report stats now.
3521 */
3524 {
3526 pgstat_report_stat(true);
3527 }
3528
3531
3534
3537
3540
3543}
volatile sig_atomic_t ParallelApplyMessagePending
void ProcessParallelApplyMessages(void)
void ProcessParallelMessages(void)
Definition: parallel.c:1048
volatile sig_atomic_t ParallelMessagePending
Definition: parallel.c:118
bool IsLogicalWorker(void)
Definition: worker.c:4855
@ DestRemote
Definition: dest.h:89
@ DestNone
Definition: dest.h:87
#define DEBUG1
Definition: elog.h:30
volatile sig_atomic_t IdleStatsUpdateTimeoutPending
Definition: globals.c:43
volatile sig_atomic_t LogMemoryContextPending
Definition: globals.c:41
volatile sig_atomic_t ProcSignalBarrierPending
Definition: globals.c:40
volatile sig_atomic_t InterruptPending
Definition: globals.c:32
volatile sig_atomic_t IdleSessionTimeoutPending
Definition: globals.c:39
volatile uint32 QueryCancelHoldoffCount
Definition: globals.c:45
volatile sig_atomic_t IdleInTransactionSessionTimeoutPending
Definition: globals.c:37
volatile uint32 InterruptHoldoffCount
Definition: globals.c:44
volatile sig_atomic_t TransactionTimeoutPending
Definition: globals.c:38
volatile sig_atomic_t ClientConnectionLost
Definition: globals.c:36
volatile uint32 CritSectionCount
Definition: globals.c:46
volatile sig_atomic_t QueryCancelPending
Definition: globals.c:33
volatile sig_atomic_t PublishMemoryContextPending
Definition: globals.c:42
volatile sig_atomic_t ProcDiePending
Definition: globals.c:34
volatile sig_atomic_t CheckClientConnectionPending
Definition: globals.c:35
void proc_exit(int code)
Definition: ipc.c:104
bool IsLogicalLauncher(void)
Definition: launcher.c:1240
void ProcessGetMemoryContextInterrupt(void)
Definition: mcxt.c:1432
void ProcessLogMemoryContextInterrupt(void)
Definition: mcxt.c:1380
#define AmWalReceiverProcess()
Definition: miscadmin.h:391
#define AmIoWorkerProcess()
Definition: miscadmin.h:394
long pgstat_report_stat(bool force)
Definition: pgstat.c:691
int client_connection_check_interval
Definition: postgres.c:102
CommandDest whereToSendOutput
Definition: postgres.c:91
static volatile sig_atomic_t RecoveryConflictPending
Definition: postgres.c:158
static bool DoingCommandRead
Definition: postgres.c:136
static void ProcessRecoveryConflictInterrupts(void)
Definition: postgres.c:3261
bool ClientAuthInProgress
Definition: postmaster.c:372
BackgroundWorker * MyBgworkerEntry
Definition: postmaster.c:200
bool pq_check_connection(void)
Definition: pqcomm.c:2057
void ProcessProcSignalBarrier(void)
Definition: procsignal.c:498
int IdleSessionTimeout
Definition: proc.c:63
int IdleInTransactionSessionTimeout
Definition: proc.c:61
int TransactionTimeout
Definition: proc.c:62
void LockErrorCleanup(void)
Definition: proc.c:814
char bgw_type[BGW_MAXLEN]
Definition: bgworker.h:92
void enable_timeout_after(TimeoutId id, int delay_ms)
Definition: timeout.c:560
TimestampTz get_timeout_finish_time(TimeoutId id)
Definition: timeout.c:827
bool get_timeout_indicator(TimeoutId id, bool reset_indicator)
Definition: timeout.c:793
bool IsTransactionOrTransactionBlock(void)
Definition: xact.c:4989

References AmAutoVacuumWorkerProcess, AmBackgroundWorkerProcess, AmIoWorkerProcess, AmWalReceiverProcess, BackgroundWorker::bgw_type, CheckClientConnectionPending, client_connection_check_interval, CLIENT_CONNECTION_CHECK_TIMEOUT, ClientAuthInProgress, ClientConnectionLost, CritSectionCount, DEBUG1, DestNone, DestRemote, DoingCommandRead, enable_timeout_after(), ereport, errcode(), errmsg(), errmsg_internal(), ERROR, FATAL, get_timeout_finish_time(), get_timeout_indicator(), IdleInTransactionSessionTimeout, IdleInTransactionSessionTimeoutPending, IdleSessionTimeout, IdleSessionTimeoutPending, IdleStatsUpdateTimeoutPending, INJECTION_POINT, InterruptHoldoffCount, InterruptPending, IsLogicalLauncher(), IsLogicalWorker(), IsTransactionOrTransactionBlock(), LOCK_TIMEOUT, LockErrorCleanup(), LogMemoryContextPending, MyBgworkerEntry, ParallelApplyMessagePending, ParallelMessagePending, pgstat_report_stat(), pq_check_connection(), proc_exit(), ProcDiePending, ProcessGetMemoryContextInterrupt(), ProcessLogMemoryContextInterrupt(), ProcessParallelApplyMessages(), ProcessParallelMessages(), ProcessProcSignalBarrier(), ProcessRecoveryConflictInterrupts(), ProcSignalBarrierPending, PublishMemoryContextPending, QueryCancelHoldoffCount, QueryCancelPending, RecoveryConflictPending, STATEMENT_TIMEOUT, TransactionTimeout, TransactionTimeoutPending, and whereToSendOutput.

Referenced by die().

◆ RecheckDataDirLockFile()

bool RecheckDataDirLockFile ( void  )

Definition at line 1697 of file miscinit.c.

1698{
1699 int fd;
1700 int len;
1701 long file_pid;
1702 char buffer[BLCKSZ];
1703
1704 fd = open(DIRECTORY_LOCK_FILE, O_RDWR | PG_BINARY, 0);
1705 if (fd < 0)
1706 {
1707 /*
1708 * There are many foreseeable false-positive error conditions. For
1709 * safety, fail only on enumerated clearly-something-is-wrong
1710 * conditions.
1711 */
1712 switch (errno)
1713 {
1714 case ENOENT:
1715 case ENOTDIR:
1716 /* disaster */
1717 ereport(LOG,
1719 errmsg("could not open file \"%s\": %m",
1721 return false;
1722 default:
1723 /* non-fatal, at least for now */
1724 ereport(LOG,
1726 errmsg("could not open file \"%s\": %m; continuing anyway",
1728 return true;
1729 }
1730 }
1731 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ);
1732 len = read(fd, buffer, sizeof(buffer) - 1);
1734 if (len < 0)
1735 {
1736 ereport(LOG,
1738 errmsg("could not read from file \"%s\": %m",
1740 close(fd);
1741 return true; /* treat read failure as nonfatal */
1742 }
1743 buffer[len] = '\0';
1744 close(fd);
1745 file_pid = atol(buffer);
1746 if (file_pid == getpid())
1747 return true; /* all is well */
1748
1749 /* Trouble: someone's overwritten the lock file */
1750 ereport(LOG,
1751 (errmsg("lock file \"%s\" contains wrong PID: %ld instead of %ld",
1752 DIRECTORY_LOCK_FILE, file_pid, (long) getpid())));
1753 return false;
1754}

References close, DIRECTORY_LOCK_FILE, ereport, errcode_for_file_access(), errmsg(), fd(), len, LOG, PG_BINARY, pgstat_report_wait_end(), pgstat_report_wait_start(), and read.

Referenced by ServerLoop().

◆ restore_stack_base()

void restore_stack_base ( pg_stack_base_t  base)

Definition at line 77 of file stack_depth.c.

78{
79 stack_base_ptr = base;
80}
static char * stack_base_ptr
Definition: stack_depth.c:35

References stack_base_ptr.

◆ RestoreClientConnectionInfo()

void RestoreClientConnectionInfo ( char *  conninfo)

Definition at line 1134 of file miscinit.c.

1135{
1137
1138 memcpy(&serialized, conninfo, sizeof(serialized));
1139
1140 /* Copy the fields back into place */
1143
1144 if (serialized.authn_id_len >= 0)
1145 {
1146 char *authn_id;
1147
1148 authn_id = conninfo + sizeof(serialized);
1150 authn_id);
1151 }
1152}

References SerializedClientConnectionInfo::auth_method, ClientConnectionInfo::auth_method, ClientConnectionInfo::authn_id, authn_id, SerializedClientConnectionInfo::authn_id_len, MemoryContextStrdup(), MyClientConnectionInfo, and TopMemoryContext.

Referenced by ParallelWorkerMain().

◆ SerializeClientConnectionInfo()

void SerializeClientConnectionInfo ( Size  maxsize,
char *  start_address 
)

Definition at line 1102 of file miscinit.c.

1103{
1104 SerializedClientConnectionInfo serialized = {0};
1105
1106 serialized.authn_id_len = -1;
1108
1110 serialized.authn_id_len = strlen(MyClientConnectionInfo.authn_id);
1111
1112 /* Copy serialized representation to buffer */
1113 Assert(maxsize >= sizeof(serialized));
1114 memcpy(start_address, &serialized, sizeof(serialized));
1115
1116 maxsize -= sizeof(serialized);
1117 start_address += sizeof(serialized);
1118
1119 /* Copy authn_id into the space after the struct */
1120 if (serialized.authn_id_len >= 0)
1121 {
1122 Assert(maxsize >= (serialized.authn_id_len + 1));
1123 memcpy(start_address,
1125 /* include the NULL terminator to ease deserialization */
1126 serialized.authn_id_len + 1);
1127 }
1128}

References Assert(), SerializedClientConnectionInfo::auth_method, ClientConnectionInfo::auth_method, ClientConnectionInfo::authn_id, SerializedClientConnectionInfo::authn_id_len, and MyClientConnectionInfo.

Referenced by InitializeParallelDSM().

◆ set_stack_base()

pg_stack_base_t set_stack_base ( void  )

Definition at line 44 of file stack_depth.c.

45{
46#ifndef HAVE__BUILTIN_FRAME_ADDRESS
47 char stack_base;
48#endif
50
51 old = stack_base_ptr;
52
53 /*
54 * Set up reference point for stack depth checking. On recent gcc we use
55 * __builtin_frame_address() to avoid a warning about storing a local
56 * variable's address in a long-lived variable.
57 */
58#ifdef HAVE__BUILTIN_FRAME_ADDRESS
59 stack_base_ptr = __builtin_frame_address(0);
60#else
61 stack_base_ptr = &stack_base;
62#endif
63
64 return old;
65}
char * pg_stack_base_t
Definition: miscadmin.h:299

References stack_base_ptr.

Referenced by main().

◆ SetAuthenticatedUserId()

void SetAuthenticatedUserId ( Oid  userid)

Definition at line 603 of file miscinit.c.

604{
605 Assert(OidIsValid(userid));
606
607 /* call only once */
609
610 AuthenticatedUserId = userid;
611
612 /* Also mark our PGPROC entry with the authenticated user id */
613 /* (We assume this is an atomic store so no lock is needed) */
614 MyProc->roleId = userid;
615}
Oid roleId
Definition: proc.h:209

References Assert(), AuthenticatedUserId, MyProc, OidIsValid, and PGPROC::roleId.

Referenced by InitializeSessionUserId(), and ParallelWorkerMain().

◆ SetCurrentRoleId()

void SetCurrentRoleId ( Oid  roleid,
bool  is_superuser 
)

Definition at line 1007 of file miscinit.c.

1008{
1009 /*
1010 * Get correct info if it's SET ROLE NONE
1011 *
1012 * If SessionUserId hasn't been set yet, do nothing beyond updating
1013 * SetRoleIsActive --- the eventual SetSessionAuthorization call will
1014 * update the derived state. This is needed since we will get called
1015 * during GUC initialization.
1016 */
1017 if (!OidIsValid(roleid))
1018 {
1019 SetRoleIsActive = false;
1020
1022 return;
1023
1024 roleid = SessionUserId;
1026 }
1027 else
1028 SetRoleIsActive = true;
1029
1031}
static void SetOuterUserId(Oid userid, bool is_superuser)
Definition: miscinit.c:539

References is_superuser(), OidIsValid, SessionUserId, SessionUserIsSuperuser, SetOuterUserId(), and SetRoleIsActive.

Referenced by assign_role(), InitializeSessionUserIdStandalone(), and ParallelWorkerMain().

◆ SetDatabasePath()

void SetDatabasePath ( const char *  path)

Definition at line 334 of file miscinit.c.

335{
336 /* This should happen only once per process */
339}
char * DatabasePath
Definition: globals.c:105

References Assert(), DatabasePath, MemoryContextStrdup(), and TopMemoryContext.

Referenced by InitPostgres().

◆ SetDataDir()

void SetDataDir ( const char *  dir)

Definition at line 440 of file miscinit.c.

441{
442 char *new;
443
444 Assert(dir);
445
446 /* If presented path is relative, convert to absolute */
447 new = make_absolute_path(dir);
448
449 free(DataDir);
450 DataDir = new;
451}
#define free(a)
Definition: header.h:65
char * make_absolute_path(const char *path)
Definition: path.c:807

References Assert(), DataDir, free, and make_absolute_path().

Referenced by SelectConfigFiles().

◆ SetSessionAuthorization()

void SetSessionAuthorization ( Oid  userid,
bool  is_superuser 
)

Definition at line 971 of file miscinit.c.

972{
974
975 if (!SetRoleIsActive)
977}
static void SetSessionUserId(Oid userid, bool is_superuser)
Definition: miscinit.c:573

References is_superuser(), SetOuterUserId(), SetRoleIsActive, and SetSessionUserId().

Referenced by assign_session_authorization(), InitializeSessionUserIdStandalone(), and ParallelWorkerMain().

◆ SetUserIdAndContext()

void SetUserIdAndContext ( Oid  userid,
bool  sec_def_context 
)

Definition at line 719 of file miscinit.c.

720{
721 /* We throw the same error SET ROLE would. */
724 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
725 errmsg("cannot set parameter \"%s\" within security-restricted operation",
726 "role")));
727 CurrentUserId = userid;
728 if (sec_def_context)
730 else
731 SecurityRestrictionContext &= ~SECURITY_LOCAL_USERID_CHANGE;
732}
bool InSecurityRestrictedOperation(void)
Definition: miscinit.c:690

References CurrentUserId, ereport, errcode(), errmsg(), ERROR, InSecurityRestrictedOperation(), SECURITY_LOCAL_USERID_CHANGE, and SecurityRestrictionContext.

◆ SetUserIdAndSecContext()

◆ stack_is_too_deep()

bool stack_is_too_deep ( void  )

Definition at line 109 of file stack_depth.c.

110{
111 char stack_top_loc;
112 ssize_t stack_depth;
113
114 /*
115 * Compute distance from reference point to my local variables
116 */
117 stack_depth = (ssize_t) (stack_base_ptr - &stack_top_loc);
118
119 /*
120 * Take abs value, since stacks grow up on some machines, down on others
121 */
122 if (stack_depth < 0)
123 stack_depth = -stack_depth;
124
125 /*
126 * Trouble?
127 *
128 * The test on stack_base_ptr prevents us from erroring out if called
129 * before that's been set. Logically it should be done first, but putting
130 * it last avoids wasting cycles during normal cases.
131 */
132 if (stack_depth > max_stack_depth_bytes &&
133 stack_base_ptr != NULL)
134 return true;
135
136 return false;
137}
static ssize_t max_stack_depth_bytes
Definition: stack_depth.c:29

References max_stack_depth_bytes, and stack_base_ptr.

Referenced by check_stack_depth(), MemoryContextStatsInternal(), rstacktoodeep(), and ShowTransactionStateRec().

◆ superuser()

bool superuser ( void  )

Definition at line 46 of file superuser.c.

47{
48 return superuser_arg(GetUserId());
49}

References GetUserId(), and superuser_arg().

Referenced by AlterForeignDataWrapper(), AlterForeignDataWrapperOwner_internal(), AlterForeignServerOwner_internal(), AlterFunction(), AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), AlterOpFamily(), AlterPublicationOwner_internal(), AlterRole(), AlterRoleSet(), AlterSubscription(), AlterSubscriptionOwner_internal(), AlterSystemSetConfigFile(), AlterType(), AlterTypeOwner(), ATExecChangeOwner(), brin_metapage_info(), brin_page_items(), brin_page_type(), brin_revmap_data(), bt_metap(), bt_multi_page_stats(), bt_page_items_bytea(), bt_page_items_internal(), bt_page_stats_internal(), check_encoding_locale_matches(), CheckAlterPublication(), CreateAccessMethod(), CreateCast(), CreateEventTrigger(), CreateForeignDataWrapper(), CreateFunction(), CreateProceduralLanguage(), CreatePublication(), CreateRole(), CreateSubscription(), CreateTableSpace(), dblink_connstr_check(), dblink_security_check(), DefineAggregate(), DefineOpClass(), DefineOpFamily(), DefineTSParser(), DefineTSTemplate(), DefineType(), DropRole(), dummy_object_relabel(), EnableDisableTrigger(), ExecSetVariableStmt(), execute_extension_script(), ExecuteDoStmt(), fmgr_security_definer(), fsm_page_contents(), get_raw_page_internal(), gin_leafpage_items(), gin_metapage_info(), gin_page_opaque_info(), gist_page_items(), gist_page_items_bytea(), gist_page_opaque_info(), GUCArrayReset(), hash_bitmap_info(), hash_metapage_info(), hash_page_items(), hash_page_stats(), hash_page_type(), have_createdb_privilege(), heap_page_items(), heap_tuple_infomask_flags(), InitPostgres(), interpret_func_support(), main(), page_checksum_internal(), page_header(), pg_buffercache_superuser_check(), pg_import_system_collations(), pg_nextoid(), pg_relpages(), pg_relpagesbyid(), pg_signal_backend(), pg_stop_making_pinned_objects(), pgstat_get_backend_current_activity(), pgstatginindex(), pgstatindex(), pgstatindexbyid(), pgstattuple(), pgstattuple_approx(), pgstattuplebyid(), postgres_fdw_validator(), ProcedureCreate(), regress_setenv(), RenameRole(), sepgsql_restorecon(), set_config_by_name(), SetPGVariable(), standard_ProcessUtility(), TerminateOtherDBBackends(), tuple_data_split(), validate_option_array_item(), and wait_pid().

◆ superuser_arg()

bool superuser_arg ( Oid  roleid)

Definition at line 56 of file superuser.c.

57{
58 bool result;
59 HeapTuple rtup;
60
61 /* Quick out for cache hit */
62 if (OidIsValid(last_roleid) && last_roleid == roleid)
64
65 /* Special escape path in case you deleted all your users. */
66 if (!IsUnderPostmaster && roleid == BOOTSTRAP_SUPERUSERID)
67 return true;
68
69 /* OK, look up the information in pg_authid */
70 rtup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
71 if (HeapTupleIsValid(rtup))
72 {
73 result = ((Form_pg_authid) GETSTRUCT(rtup))->rolsuper;
74 ReleaseSysCache(rtup);
75 }
76 else
77 {
78 /* Report "not superuser" for invalid roleids */
79 result = false;
80 }
81
82 /* If first time through, set up callback for cache flushes */
84 {
87 (Datum) 0);
89 }
90
91 /* Cache the result for next time */
92 last_roleid = roleid;
93 last_roleid_is_super = result;
94
95 return result;
96}
void CacheRegisterSyscacheCallback(int cacheid, SyscacheCallbackFunction func, Datum arg)
Definition: inval.c:1802
bool rolsuper
Definition: pg_authid.h:35
uintptr_t Datum
Definition: postgres.h:69
static Oid last_roleid
Definition: superuser.c:35
static bool roleid_callback_registered
Definition: superuser.c:37
static void RoleidCallback(Datum arg, int cacheid, uint32 hashvalue)
Definition: superuser.c:103
static bool last_roleid_is_super
Definition: superuser.c:36

References CacheRegisterSyscacheCallback(), GETSTRUCT(), HeapTupleIsValid, IsUnderPostmaster, last_roleid, last_roleid_is_super, ObjectIdGetDatum(), OidIsValid, ReleaseSysCache(), roleid_callback_registered, RoleidCallback(), rolsuper, and SearchSysCache1().

Referenced by AlterEventTriggerOwner_internal(), AlterForeignDataWrapperOwner_internal(), AlterPublicationOwner_internal(), check_conn_params(), check_object_ownership(), check_role_grantor(), check_role_membership_authorization(), check_session_authorization(), CreateRole(), CreateSubscription(), DropSubscription(), emit_audit_message(), GetSubscription(), has_bypassrls_privilege(), has_createrole_privilege(), has_privs_of_role(), has_rolreplication(), is_admin_of_role(), is_member_of_role(), LockGXact(), member_can_set_role(), object_aclmask_ext(), object_ownercheck(), pg_class_aclmask_ext(), pg_largeobject_aclmask_snapshot(), pg_namespace_aclmask_ext(), pg_parameter_acl_aclmask(), pg_parameter_aclmask(), pg_signal_backend(), pg_type_aclmask_ext(), pgfdw_security_check(), REGRESS_exec_check_perms(), REGRESS_object_access_hook(), REGRESS_object_access_hook_str(), REGRESS_utility_command(), select_best_grantor(), superuser(), and TerminateOtherDBBackends().

◆ SwitchBackToLocalLatch()

void SwitchBackToLocalLatch ( void  )

Definition at line 242 of file miscinit.c.

243{
245 Assert(MyProc != NULL && MyLatch == &MyProc->procLatch);
246
248
249 if (FeBeWaitSet)
251 MyLatch);
252
254}
void SetLatch(Latch *latch)
Definition: latch.c:288
#define FeBeWaitSetLatchPos
Definition: libpq.h:64
WaitEventSet * FeBeWaitSet
Definition: pqcomm.c:166
Latch procLatch
Definition: proc.h:170
void ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
Definition: waiteventset.c:655
#define WL_LATCH_SET
Definition: waiteventset.h:34

References Assert(), FeBeWaitSet, FeBeWaitSetLatchPos, LocalLatchData, ModifyWaitEvent(), MyLatch, MyProc, PGPROC::procLatch, SetLatch(), and WL_LATCH_SET.

Referenced by AuxiliaryProcKill(), and ProcKill().

◆ SwitchToSharedLatch()

void SwitchToSharedLatch ( void  )

Definition at line 215 of file miscinit.c.

216{
218 Assert(MyProc != NULL);
219
221
222 if (FeBeWaitSet)
224 MyLatch);
225
226 /*
227 * Set the shared latch as the local one might have been set. This
228 * shouldn't normally be necessary as code is supposed to check the
229 * condition before waiting for the latch, but a bit care can't hurt.
230 */
232}

References Assert(), FeBeWaitSet, FeBeWaitSetLatchPos, LocalLatchData, ModifyWaitEvent(), MyLatch, MyProc, PGPROC::procLatch, SetLatch(), and WL_LATCH_SET.

Referenced by InitAuxiliaryProcess(), and InitProcess().

◆ TouchSocketLockFiles()

void TouchSocketLockFiles ( void  )

Definition at line 1541 of file miscinit.c.

1542{
1543 ListCell *l;
1544
1545 foreach(l, lock_files)
1546 {
1547 char *socketLockFile = (char *) lfirst(l);
1548
1549 /* No need to touch the data directory lock file, we trust */
1550 if (strcmp(socketLockFile, DIRECTORY_LOCK_FILE) == 0)
1551 continue;
1552
1553 /* we just ignore any error here */
1554 (void) utime(socketLockFile, NULL);
1555 }
1556}
static List * lock_files
Definition: miscinit.c:67
#define lfirst(lc)
Definition: pg_list.h:172

References DIRECTORY_LOCK_FILE, lfirst, and lock_files.

Referenced by ServerLoop().

◆ ValidatePgVersion()

void ValidatePgVersion ( const char *  path)

Definition at line 1769 of file miscinit.c.

1770{
1771 char full_path[MAXPGPATH];
1772 FILE *file;
1773 int ret;
1774 long file_major;
1775 long my_major;
1776 char *endptr;
1777 char file_version_string[64];
1778 const char *my_version_string = PG_VERSION;
1779
1780 my_major = strtol(my_version_string, &endptr, 10);
1781
1782 snprintf(full_path, sizeof(full_path), "%s/PG_VERSION", path);
1783
1784 file = AllocateFile(full_path, "r");
1785 if (!file)
1786 {
1787 if (errno == ENOENT)
1788 ereport(FATAL,
1789 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1790 errmsg("\"%s\" is not a valid data directory",
1791 path),
1792 errdetail("File \"%s\" is missing.", full_path)));
1793 else
1794 ereport(FATAL,
1796 errmsg("could not open file \"%s\": %m", full_path)));
1797 }
1798
1799 file_version_string[0] = '\0';
1800 ret = fscanf(file, "%63s", file_version_string);
1801 file_major = strtol(file_version_string, &endptr, 10);
1802
1803 if (ret != 1 || endptr == file_version_string)
1804 ereport(FATAL,
1805 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1806 errmsg("\"%s\" is not a valid data directory",
1807 path),
1808 errdetail("File \"%s\" does not contain valid data.",
1809 full_path),
1810 errhint("You might need to initdb.")));
1811
1812 FreeFile(file);
1813
1814 if (my_major != file_major)
1815 ereport(FATAL,
1816 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1817 errmsg("database files are incompatible with server"),
1818 errdetail("The data directory was initialized by PostgreSQL version %s, "
1819 "which is not compatible with this version %s.",
1820 file_version_string, my_version_string)));
1821}
int FreeFile(FILE *file)
Definition: fd.c:2843
FILE * AllocateFile(const char *name, const char *mode)
Definition: fd.c:2644

References AllocateFile(), ereport, errcode(), errcode_for_file_access(), errdetail(), errhint(), errmsg(), FATAL, FreeFile(), MAXPGPATH, and snprintf.

Referenced by checkDataDir(), and InitPostgres().

Variable Documentation

◆ allowSystemTableMods

◆ CheckClientConnectionPending

PGDLLIMPORT volatile sig_atomic_t CheckClientConnectionPending
extern

Definition at line 35 of file globals.c.

Referenced by ClientCheckTimeoutHandler(), and ProcessInterrupts().

◆ ClientConnectionLost

PGDLLIMPORT volatile sig_atomic_t ClientConnectionLost
extern

Definition at line 36 of file globals.c.

Referenced by internal_flush_buffer(), and ProcessInterrupts().

◆ commit_timestamp_buffers

PGDLLIMPORT int commit_timestamp_buffers
extern

Definition at line 162 of file globals.c.

Referenced by CommitTsShmemBuffers(), and CommitTsShmemInit().

◆ CritSectionCount

◆ data_directory_mode

PGDLLIMPORT int data_directory_mode
extern

Definition at line 78 of file globals.c.

Referenced by checkDataDir(), RetrieveDataDirCreatePerm(), and show_data_directory_mode().

◆ DatabasePath

◆ DataDir

◆ DateOrder

PGDLLIMPORT int DateOrder
extern

◆ DateStyle

◆ enableFsync

◆ ExitOnAnyError

PGDLLIMPORT bool ExitOnAnyError
extern

Definition at line 124 of file globals.c.

Referenced by BeginInternalSubTransaction(), CheckpointerMain(), and errstart().

◆ hash_mem_multiplier

PGDLLIMPORT double hash_mem_multiplier
extern

Definition at line 133 of file globals.c.

Referenced by get_hash_memory_limit().

◆ IdleInTransactionSessionTimeoutPending

PGDLLIMPORT volatile sig_atomic_t IdleInTransactionSessionTimeoutPending
extern

Definition at line 37 of file globals.c.

Referenced by IdleInTransactionSessionTimeoutHandler(), and ProcessInterrupts().

◆ IdleSessionTimeoutPending

PGDLLIMPORT volatile sig_atomic_t IdleSessionTimeoutPending
extern

Definition at line 39 of file globals.c.

Referenced by IdleSessionTimeoutHandler(), and ProcessInterrupts().

◆ IdleStatsUpdateTimeoutPending

PGDLLIMPORT volatile sig_atomic_t IdleStatsUpdateTimeoutPending
extern

Definition at line 43 of file globals.c.

Referenced by IdleStatsUpdateTimeoutHandler(), and ProcessInterrupts().

◆ IgnoreSystemIndexes

PGDLLIMPORT bool IgnoreSystemIndexes
extern

◆ InterruptHoldoffCount

◆ InterruptPending

◆ IntervalStyle

PGDLLIMPORT int IntervalStyle
extern

◆ IsBinaryUpgrade

◆ IsPostmasterEnvironment

◆ IsUnderPostmaster

PGDLLIMPORT bool IsUnderPostmaster
extern

Definition at line 121 of file globals.c.

Referenced by _PG_init(), AdvanceNextFullTransactionIdPastXid(), AutoVacuumShmemInit(), AuxiliaryProcessMainCommon(), BackgroundWorkerShmemInit(), bootstrap_signals(), BootstrapModeMain(), BTreeShmemInit(), CheckMyDatabase(), CheckRecoveryConsistency(), CommitTsShmemInit(), createdb(), CreateLWLocks(), CreateOrAttachShmemStructs(), CreateRestartPoint(), CreateSharedMemoryAndSemaphores(), DebugFileOpen(), dsm_attach(), dsm_backend_startup(), dsm_create(), dsm_impl_pin_segment(), dsm_impl_posix_resize(), dsm_impl_unpin_segment(), dsm_postmaster_startup(), EventTriggerDDLCommandEnd(), EventTriggerDDLCommandStart(), EventTriggerOnLogin(), EventTriggerSQLDrop(), EventTriggerTableRewrite(), ForwardSyncRequest(), get_slru_entry(), GetNewMultiXactId(), GetNewTransactionId(), GetQuitSignalReason(), init_ps_display(), InitAuxiliaryProcess(), InitializeLatchWaitSet(), InitializeSessionUserId(), InitializeSessionUserIdStandalone(), InitializeWaitEventSupport(), InitPostgres(), InitPostmasterChild(), InitProcess(), InitSync(), InjectionPointShmemInit(), LWLockAcquire(), MaintainLatestCompletedXidRecovery(), MultiXactShmemInit(), parallel_vacuum_compute_workers(), PerformRecoveryXLogAction(), PerformWalRecovery(), pg_get_shmem_pagesize(), pgaio_io_wait(), pgaio_worker_needs_synchronous_execution(), PGSemaphoreCreate(), PGSharedMemoryNoReAttach(), PGSharedMemoryReAttach(), pgss_shmem_startup(), pgstat_fetch_entry(), pgstat_read_statsfile(), pgstat_report_autovac(), pgstat_report_recovery_conflict(), pgstat_shutdown_hook(), pgstat_wal_flush_cb(), pgstat_write_statsfile(), plan_create_index_workers(), PostgresMain(), PostgresSingleUserMain(), postmaster_child_launch(), PredicateLockShmemInit(), process_postgres_switches(), process_settings(), ProcessConfigFile(), ProcessConfigFileInternal(), ProcessStartupProcInterrupts(), readRecoverySignalFile(), RegisterBackgroundWorker(), RegisterDynamicBackgroundWorker(), ReplicationSlotAcquire(), SendPostmasterSignal(), SerialInit(), set_config_sourcefile(), set_config_with_handle(), SetMultiXactIdLimit(), SetTransactionIdLimit(), ShmemInitStruct(), SimpleLruInit(), standard_planner(), start_xact_command(), StatsShmemInit(), superuser_arg(), SyncScanShmemInit(), TwoPhaseShmemInit(), vacuum_delay_point(), VarsupShmemInit(), verify_dictoptions(), WaitLatch(), WaitLatchOrSocket(), XLogArchiveNotify(), XLogPageRead(), XLogPrefetchIncrement(), XLogRecGetFullXid(), and XLogWrite().

◆ local_preload_libraries_string

PGDLLIMPORT char* local_preload_libraries_string
extern

Definition at line 1834 of file miscinit.c.

Referenced by process_session_preload_libraries().

◆ LogMemoryContextPending

◆ maintenance_work_mem

◆ max_parallel_maintenance_workers

PGDLLIMPORT int max_parallel_maintenance_workers
extern

Definition at line 135 of file globals.c.

Referenced by parallel_vacuum_compute_workers(), and plan_create_index_workers().

◆ max_parallel_workers

PGDLLIMPORT int max_parallel_workers
extern

Definition at line 146 of file globals.c.

Referenced by RegisterDynamicBackgroundWorker().

◆ max_stack_depth

PGDLLIMPORT int max_stack_depth
extern

Definition at line 26 of file stack_depth.c.

Referenced by check_stack_depth().

◆ max_worker_processes

◆ MaxBackends

◆ MaxConnections

◆ Mode

Definition at line 62 of file miscinit.c.

◆ multixact_member_buffers

PGDLLIMPORT int multixact_member_buffers
extern

Definition at line 163 of file globals.c.

Referenced by MultiXactShmemInit(), and MultiXactShmemSize().

◆ multixact_offset_buffers

PGDLLIMPORT int multixact_offset_buffers
extern

Definition at line 164 of file globals.c.

Referenced by MultiXactShmemInit(), and MultiXactShmemSize().

◆ my_exec_path

◆ MyBackendType

◆ MyCancelKey

PGDLLIMPORT char MyCancelKey[]
extern

Definition at line 53 of file globals.c.

Referenced by InitPostgres(), and PostgresMain().

◆ MyCancelKeyLength

PGDLLIMPORT int MyCancelKeyLength
extern

Definition at line 54 of file globals.c.

Referenced by InitPostgres(), and PostgresMain().

◆ MyDatabaseHasLoginEventTriggers

PGDLLIMPORT bool MyDatabaseHasLoginEventTriggers
extern

Definition at line 99 of file globals.c.

Referenced by EventTriggerOnLogin(), and InitPostgres().

◆ MyDatabaseId

PGDLLIMPORT Oid MyDatabaseId
extern

Definition at line 95 of file globals.c.

Referenced by AfterTriggerSetState(), AlterDatabase(), AlterObjectRename_internal(), AlterPublicationOwner_internal(), AlterSchemaOwner_internal(), AlterSubscription(), AlterSubscriptionOwner(), AlterSubscriptionOwner_internal(), asyncQueueNotificationToEntry(), asyncQueueProcessPageEntries(), ATExecDetachPartition(), AutoVacuumRequestWork(), CacheInvalidateCatalog(), CacheInvalidateHeapTupleCommon(), CacheInvalidateRelcache(), CacheInvalidateRelcacheByTuple(), CacheInvalidateRelSync(), check_default_table_access_method(), check_default_tablespace(), check_default_text_search_config(), check_temp_tablespaces(), CheckLogicalDecodingRequirements(), CheckMyDatabase(), checkSharedDependencies(), checkTempNamespaceStatus(), classIdGetDbId(), ComputeXidHorizons(), ConditionalLockDatabaseObject(), create_pg_locale_builtin(), create_pg_locale_icu(), create_pg_locale_libc(), CreateDecodingContext(), CreateInitDecodingContext(), CreatePublication(), CreateSchemaCommand(), CreateSubscription(), current_database(), database_to_xml_internal(), DeconstructQualifiedName(), do_analyze_rel(), do_autovacuum(), dropdb(), DropSubscription(), EventTriggerOnLogin(), Exec_ListenPreCommit(), exec_object_restorecon(), exec_replication_command(), ExecuteTruncateGuts(), ExpandColumnRefStar(), ExportSnapshot(), extension_is_trusted(), find_funcstat_entry(), find_tabstat_entry(), get_subscription_oid(), GetCurrentVirtualXIDs(), GetNewRelFileNumber(), GetRunningTransactionData(), heap_inplace_update_and_unlock(), heap_vacuum_rel(), IdentifySystem(), ImportSnapshot(), init_database_collation(), initialize_acl(), InitializeParallelDSM(), InitPostgres(), InitTempTableNamespace(), InitWalSender(), InitWalSenderSlot(), libpqrcv_exec(), LocalExecuteInvalidationMessage(), LockApplyTransactionForSession(), LockDatabaseFrozenIds(), LockDatabaseObject(), LockGXact(), logical_heap_rewrite_flush_mappings(), logical_rewrite_log_mapping(), LogLogicalMessage(), LogStandbyInvalidations(), map_sql_catalog_to_xmlschema_types(), map_sql_schema_to_xmlschema_types(), map_sql_table_to_xmlschema(), map_sql_type_to_xml_name(), match_db_entries(), movedb(), perform_relmap_update(), perform_work_item(), pg_collation_actual_version(), pg_namespace_aclmask_ext(), pg_relation_filepath(), pg_stat_reset_single_function_counters(), pg_stat_reset_single_table_counters(), pgss_store(), pgstat_bestart_final(), pgstat_build_snapshot(), pgstat_copy_relation_stats(), pgstat_create_function(), pgstat_create_relation(), pgstat_drop_function(), pgstat_drop_relation(), pgstat_fetch_stat_funcentry(), pgstat_fetch_stat_tabentry_ext(), pgstat_init_function_usage(), pgstat_prep_database_pending(), pgstat_prep_relation_pending(), pgstat_report_analyze(), pgstat_report_connect(), pgstat_report_deadlock(), pgstat_report_disconnect(), pgstat_report_recovery_conflict(), pgstat_report_tempfile(), pgstat_report_vacuum(), pgstat_reset_counters(), pgstat_reset_database_timestamp(), pgstat_shutdown_hook(), pgstat_update_dbstats(), pgstat_update_parallel_workers_stats(), PostgresMain(), PrepareToInvalidateCacheTuple(), PrepareTransaction(), ProcArrayInstallImportedXmin(), ProcArrayInstallRestoredXmin(), RangeVarGetAndCheckCreationNamespace(), RangeVarGetCreationNamespace(), RangeVarGetRelidExtended(), read_stream_begin_impl(), ReindexMultipleTables(), RelationInitLockInfo(), RelationInitPhysicalAddr(), RelationMapFinishBootstrap(), RenameDatabase(), RenameSchema(), ReplicationSlotCreate(), roles_is_member_of(), ScanPgRelation(), SearchSysCacheLocked1(), sepgsql_schema_post_create(), SetDatabaseHasLoginEventTriggers(), SetLocktagRelationOid(), shdepDropOwned(), shdepReassignOwned(), SignalBackends(), stats_lock_check_privileges(), transformColumnRef(), UnlockApplyTransactionForSession(), UnlockDatabaseObject(), UpdateLogicalMappings(), vac_truncate_clog(), vac_update_datfrozenxid(), vacuum_is_permitted_for_relation(), XactLogAbortRecord(), and XactLogCommitRecord().

◆ MyDatabaseTableSpace

◆ MyLatch

PGDLLIMPORT struct Latch* MyLatch
extern

Definition at line 64 of file globals.c.

Referenced by ApplyLauncherMain(), autoprewarm_main(), AutoVacLauncherMain(), avl_sigusr2_handler(), BackgroundWriterMain(), CheckDeadLockAlert(), CheckpointerMain(), CheckpointWriteDelay(), ClientCheckTimeoutHandler(), ConditionVariableTimedSleep(), ConfigurePostmasterWaitSet(), copy_read_data(), die(), do_pg_backup_stop(), ExecAppendAsyncEventWait(), gather_readnext(), handle_pm_child_exit_signal(), handle_pm_pmsignal_signal(), handle_pm_reload_request_signal(), handle_pm_shutdown_request_signal(), handle_sig_alarm(), HandleCatchupInterrupt(), HandleNotifyInterrupt(), HandleParallelApplyMessageInterrupt(), HandleParallelMessageInterrupt(), IdleInTransactionSessionTimeoutHandler(), IdleSessionTimeoutHandler(), IdleStatsUpdateTimeoutHandler(), InitializeLatchWaitSet(), InitProcessLocalLatch(), IoWorkerMain(), lazy_truncate_heap(), libpqsrv_cancel(), libpqsrv_connect_internal(), libpqsrv_get_result(), LogicalParallelApplyLoop(), logicalrep_worker_stop_internal(), LogicalRepApplyLoop(), mq_putmessage(), pa_send_data(), pa_wait_for_xact_state(), pg_promote(), pg_sleep(), pg_wait_until_termination(), pgaio_worker_die(), pgaio_worker_register(), pgarch_MainLoop(), pgarch_waken_stop(), pgfdw_get_cleanup_result(), pq_check_connection(), pq_init(), ProcessClientReadInterrupt(), ProcessClientWriteInterrupt(), ProcessPendingWrites(), procsignal_sigusr1_handler(), ProcSleep(), ProcWaitForSignal(), ReqShutdownXLOG(), secure_read(), secure_write(), ServerLoop(), shm_mq_receive_bytes(), shm_mq_send_bytes(), shm_mq_wait_internal(), ShutDownSlotSync(), SignalHandlerForConfigReload(), SignalHandlerForShutdownRequest(), sigUsr1Handler(), StatementCancelHandler(), summarizer_wait_for_wal(), SwitchBackToLocalLatch(), SwitchToSharedLatch(), SyncRepWaitForLSN(), SysLoggerMain(), test_shm_mq_pipelined(), throttle(), TransactionTimeoutHandler(), wait_for_relation_state_change(), wait_for_slot_activity(), wait_for_worker_state_change(), wait_for_workers_to_become_ready(), WaitForBackgroundWorkerShutdown(), WaitForBackgroundWorkerStartup(), WaitForParallelWorkersToAttach(), WaitForParallelWorkersToFinish(), WaitForReplicationWorkerAttach(), WalRcvWaitForStartPosition(), WalReceiverMain(), WalSndLastCycleHandler(), WalSndLoop(), WalSndWaitForWal(), WalWriterMain(), and worker_spi_main().

◆ MyPMChildSlot

◆ MyProcPid

PGDLLIMPORT int MyProcPid
extern

Definition at line 48 of file globals.c.

Referenced by AddWaitEventToSet(), ApplyLauncherMain(), apw_detach_shmem(), apw_dump_now(), apw_load_buffers(), apw_start_database_worker(), apw_start_leader_worker(), Async_Listen(), Async_Unlisten(), Async_UnlistenAll(), asyncQueueNotificationToEntry(), asyncQueueReadAllNotifications(), autoprewarm_main(), AutoVacLauncherMain(), basic_archive_file(), CheckpointerMain(), CleanupProcSignalState(), DisownLatch(), Exec_ListenPreCommit(), Exec_UnlistenAllCommit(), Exec_UnlistenCommit(), ExportSnapshot(), FileSetInit(), fork_process(), get_backend_type_for_log(), GetSerializableTransactionSnapshotInt(), HandleWalSndInitStopping(), InitAuxiliaryProcess(), initialize_prng(), InitializeParallelDSM(), InitializeWaitEventSupport(), InitLatch(), InitPostmasterDeathWatchHandle(), InitProcess(), InitProcessGlobals(), InitWalSenderSlot(), injection_point_allowed(), injection_points_attach(), InvalidatePossiblyObsoleteSlot(), IsLogicalLauncher(), LaunchParallelWorkers(), llvm_compile_module(), LockAcquireExtended(), LockTimeoutHandler(), log_status_format(), logicalrep_worker_launch(), main(), ModifyWaitEvent(), OpenTemporaryFileInTablespace(), OwnLatch(), pg_backend_pid(), pgstat_bestart_initial(), PostgresMain(), PostmasterMain(), proc_exit(), process_pgfdw_appname(), ProcessGetMemoryContextInterrupt(), ProcessLogMemoryContextInterrupt(), ProcSignalInit(), ProcSleep(), ReplicationOriginExitCleanup(), ReplicationSlotAcquire(), ReplicationSlotCleanup(), ReplicationSlotCreate(), ReplicationSlotsDropDBSlots(), replorigin_session_setup(), ReplSlotSyncWorkerMain(), ResetLatch(), ServerLoop(), SetLatch(), setup_background_workers(), SharedInvalBackendInit(), SignalBackends(), SnapBuildSerialize(), StatementTimeoutHandler(), WakeupMyProc(), WalRcvDie(), WalReceiverMain(), worker_spi_launch(), write_csvlog(), write_jsonlog(), write_pipe_chunks(), and write_relcache_init_file().

◆ MyProcPort

◆ MyStartTime

◆ MyStartTimestamp

PGDLLIMPORT TimestampTz MyStartTimestamp
extern

◆ NBuffers

PGDLLIMPORT int NBuffers
extern

Definition at line 143 of file globals.c.

◆ notify_buffers

PGDLLIMPORT int notify_buffers
extern

Definition at line 165 of file globals.c.

Referenced by AsyncShmemInit(), and AsyncShmemSize().

◆ OutputFileName

PGDLLIMPORT char OutputFileName[]
extern

Definition at line 80 of file globals.c.

Referenced by BootstrapModeMain(), DebugFileOpen(), and process_postgres_switches().

◆ pkglib_path

◆ PostmasterPid

◆ ProcDiePending

PGDLLIMPORT volatile sig_atomic_t ProcDiePending
extern

◆ process_shared_preload_libraries_done

PGDLLIMPORT bool process_shared_preload_libraries_done
extern

◆ process_shared_preload_libraries_in_progress

◆ process_shmem_requests_in_progress

PGDLLIMPORT bool process_shmem_requests_in_progress
extern

◆ ProcSignalBarrierPending

◆ PublishMemoryContextPending

◆ QueryCancelHoldoffCount

PGDLLIMPORT volatile uint32 QueryCancelHoldoffCount
extern

Definition at line 45 of file globals.c.

Referenced by errfinish(), ProcessInterrupts(), and ProcessRecoveryConflictInterrupt().

◆ QueryCancelPending

◆ serializable_buffers

PGDLLIMPORT int serializable_buffers
extern

Definition at line 166 of file globals.c.

Referenced by PredicateLockShmemSize(), and SerialInit().

◆ session_preload_libraries_string

PGDLLIMPORT char* session_preload_libraries_string
extern

Definition at line 1832 of file miscinit.c.

Referenced by process_session_preload_libraries().

◆ shared_preload_libraries_string

PGDLLIMPORT char* shared_preload_libraries_string
extern

Definition at line 1833 of file miscinit.c.

Referenced by process_shared_preload_libraries().

◆ shmem_request_hook

PGDLLIMPORT shmem_request_hook_type shmem_request_hook
extern

Definition at line 1840 of file miscinit.c.

Referenced by _PG_init(), and process_shmem_requests().

◆ subtransaction_buffers

PGDLLIMPORT int subtransaction_buffers
extern

Definition at line 167 of file globals.c.

Referenced by SUBTRANSShmemBuffers(), and SUBTRANSShmemInit().

◆ transaction_buffers

PGDLLIMPORT int transaction_buffers
extern

Definition at line 168 of file globals.c.

Referenced by CLOGShmemBuffers(), and CLOGShmemInit().

◆ TransactionTimeoutPending

PGDLLIMPORT volatile sig_atomic_t TransactionTimeoutPending
extern

Definition at line 38 of file globals.c.

Referenced by ProcessInterrupts(), and TransactionTimeoutHandler().

◆ VacuumBufferUsageLimit

PGDLLIMPORT int VacuumBufferUsageLimit
extern

Definition at line 150 of file globals.c.

Referenced by do_autovacuum(), and ExecVacuum().

◆ VacuumCostActive

◆ VacuumCostBalance

◆ VacuumCostDelay

PGDLLIMPORT double VacuumCostDelay
extern

Definition at line 156 of file globals.c.

Referenced by VacuumUpdateCosts().

◆ VacuumCostLimit

PGDLLIMPORT int VacuumCostLimit
extern

Definition at line 155 of file globals.c.

Referenced by AutoVacuumUpdateCostLimit(), and VacuumUpdateCosts().

◆ VacuumCostPageDirty

PGDLLIMPORT int VacuumCostPageDirty
extern

Definition at line 154 of file globals.c.

Referenced by MarkBufferDirty(), and MarkBufferDirtyHint().

◆ VacuumCostPageHit

PGDLLIMPORT int VacuumCostPageHit
extern

Definition at line 152 of file globals.c.

Referenced by AsyncReadBuffers(), and PinBufferForBlock().

◆ VacuumCostPageMiss

PGDLLIMPORT int VacuumCostPageMiss
extern

Definition at line 153 of file globals.c.

Referenced by AsyncReadBuffers().

◆ work_mem