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 * 1024L)
 
#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 AmSpecialWorkerProcess()
 
#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_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)
 
long 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 bool MyCancelKeyValid
 
PGDLLIMPORT int32 MyCancelKey
 
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 385 of file miscadmin.h.

◆ AmAutoVacuumLauncherProcess

#define AmAutoVacuumLauncherProcess ( )    (MyBackendType == B_AUTOVAC_LAUNCHER)

Definition at line 380 of file miscadmin.h.

◆ AmAutoVacuumWorkerProcess

#define AmAutoVacuumWorkerProcess ( )    (MyBackendType == B_AUTOVAC_WORKER)

Definition at line 381 of file miscadmin.h.

◆ AmBackgroundWorkerProcess

#define AmBackgroundWorkerProcess ( )    (MyBackendType == B_BG_WORKER)

Definition at line 382 of file miscadmin.h.

◆ AmBackgroundWriterProcess

#define AmBackgroundWriterProcess ( )    (MyBackendType == B_BG_WRITER)

Definition at line 386 of file miscadmin.h.

◆ AmCheckpointerProcess

#define AmCheckpointerProcess ( )    (MyBackendType == B_CHECKPOINTER)

Definition at line 387 of file miscadmin.h.

◆ AmLogicalSlotSyncWorkerProcess

#define AmLogicalSlotSyncWorkerProcess ( )    (MyBackendType == B_SLOTSYNC_WORKER)

Definition at line 384 of file miscadmin.h.

◆ AmRegularBackendProcess

#define AmRegularBackendProcess ( )    (MyBackendType == B_BACKEND)

Definition at line 379 of file miscadmin.h.

◆ AmSpecialWorkerProcess

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

Definition at line 393 of file miscadmin.h.

◆ AmStartupProcess

#define AmStartupProcess ( )    (MyBackendType == B_STARTUP)

Definition at line 388 of file miscadmin.h.

◆ AmWalReceiverProcess

#define AmWalReceiverProcess ( )    (MyBackendType == B_WAL_RECEIVER)

Definition at line 389 of file miscadmin.h.

◆ AmWalSenderProcess

#define AmWalSenderProcess ( )    (MyBackendType == B_WAL_SENDER)

Definition at line 383 of file miscadmin.h.

◆ AmWalSummarizerProcess

#define AmWalSummarizerProcess ( )    (MyBackendType == B_WAL_SUMMARIZER)

Definition at line 390 of file miscadmin.h.

◆ AmWalWriterProcess

#define AmWalWriterProcess ( )    (MyBackendType == B_WAL_WRITER)

Definition at line 391 of file miscadmin.h.

◆ BACKEND_NUM_TYPES

#define BACKEND_NUM_TYPES   (B_LOGGER + 1)

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

Definition at line 151 of file miscadmin.h.

◆ GetProcessingMode

#define GetProcessingMode ( )    Mode

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

◆ INIT_PG_OVERRIDE_ALLOW_CONNS

#define INIT_PG_OVERRIDE_ALLOW_CONNS   0x0002

Definition at line 489 of file miscadmin.h.

◆ INIT_PG_OVERRIDE_ROLE_LOGIN

#define INIT_PG_OVERRIDE_ROLE_LOGIN   0x0004

Definition at line 490 of file miscadmin.h.

◆ INTERRUPTS_CAN_BE_PROCESSED

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

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 466 of file miscadmin.h.

◆ IsInitProcessingMode

#define IsInitProcessingMode ( )    (Mode == InitProcessing)

Definition at line 467 of file miscadmin.h.

◆ IsNormalProcessingMode

#define IsNormalProcessingMode ( )    (Mode == NormalProcessing)

Definition at line 468 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:43

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:461
@ InitProcessing
Definition: miscadmin.h:460
@ BootstrapProcessing
Definition: miscadmin.h:459
static PgChecksumMode mode
Definition: pg_checksums.c:55

Definition at line 472 of file miscadmin.h.

◆ STACK_DEPTH_SLOP

#define STACK_DEPTH_SLOP   (512 * 1024L)

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 522 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_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.
356 *
357 * If you modify these, make sure to update NUM_AUXILIARY_PROCS and the
358 * glossary in the docs.
359 */
363 B_STARTUP,
367
368 /*
369 * Logger is not connected to shared memory and does not have a PGPROC
370 * entry.
371 */
372 B_LOGGER,
BackendType
Definition: miscadmin.h:337
@ B_WAL_SUMMARIZER
Definition: miscadmin.h:365
@ B_WAL_WRITER
Definition: miscadmin.h:366
@ B_WAL_RECEIVER
Definition: miscadmin.h:364
@ B_CHECKPOINTER
Definition: miscadmin.h:362
@ B_WAL_SENDER
Definition: miscadmin.h:346
@ B_LOGGER
Definition: miscadmin.h:372
@ B_STARTUP
Definition: miscadmin.h:363
@ 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 457 of file miscadmin.h.

458{
459 BootstrapProcessing, /* bootstrap creation of template database */
460 InitProcessing, /* initializing system */
461 NormalProcessing, /* normal processing */
ProcessingMode
Definition: miscadmin.h:458

Function Documentation

◆ AddToDataDirLockFile()

void AddToDataDirLockFile ( int  target_line,
const char *  str 
)

Definition at line 1567 of file miscinit.c.

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

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

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

◆ BaseInit()

void BaseInit ( void  )

Definition at line 606 of file postinit.c.

607{
608 Assert(MyProc != NULL);
609
610 /*
611 * Initialize our input/output/debugging file descriptors.
612 */
614
615 /*
616 * Initialize file access. Done early so other subsystems can access
617 * files.
618 */
620
621 /*
622 * Initialize statistics reporting. This needs to happen early to ensure
623 * that pgstat's shutdown callback runs after the shutdown callbacks of
624 * all subsystems that can produce stats (like e.g. transaction commits
625 * can).
626 */
628
629 /* Do local initialization of storage and buffer managers */
630 InitSync();
631 smgrinit();
633
634 /*
635 * Initialize temporary file access after pgstat, so that the temporary
636 * file shutdown hook can report temporary file statistics.
637 */
639
640 /*
641 * Initialize local buffers for WAL record construction, in case we ever
642 * try to insert XLOG.
643 */
645
646 /* Initialize lock manager's local structs */
648
649 /*
650 * Initialize replication slots after pgstat. The exit hook might need to
651 * drop ephemeral slots, which in turn triggers stats reporting.
652 */
654}
void InitBufferManagerAccess(void)
Definition: bufmgr.c:3576
#define Assert(condition)
Definition: c.h:815
void DebugFileOpen(void)
Definition: elog.c:2111
void InitFileAccess(void)
Definition: fd.c:902
void InitTemporaryFileAccess(void)
Definition: fd.c:932
void InitLockManagerAccess(void)
Definition: lock.c:499
void pgstat_initialize(void)
Definition: pgstat.c:639
void ReplicationSlotInitialize(void)
Definition: slot.c:224
void smgrinit(void)
Definition: smgr.c:157
PGPROC * MyProc
Definition: proc.c:66
void InitSync(void)
Definition: sync.c:124
void InitXLogInsert(void)
Definition: xloginsert.c:1348

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

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

◆ ChangeToDataDir()

void ChangeToDataDir ( void  )

Definition at line 457 of file miscinit.c.

458{
460
461 if (chdir(DataDir) < 0)
464 errmsg("could not change directory to \"%s\": %m",
465 DataDir)));
466}
#define FATAL
Definition: elog.h:41
char * DataDir
Definition: globals.c:70

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:1317
int errcode(int sqlerrcode)
Definition: elog.c:853
#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(), ATExecAlterConstrRecurse(), 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 344 of file miscinit.c.

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

1512{
1513 CreateLockFile(DIRECTORY_LOCK_FILE, amPostmaster, "", true, DataDir);
1514}
static void CreateLockFile(const char *filename, bool amPostmaster, const char *socketDir, bool isDDLock, const char *refName)
Definition: miscinit.c:1206

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

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

References CreateLockFile(), MAXPGPATH, and snprintf.

Referenced by Lock_AF_UNIX().

◆ EstimateClientConnectionInfoSpace()

Size EstimateClientConnectionInfoSpace ( void  )

Definition at line 1083 of file miscinit.c.

1084{
1085 Size size = 0;
1086
1088
1091
1092 return size;
1093}
size_t Size
Definition: c.h:562
ClientConnectionInfo MyClientConnectionInfo
Definition: miscinit.c:1066
Size add_size(Size s1, Size s2)
Definition: shmem.c:488
static pg_noinline void Size size
Definition: slab.c:607
const char * authn_id
Definition: libpq-be.h:105

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

Referenced by InitializeParallelDSM().

◆ get_hash_memory_limit()

size_t get_hash_memory_limit ( void  )

Definition at line 3487 of file nodeHash.c.

3488{
3489 double mem_limit;
3490
3491 /* Do initial calculation in double arithmetic */
3492 mem_limit = (double) work_mem * hash_mem_multiplier * 1024.0;
3493
3494 /* Clamp in case it doesn't fit in size_t */
3495 mem_limit = Min(mem_limit, (double) SIZE_MAX);
3496
3497 return (size_t) mem_limit;
3498}
#define Min(x, y)
Definition: c.h:961
double hash_mem_multiplier
Definition: globals.c:131
int work_mem
Definition: globals.c:130

References hash_mem_multiplier, Min, and work_mem.

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

◆ get_stack_depth_rlimit()

long get_stack_depth_rlimit ( void  )

Definition at line 172 of file stack_depth.c.

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

References val.

Referenced by check_max_stack_depth(), and InitializeGUCOptionsFromEnvironment().

◆ GetAuthenticatedUserId()

Oid GetAuthenticatedUserId ( void  )

Definition at line 593 of file miscinit.c.

594{
596 return AuthenticatedUserId;
597}
#define OidIsValid(objectId)
Definition: c.h:732
static Oid AuthenticatedUserId
Definition: miscinit.c:497

References Assert, AuthenticatedUserId, and OidIsValid.

Referenced by check_session_authorization(), and InitializeParallelDSM().

◆ GetBackendTypeDesc()

const char * GetBackendTypeDesc ( BackendType  backendType)

Definition at line 263 of file miscinit.c.

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

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

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

◆ GetCurrentRoleId()

Oid GetCurrentRoleId ( void  )

Definition at line 983 of file miscinit.c.

984{
985 if (SetRoleIsActive)
986 return OuterUserId;
987 else
988 return InvalidOid;
989}
static Oid OuterUserId
Definition: miscinit.c:499
static bool SetRoleIsActive
Definition: miscinit.c:509
#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 528 of file miscinit.c.

529{
531 return OuterUserId;
532}

References Assert, OidIsValid, and OuterUserId.

Referenced by DropRole(), and RenameRole().

◆ GetSessionUserId()

Oid GetSessionUserId ( void  )

◆ GetSessionUserIsSuperuser()

bool GetSessionUserIsSuperuser ( void  )

Definition at line 563 of file miscinit.c.

564{
567}
static bool SessionUserIsSuperuser
Definition: miscinit.c:504

References Assert, OidIsValid, SessionUserId, and SessionUserIsSuperuser.

Referenced by check_session_authorization(), and InitializeParallelDSM().

◆ GetSystemUser()

const char * GetSystemUser ( void  )

Definition at line 583 of file miscinit.c.

584{
585 return SystemUser;
586}
static const char * SystemUser
Definition: miscinit.c:501

References SystemUser.

Referenced by system_user().

◆ GetUserId()

Oid GetUserId ( void  )

Definition at line 517 of file miscinit.c.

518{
520 return CurrentUserId;
521}
static Oid CurrentUserId
Definition: miscinit.c:500

References Assert, CurrentUserId, and OidIsValid.

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

◆ GetUserIdAndContext()

void GetUserIdAndContext ( Oid userid,
bool *  sec_def_context 
)

Definition at line 709 of file miscinit.c.

710{
711 *userid = CurrentUserId;
712 *sec_def_context = InLocalUserIdChange();
713}
bool InLocalUserIdChange(void)
Definition: miscinit.c:678

References CurrentUserId, and InLocalUserIdChange().

◆ GetUserIdAndSecContext()

◆ GetUserNameFromId()

char * GetUserNameFromId ( Oid  roleid,
bool  noerr 
)

Definition at line 1036 of file miscinit.c.

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

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

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

◆ has_rolreplication()

bool has_rolreplication ( Oid  roleid)

Definition at line 736 of file miscinit.c.

737{
738 bool result = false;
739 HeapTuple utup;
740
741 /* Superusers bypass all permission checking. */
742 if (superuser_arg(roleid))
743 return true;
744
745 utup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
746 if (HeapTupleIsValid(utup))
747 {
748 result = ((Form_pg_authid) GETSTRUCT(utup))->rolreplication;
749 ReleaseSysCache(utup);
750 }
751 return result;
752}
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 577 of file postinit.c.

578{
579 /* Should be initialized only once. */
581
582 /* we need at least one group */
584
586 {
587 /* stop once we exceed max_locks_per_xact */
589 break;
590
592 }
593
595}
int max_locks_per_xact
Definition: lock.c:52
int FastPathLockGroupsPerBackend
Definition: lock.c:200
#define FP_LOCK_GROUPS_PER_BACKEND_MAX
Definition: proc.h:83
#define FP_LOCK_SLOTS_PER_GROUP
Definition: proc.h:84

References Assert, FastPathLockGroupsPerBackend, FP_LOCK_GROUPS_PER_BACKEND_MAX, FP_LOCK_SLOTS_PER_GROUP, and max_locks_per_xact.

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

◆ InitializeMaxBackends()

void InitializeMaxBackends ( void  )

Definition at line 545 of file postinit.c.

546{
547 Assert(MaxBackends == 0);
548
549 /* Note that this does not include "auxiliary" processes */
552
555 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
556 errmsg("too many server processes configured"),
557 errdetail("\"max_connections\" (%d) plus \"autovacuum_worker_slots\" (%d) plus \"max_worker_processes\" (%d) plus \"max_wal_senders\" (%d) must be less than %d.",
561}
int autovacuum_worker_slots
Definition: autovacuum.c:118
int MaxConnections
Definition: globals.c:142
int MaxBackends
Definition: globals.c:145
int max_worker_processes
Definition: globals.c:143
#define MAX_BACKENDS
Definition: postmaster.h:138
#define NUM_SPECIAL_WORKER_PROCS
Definition: proc.h:433
int max_wal_senders
Definition: walsender.c:121

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

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

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

Referenced by InitPostgres().

◆ InitializeSessionUserIdStandalone()

void InitializeSessionUserIdStandalone ( void  )

Definition at line 888 of file miscinit.c.

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

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

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

References Assert, 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 700 of file postinit.c.

704{
705 bool bootstrap = IsBootstrapProcessingMode();
706 bool am_superuser;
707 char *fullpath;
708 char dbname[NAMEDATALEN];
709 int nfree = 0;
710
711 elog(DEBUG3, "InitPostgres");
712
713 /*
714 * Add my PGPROC struct to the ProcArray.
715 *
716 * Once I have done this, I am visible to other backends!
717 */
719
720 /*
721 * Initialize my entry in the shared-invalidation manager's array of
722 * per-backend data.
723 */
725
727
728 /*
729 * Also set up timeout handlers needed for backend operation. We need
730 * these in every case except bootstrap.
731 */
732 if (!bootstrap)
733 {
744 }
745
746 /*
747 * If this is either a bootstrap process or a standalone backend, start up
748 * the XLOG machinery, and register to have it closed down at exit. In
749 * other cases, the startup process is responsible for starting up the
750 * XLOG machinery, and the checkpointer for closing it down.
751 */
753 {
754 /*
755 * We don't yet have an aux-process resource owner, but StartupXLOG
756 * and ShutdownXLOG will need one. Hence, create said resource owner
757 * (and register a callback to clean it up after ShutdownXLOG runs).
758 */
760
761 StartupXLOG();
762 /* Release (and warn about) any buffer pins leaked in StartupXLOG */
764 /* Reset CurrentResourceOwner to nothing for the moment */
766
767 /*
768 * Use before_shmem_exit() so that ShutdownXLOG() can rely on DSM
769 * segments etc to work (which in turn is required for pgstats).
770 */
773 }
774
775 /*
776 * Initialize the relation cache and the system catalog caches. Note that
777 * no catalog access happens here; we only set up the hashtable structure.
778 * We must do this before starting a transaction because transaction abort
779 * would try to touch these hashtables.
780 */
784
785 /* Initialize portal manager */
787
788 /* Initialize status reporting */
790
791 /*
792 * Load relcache entries for the shared system catalogs. This must create
793 * at least entries for pg_database and catalogs used for authentication.
794 */
796
797 /*
798 * Set up process-exit callback to do pre-shutdown cleanup. This is the
799 * one of the first before_shmem_exit callbacks we register; thus, this
800 * will be one the last things we do before low-level modules like the
801 * buffer manager begin to close down. We need to have this in place
802 * before we begin our first transaction --- if we fail during the
803 * initialization transaction, as is entirely possible, we need the
804 * AbortTransaction call to clean up.
805 */
807
808 /* The autovacuum launcher is done here */
810 {
811 /* report this backend in the PgBackendStatus array */
813
814 return;
815 }
816
817 /*
818 * Start a new transaction here before first access to db.
819 */
820 if (!bootstrap)
821 {
822 /* statement_timestamp must be set for timeouts to work correctly */
825
826 /*
827 * transaction_isolation will have been set to the default by the
828 * above. If the default is "serializable", and we are in hot
829 * standby, we will fail if we don't change it to something lower.
830 * Fortunately, "read committed" is plenty good enough.
831 */
833 }
834
835 /*
836 * Perform client authentication if necessary, then figure out our
837 * postgres user ID, and see if we are a superuser.
838 *
839 * In standalone mode, autovacuum worker processes and slot sync worker
840 * process, we use a fixed ID, otherwise we figure it out from the
841 * authenticated user name.
842 */
844 {
846 am_superuser = true;
847 }
848 else if (!IsUnderPostmaster)
849 {
851 am_superuser = true;
854 (errcode(ERRCODE_UNDEFINED_OBJECT),
855 errmsg("no roles are defined in this database system"),
856 errhint("You should immediately run CREATE USER \"%s\" SUPERUSER;.",
857 username != NULL ? username : "postgres")));
858 }
859 else if (AmBackgroundWorkerProcess())
860 {
861 if (username == NULL && !OidIsValid(useroid))
862 {
864 am_superuser = true;
865 }
866 else
867 {
869 (flags & INIT_PG_OVERRIDE_ROLE_LOGIN) != 0);
870 am_superuser = superuser();
871 }
872 }
873 else
874 {
875 /* normal multiuser case */
876 Assert(MyProcPort != NULL);
878 InitializeSessionUserId(username, useroid, false);
879 /* ensure that auth_method is actually valid, aka authn_id is not NULL */
883 am_superuser = superuser();
884 }
885
886 /*
887 * Binary upgrades only allowed super-user connections
888 */
889 if (IsBinaryUpgrade && !am_superuser)
890 {
892 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
893 errmsg("must be superuser to connect in binary upgrade mode")));
894 }
895
896 /*
897 * The last few regular connection slots are reserved for superusers and
898 * roles with privileges of pg_use_reserved_connections. We do not apply
899 * these limits to background processes, since they all have their own
900 * pools of PGPROC slots.
901 *
902 * Note: At this point, the new backend has already claimed a proc struct,
903 * so we must check whether the number of free slots is strictly less than
904 * the reserved connection limits.
905 */
906 if (AmRegularBackendProcess() && !am_superuser &&
909 {
912 (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
913 errmsg("remaining connection slots are reserved for roles with the %s attribute",
914 "SUPERUSER")));
915
916 if (!has_privs_of_role(GetUserId(), ROLE_PG_USE_RESERVED_CONNECTIONS))
918 (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
919 errmsg("remaining connection slots are reserved for roles with privileges of the \"%s\" role",
920 "pg_use_reserved_connections")));
921 }
922
923 /* Check replication permissions needed for walsender processes. */
924 if (am_walsender)
925 {
926 Assert(!bootstrap);
927
930 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
931 errmsg("permission denied to start WAL sender"),
932 errdetail("Only roles with the %s attribute may start a WAL sender process.",
933 "REPLICATION")));
934 }
935
936 /*
937 * If this is a plain walsender only supporting physical replication, we
938 * don't want to connect to any particular database. Just finish the
939 * backend startup by processing any options from the startup packet, and
940 * we're done.
941 */
943 {
944 /* process any options passed in the startup packet */
945 if (MyProcPort != NULL)
946 process_startup_options(MyProcPort, am_superuser);
947
948 /* Apply PostAuthDelay as soon as we've read all options */
949 if (PostAuthDelay > 0)
950 pg_usleep(PostAuthDelay * 1000000L);
951
952 /* initialize client encoding */
954
955 /* report this backend in the PgBackendStatus array */
957
958 /* close the transaction we started above */
960
961 return;
962 }
963
964 /*
965 * Set up the global variables holding database id and default tablespace.
966 * But note we won't actually try to touch the database just yet.
967 *
968 * We take a shortcut in the bootstrap case, otherwise we have to look up
969 * the db's entry in pg_database.
970 */
971 if (bootstrap)
972 {
973 dboid = Template1DbOid;
974 MyDatabaseTableSpace = DEFAULTTABLESPACE_OID;
975 }
976 else if (in_dbname != NULL)
977 {
978 HeapTuple tuple;
979 Form_pg_database dbform;
980
981 tuple = GetDatabaseTuple(in_dbname);
982 if (!HeapTupleIsValid(tuple))
984 (errcode(ERRCODE_UNDEFINED_DATABASE),
985 errmsg("database \"%s\" does not exist", in_dbname)));
986 dbform = (Form_pg_database) GETSTRUCT(tuple);
987 dboid = dbform->oid;
988 }
989 else if (!OidIsValid(dboid))
990 {
991 /*
992 * If this is a background worker not bound to any particular
993 * database, we're done now. Everything that follows only makes sense
994 * if we are bound to a specific database. We do need to close the
995 * transaction we started before returning.
996 */
997 if (!bootstrap)
998 {
1001 }
1002 return;
1003 }
1004
1005 /*
1006 * Now, take a writer's lock on the database we are trying to connect to.
1007 * If there is a concurrently running DROP DATABASE on that database, this
1008 * will block us until it finishes (and has committed its update of
1009 * pg_database).
1010 *
1011 * Note that the lock is not held long, only until the end of this startup
1012 * transaction. This is OK since we will advertise our use of the
1013 * database in the ProcArray before dropping the lock (in fact, that's the
1014 * next thing to do). Anyone trying a DROP DATABASE after this point will
1015 * see us in the array once they have the lock. Ordering is important for
1016 * this because we don't want to advertise ourselves as being in this
1017 * database until we have the lock; otherwise we create what amounts to a
1018 * deadlock with CountOtherDBBackends().
1019 *
1020 * Note: use of RowExclusiveLock here is reasonable because we envision
1021 * our session as being a concurrent writer of the database. If we had a
1022 * way of declaring a session as being guaranteed-read-only, we could use
1023 * AccessShareLock for such sessions and thereby not conflict against
1024 * CREATE DATABASE.
1025 */
1026 if (!bootstrap)
1027 LockSharedObject(DatabaseRelationId, dboid, 0, RowExclusiveLock);
1028
1029 /*
1030 * Recheck pg_database to make sure the target database hasn't gone away.
1031 * If there was a concurrent DROP DATABASE, this ensures we will die
1032 * cleanly without creating a mess.
1033 */
1034 if (!bootstrap)
1035 {
1036 HeapTuple tuple;
1037 Form_pg_database datform;
1038
1039 tuple = GetDatabaseTupleByOid(dboid);
1040 if (HeapTupleIsValid(tuple))
1041 datform = (Form_pg_database) GETSTRUCT(tuple);
1042
1043 if (!HeapTupleIsValid(tuple) ||
1044 (in_dbname && namestrcmp(&datform->datname, in_dbname)))
1045 {
1046 if (in_dbname)
1047 ereport(FATAL,
1048 (errcode(ERRCODE_UNDEFINED_DATABASE),
1049 errmsg("database \"%s\" does not exist", in_dbname),
1050 errdetail("It seems to have just been dropped or renamed.")));
1051 else
1052 ereport(FATAL,
1053 (errcode(ERRCODE_UNDEFINED_DATABASE),
1054 errmsg("database %u does not exist", dboid)));
1055 }
1056
1057 strlcpy(dbname, NameStr(datform->datname), sizeof(dbname));
1058
1059 if (database_is_invalid_form(datform))
1060 {
1061 ereport(FATAL,
1062 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
1063 errmsg("cannot connect to invalid database \"%s\"", dbname),
1064 errhint("Use DROP DATABASE to drop invalid databases."));
1065 }
1066
1067 MyDatabaseTableSpace = datform->dattablespace;
1068 MyDatabaseHasLoginEventTriggers = datform->dathasloginevt;
1069 /* pass the database name back to the caller */
1070 if (out_dbname)
1071 strcpy(out_dbname, dbname);
1072 }
1073
1074 /*
1075 * Now that we rechecked, we are certain to be connected to a database and
1076 * thus can set MyDatabaseId.
1077 *
1078 * It is important that MyDatabaseId only be set once we are sure that the
1079 * target database can no longer be concurrently dropped or renamed. For
1080 * example, without this guarantee, pgstat_update_dbstats() could create
1081 * entries for databases that were just dropped in the pgstat shutdown
1082 * callback, which could confuse other code paths like the autovacuum
1083 * scheduler.
1084 */
1085 MyDatabaseId = dboid;
1086
1087 /*
1088 * Now we can mark our PGPROC entry with the database ID.
1089 *
1090 * We assume this is an atomic store so no lock is needed; though actually
1091 * things would work fine even if it weren't atomic. Anyone searching the
1092 * ProcArray for this database's ID should hold the database lock, so they
1093 * would not be executing concurrently with this store. A process looking
1094 * for another database's ID could in theory see a chance match if it read
1095 * a partially-updated databaseId value; but as long as all such searches
1096 * wait and retry, as in CountOtherDBBackends(), they will certainly see
1097 * the correct value on their next try.
1098 */
1100
1101 /*
1102 * We established a catalog snapshot while reading pg_authid and/or
1103 * pg_database; but until we have set up MyDatabaseId, we won't react to
1104 * incoming sinval messages for unshared catalogs, so we won't realize it
1105 * if the snapshot has been invalidated. Assume it's no good anymore.
1106 */
1108
1109 /*
1110 * Now we should be able to access the database directory safely. Verify
1111 * it's there and looks reasonable.
1112 */
1114
1115 if (!bootstrap)
1116 {
1117 if (access(fullpath, F_OK) == -1)
1118 {
1119 if (errno == ENOENT)
1120 ereport(FATAL,
1121 (errcode(ERRCODE_UNDEFINED_DATABASE),
1122 errmsg("database \"%s\" does not exist",
1123 dbname),
1124 errdetail("The database subdirectory \"%s\" is missing.",
1125 fullpath)));
1126 else
1127 ereport(FATAL,
1129 errmsg("could not access directory \"%s\": %m",
1130 fullpath)));
1131 }
1132
1133 ValidatePgVersion(fullpath);
1134 }
1135
1136 SetDatabasePath(fullpath);
1137 pfree(fullpath);
1138
1139 /*
1140 * It's now possible to do real access to the system catalogs.
1141 *
1142 * Load relcache entries for the system catalogs. This must create at
1143 * least the minimum set of "nailed-in" cache entries.
1144 */
1146
1147 /* set up ACL framework (so CheckMyDatabase can check permissions) */
1149
1150 /*
1151 * Re-read the pg_database row for our database, check permissions and set
1152 * up database-specific GUC settings. We can't do this until all the
1153 * database-access infrastructure is up. (Also, it wants to know if the
1154 * user is a superuser, so the above stuff has to happen first.)
1155 */
1156 if (!bootstrap)
1157 CheckMyDatabase(dbname, am_superuser,
1158 (flags & INIT_PG_OVERRIDE_ALLOW_CONNS) != 0);
1159
1160 /*
1161 * Now process any command-line switches and any additional GUC variable
1162 * settings passed in the startup packet. We couldn't do this before
1163 * because we didn't know if client is a superuser.
1164 */
1165 if (MyProcPort != NULL)
1166 process_startup_options(MyProcPort, am_superuser);
1167
1168 /* Process pg_db_role_setting options */
1170
1171 /* Apply PostAuthDelay as soon as we've read all options */
1172 if (PostAuthDelay > 0)
1173 pg_usleep(PostAuthDelay * 1000000L);
1174
1175 /*
1176 * Initialize various default states that can't be set up until we've
1177 * selected the active user and gotten the right GUC settings.
1178 */
1179
1180 /* set default namespace search path */
1182
1183 /* initialize client encoding */
1185
1186 /* Initialize this backend's session state. */
1188
1189 /*
1190 * If this is an interactive session, load any libraries that should be
1191 * preloaded at backend start. Since those are determined by GUCs, this
1192 * can't happen until GUC settings are complete, but we want it to happen
1193 * during the initial transaction in case anything that requires database
1194 * access needs to be done.
1195 */
1196 if ((flags & INIT_PG_LOAD_SESSION_LIBS) != 0)
1198
1199 /* report this backend in the PgBackendStatus array */
1200 if (!bootstrap)
1202
1203 /* close the transaction we started above */
1204 if (!bootstrap)
1206}
void initialize_acl(void)
Definition: acl.c:5024
bool has_privs_of_role(Oid member, Oid role)
Definition: acl.c:5268
void pgstat_beinit(void)
void pgstat_bestart(void)
bool database_is_invalid_form(Form_pg_database datform)
Definition: dbcommands.c:3211
#define DEBUG3
Definition: elog.h:28
#define WARNING
Definition: elog.h:36
#define elog(elevel,...)
Definition: elog.h:225
bool MyDatabaseHasLoginEventTriggers
Definition: globals.c:97
bool IsBinaryUpgrade
Definition: globals.c:120
int32 MyCancelKey
Definition: globals.c:52
Oid MyDatabaseTableSpace
Definition: globals.c:95
bool MyCancelKeyValid
Definition: globals.c:51
struct Port * MyProcPort
Definition: globals.c:50
Oid MyDatabaseId
Definition: globals.c:93
const char * hba_authname(UserAuth auth_method)
Definition: hba.c:3065
static char * username
Definition: initdb.c:153
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:1072
#define RowExclusiveLock
Definition: lockdefs.h:38
void InitializeClientEncoding(void)
Definition: mbutils.c:281
#define INIT_PG_LOAD_SESSION_LIBS
Definition: miscadmin.h:488
#define INIT_PG_OVERRIDE_ROLE_LOGIN
Definition: miscadmin.h:490
#define INIT_PG_OVERRIDE_ALLOW_CONNS
Definition: miscadmin.h:489
void InitializeSessionUserId(const char *rolename, Oid roleid, bool bypass_login_check)
Definition: miscinit.c:758
void InitializeSystemUser(const char *authn_id, const char *auth_method)
Definition: miscinit.c:922
void InitializeSessionUserIdStandalone(void)
Definition: miscinit.c:888
void process_session_preload_libraries(void)
Definition: miscinit.c:1913
Oid GetUserId(void)
Definition: miscinit.c:517
Oid GetSessionUserId(void)
Definition: miscinit.c:556
void SetDatabasePath(const char *path)
Definition: miscinit.c:331
bool has_rolreplication(Oid roleid)
Definition: miscinit.c:736
int namestrcmp(Name name, const char *str)
Definition: name.c:247
void InitializeSearchPath(void)
Definition: namespace.c:4736
#define NAMEDATALEN
FormData_pg_database * Form_pg_database
Definition: pg_database.h:96
void pgstat_before_server_shutdown(int code, Datum arg)
Definition: pgstat.c:560
void InitPlanCache(void)
Definition: plancache.c:155
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:98
static void ShutdownPostgres(int code, Datum arg)
Definition: postinit.c:1312
static void IdleInTransactionSessionTimeoutHandler(void)
Definition: postinit.c:1369
static void LockTimeoutHandler(void)
Definition: postinit.c:1351
static void IdleStatsUpdateTimeoutHandler(void)
Definition: postinit.c:1385
static void process_settings(Oid databaseid, Oid roleid)
Definition: postinit.c:1278
static void IdleSessionTimeoutHandler(void)
Definition: postinit.c:1377
static void process_startup_options(Port *port, bool am_superuser)
Definition: postinit.c:1213
static void StatementTimeoutHandler(void)
Definition: postinit.c:1329
static void CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connections)
Definition: postinit.c:313
static bool ThereIsAtLeastOneRole(void)
Definition: postinit.c:1404
static void PerformAuthentication(Port *port)
Definition: postinit.c:190
static void ClientCheckTimeoutHandler(void)
Definition: postinit.c:1393
static HeapTuple GetDatabaseTuple(const char *dbname)
Definition: postinit.c:101
static HeapTuple GetDatabaseTupleByOid(Oid dboid)
Definition: postinit.c:144
static void TransactionTimeoutHandler(void)
Definition: postinit.c:1361
int ReservedConnections
Definition: postmaster.c:226
int SuperuserReservedConnections
Definition: postmaster.c:225
short access
Definition: preproc-type.c:36
void ProcSignalInit(bool cancel_key_valid, int32 cancel_key)
Definition: procsignal.c:166
void RelationCacheInitializePhase3(void)
Definition: relcache.c:4051
void RelationCacheInitialize(void)
Definition: relcache.c:3946
void RelationCacheInitializePhase2(void)
Definition: relcache.c:3992
char * GetDatabasePath(Oid dbOid, Oid spcOid)
Definition: relpath.c:110
void ReleaseAuxProcessResources(bool isCommit)
Definition: resowner.c:1002
ResourceOwner CurrentResourceOwner
Definition: resowner.c:165
void CreateAuxProcessResourceOwner(void)
Definition: resowner.c:982
void InitializeSession(void)
Definition: session.c:54
void pg_usleep(long microsec)
Definition: signal.c:53
void SharedInvalBackendInit(bool sendOnly)
Definition: sinvaladt.c:271
void InvalidateCatalogSnapshot(void)
Definition: snapmgr.c:384
bool HaveNFreeProcs(int n, int *nfree)
Definition: proc.c:733
void CheckDeadLockAlert(void)
Definition: proc.c:1870
void InitProcessPhase2(void)
Definition: proc.c:531
char * dbname
Definition: streamutil.c:50
UserAuth auth_method
Definition: libpq-be.h:111
Oid databaseId
Definition: proc.h:207
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:115
bool am_db_walsender
Definition: walsender.c:118
void StartTransactionCommand(void)
Definition: xact.c:3051
int XactIsoLevel
Definition: xact.c:78
void SetCurrentStatementStartTimestamp(void)
Definition: xact.c:913
void CommitTransactionCommand(void)
Definition: xact.c:3149
#define XACT_READ_COMMITTED
Definition: xact.h:37
void StartupXLOG(void)
Definition: xlog.c:5429
void ShutdownXLOG(int code, Datum arg)
Definition: xlog.c:6602

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(), InvalidateCatalogSnapshot(), IsBinaryUpgrade, IsBootstrapProcessingMode, IsUnderPostmaster, LOCK_TIMEOUT, LockSharedObject(), LockTimeoutHandler(), MyCancelKey, MyCancelKeyValid, MyClientConnectionInfo, MyDatabaseHasLoginEventTriggers, MyDatabaseId, MyDatabaseTableSpace, MyProc, MyProcPort, NAMEDATALEN, NameStr, namestrcmp(), OidIsValid, PerformAuthentication(), pfree(), pg_usleep(), pgstat_before_server_shutdown(), pgstat_beinit(), pgstat_bestart(), 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 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:953
int errmsg_internal(const char *fmt,...)
Definition: elog.c:1157
void SignalHandlerForCrashExit(SIGNAL_ARGS)
Definition: interrupt.c:73
void on_exit_reset(void)
Definition: ipc.c:416
void InitializeLatchWaitSet(void)
Definition: latch.c:346
void InitializeLatchSupport(void)
Definition: latch.c:232
void InitProcessLocalLatch(void)
Definition: miscinit.c:235
void PostmasterDeathSignalInit(void)
Definition: pmsignal.c:407
#define pqsignal
Definition: port.h:520
void InitProcessGlobals(void)
Definition: postmaster.c:1910
int postmaster_alive_fds[2]
Definition: postmaster.c:466
#define POSTMASTER_FD_WATCH
Definition: postmaster.h:84
void pgwin32_signal_initialize(void)
Definition: signal.c:79
#define SIGQUIT
Definition: win32_port.h:159

References BlockSig, elog, ereport, errcode_for_socket_access(), errmsg_internal(), FATAL, InitializeLatchSupport(), InitializeLatchWaitSet(), 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:62
void InitLatch(Latch *latch)
Definition: latch.c:394
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:81
bool IsPostmasterEnvironment
Definition: globals.c:118
char my_exec_path[MAXPGPATH]
Definition: globals.c:80
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:879

References argv0, Assert, B_STANDALONE_BACKEND, BlockSig, elog, FATAL, find_my_exec(), get_pkglib_path(), InitializeLatchSupport(), InitializeLatchWaitSet(), 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 678 of file miscinit.c.

679{
681}
#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 696 of file miscinit.c.

697{
699}
#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 1936 of file miscinit.c.

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

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

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

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

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

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

1914{
1916 "session_preload_libraries",
1917 false);
1919 "local_preload_libraries",
1920 true);
1921}
char * session_preload_libraries_string
Definition: miscinit.c:1829
char * local_preload_libraries_string
Definition: miscinit.c:1831
static void load_libraries(const char *libraries, const char *gucname, bool restricted)
Definition: miscinit.c:1847

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

1900{
1903 "shared_preload_libraries",
1904 false);
1907}
bool process_shared_preload_libraries_done
Definition: miscinit.c:1835
char * shared_preload_libraries_string
Definition: miscinit.c:1830
bool process_shared_preload_libraries_in_progress
Definition: miscinit.c:1834

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

1928{
1933}
bool process_shmem_requests_in_progress
Definition: miscinit.c:1838
shmem_request_hook_type shmem_request_hook
Definition: miscinit.c:1837

References process_shmem_requests_in_progress, and shmem_request_hook.

Referenced by PostgresSingleUserMain(), and PostmasterMain().

◆ ProcessInterrupts()

void ProcessInterrupts ( void  )

Definition at line 3273 of file postgres.c.

3274{
3275 /* OK to accept any interrupts now? */
3276 if (InterruptHoldoffCount != 0 || CritSectionCount != 0)
3277 return;
3278 InterruptPending = false;
3279
3280 if (ProcDiePending)
3281 {
3282 ProcDiePending = false;
3283 QueryCancelPending = false; /* ProcDie trumps QueryCancel */
3285 /* As in quickdie, don't risk sending to client during auth */
3289 ereport(FATAL,
3290 (errcode(ERRCODE_QUERY_CANCELED),
3291 errmsg("canceling authentication due to timeout")));
3292 else if (AmAutoVacuumWorkerProcess())
3293 ereport(FATAL,
3294 (errcode(ERRCODE_ADMIN_SHUTDOWN),
3295 errmsg("terminating autovacuum process due to administrator command")));
3296 else if (IsLogicalWorker())
3297 ereport(FATAL,
3298 (errcode(ERRCODE_ADMIN_SHUTDOWN),
3299 errmsg("terminating logical replication worker due to administrator command")));
3300 else if (IsLogicalLauncher())
3301 {
3303 (errmsg_internal("logical replication launcher shutting down")));
3304
3305 /*
3306 * The logical replication launcher can be stopped at any time.
3307 * Use exit status 1 so the background worker is restarted.
3308 */
3309 proc_exit(1);
3310 }
3311 else if (AmBackgroundWorkerProcess())
3312 ereport(FATAL,
3313 (errcode(ERRCODE_ADMIN_SHUTDOWN),
3314 errmsg("terminating background worker \"%s\" due to administrator command",
3316 else
3317 ereport(FATAL,
3318 (errcode(ERRCODE_ADMIN_SHUTDOWN),
3319 errmsg("terminating connection due to administrator command")));
3320 }
3321
3323 {
3325
3326 /*
3327 * Check for lost connection and re-arm, if still configured, but not
3328 * if we've arrived back at DoingCommandRead state. We don't want to
3329 * wake up idle sessions, and they already know how to detect lost
3330 * connections.
3331 */
3333 {
3334 if (!pq_check_connection())
3335 ClientConnectionLost = true;
3336 else
3339 }
3340 }
3341
3343 {
3344 QueryCancelPending = false; /* lost connection trumps QueryCancel */
3346 /* don't send to client, we already know the connection to be dead. */
3348 ereport(FATAL,
3349 (errcode(ERRCODE_CONNECTION_FAILURE),
3350 errmsg("connection to client lost")));
3351 }
3352
3353 /*
3354 * Don't allow query cancel interrupts while reading input from the
3355 * client, because we might lose sync in the FE/BE protocol. (Die
3356 * interrupts are OK, because we won't read any further messages from the
3357 * client in that case.)
3358 *
3359 * See similar logic in ProcessRecoveryConflictInterrupts().
3360 */
3362 {
3363 /*
3364 * Re-arm InterruptPending so that we process the cancel request as
3365 * soon as we're done reading the message. (XXX this is seriously
3366 * ugly: it complicates INTERRUPTS_CAN_BE_PROCESSED(), and it means we
3367 * can't use that macro directly as the initial test in this function,
3368 * meaning that this code also creates opportunities for other bugs to
3369 * appear.)
3370 */
3371 InterruptPending = true;
3372 }
3373 else if (QueryCancelPending)
3374 {
3375 bool lock_timeout_occurred;
3376 bool stmt_timeout_occurred;
3377
3378 QueryCancelPending = false;
3379
3380 /*
3381 * If LOCK_TIMEOUT and STATEMENT_TIMEOUT indicators are both set, we
3382 * need to clear both, so always fetch both.
3383 */
3384 lock_timeout_occurred = get_timeout_indicator(LOCK_TIMEOUT, true);
3385 stmt_timeout_occurred = get_timeout_indicator(STATEMENT_TIMEOUT, true);
3386
3387 /*
3388 * If both were set, we want to report whichever timeout completed
3389 * earlier; this ensures consistent behavior if the machine is slow
3390 * enough that the second timeout triggers before we get here. A tie
3391 * is arbitrarily broken in favor of reporting a lock timeout.
3392 */
3393 if (lock_timeout_occurred && stmt_timeout_occurred &&
3395 lock_timeout_occurred = false; /* report stmt timeout */
3396
3397 if (lock_timeout_occurred)
3398 {
3400 ereport(ERROR,
3401 (errcode(ERRCODE_LOCK_NOT_AVAILABLE),
3402 errmsg("canceling statement due to lock timeout")));
3403 }
3404 if (stmt_timeout_occurred)
3405 {
3407 ereport(ERROR,
3408 (errcode(ERRCODE_QUERY_CANCELED),
3409 errmsg("canceling statement due to statement timeout")));
3410 }
3412 {
3414 ereport(ERROR,
3415 (errcode(ERRCODE_QUERY_CANCELED),
3416 errmsg("canceling autovacuum task")));
3417 }
3418
3419 /*
3420 * If we are reading a command from the client, just ignore the cancel
3421 * request --- sending an extra error message won't accomplish
3422 * anything. Otherwise, go ahead and throw the error.
3423 */
3424 if (!DoingCommandRead)
3425 {
3427 ereport(ERROR,
3428 (errcode(ERRCODE_QUERY_CANCELED),
3429 errmsg("canceling statement due to user request")));
3430 }
3431 }
3432
3435
3437 {
3438 /*
3439 * If the GUC has been reset to zero, ignore the signal. This is
3440 * important because the GUC update itself won't disable any pending
3441 * interrupt. We need to unset the flag before the injection point,
3442 * otherwise we could loop in interrupts checking.
3443 */
3446 {
3447 INJECTION_POINT("idle-in-transaction-session-timeout");
3448 ereport(FATAL,
3449 (errcode(ERRCODE_IDLE_IN_TRANSACTION_SESSION_TIMEOUT),
3450 errmsg("terminating connection due to idle-in-transaction timeout")));
3451 }
3452 }
3453
3455 {
3456 /* As above, ignore the signal if the GUC has been reset to zero. */
3458 if (TransactionTimeout > 0)
3459 {
3460 INJECTION_POINT("transaction-timeout");
3461 ereport(FATAL,
3462 (errcode(ERRCODE_TRANSACTION_TIMEOUT),
3463 errmsg("terminating connection due to transaction timeout")));
3464 }
3465 }
3466
3468 {
3469 /* As above, ignore the signal if the GUC has been reset to zero. */
3471 if (IdleSessionTimeout > 0)
3472 {
3473 INJECTION_POINT("idle-session-timeout");
3474 ereport(FATAL,
3475 (errcode(ERRCODE_IDLE_SESSION_TIMEOUT),
3476 errmsg("terminating connection due to idle-session timeout")));
3477 }
3478 }
3479
3480 /*
3481 * If there are pending stats updates and we currently are truly idle
3482 * (matching the conditions in PostgresMain(), report stats now.
3483 */
3486 {
3488 pgstat_report_stat(true);
3489 }
3490
3493
3496
3499
3502}
volatile sig_atomic_t ParallelApplyMessagePending
void HandleParallelApplyMessages(void)
void HandleParallelMessages(void)
Definition: parallel.c:1044
volatile sig_atomic_t ParallelMessagePending
Definition: parallel.c:117
bool IsLogicalWorker(void)
Definition: worker.c:4846
@ DestRemote
Definition: dest.h:89
@ DestNone
Definition: dest.h:87
#define DEBUG1
Definition: elog.h:30
volatile sig_atomic_t IdleStatsUpdateTimeoutPending
Definition: globals.c:41
volatile sig_atomic_t LogMemoryContextPending
Definition: globals.c:40
volatile sig_atomic_t ProcSignalBarrierPending
Definition: globals.c:39
volatile sig_atomic_t InterruptPending
Definition: globals.c:31
volatile sig_atomic_t IdleSessionTimeoutPending
Definition: globals.c:38
volatile uint32 QueryCancelHoldoffCount
Definition: globals.c:43
volatile sig_atomic_t IdleInTransactionSessionTimeoutPending
Definition: globals.c:36
volatile uint32 InterruptHoldoffCount
Definition: globals.c:42
volatile sig_atomic_t TransactionTimeoutPending
Definition: globals.c:37
volatile sig_atomic_t ClientConnectionLost
Definition: globals.c:35
volatile uint32 CritSectionCount
Definition: globals.c:44
volatile sig_atomic_t QueryCancelPending
Definition: globals.c:32
volatile sig_atomic_t ProcDiePending
Definition: globals.c:33
volatile sig_atomic_t CheckClientConnectionPending
Definition: globals.c:34
#define INJECTION_POINT(name)
void proc_exit(int code)
Definition: ipc.c:104
bool IsLogicalLauncher(void)
Definition: launcher.c:1240
void ProcessLogMemoryContextInterrupt(void)
Definition: mcxt.c:1289
long pgstat_report_stat(bool force)
Definition: pgstat.c:692
int client_connection_check_interval
Definition: postgres.c:101
CommandDest whereToSendOutput
Definition: postgres.c:90
static volatile sig_atomic_t RecoveryConflictPending
Definition: postgres.c:157
static bool DoingCommandRead
Definition: postgres.c:135
static void ProcessRecoveryConflictInterrupts(void)
Definition: postgres.c:3234
bool ClientAuthInProgress
Definition: postmaster.c:360
BackgroundWorker * MyBgworkerEntry
Definition: postmaster.c:196
bool pq_check_connection(void)
Definition: pqcomm.c:2054
void ProcessProcSignalBarrier(void)
Definition: procsignal.c:496
int IdleSessionTimeout
Definition: proc.c:62
int IdleInTransactionSessionTimeout
Definition: proc.c:60
int TransactionTimeout
Definition: proc.c:61
void LockErrorCleanup(void)
Definition: proc.c:764
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:4981

References AmAutoVacuumWorkerProcess, AmBackgroundWorkerProcess, 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(), HandleParallelApplyMessages(), HandleParallelMessages(), 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(), ProcessProcSignalBarrier(), ProcessRecoveryConflictInterrupts(), ProcSignalBarrierPending, QueryCancelHoldoffCount, QueryCancelPending, RecoveryConflictPending, STATEMENT_TIMEOUT, TransactionTimeout, TransactionTimeoutPending, and whereToSendOutput.

Referenced by die().

◆ RecheckDataDirLockFile()

bool RecheckDataDirLockFile ( void  )

Definition at line 1694 of file miscinit.c.

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

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

1132{
1134
1135 memcpy(&serialized, conninfo, sizeof(serialized));
1136
1137 /* Copy the fields back into place */
1140
1141 if (serialized.authn_id_len >= 0)
1142 {
1143 char *authn_id;
1144
1145 authn_id = conninfo + sizeof(serialized);
1147 authn_id);
1148 }
1149}

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

Referenced by ParallelWorkerMain().

◆ SerializeClientConnectionInfo()

void SerializeClientConnectionInfo ( Size  maxsize,
char *  start_address 
)

Definition at line 1099 of file miscinit.c.

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

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

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

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

Referenced by InitializeSessionUserId(), and ParallelWorkerMain().

◆ SetCurrentRoleId()

void SetCurrentRoleId ( Oid  roleid,
bool  is_superuser 
)

Definition at line 1004 of file miscinit.c.

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

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

332{
333 /* This should happen only once per process */
336}
char * DatabasePath
Definition: globals.c:103

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

Referenced by InitPostgres().

◆ SetDataDir()

void SetDataDir ( const char *  dir)

Definition at line 437 of file miscinit.c.

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

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

Referenced by SelectConfigFiles().

◆ SetSessionAuthorization()

void SetSessionAuthorization ( Oid  userid,
bool  is_superuser 
)

Definition at line 968 of file miscinit.c.

969{
971
972 if (!SetRoleIsActive)
974}
static void SetSessionUserId(Oid userid, bool is_superuser)
Definition: miscinit.c:570

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

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

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 long stack_depth;
113
114 /*
115 * Compute distance from reference point to my local variables
116 */
117 stack_depth = (long) (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 long max_stack_depth_bytes
Definition: stack_depth.c:29

References max_stack_depth_bytes, and stack_base_ptr.

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

◆ superuser()

bool superuser ( void  )

Definition at line 46 of file superuser.c.

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

References GetUserId(), and superuser_arg().

Referenced by AlterForeignDataWrapper(), AlterForeignDataWrapperOwner_internal(), AlterForeignServerOwner_internal(), AlterFunction(), AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), AlterOpFamily(), AlterPublicationOwner_internal(), AlterRole(), AlterRoleSet(), AlterSubscription(), AlterSubscriptionOwner_internal(), AlterSystemSetConfigFile(), AlterType(), AlterTypeOwner(), ATExecChangeOwner(), brin_metapage_info(), brin_page_items(), brin_page_type(), brin_revmap_data(), bt_metap(), bt_multi_page_stats(), bt_page_items_bytea(), bt_page_items_internal(), bt_page_stats_internal(), check_encoding_locale_matches(), CheckAlterPublication(), CreateAccessMethod(), CreateCast(), CreateEventTrigger(), CreateForeignDataWrapper(), CreateFunction(), CreateProceduralLanguage(), CreatePublication(), CreateRole(), CreateSubscription(), CreateTableSpace(), dblink_connstr_check(), dblink_security_check(), DefineAggregate(), DefineOpClass(), DefineOpFamily(), DefineTSParser(), DefineTSTemplate(), DefineType(), DropRole(), dummy_object_relabel(), EnableDisableTrigger(), ExecSetVariableStmt(), execute_extension_script(), ExecuteDoStmt(), fmgr_security_definer(), fsm_page_contents(), get_raw_page_internal(), gin_leafpage_items(), gin_metapage_info(), gin_page_opaque_info(), gist_page_items(), gist_page_items_bytea(), gist_page_opaque_info(), GUCArrayReset(), hash_bitmap_info(), hash_metapage_info(), hash_page_items(), hash_page_stats(), hash_page_type(), have_createdb_privilege(), heap_page_items(), heap_tuple_infomask_flags(), InitPostgres(), interpret_func_support(), main(), page_checksum_internal(), page_header(), pg_buffercache_evict(), 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:1704
bool rolsuper
Definition: pg_authid.h:35
uintptr_t Datum
Definition: postgres.h:69
static Oid last_roleid
Definition: superuser.c:35
static bool roleid_callback_registered
Definition: superuser.c:37
static void RoleidCallback(Datum arg, int cacheid, uint32 hashvalue)
Definition: superuser.c:103
static bool last_roleid_is_super
Definition: superuser.c:36

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

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

◆ SwitchBackToLocalLatch()

void SwitchBackToLocalLatch ( void  )

Definition at line 242 of file miscinit.c.

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

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

1539{
1540 ListCell *l;
1541
1542 foreach(l, lock_files)
1543 {
1544 char *socketLockFile = (char *) lfirst(l);
1545
1546 /* No need to touch the data directory lock file, we trust */
1547 if (strcmp(socketLockFile, DIRECTORY_LOCK_FILE) == 0)
1548 continue;
1549
1550 /* we just ignore any error here */
1551 (void) utime(socketLockFile, NULL);
1552 }
1553}
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 1766 of file miscinit.c.

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

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

Referenced by ClientCheckTimeoutHandler(), and ProcessInterrupts().

◆ ClientConnectionLost

PGDLLIMPORT volatile sig_atomic_t ClientConnectionLost
extern

Definition at line 35 of file globals.c.

Referenced by internal_flush_buffer(), and ProcessInterrupts().

◆ commit_timestamp_buffers

PGDLLIMPORT int commit_timestamp_buffers
extern

Definition at line 160 of file globals.c.

Referenced by CommitTsShmemBuffers(), and CommitTsShmemInit().

◆ CritSectionCount

◆ data_directory_mode

PGDLLIMPORT int data_directory_mode
extern

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

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

◆ hash_mem_multiplier

PGDLLIMPORT double hash_mem_multiplier
extern

Definition at line 131 of file globals.c.

Referenced by get_hash_memory_limit().

◆ IdleInTransactionSessionTimeoutPending

PGDLLIMPORT volatile sig_atomic_t IdleInTransactionSessionTimeoutPending
extern

Definition at line 36 of file globals.c.

Referenced by IdleInTransactionSessionTimeoutHandler(), and ProcessInterrupts().

◆ IdleSessionTimeoutPending

PGDLLIMPORT volatile sig_atomic_t IdleSessionTimeoutPending
extern

Definition at line 38 of file globals.c.

Referenced by IdleSessionTimeoutHandler(), and ProcessInterrupts().

◆ IdleStatsUpdateTimeoutPending

PGDLLIMPORT volatile sig_atomic_t IdleStatsUpdateTimeoutPending
extern

Definition at line 41 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 119 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(), HandleStartupProcInterrupts(), init_ps_display(), InitAuxiliaryProcess(), InitializeLatchSupport(), InitializeLatchWaitSet(), InitializeSessionUserId(), InitializeSessionUserIdStandalone(), InitPostgres(), InitPostmasterChild(), InitProcess(), InitSync(), InjectionPointShmemInit(), LWLockAcquire(), MaintainLatestCompletedXidRecovery(), MultiXactShmemInit(), parallel_vacuum_compute_workers(), PerformRecoveryXLogAction(), PerformWalRecovery(), 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(), readRecoverySignalFile(), RegisterBackgroundWorker(), RegisterDynamicBackgroundWorker(), ReplicationSlotAcquire(), SendPostmasterSignal(), SerialInit(), set_config_sourcefile(), set_config_with_handle(), SetMultiXactIdLimit(), SetTransactionIdLimit(), ShmemInitStruct(), SimpleLruInit(), standard_planner(), start_xact_command(), StatsShmemInit(), superuser_arg(), SyncScanShmemInit(), TwoPhaseShmemInit(), vacuum_delay_point(), VarsupShmemInit(), verify_dictoptions(), WaitLatch(), WaitLatchOrSocket(), XLogArchiveNotify(), XLogPageRead(), XLogPrefetchIncrement(), XLogRecGetFullXid(), and XLogWrite().

◆ local_preload_libraries_string

PGDLLIMPORT char* local_preload_libraries_string
extern

Definition at line 1831 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 133 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 144 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 161 of file globals.c.

Referenced by MultiXactShmemInit(), and MultiXactShmemSize().

◆ multixact_offset_buffers

PGDLLIMPORT int multixact_offset_buffers
extern

Definition at line 162 of file globals.c.

Referenced by MultiXactShmemInit(), and MultiXactShmemSize().

◆ my_exec_path

◆ MyBackendType

◆ MyCancelKey

PGDLLIMPORT int32 MyCancelKey
extern

Definition at line 52 of file globals.c.

Referenced by InitPostgres(), and PostgresMain().

◆ MyCancelKeyValid

PGDLLIMPORT bool MyCancelKeyValid
extern

Definition at line 51 of file globals.c.

Referenced by InitPostgres(), and PostgresMain().

◆ MyDatabaseHasLoginEventTriggers

PGDLLIMPORT bool MyDatabaseHasLoginEventTriggers
extern

Definition at line 97 of file globals.c.

Referenced by EventTriggerOnLogin(), and InitPostgres().

◆ MyDatabaseId

PGDLLIMPORT Oid MyDatabaseId
extern

Definition at line 93 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(), check_default_table_access_method(), check_default_tablespace(), check_default_text_search_config(), check_temp_tablespaces(), CheckLogicalDecodingRequirements(), CheckMyDatabase(), checkSharedDependencies(), checkTempNamespaceStatus(), classIdGetDbId(), ComputeXidHorizons(), ConditionalLockDatabaseObject(), create_pg_locale_builtin(), create_pg_locale_icu(), create_pg_locale_libc(), CreateDecodingContext(), CreateInitDecodingContext(), CreatePublication(), CreateSchemaCommand(), CreateSubscription(), current_database(), database_to_xml_internal(), DeconstructQualifiedName(), do_analyze_rel(), do_autovacuum(), dropdb(), DropSubscription(), EventTriggerOnLogin(), Exec_ListenPreCommit(), exec_object_restorecon(), exec_replication_command(), ExecuteTruncateGuts(), ExpandColumnRefStar(), ExportSnapshot(), extension_is_trusted(), find_funcstat_entry(), find_tabstat_entry(), get_subscription_oid(), GetCurrentVirtualXIDs(), GetNewRelFileNumber(), GetRunningTransactionData(), heap_inplace_update_and_unlock(), heap_vacuum_rel(), IdentifySystem(), ImportSnapshot(), init_database_collation(), initialize_acl(), InitializeParallelDSM(), InitPostgres(), InitTempTableNamespace(), 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(), 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_checksum_failure(), pgstat_report_connect(), pgstat_report_deadlock(), pgstat_report_disconnect(), pgstat_report_recovery_conflict(), pgstat_report_tempfile(), pgstat_report_vacuum(), pgstat_reset_counters(), pgstat_reset_database_timestamp(), pgstat_shutdown_hook(), pgstat_update_dbstats(), pgstat_update_parallel_workers_stats(), PostgresMain(), PrepareToInvalidateCacheTuple(), PrepareTransaction(), ProcArrayInstallImportedXmin(), ProcArrayInstallRestoredXmin(), RangeVarGetAndCheckCreationNamespace(), RangeVarGetCreationNamespace(), RangeVarGetRelidExtended(), read_stream_begin_impl(), ReindexMultipleTables(), RelationInitLockInfo(), RelationInitPhysicalAddr(), RelationMapFinishBootstrap(), RenameDatabase(), RenameSchema(), ReplicationSlotCreate(), roles_is_member_of(), ScanPgRelation(), SearchSysCacheLocked1(), sepgsql_schema_post_create(), SetDatabaseHasLoginEventTriggers(), SetLocktagRelationOid(), shdepDropOwned(), shdepReassignOwned(), SignalBackends(), stats_lock_check_privileges(), transformColumnRef(), UnlockApplyTransactionForSession(), UnlockDatabaseObject(), UpdateLogicalMappings(), vac_truncate_clog(), vac_update_datfrozenxid(), vacuum_is_permitted_for_relation(), XactLogAbortRecord(), and XactLogCommitRecord().

◆ MyDatabaseTableSpace

◆ MyLatch

PGDLLIMPORT struct Latch* MyLatch
extern

Definition at line 62 of file globals.c.

Referenced by ApplyLauncherMain(), autoprewarm_main(), avl_sigusr2_handler(), BackgroundWriterMain(), CheckDeadLockAlert(), CheckpointerMain(), CheckpointWriteDelay(), ClientCheckTimeoutHandler(), ConditionVariableTimedSleep(), ConfigurePostmasterWaitSet(), copy_read_data(), die(), do_pg_backup_stop(), 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(), lazy_truncate_heap(), libpqrcv_connect(), libpqrcv_PQgetResult(), 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(), pgarch_MainLoop(), pgarch_waken_stop(), pgfdw_get_cleanup_result(), pq_check_connection(), pq_init(), ProcessClientReadInterrupt(), ProcessClientWriteInterrupt(), ProcessPendingWrites(), procsignal_sigusr1_handler(), ProcSleep(), ProcWaitForSignal(), ReqCheckpointHandler(), 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 46 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(), 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(), InitializeLatchSupport(), InitializeParallelDSM(), InitLatch(), InitPostmasterDeathWatchHandle(), InitProcess(), InitProcessGlobals(), InitWalSenderSlot(), injection_point_allowed(), injection_points_attach(), InvalidatePossiblyObsoleteSlot(), IsLogicalLauncher(), LaunchParallelWorkers(), llvm_compile_module(), LockTimeoutHandler(), log_status_format(), logicalrep_worker_launch(), main(), ModifyWaitEvent(), OpenTemporaryFileInTablespace(), OwnLatch(), pg_backend_pid(), pgstat_bestart(), 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(), 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 141 of file globals.c.

◆ notify_buffers

PGDLLIMPORT int notify_buffers
extern

Definition at line 163 of file globals.c.

Referenced by AsyncShmemInit(), and AsyncShmemSize().

◆ OutputFileName

PGDLLIMPORT char OutputFileName[]
extern

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

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

◆ QueryCancelPending

PGDLLIMPORT volatile sig_atomic_t QueryCancelPending
extern

◆ serializable_buffers

PGDLLIMPORT int serializable_buffers
extern

Definition at line 164 of file globals.c.

Referenced by PredicateLockShmemSize(), and SerialInit().

◆ session_preload_libraries_string

PGDLLIMPORT char* session_preload_libraries_string
extern

Definition at line 1829 of file miscinit.c.

Referenced by process_session_preload_libraries().

◆ shared_preload_libraries_string

PGDLLIMPORT char* shared_preload_libraries_string
extern

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

Referenced by _PG_init(), and process_shmem_requests().

◆ subtransaction_buffers

PGDLLIMPORT int subtransaction_buffers
extern

Definition at line 165 of file globals.c.

Referenced by SUBTRANSShmemBuffers(), and SUBTRANSShmemInit().

◆ transaction_buffers

PGDLLIMPORT int transaction_buffers
extern

Definition at line 166 of file globals.c.

Referenced by CLOGShmemBuffers(), and CLOGShmemInit().

◆ TransactionTimeoutPending

PGDLLIMPORT volatile sig_atomic_t TransactionTimeoutPending
extern

Definition at line 37 of file globals.c.

Referenced by ProcessInterrupts(), and TransactionTimeoutHandler().

◆ VacuumBufferUsageLimit

PGDLLIMPORT int VacuumBufferUsageLimit
extern

Definition at line 148 of file globals.c.

Referenced by do_autovacuum(), and ExecVacuum().

◆ VacuumCostActive

◆ VacuumCostBalance

◆ VacuumCostDelay

PGDLLIMPORT double VacuumCostDelay
extern

Definition at line 154 of file globals.c.

Referenced by VacuumUpdateCosts().

◆ VacuumCostLimit

PGDLLIMPORT int VacuumCostLimit
extern

Definition at line 153 of file globals.c.

Referenced by AutoVacuumUpdateCostLimit(), and VacuumUpdateCosts().

◆ VacuumCostPageDirty

PGDLLIMPORT int VacuumCostPageDirty
extern

Definition at line 152 of file globals.c.

Referenced by MarkBufferDirty(), and MarkBufferDirtyHint().

◆ VacuumCostPageHit

PGDLLIMPORT int VacuumCostPageHit
extern

Definition at line 150 of file globals.c.

Referenced by PinBufferForBlock().

◆ VacuumCostPageMiss

PGDLLIMPORT int VacuumCostPageMiss
extern

Definition at line 151 of file globals.c.

Referenced by WaitReadBuffers().

◆ work_mem