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

PostgreSQL Source Code git master
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 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 uint8 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 386 of file miscadmin.h.

◆ AmAutoVacuumLauncherProcess

#define AmAutoVacuumLauncherProcess ( )    (MyBackendType == B_AUTOVAC_LAUNCHER)

Definition at line 381 of file miscadmin.h.

◆ AmAutoVacuumWorkerProcess

#define AmAutoVacuumWorkerProcess ( )    (MyBackendType == B_AUTOVAC_WORKER)

Definition at line 382 of file miscadmin.h.

◆ AmBackgroundWorkerProcess

#define AmBackgroundWorkerProcess ( )    (MyBackendType == B_BG_WORKER)

Definition at line 383 of file miscadmin.h.

◆ AmBackgroundWriterProcess

#define AmBackgroundWriterProcess ( )    (MyBackendType == B_BG_WRITER)

Definition at line 387 of file miscadmin.h.

◆ AmCheckpointerProcess

#define AmCheckpointerProcess ( )    (MyBackendType == B_CHECKPOINTER)

Definition at line 388 of file miscadmin.h.

◆ AmIoWorkerProcess

#define AmIoWorkerProcess ( )    (MyBackendType == B_IO_WORKER)

Definition at line 393 of file miscadmin.h.

◆ AmLogicalSlotSyncWorkerProcess

#define AmLogicalSlotSyncWorkerProcess ( )    (MyBackendType == B_SLOTSYNC_WORKER)

Definition at line 385 of file miscadmin.h.

◆ AmRegularBackendProcess

#define AmRegularBackendProcess ( )    (MyBackendType == B_BACKEND)

Definition at line 380 of file miscadmin.h.

◆ AmSpecialWorkerProcess

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

Definition at line 395 of file miscadmin.h.

◆ AmStartupProcess

#define AmStartupProcess ( )    (MyBackendType == B_STARTUP)

Definition at line 389 of file miscadmin.h.

◆ AmWalReceiverProcess

#define AmWalReceiverProcess ( )    (MyBackendType == B_WAL_RECEIVER)

Definition at line 390 of file miscadmin.h.

◆ AmWalSenderProcess

#define AmWalSenderProcess ( )    (MyBackendType == B_WAL_SENDER)

Definition at line 384 of file miscadmin.h.

◆ AmWalSummarizerProcess

#define AmWalSummarizerProcess ( )    (MyBackendType == B_WAL_SUMMARIZER)

Definition at line 391 of file miscadmin.h.

◆ AmWalWriterProcess

#define AmWalWriterProcess ( )    (MyBackendType == B_WAL_WRITER)

Definition at line 392 of file miscadmin.h.

◆ BACKEND_NUM_TYPES

#define BACKEND_NUM_TYPES   (B_LOGGER + 1)

Definition at line 376 of file miscadmin.h.

◆ CHECK_FOR_INTERRUPTS

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

Definition at line 122 of file miscadmin.h.

◆ DATEORDER_DMY

#define DATEORDER_DMY   1

Definition at line 243 of file miscadmin.h.

◆ DATEORDER_MDY

#define DATEORDER_MDY   2

Definition at line 244 of file miscadmin.h.

◆ DATEORDER_YMD

#define DATEORDER_YMD   0

Definition at line 242 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:45

Definition at line 151 of file miscadmin.h.

◆ GetProcessingMode

#define GetProcessingMode ( )    Mode

Definition at line 480 of file miscadmin.h.

◆ HOLD_CANCEL_INTERRUPTS

#define HOLD_CANCEL_INTERRUPTS ( )    (QueryCancelHoldoffCount++)

Definition at line 141 of file miscadmin.h.

◆ HOLD_INTERRUPTS

#define HOLD_INTERRUPTS ( )    (InterruptHoldoffCount++)

Definition at line 133 of file miscadmin.h.

◆ INIT_PG_LOAD_SESSION_LIBS

#define INIT_PG_LOAD_SESSION_LIBS   0x0001

Definition at line 498 of file miscadmin.h.

◆ INIT_PG_OVERRIDE_ALLOW_CONNS

#define INIT_PG_OVERRIDE_ALLOW_CONNS   0x0002

Definition at line 499 of file miscadmin.h.

◆ INIT_PG_OVERRIDE_ROLE_LOGIN

#define INIT_PG_OVERRIDE_ROLE_LOGIN   0x0004

Definition at line 500 of file miscadmin.h.

◆ INTERRUPTS_CAN_BE_PROCESSED

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

Definition at line 129 of file miscadmin.h.

◆ INTERRUPTS_PENDING_CONDITION

#define INTERRUPTS_PENDING_CONDITION ( )     (unlikely(InterruptPending))

Definition at line 113 of file miscadmin.h.

◆ INTSTYLE_ISO_8601

#define INTSTYLE_ISO_8601   3

Definition at line 259 of file miscadmin.h.

◆ INTSTYLE_POSTGRES

#define INTSTYLE_POSTGRES   0

Definition at line 256 of file miscadmin.h.

◆ INTSTYLE_POSTGRES_VERBOSE

#define INTSTYLE_POSTGRES_VERBOSE   1

Definition at line 257 of file miscadmin.h.

◆ INTSTYLE_SQL_STANDARD

#define INTSTYLE_SQL_STANDARD   2

Definition at line 258 of file miscadmin.h.

◆ InvalidPid

#define InvalidPid   (-1)

Definition at line 32 of file miscadmin.h.

◆ IsBootstrapProcessingMode

#define IsBootstrapProcessingMode ( )    (Mode == BootstrapProcessing)

Definition at line 476 of file miscadmin.h.

◆ IsExternalConnectionBackend

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

Definition at line 404 of file miscadmin.h.

◆ IsInitProcessingMode

#define IsInitProcessingMode ( )    (Mode == InitProcessing)

Definition at line 477 of file miscadmin.h.

◆ IsNormalProcessingMode

#define IsNormalProcessingMode ( )    (Mode == NormalProcessing)

Definition at line 478 of file miscadmin.h.

◆ MAX_BAS_VAC_RING_SIZE_KB

#define MAX_BAS_VAC_RING_SIZE_KB   (16 * 1024 * 1024)

Definition at line 278 of file miscadmin.h.

◆ MAXTZLEN

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

Definition at line 263 of file miscadmin.h.

◆ MIN_BAS_VAC_RING_SIZE_KB

#define MIN_BAS_VAC_RING_SIZE_KB   128

Definition at line 277 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:44

Definition at line 143 of file miscadmin.h.

◆ RESUME_INTERRUPTS

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

Definition at line 135 of file miscadmin.h.

◆ SECURITY_LOCAL_USERID_CHANGE

#define SECURITY_LOCAL_USERID_CHANGE   0x0001

Definition at line 317 of file miscadmin.h.

◆ SECURITY_NOFORCE_RLS

#define SECURITY_NOFORCE_RLS   0x0004

Definition at line 319 of file miscadmin.h.

◆ SECURITY_RESTRICTED_OPERATION

#define SECURITY_RESTRICTED_OPERATION   0x0002

Definition at line 318 of file miscadmin.h.

◆ SetProcessingMode

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

Definition at line 482 of file miscadmin.h.

◆ STACK_DEPTH_SLOP

#define STACK_DEPTH_SLOP   (512 * 1024)

Definition at line 296 of file miscadmin.h.

◆ START_CRIT_SECTION

#define START_CRIT_SECTION ( )    (CritSectionCount++)

Definition at line 149 of file miscadmin.h.

◆ USE_GERMAN_DATES

#define USE_GERMAN_DATES   3

Definition at line 238 of file miscadmin.h.

◆ USE_ISO_DATES

#define USE_ISO_DATES   1

Definition at line 236 of file miscadmin.h.

◆ USE_POSTGRES_DATES

#define USE_POSTGRES_DATES   0

Definition at line 235 of file miscadmin.h.

◆ USE_SQL_DATES

#define USE_SQL_DATES   2

Definition at line 237 of file miscadmin.h.

◆ USE_XSD_DATES

#define USE_XSD_DATES   4

Definition at line 239 of file miscadmin.h.

Typedef Documentation

◆ BackendType

typedef enum BackendType BackendType

◆ pg_stack_base_t

typedef char* pg_stack_base_t

Definition at line 298 of file miscadmin.h.

◆ ProcessingMode

◆ shmem_request_hook_type

typedef void(* shmem_request_hook_type) (void)

Definition at line 532 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 336 of file miscadmin.h.

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

◆ ProcessingMode

Enumerator
BootstrapProcessing 
InitProcessing 
NormalProcessing 

Definition at line 467 of file miscadmin.h.

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

Function Documentation

◆ AddToDataDirLockFile()

void AddToDataDirLockFile ( int  target_line,
const char *  str 
)

Definition at line 1519 of file miscinit.c.

1520{
1521 int fd;
1522 int len;
1523 int lineno;
1524 char *srcptr;
1525 char *destptr;
1526 char srcbuffer[BLCKSZ];
1527 char destbuffer[BLCKSZ];
1528
1529 fd = open(DIRECTORY_LOCK_FILE, O_RDWR | PG_BINARY, 0);
1530 if (fd < 0)
1531 {
1532 ereport(LOG,
1534 errmsg("could not open file \"%s\": %m",
1536 return;
1537 }
1538 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ);
1539 len = read(fd, srcbuffer, sizeof(srcbuffer) - 1);
1541 if (len < 0)
1542 {
1543 ereport(LOG,
1545 errmsg("could not read from file \"%s\": %m",
1547 close(fd);
1548 return;
1549 }
1550 srcbuffer[len] = '\0';
1551
1552 /*
1553 * Advance over lines we are not supposed to rewrite, then copy them to
1554 * destbuffer.
1555 */
1556 srcptr = srcbuffer;
1557 for (lineno = 1; lineno < target_line; lineno++)
1558 {
1559 char *eol = strchr(srcptr, '\n');
1560
1561 if (eol == NULL)
1562 break; /* not enough lines in file yet */
1563 srcptr = eol + 1;
1564 }
1565 memcpy(destbuffer, srcbuffer, srcptr - srcbuffer);
1566 destptr = destbuffer + (srcptr - srcbuffer);
1567
1568 /*
1569 * Fill in any missing lines before the target line, in case lines are
1570 * added to the file out of order.
1571 */
1572 for (; lineno < target_line; lineno++)
1573 {
1574 if (destptr < destbuffer + sizeof(destbuffer))
1575 *destptr++ = '\n';
1576 }
1577
1578 /*
1579 * Write or rewrite the target line.
1580 */
1581 snprintf(destptr, destbuffer + sizeof(destbuffer) - destptr, "%s\n", str);
1582 destptr += strlen(destptr);
1583
1584 /*
1585 * If there are more lines in the old file, append them to destbuffer.
1586 */
1587 if ((srcptr = strchr(srcptr, '\n')) != NULL)
1588 {
1589 srcptr++;
1590 snprintf(destptr, destbuffer + sizeof(destbuffer) - destptr, "%s",
1591 srcptr);
1592 }
1593
1594 /*
1595 * And rewrite the data. Since we write in a single kernel call, this
1596 * update should appear atomic to onlookers.
1597 */
1598 len = strlen(destbuffer);
1599 errno = 0;
1600 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE);
1601 if (pg_pwrite(fd, destbuffer, len, 0) != len)
1602 {
1604 /* if write didn't set errno, assume problem is no disk space */
1605 if (errno == 0)
1606 errno = ENOSPC;
1607 ereport(LOG,
1609 errmsg("could not write to file \"%s\": %m",
1611 close(fd);
1612 return;
1613 }
1615 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC);
1616 if (pg_fsync(fd) != 0)
1617 {
1618 ereport(LOG,
1620 errmsg("could not write to file \"%s\": %m",
1622 }
1624 if (close(fd) != 0)
1625 {
1626 ereport(LOG,
1628 errmsg("could not write to file \"%s\": %m",
1630 }
1631}
#define PG_BINARY
Definition: c.h:1273
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:150
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:69
static void pgstat_report_wait_end(void)
Definition: wait_event.h:85

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 611 of file postinit.c.

612{
613 Assert(MyProc != NULL);
614
615 /*
616 * Initialize our input/output/debugging file descriptors.
617 */
619
620 /*
621 * Initialize file access. Done early so other subsystems can access
622 * files.
623 */
625
626 /*
627 * Initialize statistics reporting. This needs to happen early to ensure
628 * that pgstat's shutdown callback runs after the shutdown callbacks of
629 * all subsystems that can produce stats (like e.g. transaction commits
630 * can).
631 */
633
634 /*
635 * Initialize AIO before infrastructure that might need to actually
636 * execute AIO.
637 */
639
640 /* Do local initialization of storage and buffer managers */
641 InitSync();
642 smgrinit();
644
645 /*
646 * Initialize temporary file access after pgstat, so that the temporary
647 * file shutdown hook can report temporary file statistics.
648 */
650
651 /*
652 * Initialize local buffers for WAL record construction, in case we ever
653 * try to insert XLOG.
654 */
656
657 /* Initialize lock manager's local structs */
659
660 /*
661 * Initialize replication slots after pgstat. The exit hook might need to
662 * drop ephemeral slots, which in turn triggers stats reporting.
663 */
665}
void pgaio_init_backend(void)
Definition: aio_init.c:218
void InitBufferManagerAccess(void)
Definition: bufmgr.c:3982
void DebugFileOpen(void)
Definition: elog.c:2119
void InitFileAccess(void)
Definition: fd.c:900
void InitTemporaryFileAccess(void)
Definition: fd.c:930
Assert(PointerIsAligned(start, uint64))
void InitLockManagerAccess(void)
Definition: lock.c:505
void pgstat_initialize(void)
Definition: pgstat.c:639
void ReplicationSlotInitialize(void)
Definition: slot.c:241
void smgrinit(void)
Definition: smgr.c:188
PGPROC * MyProc
Definition: proc.c:66
void InitSync(void)
Definition: sync.c:124
void InitXLogInsert(void)
Definition: xloginsert.c:1360

References Assert(), 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 409 of file miscinit.c.

410{
412
413 if (chdir(DataDir) < 0)
416 errmsg("could not change directory to \"%s\": %m",
417 DataDir)));
418}
#define FATAL
Definition: elog.h:41
char * DataDir
Definition: globals.c:71

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:1321
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 296 of file miscinit.c.

297{
298 struct stat stat_buf;
299
301
302 if (stat(DataDir, &stat_buf) != 0)
303 {
304 if (errno == ENOENT)
307 errmsg("data directory \"%s\" does not exist",
308 DataDir)));
309 else
312 errmsg("could not read permissions of directory \"%s\": %m",
313 DataDir)));
314 }
315
316 /* eventual chdir would fail anyway, but let's test ... */
317 if (!S_ISDIR(stat_buf.st_mode))
319 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
320 errmsg("specified data directory \"%s\" is not a directory",
321 DataDir)));
322
323 /*
324 * Check that the directory belongs to my userid; if not, reject.
325 *
326 * This check is an essential part of the interlock that prevents two
327 * postmasters from starting in the same directory (see CreateLockFile()).
328 * Do not remove or weaken it.
329 *
330 * XXX can we safely enable this check on Windows?
331 */
332#if !defined(WIN32) && !defined(__CYGWIN__)
333 if (stat_buf.st_uid != geteuid())
335 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
336 errmsg("data directory \"%s\" has wrong ownership",
337 DataDir),
338 errhint("The server must be started by the user that owns the data directory.")));
339#endif
340
341 /*
342 * Check if the directory has correct permissions. If not, reject.
343 *
344 * Only two possible modes are allowed, 0700 and 0750. The latter mode
345 * indicates that group read/execute should be allowed on all newly
346 * created files and directories.
347 *
348 * XXX temporarily suppress check when on Windows, because there may not
349 * be proper support for Unix-y file permissions. Need to think of a
350 * reasonable check to apply on Windows.
351 */
352#if !defined(WIN32) && !defined(__CYGWIN__)
353 if (stat_buf.st_mode & PG_MODE_MASK_GROUP)
355 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
356 errmsg("data directory \"%s\" has invalid permissions",
357 DataDir),
358 errdetail("Permissions should be u=rwx (0700) or u=rwx,g=rx (0750).")));
359#endif
360
361 /*
362 * Reset creation modes and mask based on the mode of the data directory.
363 *
364 * The mask was set earlier in startup to disallow group permissions on
365 * newly created files and directories. However, if group read/execute
366 * are present on the data directory then modify the create modes and mask
367 * to allow group read/execute on newly created files and directories and
368 * set the data_directory_mode GUC.
369 *
370 * Suppress when on Windows, because there may not be proper support for
371 * Unix-y file permissions.
372 */
373#if !defined(WIN32) && !defined(__CYGWIN__)
374 SetDataDirectoryCreatePerm(stat_buf.st_mode);
375
376 umask(pg_mode_mask);
378#endif
379
380 /* Check for PG_VERSION */
382}
int errdetail(const char *fmt,...)
Definition: elog.c:1207
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:77
void ValidatePgVersion(const char *path)
Definition: miscinit.c:1718
#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 1463 of file miscinit.c.

1464{
1465 CreateLockFile(DIRECTORY_LOCK_FILE, amPostmaster, "", true, DataDir);
1466}
static void CreateLockFile(const char *filename, bool amPostmaster, const char *socketDir, bool isDDLock, const char *refName)
Definition: miscinit.c:1158

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 1472 of file miscinit.c.

1474{
1475 char lockfile[MAXPGPATH];
1476
1477 snprintf(lockfile, sizeof(lockfile), "%s.lock", socketfile);
1478 CreateLockFile(lockfile, amPostmaster, socketDir, false, socketfile);
1479}
#define MAXPGPATH

References CreateLockFile(), MAXPGPATH, and snprintf.

Referenced by Lock_AF_UNIX().

◆ EstimateClientConnectionInfoSpace()

Size EstimateClientConnectionInfoSpace ( void  )

Definition at line 1035 of file miscinit.c.

1036{
1037 Size size = 0;
1038
1039 size = add_size(size, sizeof(SerializedClientConnectionInfo));
1040
1042 size = add_size(size, strlen(MyClientConnectionInfo.authn_id) + 1);
1043
1044 return size;
1045}
size_t Size
Definition: c.h:611
ClientConnectionInfo MyClientConnectionInfo
Definition: miscinit.c:1018
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 3615 of file nodeHash.c.

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

References hash_mem_multiplier, Min, and work_mem.

Referenced by BuildTupleHashTable(), consider_groupingsets_paths(), cost_memoize_rescan(), create_setop_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 545 of file miscinit.c.

546{
548 return AuthenticatedUserId;
549}
#define OidIsValid(objectId)
Definition: c.h:775
static Oid AuthenticatedUserId
Definition: miscinit.c:449

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#define PG_PROCTYPE(bktype, description, main_func, shmem_attach) \
270 case bktype: backendDesc = description; break;
272#undef PG_PROCTYPE
273 }
274 return backendDesc;
275}
#define gettext_noop(x)
Definition: c.h:1196

References 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 935 of file miscinit.c.

936{
937 if (SetRoleIsActive)
938 return OuterUserId;
939 else
940 return InvalidOid;
941}
static Oid OuterUserId
Definition: miscinit.c:451
static bool SetRoleIsActive
Definition: miscinit.c:461
#define InvalidOid
Definition: postgres_ext.h:37

References InvalidOid, OuterUserId, and SetRoleIsActive.

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

◆ GetOuterUserId()

Oid GetOuterUserId ( void  )

Definition at line 480 of file miscinit.c.

481{
483 return OuterUserId;
484}

References Assert(), OidIsValid, and OuterUserId.

Referenced by DropRole(), and RenameRole().

◆ GetSessionUserId()

◆ GetSessionUserIsSuperuser()

bool GetSessionUserIsSuperuser ( void  )

Definition at line 515 of file miscinit.c.

516{
519}
static bool SessionUserIsSuperuser
Definition: miscinit.c:456

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

Referenced by check_session_authorization(), and InitializeParallelDSM().

◆ GetSystemUser()

const char * GetSystemUser ( void  )

Definition at line 535 of file miscinit.c.

536{
537 return SystemUser;
538}
static const char * SystemUser
Definition: miscinit.c:453

References SystemUser.

Referenced by system_user().

◆ GetUserId()

Oid GetUserId ( void  )

Definition at line 469 of file miscinit.c.

470{
472 return CurrentUserId;
473}
static Oid CurrentUserId
Definition: miscinit.c:452

References Assert(), CurrentUserId, and OidIsValid.

Referenced by AfterTriggerSaveEvent(), AggregateCreate(), all_rows_selectable(), 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(), ExecAlterDefaultPrivilegesStmt(), ExecAlterExtensionContentsStmt(), ExecAlterExtensionStmt(), ExecAlterObjectDependsStmt(), ExecBuildGroupingEqual(), ExecBuildParamSetEqual(), ExecBuildSlotPartitionKeyDescription(), ExecBuildSlotValueDescription(), ExecCheckOneRelPerms(), ExecCheckpoint(), 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(), 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 661 of file miscinit.c.

662{
663 *userid = CurrentUserId;
664 *sec_def_context = InLocalUserIdChange();
665}
bool InLocalUserIdChange(void)
Definition: miscinit.c:630

References CurrentUserId, and InLocalUserIdChange().

◆ GetUserIdAndSecContext()

◆ GetUserNameFromId()

char * GetUserNameFromId ( Oid  roleid,
bool  noerr 
)

Definition at line 988 of file miscinit.c.

989{
990 HeapTuple tuple;
991 char *result;
992
993 tuple = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
994 if (!HeapTupleIsValid(tuple))
995 {
996 if (!noerr)
998 (errcode(ERRCODE_UNDEFINED_OBJECT),
999 errmsg("invalid role OID: %u", roleid)));
1000 result = NULL;
1001 }
1002 else
1003 {
1004 result = pstrdup(NameStr(((Form_pg_authid) GETSTRUCT(tuple))->rolname));
1005 ReleaseSysCache(tuple);
1006 }
1007 return result;
1008}
#define NameStr(name)
Definition: c.h:752
#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:1759
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:262
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:264
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:220

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 688 of file miscinit.c.

689{
690 bool result = false;
691 HeapTuple utup;
692
693 /* Superusers bypass all permission checking. */
694 if (superuser_arg(roleid))
695 return true;
696
697 utup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
698 if (HeapTupleIsValid(utup))
699 {
700 result = ((Form_pg_authid) GETSTRUCT(utup))->rolreplication;
701 ReleaseSysCache(utup);
702 }
703 return result;
704}
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 579 of file postinit.c.

580{
581 /* Should be initialized only once. */
583
584 /*
585 * Based on the max_locks_per_transaction GUC, as that's a good indicator
586 * of the expected number of locks, figure out the value for
587 * FastPathLockGroupsPerBackend. This must be a power-of-two. We cap the
588 * value at FP_LOCK_GROUPS_PER_BACKEND_MAX and insist the value is at
589 * least 1.
590 *
591 * The default max_locks_per_transaction = 64 means 4 groups by default.
592 */
596
597 /* Validate we did get a power-of-two */
600}
#define Max(x, y)
Definition: c.h:998
int max_locks_per_xact
Definition: lock.c:53
int FastPathLockGroupsPerBackend
Definition: lock.c:202
static uint32 pg_nextpower2_32(uint32 num)
Definition: pg_bitutils.h:189
#define FP_LOCK_GROUPS_PER_BACKEND_MAX
Definition: proc.h:91
#define FP_LOCK_SLOTS_PER_GROUP
Definition: proc.h:92

References Assert(), FastPathLockGroupsPerBackend, FP_LOCK_GROUPS_PER_BACKEND_MAX, FP_LOCK_SLOTS_PER_GROUP, Max, max_locks_per_xact, Min, and pg_nextpower2_32().

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

◆ InitializeMaxBackends()

void InitializeMaxBackends ( void  )

Definition at line 554 of file postinit.c.

555{
556 Assert(MaxBackends == 0);
557
558 /* Note that this does not include "auxiliary" processes */
561
564 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
565 errmsg("too many server processes configured"),
566 errdetail("\"max_connections\" (%d) plus \"autovacuum_worker_slots\" (%d) plus \"max_worker_processes\" (%d) plus \"max_wal_senders\" (%d) must be less than %d.",
570}
int autovacuum_worker_slots
Definition: autovacuum.c:118
int MaxConnections
Definition: globals.c:143
int MaxBackends
Definition: globals.c:146
int max_worker_processes
Definition: globals.c:144
#define NUM_SPECIAL_WORKER_PROCS
Definition: proc.h:450
#define MAX_BACKENDS
Definition: procnumber.h:39
int max_wal_senders
Definition: walsender.c:129

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 710 of file miscinit.c.

712{
713 HeapTuple roleTup;
714 Form_pg_authid rform;
715 char *rname;
716 bool is_superuser;
717
718 /*
719 * In a parallel worker, we don't have to do anything here.
720 * ParallelWorkerMain already set our output variables, and we aren't
721 * going to enforce either rolcanlogin or rolconnlimit. Furthermore, we
722 * don't really want to perform a catalog lookup for the role: we don't
723 * want to fail if it's been dropped.
724 */
726 {
727 Assert(bypass_login_check);
728 return;
729 }
730
731 /*
732 * Don't do scans if we're bootstrapping, none of the system catalogs
733 * exist yet, and they should be owned by postgres anyway.
734 */
736
737 /*
738 * Make sure syscache entries are flushed for recent catalog changes. This
739 * allows us to find roles that were created on-the-fly during
740 * authentication.
741 */
743
744 /*
745 * Look up the role, either by name if that's given or by OID if not.
746 */
747 if (rolename != NULL)
748 {
749 roleTup = SearchSysCache1(AUTHNAME, PointerGetDatum(rolename));
750 if (!HeapTupleIsValid(roleTup))
752 (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
753 errmsg("role \"%s\" does not exist", rolename)));
754 }
755 else
756 {
757 roleTup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
758 if (!HeapTupleIsValid(roleTup))
760 (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
761 errmsg("role with OID %u does not exist", roleid)));
762 }
763
764 rform = (Form_pg_authid) GETSTRUCT(roleTup);
765 roleid = rform->oid;
766 rname = NameStr(rform->rolname);
767 is_superuser = rform->rolsuper;
768
770
771 /*
772 * Set SessionUserId and related variables, including "role", via the GUC
773 * mechanisms.
774 *
775 * Note: ideally we would use PGC_S_DYNAMIC_DEFAULT here, so that
776 * session_authorization could subsequently be changed from
777 * pg_db_role_setting entries. Instead, session_authorization in
778 * pg_db_role_setting has no effect. Changing that would require solving
779 * two problems:
780 *
781 * 1. If pg_db_role_setting has values for both session_authorization and
782 * role, we could not be sure which order those would be applied in, and
783 * it would matter.
784 *
785 * 2. Sites may have years-old session_authorization entries. There's not
786 * been any particular reason to remove them. Ending the dormancy of
787 * those entries could seriously change application behavior, so only a
788 * major release should do that.
789 */
790 SetConfigOption("session_authorization", rname,
792
793 /*
794 * These next checks are not enforced when in standalone mode, so that
795 * there is a way to recover from sillinesses like "UPDATE pg_authid SET
796 * rolcanlogin = false;".
797 */
799 {
800 /*
801 * Is role allowed to login at all? (But background workers can
802 * override this by setting bypass_login_check.)
803 */
804 if (!bypass_login_check && !rform->rolcanlogin)
806 (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
807 errmsg("role \"%s\" is not permitted to log in",
808 rname)));
809
810 /*
811 * Check connection limit for this role. We enforce the limit only
812 * for regular backends, since other process types have their own
813 * PGPROC pools.
814 *
815 * There is a race condition here --- we create our PGPROC before
816 * checking for other PGPROCs. If two backends did this at about the
817 * same time, they might both think they were over the limit, while
818 * ideally one should succeed and one fail. Getting that to work
819 * exactly seems more trouble than it is worth, however; instead we
820 * just document that the connection limit is approximate.
821 */
822 if (rform->rolconnlimit >= 0 &&
824 !is_superuser &&
825 CountUserBackends(roleid) > rform->rolconnlimit)
827 (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
828 errmsg("too many connections for role \"%s\"",
829 rname)));
830 }
831
832 ReleaseSysCache(roleTup);
833}
bool InitializingParallelWorker
Definition: parallel.c:121
bool IsUnderPostmaster
Definition: globals.c:120
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition: guc.c:4337
@ PGC_S_OVERRIDE
Definition: guc.h:123
@ PGC_BACKEND
Definition: guc.h:77
void AcceptInvalidationMessages(void)
Definition: inval.c:930
#define IsBootstrapProcessingMode()
Definition: miscadmin.h:476
#define AmRegularBackendProcess()
Definition: miscadmin.h:380
void SetAuthenticatedUserId(Oid userid)
Definition: miscinit.c:552
static bool is_superuser(Archive *fout)
Definition: pg_dump.c:5040
static Datum PointerGetDatum(const void *X)
Definition: postgres.h:332
int CountUserBackends(Oid roleid)
Definition: procarray.c:3662

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 840 of file miscinit.c.

841{
842 /*
843 * This function should only be called in single-user mode, in autovacuum
844 * workers, in slot sync worker and in background workers.
845 */
848
849 /* call only once */
851
852 AuthenticatedUserId = BOOTSTRAP_SUPERUSERID;
853
854 /*
855 * XXX Ideally we'd do this via SetConfigOption("session_authorization"),
856 * but we lack the role name needed to do that, and we can't fetch it
857 * because one reason for this special case is to be able to start up even
858 * if something's happened to the BOOTSTRAP_SUPERUSERID's pg_authid row.
859 * Since we don't set the GUC itself, C code will see the value as NULL,
860 * and current_setting() will report an empty string within this session.
861 */
862 SetSessionAuthorization(BOOTSTRAP_SUPERUSERID, true);
863
864 /* We could do SetConfigOption("role"), but let's be consistent */
866}
#define AmAutoVacuumWorkerProcess()
Definition: miscadmin.h:382
#define AmBackgroundWorkerProcess()
Definition: miscadmin.h:383
#define AmLogicalSlotSyncWorkerProcess()
Definition: miscadmin.h:385
void SetSessionAuthorization(Oid userid, bool is_superuser)
Definition: miscinit.c:920
void SetCurrentRoleId(Oid roleid, bool is_superuser)
Definition: miscinit.c:956

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 874 of file miscinit.c.

875{
876 char *system_user;
877
878 /* call only once */
879 Assert(SystemUser == NULL);
880
881 /*
882 * InitializeSystemUser should be called only when authn_id is not NULL,
883 * meaning that auth_method is valid.
884 */
885 Assert(authn_id != NULL);
886
887 system_user = psprintf("%s:%s", auth_method, authn_id);
888
889 /* Store SystemUser in long-lived storage */
892}
char * MemoryContextStrdup(MemoryContext context, const char *string)
Definition: mcxt.c:1746
void pfree(void *pointer)
Definition: mcxt.c:1594
MemoryContext TopMemoryContext
Definition: mcxt.c:166
Datum system_user(PG_FUNCTION_ARGS)
Definition: miscinit.c:898
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 711 of file postinit.c.

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

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:1161
void SignalHandlerForCrashExit(SIGNAL_ARGS)
Definition: interrupt.c:73
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:1935
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:241
#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:63
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:82
bool IsPostmasterEnvironment
Definition: globals.c:119
char my_exec_path[MAXPGPATH]
Definition: globals.c:81
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 630 of file miscinit.c.

631{
633}
#define SECURITY_LOCAL_USERID_CHANGE
Definition: miscadmin.h:317

References SECURITY_LOCAL_USERID_CHANGE, and SecurityRestrictionContext.

Referenced by GetUserIdAndContext(), and set_config_with_handle().

◆ InNoForceRLSOperation()

bool InNoForceRLSOperation ( void  )

Definition at line 648 of file miscinit.c.

649{
651}
#define SECURITY_NOFORCE_RLS
Definition: miscadmin.h:319

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 1888 of file miscinit.c.

1889{
1890#ifdef ENABLE_NLS
1891 if (my_exec_path[0] != '\0')
1892 {
1893 char locale_path[MAXPGPATH];
1894
1895 get_locale_path(my_exec_path, locale_path);
1896 bindtextdomain(domain, locale_path);
1897 pg_bind_textdomain_codeset(domain);
1898 }
1899#endif
1900}
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 496 of file postinit.c.

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

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 1865 of file miscinit.c.

1866{
1868 "session_preload_libraries",
1869 false);
1871 "local_preload_libraries",
1872 true);
1873}
char * session_preload_libraries_string
Definition: miscinit.c:1781
char * local_preload_libraries_string
Definition: miscinit.c:1783
static void load_libraries(const char *libraries, const char *gucname, bool restricted)
Definition: miscinit.c:1799

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 1851 of file miscinit.c.

1852{
1855 "shared_preload_libraries",
1856 false);
1859}
bool process_shared_preload_libraries_done
Definition: miscinit.c:1787
char * shared_preload_libraries_string
Definition: miscinit.c:1782
bool process_shared_preload_libraries_in_progress
Definition: miscinit.c:1786

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 1879 of file miscinit.c.

1880{
1885}
bool process_shmem_requests_in_progress
Definition: miscinit.c:1790
shmem_request_hook_type shmem_request_hook
Definition: miscinit.c:1789

References process_shmem_requests_in_progress, and shmem_request_hook.

Referenced by PostgresSingleUserMain(), and PostmasterMain().

◆ ProcessInterrupts()

void ProcessInterrupts ( void  )

Definition at line 3303 of file postgres.c.

3304{
3305 /* OK to accept any interrupts now? */
3306 if (InterruptHoldoffCount != 0 || CritSectionCount != 0)
3307 return;
3308 InterruptPending = false;
3309
3310 if (ProcDiePending)
3311 {
3312 ProcDiePending = false;
3313 QueryCancelPending = false; /* ProcDie trumps QueryCancel */
3315 /* As in quickdie, don't risk sending to client during auth */
3319 ereport(FATAL,
3320 (errcode(ERRCODE_QUERY_CANCELED),
3321 errmsg("canceling authentication due to timeout")));
3322 else if (AmAutoVacuumWorkerProcess())
3323 ereport(FATAL,
3324 (errcode(ERRCODE_ADMIN_SHUTDOWN),
3325 errmsg("terminating autovacuum process due to administrator command")));
3326 else if (IsLogicalWorker())
3327 ereport(FATAL,
3328 (errcode(ERRCODE_ADMIN_SHUTDOWN),
3329 errmsg("terminating logical replication worker due to administrator command")));
3330 else if (IsLogicalLauncher())
3331 {
3333 (errmsg_internal("logical replication launcher shutting down")));
3334
3335 /*
3336 * The logical replication launcher can be stopped at any time.
3337 * Use exit status 1 so the background worker is restarted.
3338 */
3339 proc_exit(1);
3340 }
3341 else if (AmWalReceiverProcess())
3342 ereport(FATAL,
3343 (errcode(ERRCODE_ADMIN_SHUTDOWN),
3344 errmsg("terminating walreceiver process due to administrator command")));
3345 else if (AmBackgroundWorkerProcess())
3346 ereport(FATAL,
3347 (errcode(ERRCODE_ADMIN_SHUTDOWN),
3348 errmsg("terminating background worker \"%s\" due to administrator command",
3350 else if (AmIoWorkerProcess())
3351 {
3353 (errmsg_internal("io worker shutting down due to administrator command")));
3354
3355 proc_exit(0);
3356 }
3357 else
3358 ereport(FATAL,
3359 (errcode(ERRCODE_ADMIN_SHUTDOWN),
3360 errmsg("terminating connection due to administrator command")));
3361 }
3362
3364 {
3366
3367 /*
3368 * Check for lost connection and re-arm, if still configured, but not
3369 * if we've arrived back at DoingCommandRead state. We don't want to
3370 * wake up idle sessions, and they already know how to detect lost
3371 * connections.
3372 */
3374 {
3375 if (!pq_check_connection())
3376 ClientConnectionLost = true;
3377 else
3380 }
3381 }
3382
3384 {
3385 QueryCancelPending = false; /* lost connection trumps QueryCancel */
3387 /* don't send to client, we already know the connection to be dead. */
3389 ereport(FATAL,
3390 (errcode(ERRCODE_CONNECTION_FAILURE),
3391 errmsg("connection to client lost")));
3392 }
3393
3394 /*
3395 * Don't allow query cancel interrupts while reading input from the
3396 * client, because we might lose sync in the FE/BE protocol. (Die
3397 * interrupts are OK, because we won't read any further messages from the
3398 * client in that case.)
3399 *
3400 * See similar logic in ProcessRecoveryConflictInterrupts().
3401 */
3403 {
3404 /*
3405 * Re-arm InterruptPending so that we process the cancel request as
3406 * soon as we're done reading the message. (XXX this is seriously
3407 * ugly: it complicates INTERRUPTS_CAN_BE_PROCESSED(), and it means we
3408 * can't use that macro directly as the initial test in this function,
3409 * meaning that this code also creates opportunities for other bugs to
3410 * appear.)
3411 */
3412 InterruptPending = true;
3413 }
3414 else if (QueryCancelPending)
3415 {
3416 bool lock_timeout_occurred;
3417 bool stmt_timeout_occurred;
3418
3419 QueryCancelPending = false;
3420
3421 /*
3422 * If LOCK_TIMEOUT and STATEMENT_TIMEOUT indicators are both set, we
3423 * need to clear both, so always fetch both.
3424 */
3425 lock_timeout_occurred = get_timeout_indicator(LOCK_TIMEOUT, true);
3426 stmt_timeout_occurred = get_timeout_indicator(STATEMENT_TIMEOUT, true);
3427
3428 /*
3429 * If both were set, we want to report whichever timeout completed
3430 * earlier; this ensures consistent behavior if the machine is slow
3431 * enough that the second timeout triggers before we get here. A tie
3432 * is arbitrarily broken in favor of reporting a lock timeout.
3433 */
3434 if (lock_timeout_occurred && stmt_timeout_occurred &&
3436 lock_timeout_occurred = false; /* report stmt timeout */
3437
3438 if (lock_timeout_occurred)
3439 {
3441 ereport(ERROR,
3442 (errcode(ERRCODE_LOCK_NOT_AVAILABLE),
3443 errmsg("canceling statement due to lock timeout")));
3444 }
3445 if (stmt_timeout_occurred)
3446 {
3448 ereport(ERROR,
3449 (errcode(ERRCODE_QUERY_CANCELED),
3450 errmsg("canceling statement due to statement timeout")));
3451 }
3453 {
3455 ereport(ERROR,
3456 (errcode(ERRCODE_QUERY_CANCELED),
3457 errmsg("canceling autovacuum task")));
3458 }
3459
3460 /*
3461 * If we are reading a command from the client, just ignore the cancel
3462 * request --- sending an extra error message won't accomplish
3463 * anything. Otherwise, go ahead and throw the error.
3464 */
3465 if (!DoingCommandRead)
3466 {
3468 ereport(ERROR,
3469 (errcode(ERRCODE_QUERY_CANCELED),
3470 errmsg("canceling statement due to user request")));
3471 }
3472 }
3473
3476
3478 {
3479 /*
3480 * If the GUC has been reset to zero, ignore the signal. This is
3481 * important because the GUC update itself won't disable any pending
3482 * interrupt. We need to unset the flag before the injection point,
3483 * otherwise we could loop in interrupts checking.
3484 */
3487 {
3488 INJECTION_POINT("idle-in-transaction-session-timeout", NULL);
3489 ereport(FATAL,
3490 (errcode(ERRCODE_IDLE_IN_TRANSACTION_SESSION_TIMEOUT),
3491 errmsg("terminating connection due to idle-in-transaction timeout")));
3492 }
3493 }
3494
3496 {
3497 /* As above, ignore the signal if the GUC has been reset to zero. */
3499 if (TransactionTimeout > 0)
3500 {
3501 INJECTION_POINT("transaction-timeout", NULL);
3502 ereport(FATAL,
3503 (errcode(ERRCODE_TRANSACTION_TIMEOUT),
3504 errmsg("terminating connection due to transaction timeout")));
3505 }
3506 }
3507
3509 {
3510 /* As above, ignore the signal if the GUC has been reset to zero. */
3512 if (IdleSessionTimeout > 0)
3513 {
3514 INJECTION_POINT("idle-session-timeout", NULL);
3515 ereport(FATAL,
3516 (errcode(ERRCODE_IDLE_SESSION_TIMEOUT),
3517 errmsg("terminating connection due to idle-session timeout")));
3518 }
3519 }
3520
3521 /*
3522 * If there are pending stats updates and we currently are truly idle
3523 * (matching the conditions in PostgresMain(), report stats now.
3524 */
3527 {
3529 pgstat_report_stat(true);
3530 }
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:5961
@ DestRemote
Definition: dest.h:89
@ DestNone
Definition: dest.h:87
#define DEBUG1
Definition: elog.h:30
volatile sig_atomic_t IdleStatsUpdateTimeoutPending
Definition: globals.c:42
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:44
volatile sig_atomic_t IdleInTransactionSessionTimeoutPending
Definition: globals.c:37
volatile uint32 InterruptHoldoffCount
Definition: globals.c:43
volatile sig_atomic_t TransactionTimeoutPending
Definition: globals.c:38
volatile sig_atomic_t ClientConnectionLost
Definition: globals.c:36
volatile uint32 CritSectionCount
Definition: globals.c:45
volatile sig_atomic_t QueryCancelPending
Definition: globals.c:33
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:1531
void ProcessLogMemoryContextInterrupt(void)
Definition: mcxt.c:1337
#define AmWalReceiverProcess()
Definition: miscadmin.h:390
#define AmIoWorkerProcess()
Definition: miscadmin.h:393
long pgstat_report_stat(bool force)
Definition: pgstat.c:692
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:3264
bool ClientAuthInProgress
Definition: postmaster.c:372
BackgroundWorker * MyBgworkerEntry
Definition: postmaster.c:200
bool pq_check_connection(void)
Definition: pqcomm.c:2056
void ProcessProcSignalBarrier(void)
Definition: procsignal.c:499
int IdleSessionTimeout
Definition: proc.c:62
int IdleInTransactionSessionTimeout
Definition: proc.c:60
int TransactionTimeout
Definition: proc.c:61
void LockErrorCleanup(void)
Definition: proc.c:813
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:5001

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, ProcessLogMemoryContextInterrupt(), ProcessParallelApplyMessages(), ProcessParallelMessages(), ProcessProcSignalBarrier(), ProcessRecoveryConflictInterrupts(), ProcSignalBarrierPending, QueryCancelHoldoffCount, QueryCancelPending, RecoveryConflictPending, STATEMENT_TIMEOUT, TransactionTimeout, TransactionTimeoutPending, and whereToSendOutput.

Referenced by die().

◆ RecheckDataDirLockFile()

bool RecheckDataDirLockFile ( void  )

Definition at line 1646 of file miscinit.c.

1647{
1648 int fd;
1649 int len;
1650 long file_pid;
1651 char buffer[BLCKSZ];
1652
1653 fd = open(DIRECTORY_LOCK_FILE, O_RDWR | PG_BINARY, 0);
1654 if (fd < 0)
1655 {
1656 /*
1657 * There are many foreseeable false-positive error conditions. For
1658 * safety, fail only on enumerated clearly-something-is-wrong
1659 * conditions.
1660 */
1661 switch (errno)
1662 {
1663 case ENOENT:
1664 case ENOTDIR:
1665 /* disaster */
1666 ereport(LOG,
1668 errmsg("could not open file \"%s\": %m",
1670 return false;
1671 default:
1672 /* non-fatal, at least for now */
1673 ereport(LOG,
1675 errmsg("could not open file \"%s\": %m; continuing anyway",
1677 return true;
1678 }
1679 }
1680 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ);
1681 len = read(fd, buffer, sizeof(buffer) - 1);
1683 if (len < 0)
1684 {
1685 ereport(LOG,
1687 errmsg("could not read from file \"%s\": %m",
1689 close(fd);
1690 return true; /* treat read failure as nonfatal */
1691 }
1692 buffer[len] = '\0';
1693 close(fd);
1694 file_pid = atol(buffer);
1695 if (file_pid == getpid())
1696 return true; /* all is well */
1697
1698 /* Trouble: someone's overwritten the lock file */
1699 ereport(LOG,
1700 (errmsg("lock file \"%s\" contains wrong PID: %ld instead of %ld",
1701 DIRECTORY_LOCK_FILE, file_pid, (long) getpid())));
1702 return false;
1703}

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 1084 of file miscinit.c.

1085{
1087
1088 memcpy(&serialized, conninfo, sizeof(serialized));
1089
1090 /* Copy the fields back into place */
1093
1094 if (serialized.authn_id_len >= 0)
1095 {
1096 char *authn_id;
1097
1098 authn_id = conninfo + sizeof(serialized);
1100 authn_id);
1101 }
1102}

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 1051 of file miscinit.c.

1053{
1054 SerializedClientConnectionInfo serialized = {0};
1055
1056 serialized.authn_id_len = -1;
1058
1060 serialized.authn_id_len = strlen(MyClientConnectionInfo.authn_id);
1061
1062 /* Copy serialized representation to buffer */
1063 Assert(maxsize >= sizeof(serialized));
1064 memcpy(start_address, &serialized, sizeof(serialized));
1065
1066 maxsize -= sizeof(serialized);
1067 start_address += sizeof(serialized);
1068
1069 /* Copy authn_id into the space after the struct */
1070 if (serialized.authn_id_len >= 0)
1071 {
1072 Assert(maxsize >= (serialized.authn_id_len + 1));
1073 memcpy(start_address,
1075 /* include the NULL terminator to ease deserialization */
1076 serialized.authn_id_len + 1);
1077 }
1078}

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:298

References stack_base_ptr.

Referenced by main().

◆ SetAuthenticatedUserId()

void SetAuthenticatedUserId ( Oid  userid)

Definition at line 552 of file miscinit.c.

553{
554 Assert(OidIsValid(userid));
555
556 /* call only once */
558
559 AuthenticatedUserId = userid;
560
561 /* Also mark our PGPROC entry with the authenticated user id */
562 /* (We assume this is an atomic store so no lock is needed) */
563 MyProc->roleId = userid;
564}
Oid roleId
Definition: proc.h:225

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

Referenced by InitializeSessionUserId(), and ParallelWorkerMain().

◆ SetCurrentRoleId()

void SetCurrentRoleId ( Oid  roleid,
bool  is_superuser 
)

Definition at line 956 of file miscinit.c.

957{
958 /*
959 * Get correct info if it's SET ROLE NONE
960 *
961 * If SessionUserId hasn't been set yet, do nothing beyond updating
962 * SetRoleIsActive --- the eventual SetSessionAuthorization call will
963 * update the derived state. This is needed since we will get called
964 * during GUC initialization.
965 */
966 if (!OidIsValid(roleid))
967 {
968 SetRoleIsActive = false;
969
971 return;
972
973 roleid = SessionUserId;
975 }
976 else
977 SetRoleIsActive = true;
978
980}
static void SetOuterUserId(Oid userid, bool is_superuser)
Definition: miscinit.c:488

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 283 of file miscinit.c.

284{
285 /* This should happen only once per process */
288}
char * DatabasePath
Definition: globals.c:104

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

Referenced by InitPostgres().

◆ SetDataDir()

void SetDataDir ( const char *  dir)

Definition at line 389 of file miscinit.c.

390{
391 char *new;
392
393 Assert(dir);
394
395 /* If presented path is relative, convert to absolute */
396 new = make_absolute_path(dir);
397
398 free(DataDir);
399 DataDir = new;
400}
#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 920 of file miscinit.c.

921{
923
924 if (!SetRoleIsActive)
926}
static void SetSessionUserId(Oid userid, bool is_superuser)
Definition: miscinit.c:522

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 668 of file miscinit.c.

669{
670 /* We throw the same error SET ROLE would. */
673 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
674 errmsg("cannot set parameter \"%s\" within security-restricted operation",
675 "role")));
676 CurrentUserId = userid;
677 if (sec_def_context)
679 else
680 SecurityRestrictionContext &= ~SECURITY_LOCAL_USERID_CHANGE;
681}
bool InSecurityRestrictedOperation(void)
Definition: miscinit.c:639

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(), IsSquashableConstant(), 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:1812
bool rolsuper
Definition: pg_authid.h:35
uint64_t Datum
Definition: postgres.h:70
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:290
#define FeBeWaitSetLatchPos
Definition: libpq.h:64
WaitEventSet * FeBeWaitSet
Definition: pqcomm.c:166
Latch procLatch
Definition: proc.h:186
void ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
Definition: waiteventset.c:656
#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 1490 of file miscinit.c.

1491{
1492 ListCell *l;
1493
1494 foreach(l, lock_files)
1495 {
1496 char *socketLockFile = (char *) lfirst(l);
1497
1498 /* No need to touch the data directory lock file, we trust */
1499 if (strcmp(socketLockFile, DIRECTORY_LOCK_FILE) == 0)
1500 continue;
1501
1502 /* we just ignore any error here */
1503 (void) utime(socketLockFile, NULL);
1504 }
1505}
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 1718 of file miscinit.c.

1719{
1720 char full_path[MAXPGPATH];
1721 FILE *file;
1722 int ret;
1723 long file_major;
1724 long my_major;
1725 char *endptr;
1726 char file_version_string[64];
1727 const char *my_version_string = PG_VERSION;
1728
1729 my_major = strtol(my_version_string, &endptr, 10);
1730
1731 snprintf(full_path, sizeof(full_path), "%s/PG_VERSION", path);
1732
1733 file = AllocateFile(full_path, "r");
1734 if (!file)
1735 {
1736 if (errno == ENOENT)
1737 ereport(FATAL,
1738 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1739 errmsg("\"%s\" is not a valid data directory",
1740 path),
1741 errdetail("File \"%s\" is missing.", full_path)));
1742 else
1743 ereport(FATAL,
1745 errmsg("could not open file \"%s\": %m", full_path)));
1746 }
1747
1748 file_version_string[0] = '\0';
1749 ret = fscanf(file, "%63s", file_version_string);
1750 file_major = strtol(file_version_string, &endptr, 10);
1751
1752 if (ret != 1 || endptr == file_version_string)
1753 ereport(FATAL,
1754 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1755 errmsg("\"%s\" is not a valid data directory",
1756 path),
1757 errdetail("File \"%s\" does not contain valid data.",
1758 full_path),
1759 errhint("You might need to initdb.")));
1760
1761 FreeFile(file);
1762
1763 if (my_major != file_major)
1764 ereport(FATAL,
1765 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1766 errmsg("database files are incompatible with server"),
1767 errdetail("The data directory was initialized by PostgreSQL version %s, "
1768 "which is not compatible with this version %s.",
1769 file_version_string, my_version_string)));
1770}
int FreeFile(FILE *file)
Definition: fd.c:2840
FILE * AllocateFile(const char *name, const char *mode)
Definition: fd.c:2641

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 161 of file globals.c.

Referenced by CommitTsShmemBuffers(), and CommitTsShmemInit().

◆ CritSectionCount

◆ data_directory_mode

PGDLLIMPORT int data_directory_mode
extern

Definition at line 77 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 123 of file globals.c.

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

◆ hash_mem_multiplier

PGDLLIMPORT double hash_mem_multiplier
extern

Definition at line 132 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 42 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 120 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(), test_slru_shmem_startup(), 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 1783 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 134 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 145 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 162 of file globals.c.

Referenced by MultiXactShmemInit(), and MultiXactShmemSize().

◆ multixact_offset_buffers

PGDLLIMPORT int multixact_offset_buffers
extern

Definition at line 163 of file globals.c.

Referenced by MultiXactShmemInit(), and MultiXactShmemSize().

◆ my_exec_path

◆ MyBackendType

◆ MyCancelKey

PGDLLIMPORT uint8 MyCancelKey[]
extern

Definition at line 52 of file globals.c.

Referenced by InitPostgres(), and PostgresMain().

◆ MyCancelKeyLength

PGDLLIMPORT int MyCancelKeyLength
extern

Definition at line 53 of file globals.c.

Referenced by InitPostgres(), and PostgresMain().

◆ MyDatabaseHasLoginEventTriggers

PGDLLIMPORT bool MyDatabaseHasLoginEventTriggers
extern

Definition at line 98 of file globals.c.

Referenced by EventTriggerOnLogin(), and InitPostgres().

◆ MyDatabaseId

PGDLLIMPORT Oid MyDatabaseId
extern

Definition at line 94 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(), GetOldestActiveTransactionId(), 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(), TwoPhaseGetOldestXidInCommit(), 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 63 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 47 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(), 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 142 of file globals.c.

◆ notify_buffers

PGDLLIMPORT int notify_buffers
extern

Definition at line 164 of file globals.c.

Referenced by AsyncShmemInit(), and AsyncShmemSize().

◆ OutputFileName

PGDLLIMPORT char OutputFileName[]
extern

Definition at line 79 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

◆ QueryCancelHoldoffCount

PGDLLIMPORT volatile uint32 QueryCancelHoldoffCount
extern

Definition at line 44 of file globals.c.

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

◆ QueryCancelPending

◆ serializable_buffers

PGDLLIMPORT int serializable_buffers
extern

Definition at line 165 of file globals.c.

Referenced by PredicateLockShmemSize(), and SerialInit().

◆ session_preload_libraries_string

PGDLLIMPORT char* session_preload_libraries_string
extern

Definition at line 1781 of file miscinit.c.

Referenced by process_session_preload_libraries().

◆ shared_preload_libraries_string

PGDLLIMPORT char* shared_preload_libraries_string
extern

Definition at line 1782 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 1789 of file miscinit.c.

Referenced by _PG_init(), and process_shmem_requests().

◆ subtransaction_buffers

PGDLLIMPORT int subtransaction_buffers
extern

Definition at line 166 of file globals.c.

Referenced by SUBTRANSShmemBuffers(), and SUBTRANSShmemInit().

◆ transaction_buffers

PGDLLIMPORT int transaction_buffers
extern

Definition at line 167 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 149 of file globals.c.

Referenced by do_autovacuum(), and ExecVacuum().

◆ VacuumCostActive

◆ VacuumCostBalance

◆ VacuumCostDelay

PGDLLIMPORT double VacuumCostDelay
extern

Definition at line 155 of file globals.c.

Referenced by VacuumUpdateCosts().

◆ VacuumCostLimit

PGDLLIMPORT int VacuumCostLimit
extern

Definition at line 154 of file globals.c.

Referenced by AutoVacuumUpdateCostLimit(), and VacuumUpdateCosts().

◆ VacuumCostPageDirty

PGDLLIMPORT int VacuumCostPageDirty
extern

Definition at line 153 of file globals.c.

Referenced by MarkBufferDirty(), and MarkBufferDirtyHint().

◆ VacuumCostPageHit

PGDLLIMPORT int VacuumCostPageHit
extern

Definition at line 151 of file globals.c.

Referenced by AsyncReadBuffers(), and PinBufferForBlock().

◆ VacuumCostPageMiss

PGDLLIMPORT int VacuumCostPageMiss
extern

Definition at line 152 of file globals.c.

Referenced by AsyncReadBuffers().

◆ work_mem