65 #ifdef HAVE_EXECINFO_H
91 #define _(x) err_gettext(x)
130 #ifndef PG_SYSLOG_LIMIT
131 #define PG_SYSLOG_LIMIT 900
134 static bool openlog_done =
false;
135 static char *syslog_ident = NULL;
138 static void write_syslog(
int level,
const char *line);
144 static void write_eventlog(
int level,
const char *line,
int len);
148 #define ERRORDATA_STACK_SIZE 5
163 #define FORMATTED_TS_LEN 128
169 #define CHECK_STACK_DEPTH() \
171 if (errordata_stack_depth < 0) \
173 errordata_stack_depth = -1; \
174 ereport(ERROR, (errmsg_internal("errstart was not called"))); \
210 if (log_min_level ==
LOG || log_min_level <=
ERROR)
218 else if (log_min_level ==
LOG)
225 else if (elevel >= log_min_level)
260 return (elevel >=
ERROR);
282 if (elevel >=
ERROR ||
309 static inline const char *
350 bool output_to_server;
351 bool output_to_client =
false;
406 if (elevel <
ERROR && !output_to_server && !output_to_client)
416 write_stderr(
"error occurred before error message processing is available\n");
458 edata->
sqlerrcode = ERRCODE_SUCCESSFUL_COMPLETION;
896 edata->
sqlerrcode = ERRCODE_INSUFFICIENT_PRIVILEGE;
912 #if defined(ENOTEMPTY) && (ENOTEMPTY != EEXIST)
915 edata->
sqlerrcode = ERRCODE_WRONG_OBJECT_TYPE;
925 edata->
sqlerrcode = ERRCODE_INSUFFICIENT_RESOURCES;
963 edata->
sqlerrcode = ERRCODE_CONNECTION_FAILURE;
988 #define EVALUATE_MESSAGE(domain, targetfield, appendval, translateit) \
990 StringInfoData buf; \
992 if ((translateit) && !in_error_recursion_trouble()) \
993 fmt = dgettext((domain), fmt); \
994 initStringInfo(&buf); \
995 if ((appendval) && edata->targetfield) { \
996 appendStringInfoString(&buf, edata->targetfield); \
997 appendStringInfoChar(&buf, '\n'); \
1004 errno = edata->saved_errno; \
1005 va_start(args, fmt); \
1006 needed = appendStringInfoVA(&buf, fmt, args); \
1010 enlargeStringInfo(&buf, needed); \
1013 if (edata->targetfield) \
1014 pfree(edata->targetfield); \
1015 edata->targetfield = pstrdup(buf.data); \
1024 #define EVALUATE_MESSAGE_PLURAL(domain, targetfield, appendval) \
1027 StringInfoData buf; \
1029 if (!in_error_recursion_trouble()) \
1030 fmt = dngettext((domain), fmt_singular, fmt_plural, n); \
1032 fmt = (n == 1 ? fmt_singular : fmt_plural); \
1033 initStringInfo(&buf); \
1034 if ((appendval) && edata->targetfield) { \
1035 appendStringInfoString(&buf, edata->targetfield); \
1036 appendStringInfoChar(&buf, '\n'); \
1043 errno = edata->saved_errno; \
1044 va_start(args, n); \
1045 needed = appendStringInfoVA(&buf, fmt, args); \
1049 enlargeStringInfo(&buf, needed); \
1052 if (edata->targetfield) \
1053 pfree(edata->targetfield); \
1054 edata->targetfield = pstrdup(buf.data); \
1121 #ifdef HAVE_BACKTRACE_SYMBOLS
1128 strfrms = backtrace_symbols(
buf, nframes);
1129 if (strfrms == NULL)
1132 for (
int i = num_skip;
i < nframes;
i++)
1138 "backtrace generation is not supported by this installation");
1180 unsigned long n,...)
1272 unsigned long n,...)
1295 unsigned long n,...)
1339 unsigned long n,...)
1536 elog(
ERROR,
"unsupported ErrorData field id: %d", field);
1698 (*emit_log_hook) (edata);
1735 memcpy(newedata, edata,
sizeof(
ErrorData));
1920 memcpy(newedata, edata,
sizeof(
ErrorData));
2092 errmsg(
"could not reopen file \"%s\" as stderr: %m",
2105 errmsg(
"could not reopen file \"%s\" as stdout: %m",
2124 int newvallen = strlen(*
newval);
2134 validlen = strspn(*
newval,
2136 "abcdefghijklmnopqrstuvwxyz"
2137 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
2139 if (validlen != newvallen)
2157 for (
i = 0,
j = 0;
i < newvallen;
i++)
2160 someval[
j++] =
'\0';
2161 else if ((*
newval)[
i] ==
' ' ||
2166 someval[
j++] = (*newval)[
i];
2171 someval[
j + 1] =
'\0';
2211 foreach(l, elemlist)
2213 char *tok = (
char *)
lfirst(l);
2242 *myextra = newlogdest;
2243 *extra = (
void *) myextra;
2274 if (syslog_ident == NULL || strcmp(syslog_ident,
newval) != 0)
2279 openlog_done =
false;
2282 syslog_ident = strdup(
newval);
2304 openlog_done =
false;
2318 write_syslog(
int level,
const char *line)
2320 static unsigned long seq = 0;
2328 openlog(syslog_ident ? syslog_ident :
"postgres",
2329 LOG_PID | LOG_NDELAY | LOG_NOWAIT,
2331 openlog_done =
true;
2349 nlpos = strchr(line,
'\n');
2356 char buf[PG_SYSLOG_LIMIT + 1];
2361 if (line[0] ==
'\n')
2366 nlpos = strchr(line,
'\n');
2372 buflen = nlpos - line;
2375 buflen =
Min(buflen, PG_SYSLOG_LIMIT);
2376 memcpy(
buf, line, buflen);
2386 if (line[buflen] !=
'\0' &&
2387 !isspace((
unsigned char) line[buflen]))
2391 while (
i > 0 && !isspace((
unsigned char)
buf[
i]))
2404 syslog(level,
"[%lu-%d] %s", seq, chunk_nr,
buf);
2406 syslog(level,
"[%d] %s", chunk_nr,
buf);
2416 syslog(level,
"[%lu] %s", seq, line);
2418 syslog(level,
"%s", line);
2430 GetACPEncoding(
void)
2435 encoding = pg_codepage_to_encoding(GetACP());
2444 write_eventlog(
int level,
const char *line,
int len)
2447 int eventlevel = EVENTLOG_ERROR_TYPE;
2448 static HANDLE evtHandle = INVALID_HANDLE_VALUE;
2450 if (evtHandle == INVALID_HANDLE_VALUE)
2452 evtHandle = RegisterEventSource(NULL,
2454 if (evtHandle == NULL)
2456 evtHandle = INVALID_HANDLE_VALUE;
2472 eventlevel = EVENTLOG_INFORMATION_TYPE;
2476 eventlevel = EVENTLOG_WARNING_TYPE;
2482 eventlevel = EVENTLOG_ERROR_TYPE;
2503 utf16 = pgwin32_message_to_UTF16(line,
len, NULL);
2506 ReportEventW(evtHandle,
2521 ReportEventA(evtHandle,
2564 utf16 = pgwin32_message_to_UTF16(line,
len, &utf16len);
2570 stdHandle = GetStdHandle(STD_ERROR_HANDLE);
2571 if (WriteConsoleW(stdHandle, utf16, utf16len, &written, NULL))
2599 rc =
write(fileno(stderr), line,
len);
2636 "%Y-%m-%d %H:%M:%S %Z",
2676 "%Y-%m-%d %H:%M:%S %Z",
2711 const char *backend_type_str;
2714 backend_type_str =
"postmaster";
2720 return backend_type_str;
2733 int paddingsign = 1;
2746 while (*p >=
'0' && *p <=
'9')
2747 padding = padding * 10 + (*p++ -
'0');
2753 padding *= paddingsign;
2754 *ppadding = padding;
2774 static long log_line_number = 0;
2777 static int log_my_pid = 0;
2789 log_line_number = 0;
2798 for (p =
format; *p !=
'\0'; p++)
2846 if (appname == NULL || *appname ==
'\0')
2847 appname =
_(
"[unknown]");
2853 else if (padding != 0)
2855 padding > 0 ? padding : -padding);
2880 else if (padding != 0)
2882 padding > 0 ? padding : -padding);
2896 else if (padding != 0)
2898 padding > 0 ? padding : -padding);
2905 snprintf(strfbuf,
sizeof(strfbuf) - 1,
"%lx.%x",
2930 padding > 0 ? padding : -padding);
2931 else if (padding != 0)
2936 else if (padding != 0)
2938 padding > 0 ? padding : -padding);
2963 "%Y-%m-%d %H:%M:%S %Z",
2981 snprintf(strfbuf,
sizeof(strfbuf),
"%ld.%03d",
3013 else if (padding != 0)
3015 padding > 0 ? padding : -padding);
3051 else if (padding != 0)
3053 padding > 0 ? padding : -padding);
3063 else if (padding != 0)
3065 padding > 0 ? padding : -padding);
3081 snprintf(strfbuf,
sizeof(strfbuf) - 1,
"%d/%u",
3088 else if (padding != 0)
3090 padding > 0 ? padding : -padding);
3126 static char buf[12];
3129 for (
i = 0;
i < 5;
i++)
3147 bool fallback_to_stderr =
false;
3261 syslog_level = LOG_DEBUG;
3266 syslog_level = LOG_INFO;
3271 syslog_level = LOG_NOTICE;
3274 syslog_level = LOG_WARNING;
3277 syslog_level = LOG_ERR;
3281 syslog_level = LOG_CRIT;
3285 write_syslog(syslog_level,
buf.data);
3308 fallback_to_stderr =
true;
3324 fallback_to_stderr =
true;
3390 int fd = fileno(stderr);
3684 while ((ch = *
str++) !=
'\0')
3723 write_eventlog(
ERROR, errbuf, strlen(errbuf));
3754 if (trace_level <
LOG &&
void ExceptionalCondition(const char *conditionName, const char *fileName, int lineNumber)
uint64 pgstat_get_my_query_id(void)
#define pg_attribute_format_arg(a)
#define pg_attribute_cold
#define PG_TEXTDOMAIN(domain)
#define MemSet(start, val, len)
void write_csvlog(ErrorData *edata)
elog(ERROR, "%s: %s", p2, msg)
void assign_syslog_facility(int newval, void *extra)
int getinternalerrposition(void)
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)
int err_generic_string(int field, const char *str)
int errmsg_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
void errsave_finish(struct Node *context, const char *filename, int lineno, const char *funcname)
static char formatted_log_time[FORMATTED_TS_LEN]
int internalerrquery(const char *query)
static char formatted_start_time[FORMATTED_TS_LEN]
int internalerrposition(int cursorpos)
static void send_message_to_frontend(ErrorData *edata)
bool check_log_of_query(ErrorData *edata)
int errmsg_internal(const char *fmt,...)
static void append_with_tabs(StringInfo buf, const char *str)
int errhidestmt(bool hide_stmt)
char * get_formatted_log_time(void)
bool errstart(int elevel, const char *domain)
void EmitErrorReport(void)
bool syslog_split_messages
static void FreeErrorDataContents(ErrorData *edata)
static int errordata_stack_depth
static void err_sendstring(StringInfo buf, const char *str)
void FreeErrorData(ErrorData *edata)
void assign_backtrace_functions(const char *newval, void *extra)
static ErrorData * get_error_stack_entry(void)
int errdetail_internal(const char *fmt,...)
static bool saved_timeval_set
int errcode_for_file_access(void)
int errdetail(const char *fmt,...)
const char * error_severity(int elevel)
int errcontext_msg(const char *fmt,...)
static int save_format_errnumber
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 struct timeval saved_timeval
void ReThrowError(ErrorData *edata)
static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str)
const char * get_backend_type_for_log(void)
static bool matches_backtrace_functions(const char *funcname)
bool check_log_destination(char **newval, void **extra, GucSource source)
void FlushErrorState(void)
int errdetail_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
char * format_elog_string(const char *fmt,...)
int errhint(const char *fmt,...)
static bool is_log_level_output(int elevel, int log_min_level)
void ThrowErrorData(ErrorData *edata)
bool message_level_is_interesting(int elevel)
void write_pipe_chunks(char *data, int len, int dest)
int errhidecontext(bool hide_ctx)
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)
char * unpack_sql_state(int sql_state)
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)
int errcode(int sqlerrcode)
int errdetail_log_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
void write_stderr(const char *fmt,...)
int errmsg(const char *fmt,...)
static char * backtrace_symbol_list
void log_status_format(StringInfo buf, const char *format, ErrorData *edata)
char * GetErrorContextStack(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)
int errposition(int cursorpos)
#define ERRORDATA_STACK_SIZE
int errhint_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
int errdetail_log(const char *fmt,...)
static pg_noinline void set_backtrace(ErrorData *edata, int num_skip)
char * get_formatted_start_time(void)
int set_errcontext_domain(const char *domain)
void reset_formatted_start_time(void)
static ErrorData errordata[ERRORDATA_STACK_SIZE]
int trace_recovery(int trace_level)
sigjmp_buf * PG_exception_stack
static const char * save_format_domain
ErrorData * CopyErrorData(void)
void assign_log_destination(const char *newval, void *extra)
void(* emit_log_hook_type)(ErrorData *edata)
#define WARNING_CLIENT_ONLY
#define LOG_DESTINATION_JSONLOG
#define LOG_DESTINATION_SYSLOG
#define LOG_DESTINATION_STDERR
#define ereport(elevel,...)
#define LOG_DESTINATION_EVENTLOG
#define LOG_DESTINATION_CSVLOG
#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)
#define GUC_check_errdetail
int log_min_error_statement
static int syslog_facility
int trace_recovery_messages
char * backtrace_functions
bool proc_exit_inprogress
void write_jsonlog(ErrorData *edata)
static void const char * fmt
static void const char fflush(stdout)
vfprintf(stderr, fmt, args)
Assert(fmt[strlen(fmt) - 1] !='\n')
void list_free(List *list)
int pg_mbcliplen(const char *mbstr, int len, int limit)
int GetMessageEncoding(void)
void MemoryContextReset(MemoryContext context)
char * pstrdup(const char *in)
void pfree(void *pointer)
MemoryContext CurrentMemoryContext
char * MemoryContextStrdup(MemoryContext context, const char *string)
MemoryContext ErrorContext
#define MemoryContextResetAndDeleteChildren(ctx)
#define CHECK_FOR_INTERRUPTS()
const char * GetBackendTypeDesc(BackendType backendType)
BackendType MyBackendType
#define IsA(nodeptr, _type_)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define DEFAULT_EVENT_SOURCE
static rewind_source * source
SessionEndType pgStatSessionEndCause
struct pg_tm * pg_localtime(const pg_time_t *timep, const pg_tz *tz)
size_t pg_strftime(char *s, size_t maxsize, const char *format, const struct pg_tm *t)
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 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 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 MemoryContextData * assoc_context
const char * context_domain
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 SplitIdentifierString(char *rawstring, char separator, List **namelist)
int pgwin32_is_service(void)
int gettimeofday(struct timeval *tp, void *tzp)
TransactionId GetTopTransactionIdIfAny(void)