95#define _(x) err_gettext(x)
132#ifndef PG_SYSLOG_LIMIT
133#define PG_SYSLOG_LIMIT 900
153#define ERRORDATA_STACK_SIZE 5
168#define FORMATTED_TS_LEN 128
174#define CHECK_STACK_DEPTH() \
176 if (errordata_stack_depth < 0) \
178 errordata_stack_depth = -1; \
179 ereport(ERROR, (errmsg_internal("errstart was not called"))); \
267 return (elevel >=
ERROR);
289 if (elevel >=
ERROR ||
316static inline const char *
357 bool output_to_server;
358 bool output_to_client =
false;
413 if (elevel <
ERROR && !output_to_server && !output_to_client)
423 write_stderr(
"error occurred before error message processing is available\n");
455 edata->elevel = elevel;
456 edata->output_to_server = output_to_server;
457 edata->output_to_client = output_to_client;
498 elevel =
edata->elevel;
507 if (!
edata->backtrace &&
835 edata->lineno = lineno;
881 edata->sqlerrcode = sqlerrcode;
904 switch (
edata->saved_errno)
928#if defined(ENOTEMPTY) && (ENOTEMPTY != EEXIST)
983 switch (
edata->saved_errno)
1012#define EVALUATE_MESSAGE(domain, targetfield, appendval, translateit) \
1014 StringInfoData buf; \
1016 if ((translateit) && !in_error_recursion_trouble()) \
1017 fmt = dgettext((domain), fmt); \
1018 initStringInfo(&buf); \
1019 if ((appendval) && edata->targetfield) { \
1020 appendStringInfoString(&buf, edata->targetfield); \
1021 appendStringInfoChar(&buf, '\n'); \
1028 errno = edata->saved_errno; \
1029 va_start(args, fmt); \
1030 needed = appendStringInfoVA(&buf, fmt, args); \
1034 enlargeStringInfo(&buf, needed); \
1037 if (edata->targetfield) \
1038 pfree(edata->targetfield); \
1039 edata->targetfield = pstrdup(buf.data); \
1048#define EVALUATE_MESSAGE_PLURAL(domain, targetfield, appendval) \
1051 StringInfoData buf; \
1053 if (!in_error_recursion_trouble()) \
1054 fmt = dngettext((domain), fmt_singular, fmt_plural, n); \
1056 fmt = (n == 1 ? fmt_singular : fmt_plural); \
1057 initStringInfo(&buf); \
1058 if ((appendval) && edata->targetfield) { \
1059 appendStringInfoString(&buf, edata->targetfield); \
1060 appendStringInfoChar(&buf, '\n'); \
1067 errno = edata->saved_errno; \
1068 va_start(args, n); \
1069 needed = appendStringInfoVA(&buf, fmt, args); \
1073 enlargeStringInfo(&buf, needed); \
1076 if (edata->targetfield) \
1077 pfree(edata->targetfield); \
1078 edata->targetfield = pstrdup(buf.data); \
1152#ifdef HAVE_BACKTRACE_SYMBOLS
1168 "insufficient memory for backtrace generation");
1170#elif defined(_MSC_VER)
1194 "could not get process handle for backtrace: error code %lu",
1210 "could not initialize symbol handler: error code %lu",
1258 if (result == (
size_t) -1 || result ==
sizeof(
symbol_name))
1263 (
unsigned long long) address);
1275 "\n%s+0x%llx [0x%llx]",
1278 (
unsigned long long) address);
1289 if (result != (
size_t) -1 && result !=
sizeof(
filename))
1294 (
unsigned long) line.LineNumber);
1302 "\n[0x%llx] (symbol lookup failed: error code %lu)",
1303 (
unsigned long long) address,
1310 "backtrace generation is not supported by this installation");
1372 unsigned long n,...)
1464 unsigned long n,...)
1487 unsigned long n,...)
1552 unsigned long n,...)
1630 edata->hide_stmt = hide_stmt;
1649 edata->hide_ctx = hide_ctx;
1665 edata->cursorpos = cursorpos;
1681 edata->internalpos = cursorpos;
1701 if (
edata->internalquery)
1749 elog(
ERROR,
"unsupported ErrorData field id: %d", field);
1780 return edata->sqlerrcode;
1797 return edata->cursorpos;
1814 return edata->internalpos;
1870 return edata->message;
1919 (*emit_log_hook) (
edata);
1922 if (
edata->output_to_server)
1926 if (
edata->output_to_client)
2031 if (
edata->detail_log)
2037 if (
edata->backtrace)
2039 if (
edata->schema_name)
2041 if (
edata->table_name)
2043 if (
edata->column_name)
2045 if (
edata->datatype_name)
2047 if (
edata->constraint_name)
2049 if (
edata->internalquery)
2103 if (
edata->sqlerrcode != 0)
2109 if (
edata->detail_log)
2115 if (
edata->backtrace)
2118 if (
edata->schema_name)
2120 if (
edata->table_name)
2122 if (
edata->column_name)
2124 if (
edata->datatype_name)
2126 if (
edata->constraint_name)
2130 if (
edata->internalquery)
2298 return edata->context;
2332 errmsg(
"could not reopen file \"%s\" as stderr: %m",
2345 errmsg(
"could not reopen file \"%s\" as stdout: %m",
2373#define PG_PROCTYPE(bktype, bkcategory, description, main_func, shmem_attach) \
2374 [bktype] = bkcategory,
2621 "abcdefghijklmnopqrstuvwxyz"
2622 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
2648 else if ((*
newval)[
i] ==
' ' ||
2809 static unsigned long seq = 0;
2850 if (line[0] ==
'\n')
2861 buflen =
nlpos - line;
2875 if (line[buflen] !=
'\0' &&
2876 !
isspace((
unsigned char) line[buflen]))
2907 syslog(level,
"%s", line);
3128 "%Y-%m-%d %H:%M:%S %Z",
3168 "%Y-%m-%d %H:%M:%S %Z",
3185 if (
edata->hide_stmt)
3243 while (*p >=
'0' && *p <=
'9')
3244 padding = padding * 10 + (*p++ -
'0');
3295 for (p =
format; *p !=
'\0'; p++)
3343 if (appname ==
NULL || *appname ==
'\0')
3344 appname =
_(
"[unknown]");
3350 else if (padding != 0)
3352 padding > 0 ? padding : -padding);
3377 else if (padding != 0)
3379 padding > 0 ? padding : -padding);
3393 else if (padding != 0)
3395 padding > 0 ? padding : -padding);
3427 padding > 0 ? padding : -padding);
3428 else if (padding != 0)
3433 else if (padding != 0)
3435 padding > 0 ? padding : -padding);
3460 "%Y-%m-%d %H:%M:%S %Z",
3510 else if (padding != 0)
3512 padding > 0 ? padding : -padding);
3516 const char *local_host;
3538 local_host =
"[none]";
3580 else if (padding != 0)
3582 padding > 0 ? padding : -padding);
3592 else if (padding != 0)
3594 padding > 0 ? padding : -padding);
3617 else if (padding != 0)
3619 padding > 0 ? padding : -padding);
3655 static char buf[12];
3658 for (
i = 0;
i < 5;
i++)
3691 if (
edata->cursorpos > 0)
3694 else if (
edata->internalpos > 0)
3696 edata->internalpos);
3702 if (
edata->detail_log)
3709 else if (
edata->detail)
3723 if (
edata->internalquery)
3747 else if (
edata->filename)
3754 if (
edata->backtrace)
3780 switch (
edata->elevel)
4035 if (
edata->schema_name)
4041 if (
edata->table_name)
4047 if (
edata->column_name)
4053 if (
edata->datatype_name)
4059 if (
edata->constraint_name)
4065 if (
edata->cursorpos > 0)
4072 if (
edata->internalpos > 0)
4079 if (
edata->internalquery)
4085 if (
edata->filename)
4091 if (
edata->lineno > 0)
4098 if (
edata->funcname)
4210 while ((
ch = *
str++) !=
'\0')
void ExceptionalCondition(const char *conditionName, const char *fileName, int lineNumber)
int64 pgstat_get_my_query_id(void)
#define write_stderr(str)
#define pg_attribute_format_arg(a)
#define pg_attribute_cold
#define Assert(condition)
#define PG_TEXTDOMAIN(domain)
#define MemSet(start, val, len)
void write_csvlog(ErrorData *edata)
void assign_syslog_facility(int newval, void *extra)
static bool should_output_to_client(int elevel)
void assign_syslog_ident(const char *newval, void *extra)
int errcode_for_socket_access(void)
bool errsave_start(struct Node *context, const char *domain)
static void log_line_prefix(StringInfo buf, ErrorData *edata)
static const char * process_log_prefix_padding(const char *p, int *ppadding)
void errsave_finish(struct Node *context, const char *filename, int lineno, const char *funcname)
static char formatted_log_time[FORMATTED_TS_LEN]
static char formatted_start_time[FORMATTED_TS_LEN]
static void send_message_to_frontend(ErrorData *edata)
bool check_log_of_query(ErrorData *edata)
static void append_with_tabs(StringInfo buf, const char *str)
char * format_elog_string(const char *fmt,...)
bool errstart(int elevel, const char *domain)
void EmitErrorReport(void)
bool syslog_split_messages
static void FreeErrorDataContents(ErrorData *edata)
static int errordata_stack_depth
char * GetErrorContextStack(void)
static void err_sendstring(StringInfo buf, const char *str)
void FreeErrorData(ErrorData *edata)
void assign_backtrace_functions(const char *newval, void *extra)
const char * error_severity(int elevel)
void assign_log_min_messages(const char *newval, void *extra)
static ErrorData * get_error_stack_entry(void)
static bool saved_timeval_set
int errcode_for_file_access(void)
static char * backtrace_function_list
bool check_backtrace_functions(char **newval, void **extra, GucSource source)
void pre_format_elog_string(int errnumber, const char *domain)
static int recursion_depth
ErrorContextCallback * error_context_stack
static int log_min_messages_cmp(const ListCell *a, const ListCell *b)
static struct timeval saved_timeval
void ReThrowError(ErrorData *edata)
static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str)
char * get_formatted_start_time(void)
static bool matches_backtrace_functions(const char *funcname)
ErrorData * CopyErrorData(void)
bool check_log_destination(char **newval, void **extra, GucSource source)
void FlushErrorState(void)
bool check_log_min_messages(char **newval, void **extra, GucSource source)
static bool is_log_level_output(int elevel, int log_min_level)
void ThrowErrorData(ErrorData *edata)
pg_attribute_unused() static void backtrace_cleanup(int code
bool message_level_is_interesting(int elevel)
void write_pipe_chunks(char *data, int len, int dest)
emit_log_hook_type emit_log_hook
bool syslog_sequence_numbers
static void send_message_to_server_log(ErrorData *edata)
char * Log_destination_string
static void write_console(const char *line, int len)
#define EVALUATE_MESSAGE(domain, targetfield, appendval, translateit)
static void set_stack_entry_location(ErrorData *edata, const char *filename, int lineno, const char *funcname)
pg_attribute_cold bool errstart_cold(int elevel, const char *domain)
#define CHECK_STACK_DEPTH()
static void set_stack_entry_domain(ErrorData *edata, const char *domain)
#define EVALUATE_MESSAGE_PLURAL(domain, targetfield, appendval)
static bool should_output_to_server(int elevel)
const char * get_backend_type_for_log(void)
int errcode(int sqlerrcode)
static void backtrace_cleanup(int code, Datum arg)
int errmsg(const char *fmt,...)
void vwrite_stderr(const char *fmt, va_list ap)
void log_status_format(StringInfo buf, const char *format, ErrorData *edata)
char * get_formatted_log_time(void)
bool in_error_recursion_trouble(void)
void errfinish(const char *filename, int lineno, const char *funcname)
static const char * err_gettext(const char *str) pg_attribute_format_arg(1)
#define ERRORDATA_STACK_SIZE
char * unpack_sql_state(int sql_state)
static pg_noinline void set_backtrace(ErrorData *edata, int num_skip)
void reset_formatted_start_time(void)
static ErrorData errordata[ERRORDATA_STACK_SIZE]
sigjmp_buf * PG_exception_stack
static const char * save_format_domain
void assign_log_destination(const char *newval, void *extra)
int getinternalerrposition(void)
int int errhidestmt(bool hide_stmt)
void(* emit_log_hook_type)(ErrorData *edata)
int err_generic_string(int field, const char *str)
int int errdetail_internal(const char *fmt,...) pg_attribute_printf(1
int errhint(const char *fmt,...) pg_attribute_printf(1
int internalerrquery(const char *query)
int int int errhint_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...) pg_attribute_printf(1
int internalerrposition(int cursorpos)
int errdetail(const char *fmt,...) pg_attribute_printf(1
#define WARNING_CLIENT_ONLY
int int errmsg_internal(const char *fmt,...) pg_attribute_printf(1
int int int errmsg_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...) pg_attribute_printf(1
#define LOG_DESTINATION_JSONLOG
int errcontext_msg(const char *fmt,...) pg_attribute_printf(1
int errhidecontext(bool hide_ctx)
int int int errdetail_log(const char *fmt,...) pg_attribute_printf(1
#define LOG_DESTINATION_SYSLOG
#define LOG_DESTINATION_STDERR
int errposition(int cursorpos)
#define ereport(elevel,...)
#define LOG_DESTINATION_EVENTLOG
int int int int errdetail_log_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...) pg_attribute_printf(1
#define LOG_DESTINATION_CSVLOG
int set_errcontext_domain(const char *domain)
int errdetail_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...) pg_attribute_printf(1
int int errhint_internal(const char *fmt,...) pg_attribute_printf(1
#define palloc_object(type)
volatile uint32 QueryCancelHoldoffCount
ProtocolVersion FrontendProtocol
volatile uint32 InterruptHoldoffCount
volatile uint32 CritSectionCount
char OutputFileName[MAXPGPATH]
void * guc_malloc(int elevel, size_t size)
char * guc_strdup(int elevel, const char *src)
#define GUC_check_errdetail
int log_min_error_statement
static int syslog_facility
const struct config_enum_entry server_message_level_options[]
char * backtrace_functions
int pg_getnameinfo_all(const struct sockaddr_storage *addr, int salen, char *node, int nodelen, char *service, int servicelen, int flags)
void on_proc_exit(pg_on_exit_callback function, Datum arg)
bool proc_exit_inprogress
void write_jsonlog(ErrorData *edata)
void list_sort(List *list, list_sort_comparator cmp)
void list_free(List *list)
int pg_mbcliplen(const char *mbstr, int len, int limit)
int GetMessageEncoding(void)
char * MemoryContextStrdup(MemoryContext context, const char *string)
void MemoryContextReset(MemoryContext context)
char * pstrdup(const char *in)
void pfree(void *pointer)
MemoryContext CurrentMemoryContext
MemoryContext ErrorContext
#define BACKEND_NUM_TYPES
#define CHECK_FOR_INTERRUPTS()
const char * GetBackendTypeDesc(BackendType backendType)
BackendType MyBackendType
#define IsA(nodeptr, _type_)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define DEFAULT_EVENT_SOURCE
#define foreach_current_index(var_or_cell)
#define foreach_ptr(type, var, lst)
size_t wchar2char(char *to, const wchar_t *from, size_t tolen, locale_t loc)
static rewind_source * source
static char buf[DEFAULT_XLOG_SEG_SIZE]
SessionEndType pgStatSessionEndCause
size_t pg_strftime(char *s, size_t maxsize, const char *format, const struct pg_tm *t)
struct pg_tm * pg_localtime(const pg_time_t *timep, const pg_tz *tz)
PGDLLIMPORT pg_tz * log_timezone
#define ALL_CONNECTION_FAILURE_ERRNOS
int pg_strcasecmp(const char *s1, const char *s2)
CommandDest whereToSendOutput
const char * debug_query_string
#define PG_DIAG_INTERNAL_QUERY
#define PG_DIAG_SCHEMA_NAME
#define PG_DIAG_CONSTRAINT_NAME
#define PG_DIAG_DATATYPE_NAME
#define PG_DIAG_SOURCE_LINE
#define PG_DIAG_STATEMENT_POSITION
#define PG_DIAG_SOURCE_FILE
#define PG_DIAG_MESSAGE_HINT
#define PG_DIAG_SEVERITY_NONLOCALIZED
#define PG_DIAG_TABLE_NAME
#define PG_DIAG_MESSAGE_PRIMARY
#define PG_DIAG_COLUMN_NAME
#define PG_DIAG_MESSAGE_DETAIL
#define PG_DIAG_SOURCE_FUNCTION
#define PG_DIAG_INTERNAL_POSITION
bool ClientAuthInProgress
BackgroundWorker * MyBgworkerEntry
int pq_putmessage_v2(char msgtype, const char *s, size_t len)
#define PG_PROTOCOL_MAJOR(v)
static int fd(const char *x, int i)
#define INVALID_PROC_NUMBER
#define PqMsg_ErrorResponse
#define PqMsg_NoticeResponse
const char * get_ps_display(int *displen)
char * psprintf(const char *fmt,...)
void appendStringInfo(StringInfo str, const char *fmt,...)
void appendBinaryStringInfo(StringInfo str, const void *data, int datalen)
void appendStringInfoSpaces(StringInfo str, int count)
void initStringInfoExt(StringInfo str, int initsize)
void appendStringInfoString(StringInfo str, const char *s)
void appendStringInfoChar(StringInfo str, char ch)
void initStringInfo(StringInfo str)
#define appendStringInfoCharMacro(str, ch)
char bgw_type[BGW_MAXLEN]
struct ErrorContextCallback * previous
void(* callback)(void *arg)
struct sockaddr_storage addr
void write_syslogger_file(const char *buffer, int count, int destination)
#define PIPE_PROTO_DEST_JSONLOG
#define PIPE_PROTO_IS_LAST
#define PIPE_PROTO_DEST_CSVLOG
#define PIPE_PROTO_DEST_STDERR
bool SplitGUCList(char *rawstring, char separator, List **namelist)
bool SplitIdentifierString(char *rawstring, char separator, List **namelist)
int pgwin32_is_service(void)
int gettimeofday(struct timeval *tp, void *tzp)
TransactionId GetTopTransactionIdIfAny(void)