PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
miscadmin.h File Reference
#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 PG_BACKEND_VERSIONSTR   "postgres (PostgreSQL) " PG_VERSION "\n"
 
#define InvalidPid   (-1)
 
#define CHECK_FOR_INTERRUPTS()
 
#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 SECURITY_LOCAL_USERID_CHANGE   0x0001
 
#define SECURITY_RESTRICTED_OPERATION   0x0002
 
#define SECURITY_NOFORCE_RLS   0x0004
 
#define IsBootstrapProcessingMode()   (Mode == BootstrapProcessing)
 
#define IsInitProcessingMode()   (Mode == InitProcessing)
 
#define IsNormalProcessingMode()   (Mode == NormalProcessing)
 
#define GetProcessingMode()   Mode
 
#define SetProcessingMode(mode)
 
#define AmBootstrapProcess()   (MyAuxProcType == BootstrapProcess)
 
#define AmStartupProcess()   (MyAuxProcType == StartupProcess)
 
#define AmBackgroundWriterProcess()   (MyAuxProcType == BgWriterProcess)
 
#define AmCheckpointerProcess()   (MyAuxProcType == CheckpointerProcess)
 
#define AmWalWriterProcess()   (MyAuxProcType == WalWriterProcess)
 
#define AmWalReceiverProcess()   (MyAuxProcType == WalReceiverProcess)
 
#define LOCK_FILE_LINE_PID   1
 
#define LOCK_FILE_LINE_DATA_DIR   2
 
#define LOCK_FILE_LINE_START_TIME   3
 
#define LOCK_FILE_LINE_PORT   4
 
#define LOCK_FILE_LINE_SOCKET_DIR   5
 
#define LOCK_FILE_LINE_LISTEN_ADDR   6
 
#define LOCK_FILE_LINE_SHMEM_KEY   7
 

Typedefs

typedef char * pg_stack_base_t
 
typedef enum ProcessingMode ProcessingMode
 

Enumerations

enum  ProcessingMode { BootstrapProcessing, InitProcessing, NormalProcessing }
 
enum  AuxProcType {
  NotAnAuxProcess = -1, CheckerProcess = 0, BootstrapProcess, StartupProcess,
  BgWriterProcess, CheckpointerProcess, WalWriterProcess, WalReceiverProcess,
  NUM_AUXPROCTYPES
}
 

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)
 
void PreventCommandIfReadOnly (const char *cmdname)
 
void PreventCommandIfParallelMode (const char *cmdname)
 
void PreventCommandDuringRecovery (const char *cmdname)
 
int trace_recovery (int trace_level)
 
void InitPostmasterChild (void)
 
void InitStandaloneProcess (const char *argv0)
 
void SetDatabasePath (const char *path)
 
char * GetUserNameFromId (Oid roleid, bool noerr)
 
Oid GetUserId (void)
 
Oid GetOuterUserId (void)
 
Oid GetSessionUserId (void)
 
Oid GetAuthenticatedUserId (void)
 
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 useroid)
 
void InitializeSessionUserIdStandalone (void)
 
void SetSessionAuthorization (Oid userid, bool is_superuser)
 
Oid GetCurrentRoleId (void)
 
void SetCurrentRoleId (Oid roleid, bool is_superuser)
 
void SetDataDir (const char *dir)
 
void ChangeToDataDir (void)
 
void SwitchToSharedLatch (void)
 
void SwitchBackToLocalLatch (void)
 
bool superuser (void)
 
bool superuser_arg (Oid roleid)
 
void pg_split_opts (char **argv, int *argcp, const char *optstr)
 
void InitializeMaxBackends (void)
 
void InitPostgres (const char *in_dbname, Oid dboid, const char *username, Oid useroid, 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 pg_bindtextdomain (const char *domain)
 
bool has_rolreplication (Oid roleid)
 
bool BackupInProgress (void)
 
void CancelBackup (void)
 

Variables

PGDLLIMPORT volatile bool InterruptPending
 
PGDLLIMPORT volatile bool QueryCancelPending
 
PGDLLIMPORT volatile bool ProcDiePending
 
PGDLLIMPORT volatile bool IdleInTransactionSessionTimeoutPending
 
volatile bool 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 IsBackgroundWorker
 
PGDLLIMPORT bool IsBinaryUpgrade
 
bool ExitOnAnyError
 
PGDLLIMPORT char * DataDir
 
PGDLLIMPORT int NBuffers
 
int MaxBackends
 
int MaxConnections
 
int max_worker_processes
 
int max_parallel_workers
 
PGDLLIMPORT int MyProcPid
 
PGDLLIMPORT pg_time_t MyStartTime
 
PGDLLIMPORT struct PortMyProcPort
 
PGDLLIMPORT struct LatchMyLatch
 
int32 MyCancelKey
 
int MyPMChildSlot
 
char OutputFileName []
 
PGDLLIMPORT char my_exec_path []
 
char pkglib_path []
 
PGDLLIMPORT Oid MyDatabaseId
 
PGDLLIMPORT Oid MyDatabaseTableSpace
 
PGDLLIMPORT int DateStyle
 
PGDLLIMPORT int DateOrder
 
PGDLLIMPORT int IntervalStyle
 
bool enableFsync
 
bool allowSystemTableMods
 
PGDLLIMPORT int work_mem
 
PGDLLIMPORT int maintenance_work_mem
 
PGDLLIMPORT int replacement_sort_tuples
 
int VacuumCostPageHit
 
int VacuumCostPageMiss
 
int VacuumCostPageDirty
 
int VacuumCostLimit
 
int VacuumCostDelay
 
int VacuumPageHit
 
int VacuumPageMiss
 
int VacuumPageDirty
 
int VacuumCostBalance
 
bool VacuumCostActive
 
int trace_recovery_messages
 
char * DatabasePath
 
ProcessingMode Mode
 
AuxProcType MyAuxProcType
 
bool IgnoreSystemIndexes
 
PGDLLIMPORT bool process_shared_preload_libraries_in_progress
 
char * session_preload_libraries_string
 
char * shared_preload_libraries_string
 
char * local_preload_libraries_string
 

Macro Definition Documentation

#define AmBackgroundWriterProcess ( )    (MyAuxProcType == BgWriterProcess)

Definition at line 404 of file miscadmin.h.

Referenced by ForwardFsyncRequest().

#define AmBootstrapProcess ( )    (MyAuxProcType == BootstrapProcess)

Definition at line 402 of file miscadmin.h.

#define AmCheckpointerProcess ( )    (MyAuxProcType == CheckpointerProcess)
#define AmStartupProcess ( )    (MyAuxProcType == StartupProcess)

Definition at line 403 of file miscadmin.h.

Referenced by HotStandbyActiveInReplay(), and mdinit().

#define AmWalReceiverProcess ( )    (MyAuxProcType == WalReceiverProcess)

Definition at line 407 of file miscadmin.h.

Referenced by get_sync_bit().

#define AmWalWriterProcess ( )    (MyAuxProcType == WalWriterProcess)

Definition at line 406 of file miscadmin.h.

#define CHECK_FOR_INTERRUPTS ( )
Value:
do { \
} while(0)
PGDLLIMPORT volatile bool InterruptPending
Definition: globals.c:29
void ProcessInterrupts(void)
Definition: postgres.c:2825

Definition at line 97 of file miscadmin.h.

Referenced by _bt_buildadd(), _bt_readnextpage(), _bt_walk_left(), _crypt_blowfish_rn(), _hash_init(), _hash_readnext(), _hash_readprev(), add_partial_path(), add_path(), analyze_rel(), ATRewriteTable(), backend_read_statsfile(), BipartiteMatch(), blgetbitmap(), bloomBuildCallback(), brin_evacuate_page(), brin_getinsertbuffer(), brin_vacuum_scan(), bringetbitmap(), brinGetTupleForHeapBlock(), brininsert(), brinsummarize(), bt_check_level_from_leftmost(), bt_right_page_check_scankey(), bt_target_page_check(), btree_xlog_delete_get_latestRemovedXid(), calculate_database_size(), calculate_relation_size(), calculate_tablespace_size(), ClientAuthentication(), cluster_rel(), collect_corrupt_items(), collect_visibility_data(), ConditionVariableSleep(), copy_file(), copy_heap_data(), copy_messages(), copy_read_data(), copy_relation_data(), copydir(), CopyFrom(), CopyTo(), count_nondeletable_pages(), CountOtherDBBackends(), db_dir_size(), DecodingContextFindStartpoint(), do_autovacuum(), do_des(), do_pg_stop_backup(), dofindsubquery(), errfinish(), exec_execute_message(), exec_parse_message(), exec_replication_command(), exec_simple_query(), exec_stmt(), exec_stmts(), ExecHashIncreaseNumBatches(), ExecHashJoin(), ExecHashJoinGetSavedTuple(), ExecHashRemoveNextSkewBucket(), ExecMakeTableFunctionResult(), ExecProcNode(), ExecScan(), fsm_vacuum_page(), gather_readnext(), get_query_def(), get_rule_expr(), get_setop_query(), GetMultiXactIdMembers(), GetNewOidWithIndex(), GetNewRelFileNode(), getNextNearest(), ginbuild(), ginBuildCallback(), gingetbitmap(), gistgetbitmap(), gistgettuple(), gistProcessItup(), gm_readnext_tuple(), HandleFunctionRequest(), hash_xlog_vacuum_get_latestRemovedXid(), heap_lock_updated_tuple_rec(), heap_multi_insert(), heapgetpage(), hypothetical_dense_rank_final(), hypothetical_rank_common(), ident_inet(), IndexBuildHeapRangeScan(), IndexCheckExclusion(), interactive_getc(), lazy_truncate_heap(), libpqrcv_connect(), libpqrcv_PQexec(), libpqrcv_processTuples(), logicalrep_worker_stop(), LogicalRepApplyLoop(), lseg_inside_poly(), make_bounded_heap(), mode_final(), mq_putmessage(), MultiExecBitmapIndexScan(), MultiExecProcNode(), numeric_fac(), OpenTableList(), pg_logical_slot_get_changes_guts(), pg_prewarm(), pg_sleep(), pg_visibility_map_summary(), pgfdw_get_result(), PGSemaphoreLock(), pgstat_collect_oids(), pgstat_get_backend_current_activity(), pgstat_heap(), pgstat_index(), pgstat_read_current_status(), pgstat_vacuum_stat(), pgstathashindex(), pgstatindex_impl(), plperl_spi_prepare(), PortalRunMulti(), postgresAcquireSampleRowsFunc(), PostgresMain(), predicate_implied_by_simple_clause(), predicate_refuted_by_simple_clause(), ProcessClientReadInterrupt(), ProcessClientWriteInterrupt(), ProcessWalRcvInterrupts(), ProcSleep(), ProcWaitForSignal(), puttuple_common(), random_relative_prime(), RE_compile_and_cache(), RE_wchar_execute(), read_local_xlog_page(), refresh_matview_datafill(), regexp_fixed_prefix(), replace_text(), replace_text_regexp(), replorigin_create(), RequestCheckpoint(), revmap_extend_and_get_blkno(), sendAuthRequest(), sendDir(), set_rtable_names(), shm_mq_receive_bytes(), shm_mq_send_bytes(), shm_mq_wait_internal(), spgdoinsert(), spgWalk(), statapprox_heap(), storeQueryResult(), summarize_range(), tablesample_getnext(), test_shm_mq_pipelined(), text_to_array_internal(), throttle(), toast_save_datum(), tuplesort_heap_insert(), tuplesort_heap_replace_top(), tuplesort_skiptuples(), tuplestore_skiptuples(), vacuum_delay_point(), vacuum_rel(), validate_index_heapscan(), wait_for_workers_to_become_ready(), wait_pid(), WaitExceedsMaxStandbyDelay(), WaitForBackgroundWorkerShutdown(), WaitForBackgroundWorkerStartup(), WaitForParallelWorkersToFinish(), WaitForReplicationWorkerAttach(), walkdir(), WalSndLoop(), WalSndWaitForWal(), and WalSndWriteData().

#define DATEORDER_DMY   1
#define DATEORDER_MDY   2

Definition at line 218 of file miscadmin.h.

Referenced by check_datestyle(), locale_date_order(), and setup_config().

#define DATEORDER_YMD   0

Definition at line 216 of file miscadmin.h.

Referenced by check_datestyle(), DecodeNumber(), locale_date_order(), and setup_config().

#define END_CRIT_SECTION ( )
Value:
do { \
} while(0)
#define Assert(condition)
Definition: c.h:675
PGDLLIMPORT volatile uint32 CritSectionCount
Definition: globals.c:36

Definition at line 132 of file miscadmin.h.

Referenced by _bt_delitems_delete(), _bt_delitems_vacuum(), _bt_getroot(), _bt_insertonpg(), _bt_mark_page_halfdead(), _bt_newroot(), _bt_split(), _bt_unlink_halfdead_page(), _hash_addovflpage(), _hash_doinsert(), _hash_expandtable(), _hash_freeovflpage(), _hash_splitbucket(), _hash_squeezebucket(), _hash_vacuum_one_page(), AbsorbFsyncRequests(), addLeafTuple(), AlterSequence(), brin_doinsert(), brin_doupdate(), brin_initialize_empty_new_buffer(), brinbuildempty(), brinRevmapDesummarizeRange(), CreateCheckPoint(), CreateEndOfRecoveryRecord(), createPostingTree(), CreateSlotOnDisk(), do_setval(), doPickSplit(), EndPrepare(), fill_seq_with_data(), FreeSpaceMapTruncateRel(), GenericXLogFinish(), ginbuild(), ginbuildempty(), ginbulkdelete(), ginDeletePage(), ginHeapTupleFastInsert(), ginPlaceToPage(), ginUpdateStats(), ginVacuumPostingTreeLeaf(), gistbuild(), gistbuildempty(), gistbulkdelete(), gistplacetopage(), gistvacuumpage(), hashbucketcleanup(), hashbulkdelete(), heap_abort_speculative(), heap_delete(), heap_finish_speculative(), heap_inplace_update(), heap_insert(), heap_lock_tuple(), heap_lock_updated_tuple_rec(), heap_multi_insert(), heap_page_prune(), heap_update(), lazy_scan_heap(), lazy_vacuum_page(), moveLeafs(), MultiXactIdCreateFromMembers(), nextval_internal(), PostPrepare_Locks(), RecordTransactionAbort(), RecordTransactionAbortPrepared(), RecordTransactionCommit(), RecordTransactionCommitPrepared(), ReplicationSlotDropPtr(), RestoreSlotFromDisk(), revmap_physical_extend(), SaveSlotToPath(), shiftList(), SlruPhysicalWritePage(), spgAddNodeAction(), spgbuild(), spgSplitNodeAction(), TruncateMultiXact(), UpdateFullPageWrites(), vacuumLeafPage(), vacuumLeafRoot(), vacuumRedirectAndPlaceholder(), visibilitymap_set(), visibilitymap_truncate(), write_relmap_file(), writeListPage(), XLogBackgroundFlush(), XLogFlush(), and XLogInsertRecord().

#define GetProcessingMode ( )    Mode

Definition at line 369 of file miscadmin.h.

#define HOLD_CANCEL_INTERRUPTS ( )    (QueryCancelHoldoffCount++)

Definition at line 122 of file miscadmin.h.

Referenced by CopyGetData(), and SocketBackend().

#define INTSTYLE_ISO_8601   3

Definition at line 233 of file miscadmin.h.

Referenced by EncodeInterval().

#define INTSTYLE_POSTGRES   0

Definition at line 230 of file miscadmin.h.

Referenced by EncodeInterval(), and set_transmission_modes().

#define INTSTYLE_POSTGRES_VERBOSE   1

Definition at line 231 of file miscadmin.h.

Referenced by DecodeInterval(), EncodeInterval(), and PGTYPESinterval_to_asc().

#define INTSTYLE_SQL_STANDARD   2

Definition at line 232 of file miscadmin.h.

Referenced by DecodeInterval(), and EncodeInterval().

#define IsInitProcessingMode ( )    (Mode == InitProcessing)
#define IsNormalProcessingMode ( )    (Mode == NormalProcessing)
#define LOCK_FILE_LINE_DATA_DIR   2

Definition at line 447 of file miscadmin.h.

#define LOCK_FILE_LINE_LISTEN_ADDR   6

Definition at line 451 of file miscadmin.h.

Referenced by PostmasterMain(), and test_postmaster_connection().

#define LOCK_FILE_LINE_PID   1

Definition at line 446 of file miscadmin.h.

Referenced by test_postmaster_connection().

#define LOCK_FILE_LINE_PORT   4

Definition at line 449 of file miscadmin.h.

Referenced by get_sock_dir(), and test_postmaster_connection().

#define LOCK_FILE_LINE_SHMEM_KEY   7

Definition at line 452 of file miscadmin.h.

Referenced by CreateLockFile(), and InternalIpcMemoryCreate().

#define LOCK_FILE_LINE_SOCKET_DIR   5

Definition at line 450 of file miscadmin.h.

Referenced by get_sock_dir(), PostmasterMain(), and test_postmaster_connection().

#define LOCK_FILE_LINE_START_TIME   3

Definition at line 448 of file miscadmin.h.

Referenced by test_postmaster_connection().

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

Definition at line 237 of file miscadmin.h.

Referenced by abstime2tm(), and EncodeDateTime().

#define PG_BACKEND_VERSIONSTR   "postgres (PostgreSQL) " PG_VERSION "\n"

Definition at line 29 of file miscadmin.h.

Referenced by adjust_data_dir(), do_start(), getInstallationPaths(), and setup_bin_paths().

#define RESUME_CANCEL_INTERRUPTS ( )
Value:
do { \
} while(0)
PGDLLIMPORT volatile uint32 QueryCancelHoldoffCount
Definition: globals.c:35
#define Assert(condition)
Definition: c.h:675

Definition at line 124 of file miscadmin.h.

Referenced by CopyGetData(), and SocketBackend().

#define SECURITY_NOFORCE_RLS   0x0004

Definition at line 293 of file miscadmin.h.

Referenced by InNoForceRLSOperation(), ri_PerformCheck(), and ri_PlanCheck().

#define SECURITY_RESTRICTED_OPERATION   0x0002
#define SetProcessingMode (   mode)
#define START_CRIT_SECTION ( )    (CritSectionCount++)

Definition at line 130 of file miscadmin.h.

Referenced by _bt_delitems_delete(), _bt_delitems_vacuum(), _bt_getroot(), _bt_insertonpg(), _bt_mark_page_halfdead(), _bt_newroot(), _bt_split(), _bt_unlink_halfdead_page(), _hash_addovflpage(), _hash_doinsert(), _hash_expandtable(), _hash_freeovflpage(), _hash_splitbucket(), _hash_squeezebucket(), _hash_vacuum_one_page(), AbsorbFsyncRequests(), addLeafTuple(), AlterSequence(), brin_doinsert(), brin_doupdate(), brin_initialize_empty_new_buffer(), brinbuildempty(), brinRevmapDesummarizeRange(), CreateCheckPoint(), CreateEndOfRecoveryRecord(), createPostingTree(), CreateSlotOnDisk(), do_setval(), doPickSplit(), EndPrepare(), fill_seq_with_data(), FreeSpaceMapTruncateRel(), GenericXLogFinish(), GetNewMultiXactId(), ginbuild(), ginbuildempty(), ginbulkdelete(), ginDeletePage(), ginHeapTupleFastInsert(), ginPlaceToPage(), ginUpdateStats(), ginVacuumPostingTreeLeaf(), gistbuild(), gistbuildempty(), gistbulkdelete(), gistplacetopage(), gistvacuumpage(), hashbucketcleanup(), hashbulkdelete(), heap_abort_speculative(), heap_delete(), heap_finish_speculative(), heap_inplace_update(), heap_insert(), heap_lock_tuple(), heap_lock_updated_tuple_rec(), heap_multi_insert(), heap_page_prune(), heap_update(), lazy_scan_heap(), lazy_vacuum_page(), moveLeafs(), nextval_internal(), PostPrepare_Locks(), RecordTransactionAbort(), RecordTransactionAbortPrepared(), RecordTransactionCommit(), RecordTransactionCommitPrepared(), ReplicationSlotDropPtr(), RestoreSlotFromDisk(), revmap_physical_extend(), SaveSlotToPath(), shiftList(), SlruPhysicalWritePage(), spgAddNodeAction(), spgbuild(), spgSplitNodeAction(), TruncateMultiXact(), UpdateFullPageWrites(), vacuumLeafPage(), vacuumLeafRoot(), vacuumRedirectAndPlaceholder(), visibilitymap_set(), visibilitymap_truncate(), write_relmap_file(), writeListPage(), XLogBackgroundFlush(), XLogFlush(), and XLogInsertRecord().

#define USE_GERMAN_DATES   3

Definition at line 212 of file miscadmin.h.

Referenced by check_datestyle(), EncodeDateOnly(), and EncodeDateTime().

#define USE_ISO_DATES   1
#define USE_POSTGRES_DATES   0

Definition at line 209 of file miscadmin.h.

Referenced by check_datestyle(), EncodeDateOnly(), and EncodeDateTime().

#define USE_SQL_DATES   2

Definition at line 211 of file miscadmin.h.

Referenced by check_datestyle(), EncodeDateOnly(), and EncodeDateTime().

#define USE_XSD_DATES   4

Typedef Documentation

Definition at line 268 of file miscadmin.h.

Enumeration Type Documentation

Enumerator
NotAnAuxProcess 
CheckerProcess 
BootstrapProcess 
StartupProcess 
BgWriterProcess 
CheckpointerProcess 
WalWriterProcess 
WalReceiverProcess 
NUM_AUXPROCTYPES 

Definition at line 386 of file miscadmin.h.

Enumerator
BootstrapProcessing 
InitProcessing 
NormalProcessing 

Definition at line 356 of file miscadmin.h.

357 {
358  BootstrapProcessing, /* bootstrap creation of template database */
359  InitProcessing, /* initializing system */
360  NormalProcessing /* normal processing */
ProcessingMode
Definition: miscadmin.h:356

Function Documentation

void AddToDataDirLockFile ( int  target_line,
const char *  str 
)

Definition at line 1156 of file miscinit.c.

References close, DIRECTORY_LOCK_FILE, elog, ereport, errcode_for_file_access(), errmsg(), fd(), LOG, NULL, PG_BINARY, pg_fsync(), pgstat_report_wait_end(), pgstat_report_wait_start(), read, snprintf(), WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ, WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC, WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE, and write.

Referenced by InternalIpcMemoryCreate(), and PostmasterMain().

1157 {
1158  int fd;
1159  int len;
1160  int lineno;
1161  char *srcptr;
1162  char *destptr;
1163  char srcbuffer[BLCKSZ];
1164  char destbuffer[BLCKSZ];
1165 
1166  fd = open(DIRECTORY_LOCK_FILE, O_RDWR | PG_BINARY, 0);
1167  if (fd < 0)
1168  {
1169  ereport(LOG,
1171  errmsg("could not open file \"%s\": %m",
1173  return;
1174  }
1176  len = read(fd, srcbuffer, sizeof(srcbuffer) - 1);
1178  if (len < 0)
1179  {
1180  ereport(LOG,
1182  errmsg("could not read from file \"%s\": %m",
1184  close(fd);
1185  return;
1186  }
1187  srcbuffer[len] = '\0';
1188 
1189  /*
1190  * Advance over lines we are not supposed to rewrite, then copy them to
1191  * destbuffer.
1192  */
1193  srcptr = srcbuffer;
1194  for (lineno = 1; lineno < target_line; lineno++)
1195  {
1196  if ((srcptr = strchr(srcptr, '\n')) == NULL)
1197  {
1198  elog(LOG, "incomplete data in \"%s\": found only %d newlines while trying to add line %d",
1199  DIRECTORY_LOCK_FILE, lineno - 1, target_line);
1200  close(fd);
1201  return;
1202  }
1203  srcptr++;
1204  }
1205  memcpy(destbuffer, srcbuffer, srcptr - srcbuffer);
1206  destptr = destbuffer + (srcptr - srcbuffer);
1207 
1208  /*
1209  * Write or rewrite the target line.
1210  */
1211  snprintf(destptr, destbuffer + sizeof(destbuffer) - destptr, "%s\n", str);
1212  destptr += strlen(destptr);
1213 
1214  /*
1215  * If there are more lines in the old file, append them to destbuffer.
1216  */
1217  if ((srcptr = strchr(srcptr, '\n')) != NULL)
1218  {
1219  srcptr++;
1220  snprintf(destptr, destbuffer + sizeof(destbuffer) - destptr, "%s",
1221  srcptr);
1222  }
1223 
1224  /*
1225  * And rewrite the data. Since we write in a single kernel call, this
1226  * update should appear atomic to onlookers.
1227  */
1228  len = strlen(destbuffer);
1229  errno = 0;
1231  if (lseek(fd, (off_t) 0, SEEK_SET) != 0 ||
1232  (int) write(fd, destbuffer, len) != len)
1233  {
1235  /* if write didn't set errno, assume problem is no disk space */
1236  if (errno == 0)
1237  errno = ENOSPC;
1238  ereport(LOG,
1240  errmsg("could not write to file \"%s\": %m",
1242  close(fd);
1243  return;
1244  }
1247  if (pg_fsync(fd) != 0)
1248  {
1249  ereport(LOG,
1251  errmsg("could not write to file \"%s\": %m",
1253  }
1255  if (close(fd) != 0)
1256  {
1257  ereport(LOG,
1259  errmsg("could not write to file \"%s\": %m",
1261  }
1262 }
#define write(a, b, c)
Definition: win32.h:14
#define DIRECTORY_LOCK_FILE
Definition: miscinit.c:54
int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3
#define LOG
Definition: elog.h:26
static int fd(const char *x, int i)
Definition: preproc-init.c:105
#define PG_BINARY
Definition: c.h:1038
int errcode_for_file_access(void)
Definition: elog.c:598
static void pgstat_report_wait_end(void)
Definition: pgstat.h:1232
#define ereport(elevel, rest)
Definition: elog.h:122
#define NULL
Definition: c.h:229
static void pgstat_report_wait_start(uint32 wait_event_info)
Definition: pgstat.h:1208
int errmsg(const char *fmt,...)
Definition: elog.c:797
int pg_fsync(int fd)
Definition: fd.c:333
#define elog
Definition: elog.h:219
#define close(a)
Definition: win32.h:12
#define read(a, b, c)
Definition: win32.h:13
bool BackupInProgress ( void  )

Definition at line 11340 of file xlog.c.

References BACKUP_LABEL_FILE.

Referenced by pg_is_in_backup(), and PostmasterStateMachine().

11341 {
11342  struct stat stat_buf;
11343 
11344  return (stat(BACKUP_LABEL_FILE, &stat_buf) == 0);
11345 }
struct stat stat_buf
Definition: pg_standby.c:101
#define BACKUP_LABEL_FILE
Definition: xlog.h:321
void BaseInit ( void  )

Definition at line 517 of file postinit.c.

References DebugFileOpen(), InitBufferPoolAccess(), InitCommunication(), InitFileAccess(), and smgrinit().

Referenced by AutoVacLauncherMain(), AutoVacWorkerMain(), AuxiliaryProcessMain(), PostgresMain(), and StartBackgroundWorker().

518 {
519  /*
520  * Attach to shared memory and semaphores, and initialize our
521  * input/output/debugging file descriptors.
522  */
524  DebugFileOpen();
525 
526  /* Do local initialization of file, storage and buffer managers */
527  InitFileAccess();
528  smgrinit();
530 }
static void InitCommunication(void)
Definition: postinit.c:409
void InitBufferPoolAccess(void)
Definition: bufmgr.c:2437
void DebugFileOpen(void)
Definition: elog.c:1863
void smgrinit(void)
Definition: smgr.c:102
void InitFileAccess(void)
Definition: fd.c:764
void CancelBackup ( void  )

Definition at line 11360 of file xlog.c.

References BACKUP_LABEL_FILE, BACKUP_LABEL_OLD, DEBUG1, durable_rename(), ereport, errcode_for_file_access(), errdetail(), errmsg(), LOG, TABLESPACE_MAP, TABLESPACE_MAP_OLD, unlink(), and WARNING.

Referenced by PostmasterStateMachine().

11361 {
11362  struct stat stat_buf;
11363 
11364  /* if the backup_label file is not there, return */
11365  if (stat(BACKUP_LABEL_FILE, &stat_buf) < 0)
11366  return;
11367 
11368  /* remove leftover file from previously canceled backup if it exists */
11370 
11372  {
11373  ereport(WARNING,
11375  errmsg("online backup mode was not canceled"),
11376  errdetail("File \"%s\" could not be renamed to \"%s\": %m.",
11378  return;
11379  }
11380 
11381  /* if the tablespace_map file is not there, return */
11382  if (stat(TABLESPACE_MAP, &stat_buf) < 0)
11383  {
11384  ereport(LOG,
11385  (errmsg("online backup mode canceled"),
11386  errdetail("File \"%s\" was renamed to \"%s\".",
11388  return;
11389  }
11390 
11391  /* remove leftover file from previously canceled backup if it exists */
11393 
11395  {
11396  ereport(LOG,
11397  (errmsg("online backup mode canceled"),
11398  errdetail("Files \"%s\" and \"%s\" were renamed to "
11399  "\"%s\" and \"%s\", respectively.",
11402  }
11403  else
11404  {
11405  ereport(WARNING,
11407  errmsg("online backup mode canceled"),
11408  errdetail("File \"%s\" was renamed to \"%s\", but "
11409  "file \"%s\" could not be renamed to \"%s\": %m.",
11412  }
11413 }
#define DEBUG1
Definition: elog.h:25
#define LOG
Definition: elog.h:26
#define BACKUP_LABEL_OLD
Definition: xlog.h:322
#define TABLESPACE_MAP
Definition: xlog.h:324
struct stat stat_buf
Definition: pg_standby.c:101
int errdetail(const char *fmt,...)
Definition: elog.c:873
int errcode_for_file_access(void)
Definition: elog.c:598
int unlink(const char *filename)
#define ereport(elevel, rest)
Definition: elog.h:122
int durable_rename(const char *oldfile, const char *newfile, int elevel)
Definition: fd.c:593
#define WARNING
Definition: elog.h:40
#define TABLESPACE_MAP_OLD
Definition: xlog.h:325
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define BACKUP_LABEL_FILE
Definition: xlog.h:321
void ChangeToDataDir ( void  )

Definition at line 115 of file miscinit.c.

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

Referenced by AuxiliaryProcessMain(), PostgresMain(), and PostmasterMain().

116 {
118 
119  if (chdir(DataDir) < 0)
120  ereport(FATAL,
122  errmsg("could not change directory to \"%s\": %m",
123  DataDir)));
124 }
#define AssertState(condition)
Definition: c.h:678
#define FATAL
Definition: elog.h:52
int errcode_for_file_access(void)
Definition: elog.c:598
#define ereport(elevel, rest)
Definition: elog.h:122
int errmsg(const char *fmt,...)
Definition: elog.c:797
char * DataDir
Definition: globals.c:59
void check_stack_depth ( void  )

Definition at line 3102 of file postgres.c.

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

Referenced by BuildTupleRemapInfo(), clean_NOT_intree(), clean_stopword_intree(), cntsize(), contains_required_value(), convertJsonbValue(), copyObjectImpl(), Cover(), datum_to_json(), datum_to_jsonb(), dofindsubquery(), EventTriggerInvoke(), ExecEvalAlternativeSubPlan(), ExecEvalSubPlan(), ExecInitExprRec(), ExecMakeFunctionResultSet(), execute(), expression_tree_mutator(), expression_tree_walker(), fillQT(), findoprnd(), findoprnd_recurse(), flatten_grouping_sets(), FreePageManagerDumpBtree(), freetree(), generate_partition_qual(), get_query_def(), get_rule_expr(), get_setop_query(), gistSplit(), hash_range(), hk_depth_search(), infix(), inline_set_returning_function(), int_query_opr_selec(), JsonbDeepContains(), JumbleExpr(), ltree_execute(), makepol(), maketree(), MatchText(), parse_array(), parse_object(), plainnode(), plperl_hash_from_tuple(), plperl_sv_to_datum(), populate_array_dim_jsonb(), populate_record_field(), QT2QTN(), QTNBinary(), QTNClearFlags(), QTNCopy(), QTNFree(), QTNodeCompare(), QTNSort(), QTNTernary(), range_cmp(), range_in(), range_out(), range_recv(), range_send(), raw_expression_tree_walker(), record_cmp(), record_eq(), record_in(), record_out(), record_recv(), record_send(), setPath(), split_array(), TQExamine(), TQRemap(), transformExprRecurse(), transformSetOperationTree(), traverse_lacons(), TS_execute(), TS_execute_ternary(), TS_phrase_execute(), tsquery_opr_selec(), and tsquery_requires_match().

3103 {
3104  if (stack_is_too_deep())
3105  {
3106  ereport(ERROR,
3107  (errcode(ERRCODE_STATEMENT_TOO_COMPLEX),
3108  errmsg("stack depth limit exceeded"),
3109  errhint("Increase the configuration parameter \"max_stack_depth\" (currently %dkB), "
3110  "after ensuring the platform's stack depth limit is adequate.",
3111  max_stack_depth)));
3112  }
3113 }
int errhint(const char *fmt,...)
Definition: elog.c:987
int errcode(int sqlerrcode)
Definition: elog.c:575
#define ERROR
Definition: elog.h:43
#define ereport(elevel, rest)
Definition: elog.h:122
int max_stack_depth
Definition: postgres.c:94
int errmsg(const char *fmt,...)
Definition: elog.c:797
bool stack_is_too_deep(void)
Definition: postgres.c:3116
void CreateDataDirLockFile ( bool  amPostmaster)

Definition at line 1080 of file miscinit.c.

References CreateLockFile(), DataDir, and DIRECTORY_LOCK_FILE.

Referenced by AuxiliaryProcessMain(), PostgresMain(), and PostmasterMain().

1081 {
1082  CreateLockFile(DIRECTORY_LOCK_FILE, amPostmaster, "", true, DataDir);
1083 }
#define DIRECTORY_LOCK_FILE
Definition: miscinit.c:54
static void CreateLockFile(const char *filename, bool amPostmaster, const char *socketDir, bool isDDLock, const char *refName)
Definition: miscinit.c:768
char * DataDir
Definition: globals.c:59
void CreateSocketLockFile ( const char *  socketfile,
bool  amPostmaster,
const char *  socketDir 
)

Definition at line 1089 of file miscinit.c.

References CreateLockFile(), MAXPGPATH, and snprintf().

1091 {
1092  char lockfile[MAXPGPATH];
1093 
1094  snprintf(lockfile, sizeof(lockfile), "%s.lock", socketfile);
1095  CreateLockFile(lockfile, amPostmaster, socketDir, false, socketfile);
1096 }
int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3
static void CreateLockFile(const char *filename, bool amPostmaster, const char *socketDir, bool isDDLock, const char *refName)
Definition: miscinit.c:768
#define MAXPGPATH
Oid GetAuthenticatedUserId ( void  )

Definition at line 342 of file miscinit.c.

References AssertState, AuthenticatedUserId, and OidIsValid.

Referenced by InitializeParallelDSM().

343 {
345  return AuthenticatedUserId;
346 }
#define AssertState(condition)
Definition: c.h:678
#define OidIsValid(objectId)
Definition: c.h:538
static Oid AuthenticatedUserId
Definition: miscinit.c:155
Oid GetCurrentRoleId ( void  )

Definition at line 635 of file miscinit.c.

References InvalidOid, OuterUserId, and SetRoleIsActive.

Referenced by show_role().

636 {
637  if (SetRoleIsActive)
638  return OuterUserId;
639  else
640  return InvalidOid;
641 }
static Oid OuterUserId
Definition: miscinit.c:157
#define InvalidOid
Definition: postgres_ext.h:36
static bool SetRoleIsActive
Definition: miscinit.c:167
Oid GetOuterUserId ( void  )

Definition at line 294 of file miscinit.c.

References AssertState, OidIsValid, and OuterUserId.

Referenced by DropRole(), and RenameRole().

295 {
297  return OuterUserId;
298 }
#define AssertState(condition)
Definition: c.h:678
static Oid OuterUserId
Definition: miscinit.c:157
#define OidIsValid(objectId)
Definition: c.h:538
Oid GetSessionUserId ( void  )

Definition at line 317 of file miscinit.c.

References AssertState, OidIsValid, and SessionUserId.

Referenced by check_role(), DropRole(), get_rolespec_oid(), get_rolespec_tuple(), InitPostgres(), is_admin_of_role(), pgstat_bestart(), RenameRole(), and session_user().

318 {
320  return SessionUserId;
321 }
#define AssertState(condition)
Definition: c.h:678
static Oid SessionUserId
Definition: miscinit.c:156
#define OidIsValid(objectId)
Definition: c.h:538
Oid GetUserId ( void  )

Definition at line 283 of file miscinit.c.

References AssertState, CurrentUserId, and OidIsValid.

Referenced by AddRoleMems(), AggregateCreate(), AlterCollation(), AlterDatabase(), AlterDatabaseOwner(), AlterDatabaseSet(), AlterEventTrigger(), AlterEventTriggerOwner_internal(), AlterExtensionNamespace(), AlterForeignServer(), AlterForeignServerOwner_internal(), AlterFunction(), AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), AlterOperator(), AlterOpFamilyAdd(), AlterPublication(), AlterPublicationOwner_internal(), AlterRole(), AlterRoleSet(), AlterSchemaOwner_internal(), AlterSequence(), AlterSubscription(), AlterSubscriptionOwner_internal(), AlterTableMoveAll(), AlterTableSpaceOptions(), AlterTSConfiguration(), AlterTSDictionary(), AlterTypeNamespace_oid(), AlterTypeOwner(), analyze_rel(), ATExecAddColumn(), ATExecChangeOwner(), ATPrepAlterColumnType(), ATPrepSetStatistics(), ATPrepSetTableSpace(), ATSimplePermissions(), be_lo_unlink(), binary_upgrade_create_empty_extension(), brin_desummarize_range(), brin_summarize_range(), BuildCachedPlan(), BuildDescForRelation(), BuildIndexValueDescription(), calculate_database_size(), calculate_tablespace_size(), call_pltcl_start_proc(), check_enable_rls(), check_permissions(), check_temp_tablespaces(), CheckCachedPlan(), checkDomainOwner(), checkEnumOwner(), checkFkeyPermissions(), CheckFunctionValidatorAccess(), CheckMyDatabase(), cluster_rel(), CommentObject(), compile_plperl_function(), compile_pltcl_function(), CompleteCachedPlan(), compute_return_type(), CreateCast(), CreateConversionCommand(), createdb(), CreateEventTrigger(), CreateExtensionInternal(), CreateForeignDataWrapper(), CreateForeignServer(), CreateForeignTable(), CreateFunction(), CreateOpFamily(), CreateProceduralLanguage(), CreatePublication(), CreateRole(), CreateStatistics(), CreateSubscription(), CreateTableSpace(), CreateTransform(), CreateTrigger(), current_user(), currtid_byrelname(), currtid_byreloid(), currval_oid(), DefineAggregate(), DefineCollation(), DefineDomain(), DefineEnum(), DefineIndex(), DefineOpClass(), DefineOperator(), DefineOpFamily(), DefineQueryRewrite(), DefineRange(), DefineRelation(), DefineTSConfiguration(), DefineTSDictionary(), DefineType(), DelRoleMems(), do_setval(), dropdb(), DropOwnedObjects(), DropRole(), DropSubscription(), DropTableSpace(), EnableDisableRule(), examine_simple_variable(), examine_variable(), ExecAlterDefaultPrivilegesStmt(), ExecAlterExtensionContentsStmt(), ExecAlterExtensionStmt(), ExecBuildSlotPartitionKeyDescription(), ExecBuildSlotValueDescription(), ExecCheckRTEPerms(), ExecGrant_Attribute(), ExecGrant_Database(), ExecGrant_Fdw(), ExecGrant_ForeignServer(), ExecGrant_Function(), ExecGrant_Language(), ExecGrant_Largeobject(), ExecGrant_Namespace(), ExecGrant_Relation(), ExecGrant_Tablespace(), ExecGrant_Type(), ExecInitAgg(), ExecInitExprRec(), ExecInitFunc(), ExecInitWindowAgg(), ExecSecLabelStmt(), ExecuteDoStmt(), ExecuteTruncate(), findRangeCanonicalFunction(), findRangeSubtypeDiffFunction(), FinishPreparedTransaction(), get_connect_string(), get_other_operator(), get_rel_from_relname(), get_rolespec_oid(), get_rolespec_tuple(), get_row_security_policies(), get_tables_to_cluster(), GetConfigOption(), GetConfigOptionByName(), GetConfigOptionByNum(), GetConfigOptionResetString(), 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_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(), ImportForeignSchema(), init_sexpr(), InitializeSearchPath(), InitPostgres(), InitTempTableNamespace(), inline_function(), inline_set_returning_function(), insert_username(), interpret_function_parameter_list(), inv_create(), LargeObjectCreate(), lastval(), lo_get_fragment_internal(), lo_read(), lo_truncate_internal(), lo_write(), LockTableAclCheck(), lookup_agg_function(), LookupCreationNamespace(), LookupExplicitNamespace(), MergeAttributes(), movedb(), nextval_internal(), OperatorCreate(), OperatorShellMake(), 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_activity(), pg_stat_get_backend_activity(), pg_stat_get_backend_activity_start(), pg_stat_get_backend_client_addr(), pg_stat_get_backend_client_port(), pg_stat_get_backend_start(), pg_stat_get_backend_wait_event(), pg_stat_get_backend_wait_event_type(), pg_stat_get_backend_xact_start(), pg_stat_get_progress_info(), pg_stat_get_wal_receiver(), pg_stat_statements_internal(), pgrowlocks(), pgss_store(), pgstat_get_backend_current_activity(), pltcl_fetch_interp(), postgresBeginDirectModify(), postgresBeginForeignModify(), postgresBeginForeignScan(), postgresGetForeignRelSize(), postgresImportForeignSchema(), PrepareTempTablespaces(), PrepareTransaction(), PublicationAddTables(), RangeVarCallbackForAlterRelation(), RangeVarCallbackForDropRelation(), RangeVarCallbackForPolicy(), RangeVarCallbackForReindexIndex(), RangeVarCallbackForRenameRule(), RangeVarCallbackForRenameTrigger(), RangeVarCallbackOwnsRelation(), RangeVarCallbackOwnsTable(), RangeVarGetAndCheckCreationNamespace(), ReassignOwnedObjects(), recomputeNamespacePath(), ReindexMultipleTables(), RemoveObjects(), RemoveRoleFromObjectPolicy(), renameatt_check(), RenameDatabase(), RenameSchema(), RenameTableSpace(), RenameType(), RevalidateCachedQuery(), RI_Initial_Check(), ri_ReportViolation(), select_perl_context(), set_foreign_rel_properties(), superuser(), timetravel(), transformTableLikeClause(), truncate_check_rel(), user_mapping_ddl_aclcheck(), vacuum_rel(), ValidateJoinEstimator(), and ValidateRestrictionEstimator().

284 {
286  return CurrentUserId;
287 }
#define AssertState(condition)
Definition: c.h:678
#define OidIsValid(objectId)
Definition: c.h:538
static Oid CurrentUserId
Definition: miscinit.c:158
void GetUserIdAndContext ( Oid userid,
bool sec_def_context 
)

Definition at line 437 of file miscinit.c.

References CurrentUserId, and InLocalUserIdChange().

438 {
439  *userid = CurrentUserId;
440  *sec_def_context = InLocalUserIdChange();
441 }
bool InLocalUserIdChange(void)
Definition: miscinit.c:406
static Oid CurrentUserId
Definition: miscinit.c:158
void GetUserIdAndSecContext ( Oid userid,
int *  sec_context 
)
char* GetUserNameFromId ( Oid  roleid,
bool  noerr 
)

Definition at line 691 of file miscinit.c.

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

Referenced by check_is_member_of_role(), current_user(), getObjectDescription(), getObjectIdentityParts(), insert_username(), regroleout(), RemoveRoleFromObjectPolicy(), session_user(), and timetravel().

692 {
693  HeapTuple tuple;
694  char *result;
695 
696  tuple = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
697  if (!HeapTupleIsValid(tuple))
698  {
699  if (!noerr)
700  ereport(ERROR,
701  (errcode(ERRCODE_UNDEFINED_OBJECT),
702  errmsg("invalid role OID: %u", roleid)));
703  result = NULL;
704  }
705  else
706  {
707  result = pstrdup(NameStr(((Form_pg_authid) GETSTRUCT(tuple))->rolname));
708  ReleaseSysCache(tuple);
709  }
710  return result;
711 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:656
char * pstrdup(const char *in)
Definition: mcxt.c:1077
int errcode(int sqlerrcode)
Definition: elog.c:575
return result
Definition: formatting.c:1632
#define SearchSysCache1(cacheId, key1)
Definition: syscache.h:156
FormData_pg_authid * Form_pg_authid
Definition: pg_authid.h:72
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
#define ERROR
Definition: elog.h:43
#define ereport(elevel, rest)
Definition: elog.h:122
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1117
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
#define NULL
Definition: c.h:229
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define NameStr(name)
Definition: c.h:499
bool has_rolreplication ( Oid  roleid)

Definition at line 464 of file miscinit.c.

References AUTHOID, GETSTRUCT, HeapTupleIsValid, ObjectIdGetDatum, ReleaseSysCache(), result, and SearchSysCache1.

Referenced by check_permissions(), and InitPostgres().

465 {
466  bool result = false;
467  HeapTuple utup;
468 
469  utup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
470  if (HeapTupleIsValid(utup))
471  {
472  result = ((Form_pg_authid) GETSTRUCT(utup))->rolreplication;
473  ReleaseSysCache(utup);
474  }
475  return result;
476 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:656
return result
Definition: formatting.c:1632
#define SearchSysCache1(cacheId, key1)
Definition: syscache.h:156
FormData_pg_authid * Form_pg_authid
Definition: pg_authid.h:72
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1117
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
void InitializeMaxBackends ( void  )

Definition at line 495 of file postinit.c.

References Assert, autovacuum_max_workers, elog, ERROR, MAX_BACKENDS, max_worker_processes, MaxBackends, and MaxConnections.

Referenced by AuxiliaryProcessMain(), PostgresMain(), and PostmasterMain().

496 {
497  Assert(MaxBackends == 0);
498 
499  /* the extra unit accounts for the autovacuum launcher */
502 
503  /* internal error because the values were all checked previously */
505  elog(ERROR, "too many backends configured");
506 }
#define ERROR
Definition: elog.h:43
#define MAX_BACKENDS
Definition: postmaster.h:75
int MaxBackends
Definition: globals.c:126
int MaxConnections
Definition: globals.c:123
int autovacuum_max_workers
Definition: autovacuum.c:113
#define Assert(condition)
Definition: c.h:675
int max_worker_processes
Definition: globals.c:124
#define elog
Definition: elog.h:219
void InitializeSessionUserId ( const char *  rolename,
Oid  useroid 
)

Definition at line 482 of file miscinit.c.

References AssertState, AuthenticatedUserId, AuthenticatedUserIsSuperuser, AUTHNAME, AUTHOID, CountUserBackends(), ereport, errcode(), errmsg(), FATAL, GETSTRUCT, HeapTupleGetOid, HeapTupleIsValid, IsBootstrapProcessingMode, IsUnderPostmaster, MyProc, NameStr, NULL, ObjectIdGetDatum, OidIsValid, PGC_BACKEND, PGC_INTERNAL, PGC_S_OVERRIDE, PointerGetDatum, ReleaseSysCache(), PGPROC::roleId, SearchSysCache1, SetConfigOption(), and SetSessionUserId().

Referenced by InitPostgres().

483 {
484  HeapTuple roleTup;
485  Form_pg_authid rform;
486  char *rname;
487 
488  /*
489  * Don't do scans if we're bootstrapping, none of the system catalogs
490  * exist yet, and they should be owned by postgres anyway.
491  */
493 
494  /* call only once */
496 
497  if (rolename != NULL)
498  {
499  roleTup = SearchSysCache1(AUTHNAME, PointerGetDatum(rolename));
500  if (!HeapTupleIsValid(roleTup))
501  ereport(FATAL,
502  (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
503  errmsg("role \"%s\" does not exist", rolename)));
504  }
505  else
506  {
507  roleTup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
508  if (!HeapTupleIsValid(roleTup))
509  ereport(FATAL,
510  (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
511  errmsg("role with OID %u does not exist", roleid)));
512  }
513 
514  rform = (Form_pg_authid) GETSTRUCT(roleTup);
515  roleid = HeapTupleGetOid(roleTup);
516  rname = NameStr(rform->rolname);
517 
518  AuthenticatedUserId = roleid;
519  AuthenticatedUserIsSuperuser = rform->rolsuper;
520 
521  /* This sets OuterUserId/CurrentUserId too */
523 
524  /* Also mark our PGPROC entry with the authenticated user id */
525  /* (We assume this is an atomic store so no lock is needed) */
526  MyProc->roleId = roleid;
527 
528  /*
529  * These next checks are not enforced when in standalone mode, so that
530  * there is a way to recover from sillinesses like "UPDATE pg_authid SET
531  * rolcanlogin = false;".
532  */
533  if (IsUnderPostmaster)
534  {
535  /*
536  * Is role allowed to login at all?
537  */
538  if (!rform->rolcanlogin)
539  ereport(FATAL,
540  (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
541  errmsg("role \"%s\" is not permitted to log in",
542  rname)));
543 
544  /*
545  * Check connection limit for this role.
546  *
547  * There is a race condition here --- we create our PGPROC before
548  * checking for other PGPROCs. If two backends did this at about the
549  * same time, they might both think they were over the limit, while
550  * ideally one should succeed and one fail. Getting that to work
551  * exactly seems more trouble than it is worth, however; instead we
552  * just document that the connection limit is approximate.
553  */
554  if (rform->rolconnlimit >= 0 &&
556  CountUserBackends(roleid) > rform->rolconnlimit)
557  ereport(FATAL,
558  (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
559  errmsg("too many connections for role \"%s\"",
560  rname)));
561  }
562 
563  /* Record username and superuser status as GUC settings too */
564  SetConfigOption("session_authorization", rname,
566  SetConfigOption("is_superuser",
567  AuthenticatedUserIsSuperuser ? "on" : "off",
569 
570  ReleaseSysCache(roleTup);
571 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:656
#define AssertState(condition)
Definition: c.h:678
PGPROC * MyProc
Definition: proc.c:67
#define PointerGetDatum(X)
Definition: postgres.h:562
Oid roleId
Definition: proc.h:114
int errcode(int sqlerrcode)
Definition: elog.c:575
#define OidIsValid(objectId)
Definition: c.h:538
#define SearchSysCache1(cacheId, key1)
Definition: syscache.h:156
FormData_pg_authid * Form_pg_authid
Definition: pg_authid.h:72
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
#define FATAL
Definition: elog.h:52
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition: guc.c:6672
bool IsUnderPostmaster
Definition: globals.c:100
static bool AuthenticatedUserIsSuperuser
Definition: miscinit.c:161
#define ereport(elevel, rest)
Definition: elog.h:122
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1117
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
#define NULL
Definition: c.h:229
int CountUserBackends(Oid roleid)
Definition: procarray.c:2836
#define IsBootstrapProcessingMode()
Definition: miscadmin.h:365
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define NameStr(name)
Definition: c.h:499
#define HeapTupleGetOid(tuple)
Definition: htup_details.h:695
static void SetSessionUserId(Oid userid, bool is_superuser)
Definition: miscinit.c:325
static Oid AuthenticatedUserId
Definition: miscinit.c:155
void InitializeSessionUserIdStandalone ( void  )

Definition at line 578 of file miscinit.c.

References AssertState, AuthenticatedUserId, AuthenticatedUserIsSuperuser, BOOTSTRAP_SUPERUSERID, IsAutoVacuumWorkerProcess(), IsBackgroundWorker, IsUnderPostmaster, OidIsValid, and SetSessionUserId().

Referenced by InitPostgres().

579 {
580  /*
581  * This function should only be called in single-user mode, in autovacuum
582  * workers, and in background workers.
583  */
585 
586  /* call only once */
588 
591 
593 }
#define AssertState(condition)
Definition: c.h:678
#define OidIsValid(objectId)
Definition: c.h:538
bool IsBackgroundWorker
Definition: globals.c:102
bool IsUnderPostmaster
Definition: globals.c:100
static bool AuthenticatedUserIsSuperuser
Definition: miscinit.c:161
bool IsAutoVacuumWorkerProcess(void)
Definition: autovacuum.c:3360
#define BOOTSTRAP_SUPERUSERID
Definition: pg_authid.h:102
static void SetSessionUserId(Oid userid, bool is_superuser)
Definition: miscinit.c:325
static Oid AuthenticatedUserId
Definition: miscinit.c:155
void InitPostgres ( const char *  in_dbname,
Oid  dboid,
const char *  username,
Oid  useroid,
char *  out_dbname 
)

Definition at line 558 of file postinit.c.

References am_db_walsender, am_walsender, Assert, before_shmem_exit(), CAC_WAITBACKUP, Port::canAcceptConnections, CheckDeadLockAlert(), CheckMyDatabase(), CommitTransactionCommand(), PGPROC::databaseId, DatabaseRelationId, dbname, DEADLOCK_TIMEOUT, DEBUG3, DEFAULTTABLESPACE_OID, elog, EnablePortalManager(), ereport, errcode(), errcode_for_file_access(), errdetail(), errhint(), errmsg(), FATAL, GetDatabasePath(), GetDatabaseTuple(), GetDatabaseTupleByOid(), GetSessionUserId(), GETSTRUCT, GetTransactionSnapshot(), GetUserId(), has_rolreplication(), HaveNFreeProcs(), HeapTupleGetOid, HeapTupleIsValid, IDLE_IN_TRANSACTION_SESSION_TIMEOUT, IdleInTransactionSessionTimeoutHandler(), InitBufferPoolBackend(), InitCatalogCache(), initialize_acl(), InitializeClientEncoding(), InitializeSearchPath(), InitializeSessionUserId(), InitializeSessionUserIdStandalone(), InitPlanCache(), InitProcessPhase2(), InvalidateCatalogSnapshot(), InvalidBackendId, IsAutoVacuumLauncherProcess(), IsAutoVacuumWorkerProcess(), IsBackgroundWorker, IsBinaryUpgrade, IsBootstrapProcessingMode, IsUnderPostmaster, LOCK_TIMEOUT, LockSharedObject(), LockTimeoutHandler(), MaxBackends, MyBackendId, MyDatabaseId, MyDatabaseTableSpace, MyProc, MyProcPort, NAMEDATALEN, NameStr, NULL, OidIsValid, on_shmem_exit(), PerformAuthentication(), pg_usleep(), pgstat_bestart(), pgstat_initialize(), PostAuthDelay, process_settings(), process_startup_options(), ProcSignalInit(), RecoveryInProgress(), RegisterTimeout(), RelationCacheInitialize(), RelationCacheInitializePhase2(), RelationCacheInitializePhase3(), ReservedBackends, RowExclusiveLock, SetCurrentStatementStartTimestamp(), SetDatabasePath(), SharedInvalBackendInit(), ShutdownPostgres(), ShutdownXLOG(), StartTransactionCommand(), StartupXLOG(), STATEMENT_TIMEOUT, StatementTimeoutHandler(), strlcpy(), superuser(), TemplateDbOid, ThereIsAtLeastOneRole(), ValidatePgVersion(), WARNING, XACT_READ_COMMITTED, and XactIsoLevel.

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

560 {
561  bool bootstrap = IsBootstrapProcessingMode();
562  bool am_superuser;
563  char *fullpath;
564  char dbname[NAMEDATALEN];
565 
566  elog(DEBUG3, "InitPostgres");
567 
568  /*
569  * Add my PGPROC struct to the ProcArray.
570  *
571  * Once I have done this, I am visible to other backends!
572  */
574 
575  /*
576  * Initialize my entry in the shared-invalidation manager's array of
577  * per-backend data.
578  *
579  * Sets up MyBackendId, a unique backend identifier.
580  */
582 
583  SharedInvalBackendInit(false);
584 
585  if (MyBackendId > MaxBackends || MyBackendId <= 0)
586  elog(FATAL, "bad backend ID: %d", MyBackendId);
587 
588  /* Now that we have a BackendId, we can participate in ProcSignal */
590 
591  /*
592  * Also set up timeout handlers needed for backend operation. We need
593  * these in every case except bootstrap.
594  */
595  if (!bootstrap)
596  {
602  }
603 
604  /*
605  * bufmgr needs another initialization call too
606  */
608 
609  /*
610  * Initialize local process's access to XLOG.
611  */
612  if (IsUnderPostmaster)
613  {
614  /*
615  * The postmaster already started the XLOG machinery, but we need to
616  * call InitXLOGAccess(), if the system isn't in hot-standby mode.
617  * This is handled by calling RecoveryInProgress and ignoring the
618  * result.
619  */
620  (void) RecoveryInProgress();
621  }
622  else
623  {
624  /*
625  * We are either a bootstrap process or a standalone backend. Either
626  * way, start up the XLOG machinery, and register to have it closed
627  * down at exit.
628  */
629  StartupXLOG();
631  }
632 
633  /*
634  * Initialize the relation cache and the system catalog caches. Note that
635  * no catalog access happens here; we only set up the hashtable structure.
636  * We must do this before starting a transaction because transaction abort
637  * would try to touch these hashtables.
638  */
641  InitPlanCache();
642 
643  /* Initialize portal manager */
645 
646  /* Initialize stats collection --- must happen before first xact */
647  if (!bootstrap)
649 
650  /*
651  * Load relcache entries for the shared system catalogs. This must create
652  * at least entries for pg_database and catalogs used for authentication.
653  */
655 
656  /*
657  * Set up process-exit callback to do pre-shutdown cleanup. This is the
658  * first before_shmem_exit callback we register; thus, this will be the
659  * last thing we do before low-level modules like the buffer manager begin
660  * to close down. We need to have this in place before we begin our first
661  * transaction --- if we fail during the initialization transaction, as is
662  * entirely possible, we need the AbortTransaction call to clean up.
663  */
665 
666  /* The autovacuum launcher is done here */
668  {
669  /* report this backend in the PgBackendStatus array */
670  pgstat_bestart();
671 
672  return;
673  }
674 
675  /*
676  * Start a new transaction here before first access to db, and get a
677  * snapshot. We don't have a use for the snapshot itself, but we're
678  * interested in the secondary effect that it sets RecentGlobalXmin. (This
679  * is critical for anything that reads heap pages, because HOT may decide
680  * to prune them even if the process doesn't attempt to modify any
681  * tuples.)
682  */
683  if (!bootstrap)
684  {
685  /* statement_timestamp must be set for timeouts to work correctly */
688 
689  /*
690  * transaction_isolation will have been set to the default by the
691  * above. If the default is "serializable", and we are in hot
692  * standby, we will fail if we don't change it to something lower.
693  * Fortunately, "read committed" is plenty good enough.
694  */
696 
697  (void) GetTransactionSnapshot();
698  }
699 
700  /*
701  * Perform client authentication if necessary, then figure out our
702  * postgres user ID, and see if we are a superuser.
703  *
704  * In standalone mode and in autovacuum worker processes, we use a fixed
705  * ID, otherwise we figure it out from the authenticated user name.
706  */
707  if (bootstrap || IsAutoVacuumWorkerProcess())
708  {
710  am_superuser = true;
711  }
712  else if (!IsUnderPostmaster)
713  {
715  am_superuser = true;
716  if (!ThereIsAtLeastOneRole())
718  (errcode(ERRCODE_UNDEFINED_OBJECT),
719  errmsg("no roles are defined in this database system"),
720  errhint("You should immediately run CREATE USER \"%s\" SUPERUSER;.",
721  username != NULL ? username : "postgres")));
722  }
723  else if (IsBackgroundWorker)
724  {
725  if (username == NULL && !OidIsValid(useroid))
726  {
728  am_superuser = true;
729  }
730  else
731  {
733  am_superuser = superuser();
734  }
735  }
736  else
737  {
738  /* normal multiuser case */
739  Assert(MyProcPort != NULL);
742  am_superuser = superuser();
743  }
744 
745  /*
746  * If we're trying to shut down, only superusers can connect, and new
747  * replication connections are not allowed.
748  */
749  if ((!am_superuser || am_walsender) &&
750  MyProcPort != NULL &&
752  {
753  if (am_walsender)
754  ereport(FATAL,
755  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
756  errmsg("new replication connections are not allowed during database shutdown")));
757  else
758  ereport(FATAL,
759  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
760  errmsg("must be superuser to connect during database shutdown")));
761  }
762 
763  /*
764  * Binary upgrades only allowed super-user connections
765  */
766  if (IsBinaryUpgrade && !am_superuser)
767  {
768  ereport(FATAL,
769  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
770  errmsg("must be superuser to connect in binary upgrade mode")));
771  }
772 
773  /*
774  * The last few connections slots are reserved for superusers. Although
775  * replication connections currently require superuser privileges, we
776  * don't allow them to consume the reserved slots, which are intended for
777  * interactive use.
778  */
779  if ((!am_superuser || am_walsender) &&
780  ReservedBackends > 0 &&
782  ereport(FATAL,
783  (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
784  errmsg("remaining connection slots are reserved for non-replication superuser connections")));
785 
786  /* Check replication permissions needed for walsender processes. */
787  if (am_walsender)
788  {
789  Assert(!bootstrap);
790 
791  if (!superuser() && !has_rolreplication(GetUserId()))
792  ereport(FATAL,
793  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
794  errmsg("must be superuser or replication role to start walsender")));
795  }
796 
797  /*
798  * If this is a plain walsender only supporting physical replication, we
799  * don't want to connect to any particular database. Just finish the
800  * backend startup by processing any options from the startup packet, and
801  * we're done.
802  */
804  {
805  /* process any options passed in the startup packet */
806  if (MyProcPort != NULL)
807  process_startup_options(MyProcPort, am_superuser);
808 
809  /* Apply PostAuthDelay as soon as we've read all options */
810  if (PostAuthDelay > 0)
811  pg_usleep(PostAuthDelay * 1000000L);
812 
813  /* initialize client encoding */
815 
816  /* report this backend in the PgBackendStatus array */
817  pgstat_bestart();
818 
819  /* close the transaction we started above */
821 
822  return;
823  }
824 
825  /*
826  * Set up the global variables holding database id and default tablespace.
827  * But note we won't actually try to touch the database just yet.
828  *
829  * We take a shortcut in the bootstrap case, otherwise we have to look up
830  * the db's entry in pg_database.
831  */
832  if (bootstrap)
833  {
836  }
837  else if (in_dbname != NULL)
838  {
839  HeapTuple tuple;
840  Form_pg_database dbform;
841 
842  tuple = GetDatabaseTuple(in_dbname);
843  if (!HeapTupleIsValid(tuple))
844  ereport(FATAL,
845  (errcode(ERRCODE_UNDEFINED_DATABASE),
846  errmsg("database \"%s\" does not exist", in_dbname)));
847  dbform = (Form_pg_database) GETSTRUCT(tuple);
848  MyDatabaseId = HeapTupleGetOid(tuple);
849  MyDatabaseTableSpace = dbform->dattablespace;
850  /* take database name from the caller, just for paranoia */
851  strlcpy(dbname, in_dbname, sizeof(dbname));
852  }
853  else if (OidIsValid(dboid))
854  {
855  /* caller specified database by OID */
856  HeapTuple tuple;
857  Form_pg_database dbform;
858 
859  tuple = GetDatabaseTupleByOid(dboid);
860  if (!HeapTupleIsValid(tuple))
861  ereport(FATAL,
862  (errcode(ERRCODE_UNDEFINED_DATABASE),
863  errmsg("database %u does not exist", dboid)));
864  dbform = (Form_pg_database) GETSTRUCT(tuple);
865  MyDatabaseId = HeapTupleGetOid(tuple);
866  MyDatabaseTableSpace = dbform->dattablespace;
867  Assert(MyDatabaseId == dboid);
868  strlcpy(dbname, NameStr(dbform->datname), sizeof(dbname));
869  /* pass the database name back to the caller */
870  if (out_dbname)
871  strcpy(out_dbname, dbname);
872  }
873  else
874  {
875  /*
876  * If this is a background worker not bound to any particular
877  * database, we're done now. Everything that follows only makes sense
878  * if we are bound to a specific database. We do need to close the
879  * transaction we started before returning.
880  */
881  if (!bootstrap)
882  {
883  pgstat_bestart();
885  }
886  return;
887  }
888 
889  /*
890  * Now, take a writer's lock on the database we are trying to connect to.
891  * If there is a concurrently running DROP DATABASE on that database, this
892  * will block us until it finishes (and has committed its update of
893  * pg_database).
894  *
895  * Note that the lock is not held long, only until the end of this startup
896  * transaction. This is OK since we will advertise our use of the
897  * database in the ProcArray before dropping the lock (in fact, that's the
898  * next thing to do). Anyone trying a DROP DATABASE after this point will
899  * see us in the array once they have the lock. Ordering is important for
900  * this because we don't want to advertise ourselves as being in this
901  * database until we have the lock; otherwise we create what amounts to a
902  * deadlock with CountOtherDBBackends().
903  *
904  * Note: use of RowExclusiveLock here is reasonable because we envision
905  * our session as being a concurrent writer of the database. If we had a
906  * way of declaring a session as being guaranteed-read-only, we could use
907  * AccessShareLock for such sessions and thereby not conflict against
908  * CREATE DATABASE.
909  */
910  if (!bootstrap)
913 
914  /*
915  * Now we can mark our PGPROC entry with the database ID.
916  *
917  * We assume this is an atomic store so no lock is needed; though actually
918  * things would work fine even if it weren't atomic. Anyone searching the
919  * ProcArray for this database's ID should hold the database lock, so they
920  * would not be executing concurrently with this store. A process looking
921  * for another database's ID could in theory see a chance match if it read
922  * a partially-updated databaseId value; but as long as all such searches
923  * wait and retry, as in CountOtherDBBackends(), they will certainly see
924  * the correct value on their next try.
925  */
927 
928  /*
929  * We established a catalog snapshot while reading pg_authid and/or
930  * pg_database; but until we have set up MyDatabaseId, we won't react to
931  * incoming sinval messages for unshared catalogs, so we won't realize it
932  * if the snapshot has been invalidated. Assume it's no good anymore.
933  */
935 
936  /*
937  * Recheck pg_database to make sure the target database hasn't gone away.
938  * If there was a concurrent DROP DATABASE, this ensures we will die
939  * cleanly without creating a mess.
940  */
941  if (!bootstrap)
942  {
943  HeapTuple tuple;
944 
945  tuple = GetDatabaseTuple(dbname);
946  if (!HeapTupleIsValid(tuple) ||
947  MyDatabaseId != HeapTupleGetOid(tuple) ||
948  MyDatabaseTableSpace != ((Form_pg_database) GETSTRUCT(tuple))->dattablespace)
949  ereport(FATAL,
950  (errcode(ERRCODE_UNDEFINED_DATABASE),
951  errmsg("database \"%s\" does not exist", dbname),
952  errdetail("It seems to have just been dropped or renamed.")));
953  }
954 
955  /*
956  * Now we should be able to access the database directory safely. Verify
957  * it's there and looks reasonable.
958  */
960 
961  if (!bootstrap)
962  {
963  if (access(fullpath, F_OK) == -1)
964  {
965  if (errno == ENOENT)
966  ereport(FATAL,
967  (errcode(ERRCODE_UNDEFINED_DATABASE),
968  errmsg("database \"%s\" does not exist",
969  dbname),
970  errdetail("The database subdirectory \"%s\" is missing.",
971  fullpath)));
972  else
973  ereport(FATAL,
975  errmsg("could not access directory \"%s\": %m",
976  fullpath)));
977  }
978 
979  ValidatePgVersion(fullpath);
980  }
981 
982  SetDatabasePath(fullpath);
983 
984  /*
985  * It's now possible to do real access to the system catalogs.
986  *
987  * Load relcache entries for the system catalogs. This must create at
988  * least the minimum set of "nailed-in" cache entries.
989  */
991 
992  /* set up ACL framework (so CheckMyDatabase can check permissions) */
993  initialize_acl();
994 
995  /*
996  * Re-read the pg_database row for our database, check permissions and set
997  * up database-specific GUC settings. We can't do this until all the
998  * database-access infrastructure is up. (Also, it wants to know if the
999  * user is a superuser, so the above stuff has to happen first.)
1000  */
1001  if (!bootstrap)
1002  CheckMyDatabase(dbname, am_superuser);
1003 
1004  /*
1005  * Now process any command-line switches and any additional GUC variable
1006  * settings passed in the startup packet. We couldn't do this before
1007  * because we didn't know if client is a superuser.
1008  */
1009  if (MyProcPort != NULL)
1010  process_startup_options(MyProcPort, am_superuser);
1011 
1012  /* Process pg_db_role_setting options */
1014 
1015  /* Apply PostAuthDelay as soon as we've read all options */
1016  if (PostAuthDelay > 0)
1017  pg_usleep(PostAuthDelay * 1000000L);
1018 
1019  /*
1020  * Initialize various default states that can't be set up until we've
1021  * selected the active user and gotten the right GUC settings.
1022  */
1023 
1024  /* set default namespace search path */
1026 
1027  /* initialize client encoding */
1029 
1030  /* report this backend in the PgBackendStatus array */
1031  if (!bootstrap)
1032  pgstat_bestart();
1033 
1034  /* close the transaction we started above */
1035  if (!bootstrap)
1037 }
int errhint(const char *fmt,...)
Definition: elog.c:987
BackendId MyBackendId
Definition: globals.c:72
#define GETSTRUCT(TUP)
Definition: htup_details.h:656
struct Port * MyProcPort
Definition: globals.c:40
CAC_state canAcceptConnections
Definition: libpq-be.h:129
void SharedInvalBackendInit(bool sendOnly)
Definition: sinvaladt.c:258
#define DEBUG3
Definition: elog.h:23
Oid GetUserId(void)
Definition: miscinit.c:283
FormData_pg_database * Form_pg_database
Definition: pg_database.h:57
PGPROC * MyProc
Definition: proc.c:67
static HeapTuple GetDatabaseTuple(const char *dbname)
Definition: postinit.c:94
#define DatabaseRelationId
Definition: pg_database.h:29
void CommitTransactionCommand(void)
Definition: xact.c:2749
void ValidatePgVersion(const char *path)
Definition: miscinit.c:1349
void RelationCacheInitializePhase2(void)
Definition: relcache.c:3565
static void PerformAuthentication(Port *port)
Definition: postinit.c:183
static void LockTimeoutHandler(void)
Definition: postinit.c:1182
int errcode(int sqlerrcode)
Definition: elog.c:575
bool superuser(void)
Definition: superuser.c:47
static void CheckMyDatabase(const char *name, bool am_superuser)
Definition: postinit.c:286
void initialize_acl(void)
Definition: acl.c:4594
bool RecoveryInProgress(void)
Definition: xlog.c:7873
Snapshot GetTransactionSnapshot(void)
Definition: snapmgr.c:300
#define OidIsValid(objectId)
Definition: c.h:538
Oid GetSessionUserId(void)
Definition: miscinit.c:317
bool HaveNFreeProcs(int n)
Definition: proc.c:637
bool IsBinaryUpgrade
Definition: globals.c:101
Oid MyDatabaseTableSpace
Definition: globals.c:78
bool IsBackgroundWorker
Definition: globals.c:102
void RelationCacheInitializePhase3(void)
Definition: relcache.c:3624
#define NAMEDATALEN
bool am_walsender
Definition: walsender.c:111
void pg_usleep(long microsec)
Definition: signal.c:53
int ReservedBackends
Definition: postmaster.c:211
#define FATAL
Definition: elog.h:52
void InitializeSearchPath(void)
Definition: namespace.c:4083
int MaxBackends
Definition: globals.c:126
#define TemplateDbOid
Definition: pg_database.h:80
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:348
bool IsUnderPostmaster
Definition: globals.c:100
#define RowExclusiveLock
Definition: lockdefs.h:38
#define DEFAULTTABLESPACE_OID
Definition: pg_tablespace.h:63
int errdetail(const char *fmt,...)
Definition: elog.c:873
int errcode_for_file_access(void)
Definition: elog.c:598
static void IdleInTransactionSessionTimeoutHandler(void)
Definition: postinit.c:1192
void before_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:320
Oid databaseId
Definition: proc.h:113
void pgstat_initialize(void)
Definition: pgstat.c:2745
static bool ThereIsAtLeastOneRole(void)
Definition: postinit.c:1203
void StartupXLOG(void)
Definition: xlog.c:6189
bool IsAutoVacuumWorkerProcess(void)
Definition: autovacuum.c:3360
#define ereport(elevel, rest)
Definition: elog.h:122
void InvalidateCatalogSnapshot(void)
Definition: snapmgr.c:506
char * GetDatabasePath(Oid dbNode, Oid spcNode)
Definition: relpath.c:108
void SetDatabasePath(const char *path)
Definition: miscinit.c:82
#define WARNING
Definition: elog.h:40
void ShutdownXLOG(int code, Datum arg)
Definition: xlog.c:8321
static HeapTuple GetDatabaseTupleByOid(Oid dboid)
Definition: postinit.c:137
#define InvalidBackendId
Definition: backendid.h:23
bool am_db_walsender
Definition: walsender.c:114
Oid MyDatabaseId
Definition: globals.c:76
int PostAuthDelay
Definition: postgres.c:97
void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
Definition: lmgr.c:871
void EnablePortalManager(void)
Definition: portalmem.c:103
static void ShutdownPostgres(int code, Datum arg)
Definition: postinit.c:1143
static char * username
Definition: initdb.c:131
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition: strlcpy.c:45
TimeoutId RegisterTimeout(TimeoutId id, timeout_handler_proc handler)
Definition: timeout.c:373
bool IsAutoVacuumLauncherProcess(void)
Definition: autovacuum.c:3354
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
#define NULL
Definition: c.h:229
#define Assert(condition)
Definition: c.h:675
void InitializeSessionUserIdStandalone(void)
Definition: miscinit.c:578
void StartTransactionCommand(void)
Definition: xact.c:2679
#define XACT_READ_COMMITTED
Definition: xact.h:29
void InitializeSessionUserId(const char *rolename, Oid roleid)
Definition: miscinit.c:482
char * dbname
Definition: streamutil.c:38
static void process_startup_options(Port *port, bool am_superuser)
Definition: postinit.c:1044
int XactIsoLevel
Definition: xact.c:74
bool has_rolreplication(Oid roleid)
Definition: miscinit.c:464
void InitializeClientEncoding(void)
Definition: mbutils.c:293
void InitPlanCache(void)
Definition: plancache.c:116
void InitProcessPhase2(void)
Definition: proc.c:447
#define IsBootstrapProcessingMode()
Definition: miscadmin.h:365
void RelationCacheInitialize(void)
Definition: relcache.c:3528
void ProcSignalInit(int pss_idx)
Definition: procsignal.c:104
void InitCatalogCache(void)
Definition: syscache.c:998
static void StatementTimeoutHandler(void)
Definition: postinit.c:1160
void SetCurrentStatementStartTimestamp(void)
Definition: xact.c:740
int errmsg(const char *fmt,...)
Definition: elog.c:797
void pgstat_bestart(void)
Definition: pgstat.c:2785
#define NameStr(name)
Definition: c.h:499
static void process_settings(Oid databaseid, Oid roleid)
Definition: postinit.c:1109
void CheckDeadLockAlert(void)
Definition: proc.c:1743
void InitBufferPoolBackend(void)
Definition: bufmgr.c:2461
#define elog
Definition: elog.h:219
#define HeapTupleGetOid(tuple)
Definition: htup_details.h:695
void InitPostmasterChild ( void  )

Definition at line 175 of file miscinit.c.

References elog, FATAL, InitializeLatchSupport(), InitLatch(), IsUnderPostmaster, LocalLatchData, MyLatch, MyProcPid, MyStartTime, NULL, and on_exit_reset().

Referenced by BackendStartup(), do_start_bgworker(), pgarch_start(), pgstat_start(), StartAutoVacLauncher(), StartAutoVacWorker(), StartChildProcess(), and SysLogger_Start().

176 {
177  IsUnderPostmaster = true; /* we are a postmaster subprocess now */
178 
179  MyProcPid = getpid(); /* reset MyProcPid */
180 
181  MyStartTime = time(NULL); /* set our start time in case we call elog */
182 
183  /*
184  * make sure stderr is in binary mode before anything can possibly be
185  * written to it, in case it's actually the syslogger pipe, so the pipe
186  * chunking protocol isn't disturbed. Non-logpipe data gets translated on
187  * redirection (e.g. via pg_ctl -l) anyway.
188  */
189 #ifdef WIN32
190  _setmode(fileno(stderr), _O_BINARY);
191 #endif
192 
193  /* We don't want the postmaster's proc_exit() handlers */
194  on_exit_reset();
195 
196  /* Initialize process-local latch support */
200 
201  /*
202  * If possible, make this process a group leader, so that the postmaster
203  * can signal any child processes too. Not all processes will have
204  * children, but for consistency we make all postmaster child processes do
205  * this.
206  */
207 #ifdef HAVE_SETSID
208  if (setsid() < 0)
209  elog(FATAL, "setsid() failed: %m");
210 #endif
211 }
int MyProcPid
Definition: globals.c:38
pg_time_t MyStartTime
Definition: globals.c:39
void on_exit_reset(void)
Definition: ipc.c:396
static Latch LocalLatchData
Definition: miscinit.c:61
#define FATAL
Definition: elog.h:52
bool IsUnderPostmaster
Definition: globals.c:100
void InitializeLatchSupport(void)
Definition: latch.c:147
#define NULL
Definition: c.h:229
void InitLatch(volatile Latch *latch)
Definition: latch.c:220
struct Latch * MyLatch
Definition: globals.c:51
#define elog
Definition: elog.h:219
void InitStandaloneProcess ( const char *  argv0)

Definition at line 219 of file miscinit.c.

References Assert, elog, FATAL, find_my_exec(), get_pkglib_path(), InitializeLatchSupport(), InitLatch(), IsPostmasterEnvironment, LocalLatchData, my_exec_path, MyLatch, MyProcPid, MyStartTime, NULL, and pkglib_path.

Referenced by AuxiliaryProcessMain(), and PostgresMain().

220 {
222 
223  MyProcPid = getpid(); /* reset MyProcPid */
224 
225  MyStartTime = time(NULL); /* set our start time in case we call elog */
226 
227  /* Initialize process-local latch support */
231 
232  /* Compute paths, no postmaster to inherit from */
233  if (my_exec_path[0] == '\0')
234  {
235  if (find_my_exec(argv0, my_exec_path) < 0)
236  elog(FATAL, "%s: could not locate my own executable path",
237  argv0);
238  }
239 
240  if (pkglib_path[0] == '\0')
242 }
bool IsPostmasterEnvironment
Definition: globals.c:99
static char * argv0
Definition: pg_ctl.c:89
int MyProcPid
Definition: globals.c:38
pg_time_t MyStartTime
Definition: globals.c:39
void get_pkglib_path(const char *my_exec_path, char *ret_path)
Definition: path.c:758
static Latch LocalLatchData
Definition: miscinit.c:61
#define FATAL
Definition: elog.h:52
int find_my_exec(const char *argv0, char *retpath)
Definition: exec.c:119
char my_exec_path[MAXPGPATH]
Definition: globals.c:63
void InitializeLatchSupport(void)
Definition: latch.c:147
#define NULL
Definition: c.h:229
#define Assert(condition)
Definition: c.h:675
void InitLatch(volatile Latch *latch)
Definition: latch.c:220
struct Latch * MyLatch
Definition: globals.c:51
#define elog
Definition: elog.h:219
char pkglib_path[MAXPGPATH]
Definition: globals.c:64
bool InLocalUserIdChange ( void  )

Definition at line 406 of file miscinit.c.

References SECURITY_LOCAL_USERID_CHANGE, and SecurityRestrictionContext.

Referenced by GetUserIdAndContext(), is_admin_of_role(), and set_config_option().

407 {
409 }
static int SecurityRestrictionContext
Definition: miscinit.c:164
#define SECURITY_LOCAL_USERID_CHANGE
Definition: miscadmin.h:291
bool InNoForceRLSOperation ( void  )

Definition at line 424 of file miscinit.c.

References SECURITY_NOFORCE_RLS, and SecurityRestrictionContext.

Referenced by check_enable_rls().

425 {
427 }
static int SecurityRestrictionContext
Definition: miscinit.c:164
#define SECURITY_NOFORCE_RLS
Definition: miscadmin.h:293
bool InSecurityRestrictedOperation ( void  )

Definition at line 415 of file miscinit.c.

References SECURITY_RESTRICTED_OPERATION, and SecurityRestrictionContext.

Referenced by CheckRestrictedOperation(), DefineRelation(), is_admin_of_role(), set_config_option(), and SetUserIdAndContext().

416 {
418 }
#define SECURITY_RESTRICTED_OPERATION
Definition: miscadmin.h:292
static int SecurityRestrictionContext
Definition: miscinit.c:164
void pg_bindtextdomain ( const char *  domain)

Definition at line 1505 of file miscinit.c.

References get_locale_path(), MAXPGPATH, and my_exec_path.

Referenced by _PG_init().

1506 {
1507 #ifdef ENABLE_NLS
1508  if (my_exec_path[0] != '\0')
1509  {
1510  char locale_path[MAXPGPATH];
1511 
1512  get_locale_path(my_exec_path, locale_path);
1513  bindtextdomain(domain, locale_path);
1514  pg_bind_textdomain_codeset(domain);
1515  }
1516 #endif
1517 }
#define MAXPGPATH
char my_exec_path[MAXPGPATH]
Definition: globals.c:63
void get_locale_path(const char *my_exec_path, char *ret_path)
Definition: path.c:767
void pg_split_opts ( char **  argv,
int *  argcp,
const char *  optstr 
)

Definition at line 436 of file postinit.c.

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

Referenced by BackendRun(), and process_startup_options().

437 {
438  StringInfoData s;
439 
440  initStringInfo(&s);
441 
442  while (*optstr)
443  {
444  bool last_was_escape = false;
445 
446  resetStringInfo(&s);
447 
448  /* skip over leading space */
449  while (isspace((unsigned char) *optstr))
450  optstr++;
451 
452  if (*optstr == '\0')
453  break;
454 
455  /*
456  * Parse a single option, stopping at the first space, unless it's
457  * escaped.
458  */
459  while (*optstr)
460  {
461  if (isspace((unsigned char) *optstr) && !last_was_escape)
462  break;
463 
464  if (!last_was_escape && *optstr == '\\')
465  last_was_escape = true;
466  else
467  {
468  last_was_escape = false;
469  appendStringInfoChar(&s, *optstr);
470  }
471 
472  optstr++;
473  }
474 
475  /* now store the option in the next argv[] position */
476  argv[(*argcp)++] = pstrdup(s.data);
477  }
478 
479  pfree(s.data);
480 }
char * pstrdup(const char *in)
Definition: mcxt.c:1077
void pfree(void *pointer)
Definition: mcxt.c:950
void resetStringInfo(StringInfo str)
Definition: stringinfo.c:62
void appendStringInfoChar(StringInfo str, char ch)
Definition: stringinfo.c:169
void initStringInfo(StringInfo str)
Definition: stringinfo.c:46
void PreventCommandDuringRecovery ( const char *  cmdname)

Definition at line 273 of file utility.c.

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

Referenced by LockTableCommand(), pg_notify(), standard_ProcessUtility(), and txid_current().

274 {
275  if (RecoveryInProgress())
276  ereport(ERROR,
277  (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
278  /* translator: %s is name of a SQL command, eg CREATE */
279  errmsg("cannot execute %s during recovery",
280  cmdname)));
281 }
int errcode(int sqlerrcode)
Definition: elog.c:575
bool RecoveryInProgress(void)
Definition: xlog.c:7873
#define ERROR
Definition: elog.h:43
#define ereport(elevel, rest)
Definition: elog.h:122
int errmsg(const char *fmt,...)
Definition: elog.c:797
void PreventCommandIfParallelMode ( const char *  cmdname)

Definition at line 254 of file utility.c.

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

Referenced by _SPI_execute_plan(), check_xact_readonly(), do_setval(), DoCopy(), ExecCheckXactReadOnly(), init_execution_state(), nextval_internal(), and SPI_cursor_open_internal().

255 {
256  if (IsInParallelMode())
257  ereport(ERROR,
258  (errcode(ERRCODE_INVALID_TRANSACTION_STATE),
259  /* translator: %s is name of a SQL command, eg CREATE */
260  errmsg("cannot execute %s during a parallel operation",
261  cmdname)));
262 }
int errcode(int sqlerrcode)
Definition: elog.c:575
bool IsInParallelMode(void)
Definition: xact.c:913
#define ERROR
Definition: elog.h:43
#define ereport(elevel, rest)
Definition: elog.h:122
int errmsg(const char *fmt,...)
Definition: elog.c:797
void PreventCommandIfReadOnly ( const char *  cmdname)

Definition at line 236 of file utility.c.

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

Referenced by check_xact_readonly(), do_setval(), DoCopy(), ExecCheckXactReadOnly(), and nextval_internal().

237 {
238  if (XactReadOnly)
239  ereport(ERROR,
240  (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
241  /* translator: %s is name of a SQL command, eg CREATE */
242  errmsg("cannot execute %s in a read-only transaction",
243  cmdname)));
244 }
int errcode(int sqlerrcode)
Definition: elog.c:575
#define ERROR
Definition: elog.h:43
#define ereport(elevel, rest)
Definition: elog.h:122
bool XactReadOnly
Definition: xact.c:77
int errmsg(const char *fmt,...)
Definition: elog.c:797
void process_session_preload_libraries ( void  )

Definition at line 1494 of file miscinit.c.

References load_libraries(), local_preload_libraries_string, and session_preload_libraries_string.

Referenced by PostgresMain().

1495 {
1497  "session_preload_libraries",
1498  false);
1500  "local_preload_libraries",
1501  true);
1502 }
static void load_libraries(const char *libraries, const char *gucname, bool restricted)
Definition: miscinit.c:1426
char * local_preload_libraries_string
Definition: miscinit.c:1414
char * session_preload_libraries_string
Definition: miscinit.c:1412
void process_shared_preload_libraries ( void  )

Definition at line 1481 of file miscinit.c.

References load_libraries(), process_shared_preload_libraries_in_progress, and shared_preload_libraries_string.

Referenced by PostmasterMain().

1482 {
1485  "shared_preload_libraries",
1486  false);
1488 }
bool process_shared_preload_libraries_in_progress
Definition: miscinit.c:1417
char * shared_preload_libraries_string
Definition: miscinit.c:1413
static void load_libraries(const char *libraries, const char *gucname, bool restricted)
Definition: miscinit.c:1426
void ProcessInterrupts ( void  )

Definition at line 2825 of file postgres.c.

References Assert, ClientAuthInProgress, ClientConnectionLost, CritSectionCount, DestNone, DestRemote, DoingCommandRead, ereport, errcode(), errdetail_recovery_conflict(), errhint(), errmsg(), ERROR, FATAL, get_timeout_finish_time(), get_timeout_indicator(), HandleParallelMessages(), IdleInTransactionSessionTimeout, IdleInTransactionSessionTimeoutPending, InterruptHoldoffCount, InterruptPending, IsAutoVacuumWorkerProcess(), LOCK_TIMEOUT, LockErrorCleanup(), ParallelMessagePending, pgstat_report_recovery_conflict(), ProcDiePending, PROCSIG_RECOVERY_CONFLICT_DATABASE, QueryCancelHoldoffCount, QueryCancelPending, RecoveryConflictPending, RecoveryConflictReason, RecoveryConflictRetryable, STATEMENT_TIMEOUT, and whereToSendOutput.

Referenced by die().

2826 {
2827  /* OK to accept any interrupts now? */
2828  if (InterruptHoldoffCount != 0 || CritSectionCount != 0)
2829  return;
2830  InterruptPending = false;
2831 
2832  if (ProcDiePending)
2833  {
2834  ProcDiePending = false;
2835  QueryCancelPending = false; /* ProcDie trumps QueryCancel */
2836  LockErrorCleanup();
2837  /* As in quickdie, don't risk sending to client during auth */
2841  ereport(FATAL,
2842  (errcode(ERRCODE_QUERY_CANCELED),
2843  errmsg("canceling authentication due to timeout")));
2844  else if (IsAutoVacuumWorkerProcess())
2845  ereport(FATAL,
2846  (errcode(ERRCODE_ADMIN_SHUTDOWN),
2847  errmsg("terminating autovacuum process due to administrator command")));
2849  {
2851  ereport(FATAL,
2852  (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
2853  errmsg("terminating connection due to conflict with recovery"),
2855  }
2856  else if (RecoveryConflictPending)
2857  {
2858  /* Currently there is only one non-retryable recovery conflict */
2861  ereport(FATAL,
2862  (errcode(ERRCODE_DATABASE_DROPPED),
2863  errmsg("terminating connection due to conflict with recovery"),
2865  }
2866  else
2867  ereport(FATAL,
2868  (errcode(ERRCODE_ADMIN_SHUTDOWN),
2869  errmsg("terminating connection due to administrator command")));
2870  }
2872  {
2873  QueryCancelPending = false; /* lost connection trumps QueryCancel */
2874  LockErrorCleanup();
2875  /* don't send to client, we already know the connection to be dead. */
2877  ereport(FATAL,
2878  (errcode(ERRCODE_CONNECTION_FAILURE),
2879  errmsg("connection to client lost")));
2880  }
2881 
2882  /*
2883  * If a recovery conflict happens while we are waiting for input from the
2884  * client, the client is presumably just sitting idle in a transaction,
2885  * preventing recovery from making progress. Terminate the connection to
2886  * dislodge it.
2887  */
2889  {
2890  QueryCancelPending = false; /* this trumps QueryCancel */
2891  RecoveryConflictPending = false;
2892  LockErrorCleanup();
2894  ereport(FATAL,
2895  (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
2896  errmsg("terminating connection due to conflict with recovery"),
2898  errhint("In a moment you should be able to reconnect to the"
2899  " database and repeat your command.")));
2900  }
2901 
2902  if (QueryCancelPending)
2903  {
2904  bool lock_timeout_occurred;
2905  bool stmt_timeout_occurred;
2906 
2907  /*
2908  * Don't allow query cancel interrupts while reading input from the
2909  * client, because we might lose sync in the FE/BE protocol. (Die
2910  * interrupts are OK, because we won't read any further messages from
2911  * the client in that case.)
2912  */
2913  if (QueryCancelHoldoffCount != 0)
2914  {
2915  /*
2916  * Re-arm InterruptPending so that we process the cancel request
2917  * as soon as we're done reading the message.
2918  */
2919  InterruptPending = true;
2920  return;
2921  }
2922 
2923  QueryCancelPending = false;
2924 
2925  /*
2926  * If LOCK_TIMEOUT and STATEMENT_TIMEOUT indicators are both set, we
2927  * need to clear both, so always fetch both.
2928  */
2929  lock_timeout_occurred = get_timeout_indicator(LOCK_TIMEOUT, true);
2930  stmt_timeout_occurred = get_timeout_indicator(STATEMENT_TIMEOUT, true);
2931 
2932  /*
2933  * If both were set, we want to report whichever timeout completed
2934  * earlier; this ensures consistent behavior if the machine is slow
2935  * enough that the second timeout triggers before we get here. A tie
2936  * is arbitrarily broken in favor of reporting a lock timeout.
2937  */
2938  if (lock_timeout_occurred && stmt_timeout_occurred &&
2940  lock_timeout_occurred = false; /* report stmt timeout */
2941 
2942  if (lock_timeout_occurred)
2943  {
2944  LockErrorCleanup();
2945  ereport(ERROR,
2946  (errcode(ERRCODE_LOCK_NOT_AVAILABLE),
2947  errmsg("canceling statement due to lock timeout")));
2948  }
2949  if (stmt_timeout_occurred)
2950  {
2951  LockErrorCleanup();
2952  ereport(ERROR,
2953  (errcode(ERRCODE_QUERY_CANCELED),
2954  errmsg("canceling statement due to statement timeout")));
2955  }
2957  {
2958  LockErrorCleanup();
2959  ereport(ERROR,
2960  (errcode(ERRCODE_QUERY_CANCELED),
2961  errmsg("canceling autovacuum task")));
2962  }
2964  {
2965  RecoveryConflictPending = false;
2966  LockErrorCleanup();
2968  ereport(ERROR,
2969  (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
2970  errmsg("canceling statement due to conflict with recovery"),
2972  }
2973 
2974  /*
2975  * If we are reading a command from the client, just ignore the cancel
2976  * request --- sending an extra error message won't accomplish
2977  * anything. Otherwise, go ahead and throw the error.
2978  */
2979  if (!DoingCommandRead)
2980  {
2981  LockErrorCleanup();
2982  ereport(ERROR,
2983  (errcode(ERRCODE_QUERY_CANCELED),
2984  errmsg("canceling statement due to user request")));
2985  }
2986  }
2987 
2989  {
2990  /* Has the timeout setting changed since last we looked? */
2992  ereport(FATAL,
2993  (errcode(ERRCODE_IDLE_IN_TRANSACTION_SESSION_TIMEOUT),
2994  errmsg("terminating connection due to idle-in-transaction timeout")));
2995  else
2997 
2998  }
2999 
3002 }
volatile uint32 InterruptHoldoffCount
Definition: globals.c:34
TimestampTz get_timeout_finish_time(TimeoutId id)
Definition: timeout.c:667
int errhint(const char *fmt,...)
Definition: elog.c:987
void pgstat_report_recovery_conflict(int reason)
Definition: pgstat.c:1486
volatile bool IdleInTransactionSessionTimeoutPending
Definition: globals.c:33
volatile uint32 QueryCancelHoldoffCount
Definition: globals.c:35
int errcode(int sqlerrcode)
Definition: elog.c:575
volatile bool QueryCancelPending
Definition: globals.c:30
volatile bool ClientConnectionLost
Definition: globals.c:32
volatile bool ParallelMessagePending
Definition: parallel.c:97
bool ClientAuthInProgress
Definition: postmaster.c:348
#define ERROR
Definition: elog.h:43
int IdleInTransactionSessionTimeout
Definition: proc.c:63
#define FATAL
Definition: elog.h:52
void HandleParallelMessages(void)
Definition: parallel.c:692
Definition: dest.h:88
volatile uint32 CritSectionCount
Definition: globals.c:36
bool IsAutoVacuumWorkerProcess(void)
Definition: autovacuum.c:3360
#define ereport(elevel, rest)
Definition: elog.h:122
void LockErrorCleanup(void)
Definition: proc.c:677
static ProcSignalReason RecoveryConflictReason
Definition: postgres.c:166
static bool RecoveryConflictPending
Definition: postgres.c:164
static bool RecoveryConflictRetryable
Definition: postgres.c:165
bool get_timeout_indicator(TimeoutId id, bool reset_indicator)
Definition: timeout.c:633
static int errdetail_recovery_conflict(void)
Definition: postgres.c:2260
volatile bool InterruptPending
Definition: globals.c:29
#define Assert(condition)
Definition: c.h:675
static bool DoingCommandRead
Definition: postgres.c:142
volatile bool ProcDiePending
Definition: globals.c:31
int errmsg(const char *fmt,...)
Definition: elog.c:797
CommandDest whereToSendOutput
Definition: postgres.c:86
bool RecheckDataDirLockFile ( void  )

Definition at line 1277 of file miscinit.c.

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

Referenced by ServerLoop().

1278 {
1279  int fd;
1280  int len;
1281  long file_pid;
1282  char buffer[BLCKSZ];
1283 
1284  fd = open(DIRECTORY_LOCK_FILE, O_RDWR | PG_BINARY, 0);
1285  if (fd < 0)
1286  {
1287  /*
1288  * There are many foreseeable false-positive error conditions. For
1289  * safety, fail only on enumerated clearly-something-is-wrong
1290  * conditions.
1291  */
1292  switch (errno)
1293  {
1294  case ENOENT:
1295  case ENOTDIR:
1296  /* disaster */
1297  ereport(LOG,
1299  errmsg("could not open file \"%s\": %m",
1301  return false;
1302  default:
1303  /* non-fatal, at least for now */
1304  ereport(LOG,
1306  errmsg("could not open file \"%s\": %m; continuing anyway",
1308  return true;
1309  }
1310  }
1312  len = read(fd, buffer, sizeof(buffer) - 1);
1314  if (len < 0)
1315  {
1316  ereport(LOG,
1318  errmsg("could not read from file \"%s\": %m",
1320  close(fd);
1321  return true; /* treat read failure as nonfatal */
1322  }
1323  buffer[len] = '\0';
1324  close(fd);
1325  file_pid = atol(buffer);
1326  if (file_pid == getpid())
1327  return true; /* all is well */
1328 
1329  /* Trouble: someone's overwritten the lock file */
1330  ereport(LOG,
1331  (errmsg("lock file \"%s\" contains wrong PID: %ld instead of %ld",
1332  DIRECTORY_LOCK_FILE, file_pid, (long) getpid())));
1333  return false;
1334 }
#define DIRECTORY_LOCK_FILE
Definition: miscinit.c:54
#define LOG
Definition: elog.h:26
static int fd(const char *x, int i)
Definition: preproc-init.c:105
#define PG_BINARY
Definition: c.h:1038
int errcode_for_file_access(void)
Definition: elog.c:598
static void pgstat_report_wait_end(void)
Definition: pgstat.h:1232
#define ereport(elevel, rest)
Definition: elog.h:122
WalTimeSample buffer[LAG_TRACKER_BUFFER_SIZE]
Definition: walsender.c:211
static void pgstat_report_wait_start(uint32 wait_event_info)
Definition: pgstat.h:1208
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define close(a)
Definition: win32.h:12
#define read(a, b, c)
Definition: win32.h:13
void restore_stack_base ( pg_stack_base_t  base)

Definition at line 3080 of file postgres.c.

References stack_base_ptr.

3081 {
3082 #if defined(__ia64__) || defined(__ia64)
3083  stack_base_ptr = base.stack_base_ptr;
3084  register_stack_base_ptr = base.register_stack_base_ptr;
3085 #else
3086  stack_base_ptr = base;
3087 #endif
3088 }
char * stack_base_ptr
Definition: postgres.c:115
pg_stack_base_t set_stack_base ( void  )

Definition at line 3049 of file postgres.c.

References stack_base_ptr.

Referenced by PostmasterMain().

3050 {
3051  char stack_base;
3052  pg_stack_base_t old;
3053 
3054 #if defined(__ia64__) || defined(__ia64)
3055  old.stack_base_ptr = stack_base_ptr;
3056  old.register_stack_base_ptr = register_stack_base_ptr;
3057 #else
3058  old = stack_base_ptr;
3059 #endif
3060 
3061  /* Set up reference point for stack depth checking */
3062  stack_base_ptr = &stack_base;
3063 #if defined(__ia64__) || defined(__ia64)
3064  register_stack_base_ptr = ia64_get_bsp();
3065 #endif
3066 
3067  return old;
3068 }
char * stack_base_ptr
Definition: postgres.c:115
char * pg_stack_base_t
Definition: miscadmin.h:268
void SetCurrentRoleId ( Oid  roleid,
bool  is_superuser 
)

Definition at line 656 of file miscinit.c.

References OidIsValid, PGC_INTERNAL, PGC_S_OVERRIDE, SessionUserId, SessionUserIsSuperuser, SetConfigOption(), SetOuterUserId(), and SetRoleIsActive.

Referenced by assign_role().

657 {
658  /*
659  * Get correct info if it's SET ROLE NONE
660  *
661  * If SessionUserId hasn't been set yet, just do nothing --- the eventual
662  * SetSessionUserId call will fix everything. This is needed since we
663  * will get called during GUC initialization.
664  */
665  if (!OidIsValid(roleid))
666  {
668  return;
669 
670  roleid = SessionUserId;
672 
673  SetRoleIsActive = false;
674  }
675  else
676  SetRoleIsActive = true;
677 
678  SetOuterUserId(roleid);
679 
680  SetConfigOption("is_superuser",
681  is_superuser ? "on" : "off",
683 }
static Oid SessionUserId
Definition: miscinit.c:156
static void SetOuterUserId(Oid userid)
Definition: miscinit.c:302
#define OidIsValid(objectId)
Definition: c.h:538
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition: guc.c:6672
static bool SetRoleIsActive
Definition: miscinit.c:167
static bool SessionUserIsSuperuser
Definition: miscinit.c:162
static bool is_superuser(Archive *fout)
Definition: pg_dump.c:3673
void SetDatabasePath ( const char *  path)

Definition at line 82 of file miscinit.c.

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

Referenced by InitPostgres().

83 {
84  /* This should happen only once per process */
87 }
MemoryContext TopMemoryContext
Definition: mcxt.c:43
char * DatabasePath
Definition: globals.c:84
#define Assert(condition)
Definition: c.h:675
char * MemoryContextStrdup(MemoryContext context, const char *string)
Definition: mcxt.c:1064
void SetDataDir ( const char *  dir)

Definition at line 94 of file miscinit.c.

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

Referenced by SelectConfigFiles().

95 {
96  char *new;
97 
98  AssertArg(dir);
99 
100  /* If presented path is relative, convert to absolute */
101  new = make_absolute_path(dir);
102 
103  if (DataDir)
104  free(DataDir);
105  DataDir = new;
106 }
char * make_absolute_path(const char *path)
Definition: path.c:608
#define AssertArg(condition)
Definition: c.h:677
#define free(a)
Definition: header.h:65
char * DataDir
Definition: globals.c:59
void SetSessionAuthorization ( Oid  userid,
bool  is_superuser 
)

Definition at line 610 of file miscinit.c.

References AssertState, AuthenticatedUserId, AuthenticatedUserIsSuperuser, ereport, errcode(), errmsg(), ERROR, OidIsValid, PGC_INTERNAL, PGC_S_OVERRIDE, SetConfigOption(), and SetSessionUserId().

Referenced by assign_session_authorization().

611 {
612  /* Must have authenticated already, else can't make permission check */
614 
615  if (userid != AuthenticatedUserId &&
617  ereport(ERROR,
618  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
619  errmsg("permission denied to set session authorization")));
620 
622 
623  SetConfigOption("is_superuser",
624  is_superuser ? "on" : "off",
626 }
#define AssertState(condition)
Definition: c.h:678
int errcode(int sqlerrcode)
Definition: elog.c:575
#define OidIsValid(objectId)
Definition: c.h:538
#define ERROR
Definition: elog.h:43
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition: guc.c:6672
static bool AuthenticatedUserIsSuperuser
Definition: miscinit.c:161
#define ereport(elevel, rest)
Definition: elog.h:122
static bool is_superuser(Archive *fout)
Definition: pg_dump.c:3673
int errmsg(const char *fmt,...)
Definition: elog.c:797
static void SetSessionUserId(Oid userid, bool is_superuser)
Definition: miscinit.c:325
static Oid AuthenticatedUserId
Definition: miscinit.c:155
void SetUserIdAndContext ( Oid  userid,
bool  sec_def_context 
)

Definition at line 444 of file miscinit.c.

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

445 {
446  /* We throw the same error SET ROLE would. */
448  ereport(ERROR,
449  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
450  errmsg("cannot set parameter \"%s\" within security-restricted operation",
451  "role")));
452  CurrentUserId = userid;
453  if (sec_def_context)
455  else
457 }
int errcode(int sqlerrcode)
Definition: elog.c:575
#define ERROR
Definition: elog.h:43
static int SecurityRestrictionContext
Definition: miscinit.c:164
#define ereport(elevel, rest)
Definition: elog.h:122
#define SECURITY_LOCAL_USERID_CHANGE
Definition: miscadmin.h:291
static Oid CurrentUserId
Definition: miscinit.c:158
bool InSecurityRestrictedOperation(void)
Definition: miscinit.c:415
int errmsg(const char *fmt,...)
Definition: elog.c:797
void SetUserIdAndSecContext ( Oid  userid,
int  sec_context 
)
bool stack_is_too_deep ( void  )

Definition at line 3116 of file postgres.c.

References max_stack_depth_bytes, NULL, and stack_base_ptr.

Referenced by check_stack_depth(), and rstacktoodeep().

3117 {
3118  char stack_top_loc;
3119  long stack_depth;
3120 
3121  /*
3122  * Compute distance from reference point to my local variables
3123  */
3124  stack_depth = (long) (stack_base_ptr - &stack_top_loc);
3125 
3126  /*
3127  * Take abs value, since stacks grow up on some machines, down on others
3128  */
3129  if (stack_depth < 0)
3130  stack_depth = -stack_depth;
3131 
3132  /*
3133  * Trouble?
3134  *
3135  * The test on stack_base_ptr prevents us from erroring out if called
3136  * during process setup or in a non-backend process. Logically it should
3137  * be done first, but putting it here avoids wasting cycles during normal
3138  * cases.
3139  */
3140  if (stack_depth > max_stack_depth_bytes &&
3141  stack_base_ptr != NULL)
3142  return true;
3143 
3144  /*
3145  * On IA64 there is a separate "register" stack that requires its own
3146  * independent check. For this, we have to measure the change in the
3147  * "BSP" pointer from PostgresMain to here. Logic is just as above,
3148  * except that we know IA64's register stack grows up.
3149  *
3150  * Note we assume that the same max_stack_depth applies to both stacks.
3151  */
3152 #if defined(__ia64__) || defined(__ia64)
3153  stack_depth = (long) (ia64_get_bsp() - register_stack_base_ptr);
3154 
3155  if (stack_depth > max_stack_depth_bytes &&
3156  register_stack_base_ptr != NULL)
3157  return true;
3158 #endif /* IA64 */
3159 
3160  return false;
3161 }
static long max_stack_depth_bytes
Definition: postgres.c:107
#define NULL
Definition: c.h:229
char * stack_base_ptr
Definition: postgres.c:115
bool superuser ( void  )

Definition at line 47 of file superuser.c.

References GetUserId(), and superuser_arg().

Referenced by AddRoleMems(), AlterForeignDataWrapper(), AlterForeignDataWrapperOwner_internal(), AlterForeignServerOwner_internal(), AlterFunction(), AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), AlterOpFamily(), AlterPublicationOwner_internal(), AlterRole(), AlterRoleSet(), AlterSystemSetConfigFile(), AlterTypeOwner(), ATExecChangeOwner(), be_lo_export(), brin_metapage_info(), brin_page_items(), brin_page_type(), brin_revmap_data(), bt_metap(), bt_page_items(), bt_page_items_bytea(), bt_page_stats(), check_conn_params(), check_encoding_locale_matches(), check_permissions(), connect_pg_server(), CreateAccessMethod(), CreateCast(), CreateEventTrigger(), CreateForeignDataWrapper(), CreateFunction(), CreateProceduralLanguage(), CreatePublication(), CreateRole(), CreateSubscription(), CreateTableSpace(), dblink_connstr_check(), dblink_security_check(), DefineAggregate(), DefineOpClass(), DefineOpFamily(), DefineTSParser(), DefineTSTemplate(), DefineType(), DelRoleMems(), DoCopy(), DropRole(), dummy_object_relabel(), EnableDisableTrigger(), ExecSetVariableStmt(), execute_extension_script(), ExecuteDoStmt(), file_fdw_validator(), fmgr_security_definer(), fsm_page_contents(), get_raw_page_internal(), GetConfigOptionByNum(), gin_leafpage_items(), gin_metapage_info(), gin_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(), InitPostgres(), lo_import_internal(), main(), page_checksum(), page_header(), pg_import_system_collations(), pg_logdir_ls(), pg_ls_dir(), pg_read_binary_file(), pg_read_file(), pg_relpages(), pg_relpagesbyid(), pg_signal_backend(), pg_stat_file(), pg_stat_get_wal_senders(), pgstat_get_backend_current_activity(), pgstatginindex(), pgstatindex(), pgstatindexbyid(), pgstattuple(), pgstattuple_approx(), pgstattuplebyid(), ProcedureCreate(), regress_putenv(), RemoveAccessMethodById(), RenameRole(), replorigin_check_prerequisites(), requireSuperuser(), sepgsql_restorecon(), set_config_by_name(), SetPGVariable(), ShowAllGUCConfig(), standard_ProcessUtility(), tuple_data_split(), validate_option_array_item(), and wait_pid().

48 {
49  return superuser_arg(GetUserId());
50 }
Oid GetUserId(void)
Definition: miscinit.c:283
bool superuser_arg(Oid roleid)
Definition: superuser.c:57
bool superuser_arg ( Oid  roleid)

Definition at line 57 of file superuser.c.

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

Referenced by AddRoleMems(), AlterEventTriggerOwner_internal(), AlterForeignDataWrapperOwner_internal(), AlterPublicationOwner_internal(), AlterSubscriptionOwner_internal(), check_object_ownership(), DelRoleMems(), has_bypassrls_privilege(), has_createrole_privilege(), has_privs_of_role(), is_admin_of_role(), is_member_of_role(), LockGXact(), pg_class_aclmask(), pg_class_ownercheck(), pg_collation_ownercheck(), pg_conversion_ownercheck(), pg_database_aclmask(), pg_database_ownercheck(), pg_event_trigger_ownercheck(), pg_extension_ownercheck(), pg_foreign_data_wrapper_aclmask(), pg_foreign_data_wrapper_ownercheck(), pg_foreign_server_aclmask(), pg_foreign_server_ownercheck(), pg_language_aclmask(), pg_language_ownercheck(), pg_largeobject_aclmask_snapshot(), pg_largeobject_ownercheck(), pg_namespace_aclmask(), pg_namespace_ownercheck(), pg_opclass_ownercheck(), pg_oper_ownercheck(), pg_opfamily_ownercheck(), pg_proc_aclmask(), pg_proc_ownercheck(), pg_publication_ownercheck(), pg_signal_backend(), pg_statistics_object_ownercheck(), pg_subscription_ownercheck(), pg_tablespace_aclmask(), pg_tablespace_ownercheck(), pg_ts_config_ownercheck(), pg_ts_dict_ownercheck(), pg_type_aclmask(), pg_type_ownercheck(), select_best_grantor(), and superuser().

58 {
59  bool result;
60  HeapTuple rtup;
61 
62  /* Quick out for cache hit */
63  if (OidIsValid(last_roleid) && last_roleid == roleid)
64  return last_roleid_is_super;
65 
66  /* Special escape path in case you deleted all your users. */
67  if (!IsUnderPostmaster && roleid == BOOTSTRAP_SUPERUSERID)
68  return true;
69 
70  /* OK, look up the information in pg_authid */
71  rtup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
72  if (HeapTupleIsValid(rtup))
73  {
74  result = ((Form_pg_authid) GETSTRUCT(rtup))->rolsuper;
75  ReleaseSysCache(rtup);
76  }
77  else
78  {
79  /* Report "not superuser" for invalid roleids */
80  result = false;
81  }
82 
83  /* If first time through, set up callback for cache flushes */
85  {
88  (Datum) 0);
90  }
91 
92  /* Cache the result for next time */
93  last_roleid = roleid;
95 
96  return result;
97 }
static Oid last_roleid
Definition: superuser.c:36
#define GETSTRUCT(TUP)
Definition: htup_details.h:656
return result
Definition: formatting.c:1632
#define OidIsValid(objectId)
Definition: c.h:538
#define SearchSysCache1(cacheId, key1)
Definition: syscache.h:156
static void RoleidCallback(Datum arg, int cacheid, uint32 hashvalue)
Definition: superuser.c:104
FormData_pg_authid * Form_pg_authid
Definition: pg_authid.h:72
static bool last_roleid_is_super
Definition: superuser.c:37
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
bool IsUnderPostmaster
Definition: globals.c:100
void CacheRegisterSyscacheCallback(int cacheid, SyscacheCallbackFunction func, Datum arg)
Definition: inval.c:1389
uintptr_t Datum
Definition: postgres.h:372
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1117
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
#define BOOTSTRAP_SUPERUSERID
Definition: pg_authid.h:102
static bool roleid_callback_registered
Definition: superuser.c:38
void SwitchBackToLocalLatch ( void  )

Definition at line 264 of file miscinit.c.

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

Referenced by AuxiliaryProcKill(), and ProcKill().

265 {
268 
270 
271  if (FeBeWaitSet)
273 
274  SetLatch(MyLatch);
275 }
PGPROC * MyProc
Definition: proc.c:67
void ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
Definition: latch.c:735
WaitEventSet * FeBeWaitSet
Definition: pqcomm.c:167
Latch procLatch
Definition: proc.h:103
static Latch LocalLatchData
Definition: miscinit.c:61
void SetLatch(volatile Latch *latch)
Definition: latch.c:415
#define NULL
Definition: c.h:229
#define Assert(condition)
Definition: c.h:675
struct Latch * MyLatch
Definition: globals.c:51
#define WL_LATCH_SET
Definition: latch.h:124
void SwitchToSharedLatch ( void  )

Definition at line 245 of file miscinit.c.

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

Referenced by InitAuxiliaryProcess(), and InitProcess().

246 {
248  Assert(MyProc != NULL);
249 
251 
252  if (FeBeWaitSet)
254 
255  /*
256  * Set the shared latch as the local one might have been set. This
257  * shouldn't normally be necessary as code is supposed to check the
258  * condition before waiting for the latch, but a bit care can't hurt.
259  */
260  SetLatch(MyLatch);
261 }
PGPROC * MyProc
Definition: proc.c:67
void ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
Definition: latch.c:735
WaitEventSet * FeBeWaitSet
Definition: pqcomm.c:167
Latch procLatch
Definition: proc.h:103
static Latch LocalLatchData
Definition: miscinit.c:61
void SetLatch(volatile Latch *latch)
Definition: latch.c:415
#define NULL
Definition: c.h:229
#define Assert(condition)
Definition: c.h:675
struct Latch * MyLatch
Definition: globals.c:51
#define WL_LATCH_SET
Definition: latch.h:124
void TouchSocketLockFiles ( void  )

Definition at line 1107 of file miscinit.c.

References buffer, close, DIRECTORY_LOCK_FILE, fd(), lfirst, NULL, PG_BINARY, and read.

Referenced by ServerLoop().

1108 {
1109  ListCell *l;
1110 
1111  foreach(l, lock_files)
1112  {
1113  char *socketLockFile = (char *) lfirst(l);
1114 
1115  /* No need to touch the data directory lock file, we trust */
1116  if (strcmp(socketLockFile, DIRECTORY_LOCK_FILE) == 0)
1117  continue;
1118 
1119  /*
1120  * utime() is POSIX standard, utimes() is a common alternative; if we
1121  * have neither, fall back to actually reading the file (which only
1122  * sets the access time not mod time, but that should be enough in
1123  * most cases). In all paths, we ignore errors.
1124  */
1125 #ifdef HAVE_UTIME
1126  utime(socketLockFile, NULL);
1127 #else /* !HAVE_UTIME */
1128 #ifdef HAVE_UTIMES
1129  utimes(socketLockFile, NULL);
1130 #else /* !HAVE_UTIMES */
1131  int fd;
1132  char buffer[1];
1133 
1134  fd = open(socketLockFile, O_RDONLY | PG_BINARY, 0);
1135  if (fd >= 0)
1136  {
1137  read(fd, buffer, sizeof(buffer));
1138  close(fd);
1139  }
1140 #endif /* HAVE_UTIMES */
1141 #endif /* HAVE_UTIME */
1142  }
1143 }
static List * lock_files
Definition: miscinit.c:59
#define DIRECTORY_LOCK_FILE
Definition: miscinit.c:54
static int fd(const char *x, int i)
Definition: preproc-init.c:105
#define PG_BINARY
Definition: c.h:1038
#define NULL
Definition: c.h:229
#define lfirst(lc)
Definition: pg_list.h:106
WalTimeSample buffer[LAG_TRACKER_BUFFER_SIZE]
Definition: walsender.c:211
#define close(a)
Definition: win32.h:12
#define read(a, b, c)
Definition: win32.h:13
int trace_recovery ( int  trace_level)
void ValidatePgVersion ( const char *  path)

Definition at line 1349 of file miscinit.c.

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

Referenced by AuxiliaryProcessMain(), checkDataDir(), InitPostgres(), and PostgresMain().

1350 {
1351  char full_path[MAXPGPATH];
1352  FILE *file;
1353  int ret;
1354  long file_major;
1355  long my_major;
1356  char *endptr;
1357  char file_version_string[64];
1358  const char *my_version_string = PG_VERSION;
1359 
1360  my_major = strtol(my_version_string, &endptr, 10);
1361 
1362  snprintf(full_path, sizeof(full_path), "%s/PG_VERSION", path);
1363 
1364  file = AllocateFile(full_path, "r");
1365  if (!file)
1366  {
1367  if (errno == ENOENT)
1368  ereport(FATAL,
1369  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1370  errmsg("\"%s\" is not a valid data directory",
1371  path),
1372  errdetail("File \"%s\" is missing.", full_path)));
1373  else
1374  ereport(FATAL,
1376  errmsg("could not open file \"%s\": %m", full_path)));
1377  }
1378 
1379  file_version_string[0] = '\0';
1380  ret = fscanf(file, "%63s", file_version_string);
1381  file_major = strtol(file_version_string, &endptr, 10);
1382 
1383  if (ret != 1 || endptr == file_version_string)
1384  ereport(FATAL,
1385  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1386  errmsg("\"%s\" is not a valid data directory",
1387  path),
1388  errdetail("File \"%s\" does not contain valid data.",
1389  full_path),
1390  errhint("You might need to initdb.")));
1391 
1392  FreeFile(file);
1393 
1394  if (my_major != file_major)
1395  ereport(FATAL,
1396  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1397  errmsg("database files are incompatible with server"),
1398  errdetail("The data directory was initialized by PostgreSQL version %s, "
1399  "which is not compatible with this version %s.",
1400  file_version_string, my_version_string)));
1401 }
int errhint(const char *fmt,...)
Definition: elog.c:987
int errcode(int sqlerrcode)
Definition: elog.c:575
int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3
#define FATAL
Definition: elog.h:52
#define MAXPGPATH
int errdetail(const char *fmt,...)
Definition: elog.c:873
int errcode_for_file_access(void)
Definition: elog.c:598
FILE * AllocateFile(const char *name, const char *mode)
Definition: fd.c:2094
#define ereport(elevel, rest)
Definition: elog.h:122
int FreeFile(FILE *file)
Definition: fd.c:2277
int errmsg(const char *fmt,...)
Definition: elog.c:797

Variable Documentation

volatile bool ClientConnectionLost

Definition at line 32 of file globals.c.

Referenced by internal_flush(), and ProcessInterrupts().

PGDLLIMPORT int DateOrder
bool ExitOnAnyError

Definition at line 104 of file globals.c.

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

PGDLLIMPORT volatile bool IdleInTransactionSessionTimeoutPending

Definition at line 33 of file globals.c.

Referenced by IdleInTransactionSessionTimeoutHandler(), and ProcessInterrupts().

bool IgnoreSystemIndexes
PGDLLIMPORT volatile uint32 InterruptHoldoffCount

Definition at line 34 of file globals.c.

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

PGDLLIMPORT int IntervalStyle
PGDLLIMPORT bool IsUnderPostmaster

Definition at line 100 of file globals.c.

Referenced by _PG_init(), AutoVacuumShmemInit(), AuxiliaryProcessMain(), BackendRandomShmemInit(), BackgroundWorkerShmemInit(), bootstrap_signals(), BootstrapModeMain(), BTreeShmemInit(), CheckMyDatabase(), CheckRecoveryConsistency(), CommitTsShmemInit(), CreateLWLocks(), CreateSharedMemoryAndSemaphores(), DebugFileOpen(), dsm_attach(), dsm_create(), dsm_postmaster_startup(), EventTriggerDDLCommandEnd(), EventTriggerDDLCommandStart(), EventTriggerSQLDrop(), EventTriggerTableRewrite(), ForgetDatabaseFsyncRequests(), ForgetRelationFsyncRequests(), ForwardFsyncRequest(), GetNewMultiXactId(), GetNewTransactionId(), HandleStartupProcInterrupts(), heap_create_with_catalog(), init_ps_display(), InitCommunication(), InitializeLatchSupport(), InitializeSessionUserId(), InitializeSessionUserIdStandalone(), InitPostgres(), InitPostmasterChild(), InitProcess(), LWLockAcquire(), mdinit(), MultiXactShmemInit(), pg_backend_random(), PGSemaphoreCreate(), PGSharedMemoryNoReAttach(), PGSharedMemoryReAttach(), pgss_shmem_startup(), PostgresMain(), process_postgres_switches(), process_settings(), ProcKill(), readRecoveryCommandFile(), register_unlink(), RegisterBackgroundWorker(), RegisterDynamicBackgroundWorker(), RequestAddinShmemSpace(), RequestNamedLWLockTranche(), SendPostmasterSignal(), set_config_option(), set_config_sourcefile(), set_ps_display(), SetMultiXactIdLimit(), SetTransactionIdLimit(), ShmemInitStruct(), SimpleLruInit(), standard_planner(), StartupXLOG(), superuser_arg(), SyncScanShmemInit(), TwoPhaseShmemInit(), verify_dictoptions(), XLogArchiveNotify(), and XLogWrite().

char* local_preload_libraries_string

Definition at line 1414 of file miscinit.c.

Referenced by process_session_preload_libraries().

int max_parallel_workers

Definition at line 125 of file globals.c.

Referenced by RegisterDynamicBackgroundWorker().

Definition at line 56 of file miscinit.c.

AuxProcType MyAuxProcType

Definition at line 68 of file bootstrap.c.

Referenced by AuxiliaryProcessMain(), pgstat_bestart(), and pgstat_initialize().

PGDLLIMPORT Oid MyDatabaseId

Definition at line 76 of file globals.c.

Referenced by AfterTriggerSetState(), AlterDatabase(), AlterObjectRename_internal(), AlterPublicationOwner_internal(), AlterSchemaOwner_internal(), AlterSubscription(), AlterSubscriptionOwner(), analyze_rel(), asyncQueueNotificationToEntry(), asyncQueueProcessPageEntries(), AutoVacuumRequestWork(), backend_read_statsfile(), CacheInvalidateCatalog(), CacheInvalidateHeapTuple(), CacheInvalidateRelcache(), CacheInvalidateRelcacheByTuple(), CheckLogicalDecodingRequirements(), CheckMyDatabase(), checkSharedDependencies(), classIdGetDbId(), CreateDecodingContext(), CreateInitDecodingContext(), CreateProceduralLanguage(), CreatePublication(), CreateSchemaCommand(), CreateSubscription(), current_database(), database_to_xml_internal(), DeconstructQualifiedName(), do_analyze_rel(), do_autovacuum(), dropdb(), DropSubscription(), Exec_ListenPreCommit(), exec_object_restorecon(), exec_replication_command(), ExpandColumnRefStar(), ExportSnapshot(), get_subscription_oid(), GetCurrentVirtualXIDs(), GetNewRelFileNode(), GetOldestXmin(), IdentifySystem(), ImportSnapshot(), InitializeParallelDSM(), InitPostgres(), InitTempTableNamespace(), lazy_vacuum_rel(), libpqrcv_exec(), LocalExecuteInvalidationMessage(), 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(), movedb(), perform_relmap_update(), perform_work_item(), pg_namespace_aclmask(), pg_relation_filepath(), pgss_store(), pgstat_beshutdown_hook(), pgstat_bestart(), pgstat_fetch_stat_funcentry(), pgstat_fetch_stat_tabentry(), pgstat_report_analyze(), pgstat_report_deadlock(), pgstat_report_recovery_conflict(), pgstat_report_stat(), pgstat_report_tempfile(), pgstat_report_vacuum(), pgstat_reset_counters(), pgstat_reset_single_counter(), pgstat_send_funcstats(), pgstat_vacuum_stat(), PrepareToInvalidateCacheTuple(), PrepareTransaction(), ProcArrayInstallImportedXmin(), ProcArrayInstallRestoredXmin(), RangeVarGetAndCheckCreationNamespace(), RangeVarGetCreationNamespace(), RangeVarGetRelidExtended(), ReindexMultipleTables(), RelationInitLockInfo(), RelationInitPhysicalAddr(), RelationMapFinishBootstrap(), RenameDatabase(), RenameSchema(), ReplicationSlotCreate(), ScanPgRelation(), sepgsql_schema_post_create(), SetLocktagRelationOid(), shdepDropOwned(), shdepReassignOwned(), table_recheck_autovac(), transformColumnRef(), UnlockDatabaseObject(), UpdateLogicalMappings(), vac_truncate_clog(), vac_update_datfrozenxid(), vacuum_rel(), and XactLogCommitRecord().

PGDLLIMPORT struct Latch* MyLatch

Definition at line 51 of file globals.c.

Referenced by ArchSigHupHandler(), ArchSigTermHandler(), AutoVacLauncherMain(), av_sighup_handler(), avl_sigterm_handler(), avl_sigusr2_handler(), BackgroundWriterMain(), be_tls_open_server(), BgSigHupHandler(), CheckDeadLockAlert(), CheckpointerMain(), ChkptSigHupHandler(), die(), gather_readnext(), handle_sig_alarm(), handle_sigterm(), HandleCatchupInterrupt(), HandleNotifyInterrupt(), HandleParallelMessageInterrupt(), IdleInTransactionSessionTimeoutHandler(), InitPostmasterChild(), InitStandaloneProcess(), logicalrep_worker_sighup(), logicalrep_worker_sigterm(), pg_sleep(), pgarch_MainLoop(), pgarch_waken(), pgarch_waken_stop(), pgfdw_get_result(), pgstat_exit(), pgstat_sighup_handler(), PgstatCollectorMain(), pq_init(), procsignal_sigusr1_handler(), ProcSleep(), ProcWaitForSignal(), RecoveryConflictInterrupt(), ReqCheckpointHandler(), ReqShutdownHandler(), secure_read(), secure_write(), shm_mq_receive_bytes(), shm_mq_send_bytes(), shm_mq_wait_internal(), sigHupHandler(), SigHupHandler(), sigUsr1Handler(), StatementCancelHandler(), SwitchBackToLocalLatch(), SwitchToSharedLatch(), SyncRepWaitForLSN(), SysLoggerMain(), test_shm_mq_pipelined(), throttle(), wait_for_workers_to_become_ready(), WaitForBackgroundWorkerStartup(), WaitForReplicationWorkerAttach(), WalShutdownHandler(), WalSigHupHandler(), WalSndLastCycleHandler(), WalSndLoop(), WalSndSigHupHandler(), WalSndSwitchStopping(), WalSndWaitForWal(), WalSndWriteData(), WalWriterMain(), worker_spi_sighup(), and worker_spi_sigterm().

PGDLLIMPORT int MyProcPid
PGDLLIMPORT int NBuffers

Definition at line 122 of file globals.c.

char OutputFileName[]

Definition at line 61 of file globals.c.

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

char pkglib_path[]

Definition at line 64 of file globals.c.

Referenced by getInstallationPaths(), InitStandaloneProcess(), and substitute_libpath_macro().

PGDLLIMPORT bool process_shared_preload_libraries_in_progress
PGDLLIMPORT volatile uint32 QueryCancelHoldoffCount

Definition at line 35 of file globals.c.

Referenced by errfinish(), and ProcessInterrupts().

PGDLLIMPORT int replacement_sort_tuples

Definition at line 114 of file globals.c.

Referenced by useselection().

char* session_preload_libraries_string

Definition at line 1412 of file miscinit.c.

Referenced by process_session_preload_libraries().

char* shared_preload_libraries_string

Definition at line 1413 of file miscinit.c.

Referenced by process_shared_preload_libraries().

int trace_recovery_messages

Definition at line 455 of file guc.c.

Referenced by StartupXLOG(), and trace_recovery().

bool VacuumCostActive
int VacuumCostBalance
int VacuumCostLimit
int VacuumCostPageDirty

Definition at line 130 of file globals.c.

Referenced by MarkBufferDirty(), and MarkBufferDirtyHint().

int VacuumCostPageHit

Definition at line 128 of file globals.c.

Referenced by ReadBuffer_common().

int VacuumCostPageMiss

Definition at line 129 of file globals.c.

Referenced by ReadBuffer_common().

int VacuumPageDirty

Definition at line 136 of file globals.c.

Referenced by lazy_vacuum_rel(), MarkBufferDirty(), MarkBufferDirtyHint(), and vacuum().

int VacuumPageHit

Definition at line 134 of file globals.c.

Referenced by lazy_vacuum_rel(), ReadBuffer_common(), and vacuum().

int VacuumPageMiss

Definition at line 135 of file globals.c.

Referenced by lazy_vacuum_rel(), ReadBuffer_common(), and vacuum().

PGDLLIMPORT int work_mem

Definition at line 112 of file globals.c.

Referenced by _bt_spoolinit(), begin_partition(), brin_page_items(), BuildTupleHashTable(), choose_hashed_setop(), collectMatchBitmap(), connectby(), consider_groupingsets_paths(), cost_material(), cost_rescan(), create_distinct_paths(), create_gather_merge_path(), create_grouping_paths(), create_groupingsets_path(), create_merge_append_path(), create_sort_path(), create_unique_path(), crosstab(), dblink_get_notify(), deflist_to_tuplestore(), each_worker(), each_worker_jsonb(), elements_worker(), elements_worker_jsonb(), exec_init_tuple_store(), ExecChooseHashTableSize(), ExecHashTableCreate(), ExecInitCteScan(), ExecInitRecursiveUnion(), ExecMakeTableFunctionResult(), ExecMaterial(), ExecRecursiveUnion(), ExecSort(), final_cost_mergejoin(), fmgr_sql(), get_crosstab_tuplestore(), GetTriggerTransitionTuplestore(), ginInsertCleanup(), initial_cost_mergejoin(), initialize_aggregate(), initialize_phase(), label_sort_with_costsize(), libpqrcv_processTuples(), materializeQueryResult(), materializeResult(), MultiExecBitmapIndexScan(), MultiExecBitmapOr(), ordered_set_startup(), pg_available_extension_versions(), pg_available_extensions(), pg_config(), pg_cursor(), pg_event_trigger_ddl_commands(), pg_event_trigger_dropped_objects(), pg_extension_update_paths(), pg_get_replication_slots(), pg_hba_file_rules(), pg_logical_slot_get_changes_guts(), pg_prepared_statement(), pg_show_replication_origin_status(), pg_stat_get_activity(), pg_stat_get_progress_info(), pg_stat_get_subscription(), pg_stat_get_wal_senders(), pg_stat_statements_internal(), pg_stop_backup_v2(), plperl_return_next(), pltcl_init_tuple_store(), populate_recordset_worker(), PortalCreateHoldStore(), show_all_file_settings(), storeRow(), subplan_is_hashable(), tfuncFetchRows(), and xpath_table().