PostgreSQL Source Code git master
elog.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * elog.c
4 * error logging and reporting
5 *
6 * Because of the extremely high rate at which log messages can be generated,
7 * we need to be mindful of the performance cost of obtaining any information
8 * that may be logged. Also, it's important to keep in mind that this code may
9 * get called from within an aborted transaction, in which case operations
10 * such as syscache lookups are unsafe.
11 *
12 * Some notes about recursion and errors during error processing:
13 *
14 * We need to be robust about recursive-error scenarios --- for example,
15 * if we run out of memory, it's important to be able to report that fact.
16 * There are a number of considerations that go into this.
17 *
18 * First, distinguish between re-entrant use and actual recursion. It
19 * is possible for an error or warning message to be emitted while the
20 * parameters for an error message are being computed. In this case
21 * errstart has been called for the outer message, and some field values
22 * may have already been saved, but we are not actually recursing. We handle
23 * this by providing a (small) stack of ErrorData records. The inner message
24 * can be computed and sent without disturbing the state of the outer message.
25 * (If the inner message is actually an error, this isn't very interesting
26 * because control won't come back to the outer message generator ... but
27 * if the inner message is only debug or log data, this is critical.)
28 *
29 * Second, actual recursion will occur if an error is reported by one of
30 * the elog.c routines or something they call. By far the most probable
31 * scenario of this sort is "out of memory"; and it's also the nastiest
32 * to handle because we'd likely also run out of memory while trying to
33 * report this error! Our escape hatch for this case is to reset the
34 * ErrorContext to empty before trying to process the inner error. Since
35 * ErrorContext is guaranteed to have at least 8K of space in it (see mcxt.c),
36 * we should be able to process an "out of memory" message successfully.
37 * Since we lose the prior error state due to the reset, we won't be able
38 * to return to processing the original error, but we wouldn't have anyway.
39 * (NOTE: the escape hatch is not used for recursive situations where the
40 * inner message is of less than ERROR severity; in that case we just
41 * try to process it and return normally. Usually this will work, but if
42 * it ends up in infinite recursion, we will PANIC due to error stack
43 * overflow.)
44 *
45 *
46 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
47 * Portions Copyright (c) 1994, Regents of the University of California
48 *
49 *
50 * IDENTIFICATION
51 * src/backend/utils/error/elog.c
52 *
53 *-------------------------------------------------------------------------
54 */
55#include "postgres.h"
56
57#include <fcntl.h>
58#include <time.h>
59#include <unistd.h>
60#include <signal.h>
61#include <ctype.h>
62#ifdef HAVE_SYSLOG
63#include <syslog.h>
64#endif
65#ifdef HAVE_EXECINFO_H
66#include <execinfo.h>
67#endif
68
69#include "access/xact.h"
70#include "libpq/libpq.h"
71#include "libpq/pqformat.h"
72#include "mb/pg_wchar.h"
73#include "miscadmin.h"
74#include "nodes/miscnodes.h"
75#include "pgstat.h"
76#include "postmaster/bgworker.h"
79#include "storage/ipc.h"
80#include "storage/proc.h"
81#include "tcop/tcopprot.h"
82#include "utils/guc_hooks.h"
83#include "utils/memutils.h"
84#include "utils/ps_status.h"
85#include "utils/varlena.h"
86
87
88/* In this module, access gettext() via err_gettext() */
89#undef _
90#define _(x) err_gettext(x)
91
92
93/* Global variables */
95
96sigjmp_buf *PG_exception_stack = NULL;
97
98/*
99 * Hook for intercepting messages before they are sent to the server log.
100 * Note that the hook will not get called for messages that are suppressed
101 * by log_min_messages. Also note that logging hooks implemented in preload
102 * libraries will miss any log messages that are generated before the
103 * library is loaded.
104 */
106
107/* GUC parameters */
109char *Log_line_prefix = NULL; /* format for extra log line info */
114
115/* Processed form of backtrace_functions GUC */
117
118#ifdef HAVE_SYSLOG
119
120/*
121 * Max string length to send to syslog(). Note that this doesn't count the
122 * sequence-number prefix we add, and of course it doesn't count the prefix
123 * added by syslog itself. Solaris and sysklogd truncate the final message
124 * at 1024 bytes, so this value leaves 124 bytes for those prefixes. (Most
125 * other syslog implementations seem to have limits of 2KB or so.)
126 */
127#ifndef PG_SYSLOG_LIMIT
128#define PG_SYSLOG_LIMIT 900
129#endif
130
131static bool openlog_done = false;
132static char *syslog_ident = NULL;
133static int syslog_facility = LOG_LOCAL0;
134
135static void write_syslog(int level, const char *line);
136#endif
137
138#ifdef WIN32
139static void write_eventlog(int level, const char *line, int len);
140#endif
141
142/* We provide a small stack of ErrorData records for re-entrant cases */
143#define ERRORDATA_STACK_SIZE 5
144
146
147static int errordata_stack_depth = -1; /* index of topmost active frame */
148
149static int recursion_depth = 0; /* to detect actual recursion */
150
151/*
152 * Saved timeval and buffers for formatted timestamps that might be used by
153 * log_line_prefix, csv logs and JSON logs.
154 */
155static struct timeval saved_timeval;
156static bool saved_timeval_set = false;
157
158#define FORMATTED_TS_LEN 128
161
162
163/* Macro for checking errordata_stack_depth is reasonable */
164#define CHECK_STACK_DEPTH() \
165 do { \
166 if (errordata_stack_depth < 0) \
167 { \
168 errordata_stack_depth = -1; \
169 ereport(ERROR, (errmsg_internal("errstart was not called"))); \
170 } \
171 } while (0)
172
173
174static const char *err_gettext(const char *str) pg_attribute_format_arg(1);
175static ErrorData *get_error_stack_entry(void);
176static void set_stack_entry_domain(ErrorData *edata, const char *domain);
177static void set_stack_entry_location(ErrorData *edata,
178 const char *filename, int lineno,
179 const char *funcname);
180static bool matches_backtrace_functions(const char *funcname);
181static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
182static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
183static void FreeErrorDataContents(ErrorData *edata);
184static void write_console(const char *line, int len);
185static const char *process_log_prefix_padding(const char *p, int *ppadding);
186static void log_line_prefix(StringInfo buf, ErrorData *edata);
187static void send_message_to_server_log(ErrorData *edata);
188static void send_message_to_frontend(ErrorData *edata);
189static void append_with_tabs(StringInfo buf, const char *str);
190
191
192/*
193 * is_log_level_output -- is elevel logically >= log_min_level?
194 *
195 * We use this for tests that should consider LOG to sort out-of-order,
196 * between ERROR and FATAL. Generally this is the right thing for testing
197 * whether a message should go to the postmaster log, whereas a simple >=
198 * test is correct for testing whether the message should go to the client.
199 */
200static inline bool
201is_log_level_output(int elevel, int log_min_level)
202{
203 if (elevel == LOG || elevel == LOG_SERVER_ONLY)
204 {
205 if (log_min_level == LOG || log_min_level <= ERROR)
206 return true;
207 }
208 else if (elevel == WARNING_CLIENT_ONLY)
209 {
210 /* never sent to log, regardless of log_min_level */
211 return false;
212 }
213 else if (log_min_level == LOG)
214 {
215 /* elevel != LOG */
216 if (elevel >= FATAL)
217 return true;
218 }
219 /* Neither is LOG */
220 else if (elevel >= log_min_level)
221 return true;
222
223 return false;
224}
225
226/*
227 * Policy-setting subroutines. These are fairly simple, but it seems wise
228 * to have the code in just one place.
229 */
230
231/*
232 * should_output_to_server --- should message of given elevel go to the log?
233 */
234static inline bool
236{
238}
239
240/*
241 * should_output_to_client --- should message of given elevel go to the client?
242 */
243static inline bool
245{
246 if (whereToSendOutput == DestRemote && elevel != LOG_SERVER_ONLY)
247 {
248 /*
249 * client_min_messages is honored only after we complete the
250 * authentication handshake. This is required both for security
251 * reasons and because many clients can't handle NOTICE messages
252 * during authentication.
253 */
255 return (elevel >= ERROR);
256 else
257 return (elevel >= client_min_messages || elevel == INFO);
258 }
259 return false;
260}
261
262
263/*
264 * message_level_is_interesting --- would ereport/elog do anything?
265 *
266 * Returns true if ereport/elog with this elevel will not be a no-op.
267 * This is useful to short-circuit any expensive preparatory work that
268 * might be needed for a logging message. There is no point in
269 * prepending this to a bare ereport/elog call, however.
270 */
271bool
273{
274 /*
275 * Keep this in sync with the decision-making in errstart().
276 */
277 if (elevel >= ERROR ||
278 should_output_to_server(elevel) ||
280 return true;
281 return false;
282}
283
284
285/*
286 * in_error_recursion_trouble --- are we at risk of infinite error recursion?
287 *
288 * This function exists to provide common control of various fallback steps
289 * that we take if we think we are facing infinite error recursion. See the
290 * callers for details.
291 */
292bool
294{
295 /* Pull the plug if recurse more than once */
296 return (recursion_depth > 2);
297}
298
299/*
300 * One of those fallback steps is to stop trying to localize the error
301 * message, since there's a significant probability that that's exactly
302 * what's causing the recursion.
303 */
304static inline const char *
305err_gettext(const char *str)
306{
307#ifdef ENABLE_NLS
309 return str;
310 else
311 return gettext(str);
312#else
313 return str;
314#endif
315}
316
317/*
318 * errstart_cold
319 * A simple wrapper around errstart, but hinted to be "cold". Supporting
320 * compilers are more likely to move code for branches containing this
321 * function into an area away from the calling function's code. This can
322 * result in more commonly executed code being more compact and fitting
323 * on fewer cache lines.
324 */
326errstart_cold(int elevel, const char *domain)
327{
328 return errstart(elevel, domain);
329}
330
331/*
332 * errstart --- begin an error-reporting cycle
333 *
334 * Create and initialize error stack entry. Subsequently, errmsg() and
335 * perhaps other routines will be called to further populate the stack entry.
336 * Finally, errfinish() will be called to actually process the error report.
337 *
338 * Returns true in normal case. Returns false to short-circuit the error
339 * report (if it's a warning or lower and not to be reported anywhere).
340 */
341bool
342errstart(int elevel, const char *domain)
343{
344 ErrorData *edata;
345 bool output_to_server;
346 bool output_to_client = false;
347 int i;
348
349 /*
350 * Check some cases in which we want to promote an error into a more
351 * severe error. None of this logic applies for non-error messages.
352 */
353 if (elevel >= ERROR)
354 {
355 /*
356 * If we are inside a critical section, all errors become PANIC
357 * errors. See miscadmin.h.
358 */
359 if (CritSectionCount > 0)
360 elevel = PANIC;
361
362 /*
363 * Check reasons for treating ERROR as FATAL:
364 *
365 * 1. we have no handler to pass the error to (implies we are in the
366 * postmaster or in backend startup).
367 *
368 * 2. ExitOnAnyError mode switch is set (initdb uses this).
369 *
370 * 3. the error occurred after proc_exit has begun to run. (It's
371 * proc_exit's responsibility to see that this doesn't turn into
372 * infinite recursion!)
373 */
374 if (elevel == ERROR)
375 {
376 if (PG_exception_stack == NULL ||
379 elevel = FATAL;
380 }
381
382 /*
383 * If the error level is ERROR or more, errfinish is not going to
384 * return to caller; therefore, if there is any stacked error already
385 * in progress it will be lost. This is more or less okay, except we
386 * do not want to have a FATAL or PANIC error downgraded because the
387 * reporting process was interrupted by a lower-grade error. So check
388 * the stack and make sure we panic if panic is warranted.
389 */
390 for (i = 0; i <= errordata_stack_depth; i++)
391 elevel = Max(elevel, errordata[i].elevel);
392 }
393
394 /*
395 * Now decide whether we need to process this report at all; if it's
396 * warning or less and not enabled for logging, just return false without
397 * starting up any error logging machinery.
398 */
399 output_to_server = should_output_to_server(elevel);
400 output_to_client = should_output_to_client(elevel);
401 if (elevel < ERROR && !output_to_server && !output_to_client)
402 return false;
403
404 /*
405 * We need to do some actual work. Make sure that memory context
406 * initialization has finished, else we can't do anything useful.
407 */
408 if (ErrorContext == NULL)
409 {
410 /* Oops, hard crash time; very little we can do safely here */
411 write_stderr("error occurred before error message processing is available\n");
412 exit(2);
413 }
414
415 /*
416 * Okay, crank up a stack entry to store the info in.
417 */
418
419 if (recursion_depth++ > 0 && elevel >= ERROR)
420 {
421 /*
422 * Oops, error during error processing. Clear ErrorContext as
423 * discussed at top of file. We will not return to the original
424 * error's reporter or handler, so we don't need it.
425 */
427
428 /*
429 * Infinite error recursion might be due to something broken in a
430 * context traceback routine. Abandon them too. We also abandon
431 * attempting to print the error statement (which, if long, could
432 * itself be the source of the recursive failure).
433 */
435 {
436 error_context_stack = NULL;
437 debug_query_string = NULL;
438 }
439 }
440
441 /* Initialize data for this error frame */
442 edata = get_error_stack_entry();
443 edata->elevel = elevel;
444 edata->output_to_server = output_to_server;
445 edata->output_to_client = output_to_client;
446 set_stack_entry_domain(edata, domain);
447 /* Select default errcode based on elevel */
448 if (elevel >= ERROR)
449 edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
450 else if (elevel >= WARNING)
451 edata->sqlerrcode = ERRCODE_WARNING;
452 else
453 edata->sqlerrcode = ERRCODE_SUCCESSFUL_COMPLETION;
454
455 /*
456 * Any allocations for this error state level should go into ErrorContext
457 */
459
461 return true;
462}
463
464/*
465 * errfinish --- end an error-reporting cycle
466 *
467 * Produce the appropriate error report(s) and pop the error stack.
468 *
469 * If elevel, as passed to errstart(), is ERROR or worse, control does not
470 * return to the caller. See elog.h for the error level definitions.
471 */
472void
473errfinish(const char *filename, int lineno, const char *funcname)
474{
476 int elevel;
477 MemoryContext oldcontext;
478 ErrorContextCallback *econtext;
479
482
483 /* Save the last few bits of error state into the stack entry */
485
486 elevel = edata->elevel;
487
488 /*
489 * Do processing in ErrorContext, which we hope has enough reserved space
490 * to report an error.
491 */
493
494 /* Collect backtrace, if enabled and we didn't already */
495 if (!edata->backtrace &&
496 edata->funcname &&
499 set_backtrace(edata, 2);
500
501 /*
502 * Call any context callback functions. Errors occurring in callback
503 * functions will be treated as recursive errors --- this ensures we will
504 * avoid infinite recursion (see errstart).
505 */
506 for (econtext = error_context_stack;
507 econtext != NULL;
508 econtext = econtext->previous)
509 econtext->callback(econtext->arg);
510
511 /*
512 * If ERROR (not more nor less) we pass it off to the current handler.
513 * Printing it and popping the stack is the responsibility of the handler.
514 */
515 if (elevel == ERROR)
516 {
517 /*
518 * We do some minimal cleanup before longjmp'ing so that handlers can
519 * execute in a reasonably sane state.
520 *
521 * Reset InterruptHoldoffCount in case we ereport'd from inside an
522 * interrupt holdoff section. (We assume here that no handler will
523 * itself be inside a holdoff section. If necessary, such a handler
524 * could save and restore InterruptHoldoffCount for itself, but this
525 * should make life easier for most.)
526 */
529
530 CritSectionCount = 0; /* should be unnecessary, but... */
531
532 /*
533 * Note that we leave CurrentMemoryContext set to ErrorContext. The
534 * handler should reset it to something else soon.
535 */
536
538 PG_RE_THROW();
539 }
540
541 /* Emit the message to the right places */
543
544 /* Now free up subsidiary data attached to stack entry, and release it */
547
548 /* Exit error-handling context */
549 MemoryContextSwitchTo(oldcontext);
551
552 /*
553 * Perform error recovery action as specified by elevel.
554 */
555 if (elevel == FATAL)
556 {
557 /*
558 * For a FATAL error, we let proc_exit clean up and exit.
559 *
560 * If we just reported a startup failure, the client will disconnect
561 * on receiving it, so don't send any more to the client.
562 */
565
566 /*
567 * fflush here is just to improve the odds that we get to see the
568 * error message, in case things are so hosed that proc_exit crashes.
569 * Any other code you might be tempted to add here should probably be
570 * in an on_proc_exit or on_shmem_exit callback instead.
571 */
572 fflush(NULL);
573
574 /*
575 * Let the cumulative stats system know. Only mark the session as
576 * terminated by fatal error if there is no other known cause.
577 */
580
581 /*
582 * Do normal process-exit cleanup, then return exit code 1 to indicate
583 * FATAL termination. The postmaster may or may not consider this
584 * worthy of panic, depending on which subprocess returns it.
585 */
586 proc_exit(1);
587 }
588
589 if (elevel >= PANIC)
590 {
591 /*
592 * Serious crash time. Postmaster will observe SIGABRT process exit
593 * status and kill the other backends too.
594 *
595 * XXX: what if we are *in* the postmaster? abort() won't kill our
596 * children...
597 */
598 fflush(NULL);
599 abort();
600 }
601
602 /*
603 * Check for cancel/die interrupt first --- this is so that the user can
604 * stop a query emitting tons of notice or warning messages, even if it's
605 * in a loop that otherwise fails to check for interrupts.
606 */
608}
609
610
611/*
612 * errsave_start --- begin a "soft" error-reporting cycle
613 *
614 * If "context" isn't an ErrorSaveContext node, this behaves as
615 * errstart(ERROR, domain), and the errsave() macro ends up acting
616 * exactly like ereport(ERROR, ...).
617 *
618 * If "context" is an ErrorSaveContext node, but the node creator only wants
619 * notification of the fact of a soft error without any details, we just set
620 * the error_occurred flag in the ErrorSaveContext node and return false,
621 * which will cause us to skip the remaining error processing steps.
622 *
623 * Otherwise, create and initialize error stack entry and return true.
624 * Subsequently, errmsg() and perhaps other routines will be called to further
625 * populate the stack entry. Finally, errsave_finish() will be called to
626 * tidy up.
627 */
628bool
629errsave_start(struct Node *context, const char *domain)
630{
631 ErrorSaveContext *escontext;
632 ErrorData *edata;
633
634 /*
635 * Do we have a context for soft error reporting? If not, just punt to
636 * errstart().
637 */
638 if (context == NULL || !IsA(context, ErrorSaveContext))
639 return errstart(ERROR, domain);
640
641 /* Report that a soft error was detected */
642 escontext = (ErrorSaveContext *) context;
643 escontext->error_occurred = true;
644
645 /* Nothing else to do if caller wants no further details */
646 if (!escontext->details_wanted)
647 return false;
648
649 /*
650 * Okay, crank up a stack entry to store the info in.
651 */
652
654
655 /* Initialize data for this error frame */
656 edata = get_error_stack_entry();
657 edata->elevel = LOG; /* signal all is well to errsave_finish */
658 set_stack_entry_domain(edata, domain);
659 /* Select default errcode based on the assumed elevel of ERROR */
660 edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
661
662 /*
663 * Any allocations for this error state level should go into the caller's
664 * context. We don't need to pollute ErrorContext, or even require it to
665 * exist, in this code path.
666 */
668
670 return true;
671}
672
673/*
674 * errsave_finish --- end a "soft" error-reporting cycle
675 *
676 * If errsave_start() decided this was a regular error, behave as
677 * errfinish(). Otherwise, package up the error details and save
678 * them in the ErrorSaveContext node.
679 */
680void
681errsave_finish(struct Node *context, const char *filename, int lineno,
682 const char *funcname)
683{
684 ErrorSaveContext *escontext = (ErrorSaveContext *) context;
686
687 /* verify stack depth before accessing *edata */
689
690 /*
691 * If errsave_start punted to errstart, then elevel will be ERROR or
692 * perhaps even PANIC. Punt likewise to errfinish.
693 */
694 if (edata->elevel >= ERROR)
695 {
696 errfinish(filename, lineno, funcname);
698 }
699
700 /*
701 * Else, we should package up the stack entry contents and deliver them to
702 * the caller.
703 */
705
706 /* Save the last few bits of error state into the stack entry */
708
709 /* Replace the LOG value that errsave_start inserted */
710 edata->elevel = ERROR;
711
712 /*
713 * We skip calling backtrace and context functions, which are more likely
714 * to cause trouble than provide useful context; they might act on the
715 * assumption that a transaction abort is about to occur.
716 */
717
718 /*
719 * Make a copy of the error info for the caller. All the subsidiary
720 * strings are already in the caller's context, so it's sufficient to
721 * flat-copy the stack entry.
722 */
723 escontext->error_data = palloc_object(ErrorData);
724 memcpy(escontext->error_data, edata, sizeof(ErrorData));
725
726 /* Exit error-handling context */
729}
730
731
732/*
733 * get_error_stack_entry --- allocate and initialize a new stack entry
734 *
735 * The entry should be freed, when we're done with it, by calling
736 * FreeErrorDataContents() and then decrementing errordata_stack_depth.
737 *
738 * Returning the entry's address is just a notational convenience,
739 * since it had better be errordata[errordata_stack_depth].
740 *
741 * Although the error stack is not large, we don't expect to run out of space.
742 * Using more than one entry implies a new error report during error recovery,
743 * which is possible but already suggests we're in trouble. If we exhaust the
744 * stack, almost certainly we are in an infinite loop of errors during error
745 * recovery, so we give up and PANIC.
746 *
747 * (Note that this is distinct from the recursion_depth checks, which
748 * guard against recursion while handling a single stack entry.)
749 */
750static ErrorData *
752{
753 ErrorData *edata;
754
755 /* Allocate error frame */
758 {
759 /* Wups, stack not big enough */
760 errordata_stack_depth = -1; /* make room on stack */
761 ereport(PANIC, (errmsg_internal("ERRORDATA_STACK_SIZE exceeded")));
762 }
763
764 /* Initialize error frame to all zeroes/NULLs */
766 memset(edata, 0, sizeof(ErrorData));
767
768 /* Save errno immediately to ensure error parameter eval can't change it */
769 edata->saved_errno = errno;
770
771 return edata;
772}
773
774/*
775 * set_stack_entry_domain --- fill in the internationalization domain
776 */
777static void
778set_stack_entry_domain(ErrorData *edata, const char *domain)
779{
780 /* the default text domain is the backend's */
781 edata->domain = domain ? domain : PG_TEXTDOMAIN("postgres");
782 /* initialize context_domain the same way (see set_errcontext_domain()) */
783 edata->context_domain = edata->domain;
784}
785
786/*
787 * set_stack_entry_location --- fill in code-location details
788 *
789 * Store the values of __FILE__, __LINE__, and __func__ from the call site.
790 * We make an effort to normalize __FILE__, since compilers are inconsistent
791 * about how much of the path they'll include, and we'd prefer that the
792 * behavior not depend on that (especially, that it not vary with build path).
793 */
794static void
796 const char *filename, int lineno,
797 const char *funcname)
798{
799 if (filename)
800 {
801 const char *slash;
802
803 /* keep only base name, useful especially for vpath builds */
804 slash = strrchr(filename, '/');
805 if (slash)
806 filename = slash + 1;
807 /* Some Windows compilers use backslashes in __FILE__ strings */
808 slash = strrchr(filename, '\\');
809 if (slash)
810 filename = slash + 1;
811 }
812
813 edata->filename = filename;
814 edata->lineno = lineno;
815 edata->funcname = funcname;
816}
817
818/*
819 * matches_backtrace_functions --- checks whether the given funcname matches
820 * backtrace_functions
821 *
822 * See check_backtrace_functions.
823 */
824static bool
826{
827 const char *p;
828
829 if (!backtrace_function_list || funcname == NULL || funcname[0] == '\0')
830 return false;
831
833 for (;;)
834 {
835 if (*p == '\0') /* end of backtrace_function_list */
836 break;
837
838 if (strcmp(funcname, p) == 0)
839 return true;
840 p += strlen(p) + 1;
841 }
842
843 return false;
844}
845
846
847/*
848 * errcode --- add SQLSTATE error code to the current error
849 *
850 * The code is expected to be represented as per MAKE_SQLSTATE().
851 */
852int
853errcode(int sqlerrcode)
854{
856
857 /* we don't bother incrementing recursion_depth */
859
860 edata->sqlerrcode = sqlerrcode;
861
862 return 0; /* return value does not matter */
863}
864
865
866/*
867 * errcode_for_file_access --- add SQLSTATE error code to the current error
868 *
869 * The SQLSTATE code is chosen based on the saved errno value. We assume
870 * that the failing operation was some type of disk file access.
871 *
872 * NOTE: the primary error message string should generally include %m
873 * when this is used.
874 */
875int
877{
879
880 /* we don't bother incrementing recursion_depth */
882
883 switch (edata->saved_errno)
884 {
885 /* Permission-denied failures */
886 case EPERM: /* Not super-user */
887 case EACCES: /* Permission denied */
888#ifdef EROFS
889 case EROFS: /* Read only file system */
890#endif
891 edata->sqlerrcode = ERRCODE_INSUFFICIENT_PRIVILEGE;
892 break;
893
894 /* File not found */
895 case ENOENT: /* No such file or directory */
896 edata->sqlerrcode = ERRCODE_UNDEFINED_FILE;
897 break;
898
899 /* Duplicate file */
900 case EEXIST: /* File exists */
901 edata->sqlerrcode = ERRCODE_DUPLICATE_FILE;
902 break;
903
904 /* Wrong object type or state */
905 case ENOTDIR: /* Not a directory */
906 case EISDIR: /* Is a directory */
907 case ENOTEMPTY: /* Directory not empty */
908 edata->sqlerrcode = ERRCODE_WRONG_OBJECT_TYPE;
909 break;
910
911 /* Insufficient resources */
912 case ENOSPC: /* No space left on device */
913 edata->sqlerrcode = ERRCODE_DISK_FULL;
914 break;
915
916 case ENOMEM: /* Out of memory */
917 edata->sqlerrcode = ERRCODE_OUT_OF_MEMORY;
918 break;
919
920 case ENFILE: /* File table overflow */
921 case EMFILE: /* Too many open files */
922 edata->sqlerrcode = ERRCODE_INSUFFICIENT_RESOURCES;
923 break;
924
925 /* Hardware failure */
926 case EIO: /* I/O error */
927 edata->sqlerrcode = ERRCODE_IO_ERROR;
928 break;
929
930 case ENAMETOOLONG: /* File name too long */
931 edata->sqlerrcode = ERRCODE_FILE_NAME_TOO_LONG;
932 break;
933
934 /* All else is classified as internal errors */
935 default:
936 edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
937 break;
938 }
939
940 return 0; /* return value does not matter */
941}
942
943/*
944 * errcode_for_socket_access --- add SQLSTATE error code to the current error
945 *
946 * The SQLSTATE code is chosen based on the saved errno value. We assume
947 * that the failing operation was some type of socket access.
948 *
949 * NOTE: the primary error message string should generally include %m
950 * when this is used.
951 */
952int
954{
956
957 /* we don't bother incrementing recursion_depth */
959
960 switch (edata->saved_errno)
961 {
962 /* Loss of connection */
964 edata->sqlerrcode = ERRCODE_CONNECTION_FAILURE;
965 break;
966
967 /* All else is classified as internal errors */
968 default:
969 edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
970 break;
971 }
972
973 return 0; /* return value does not matter */
974}
975
976
977/*
978 * This macro handles expansion of a format string and associated parameters;
979 * it's common code for errmsg(), errdetail(), etc. Must be called inside
980 * a routine that is declared like "const char *fmt, ..." and has an edata
981 * pointer set up. The message is assigned to edata->targetfield, or
982 * appended to it if appendval is true. The message is subject to translation
983 * if translateit is true.
984 *
985 * Note: we pstrdup the buffer rather than just transferring its storage
986 * to the edata field because the buffer might be considerably larger than
987 * really necessary.
988 */
989#define EVALUATE_MESSAGE(domain, targetfield, appendval, translateit) \
990 { \
991 StringInfoData buf; \
992 /* Internationalize the error format string */ \
993 if ((translateit) && !in_error_recursion_trouble()) \
994 fmt = dgettext((domain), fmt); \
995 initStringInfo(&buf); \
996 if ((appendval) && edata->targetfield) { \
997 appendStringInfoString(&buf, edata->targetfield); \
998 appendStringInfoChar(&buf, '\n'); \
999 } \
1000 /* Generate actual output --- have to use appendStringInfoVA */ \
1001 for (;;) \
1002 { \
1003 va_list args; \
1004 int needed; \
1005 errno = edata->saved_errno; \
1006 va_start(args, fmt); \
1007 needed = appendStringInfoVA(&buf, fmt, args); \
1008 va_end(args); \
1009 if (needed == 0) \
1010 break; \
1011 enlargeStringInfo(&buf, needed); \
1012 } \
1013 /* Save the completed message into the stack item */ \
1014 if (edata->targetfield) \
1015 pfree(edata->targetfield); \
1016 edata->targetfield = pstrdup(buf.data); \
1017 pfree(buf.data); \
1018 }
1019
1020/*
1021 * Same as above, except for pluralized error messages. The calling routine
1022 * must be declared like "const char *fmt_singular, const char *fmt_plural,
1023 * unsigned long n, ...". Translation is assumed always wanted.
1024 */
1025#define EVALUATE_MESSAGE_PLURAL(domain, targetfield, appendval) \
1026 { \
1027 const char *fmt; \
1028 StringInfoData buf; \
1029 /* Internationalize the error format string */ \
1030 if (!in_error_recursion_trouble()) \
1031 fmt = dngettext((domain), fmt_singular, fmt_plural, n); \
1032 else \
1033 fmt = (n == 1 ? fmt_singular : fmt_plural); \
1034 initStringInfo(&buf); \
1035 if ((appendval) && edata->targetfield) { \
1036 appendStringInfoString(&buf, edata->targetfield); \
1037 appendStringInfoChar(&buf, '\n'); \
1038 } \
1039 /* Generate actual output --- have to use appendStringInfoVA */ \
1040 for (;;) \
1041 { \
1042 va_list args; \
1043 int needed; \
1044 errno = edata->saved_errno; \
1045 va_start(args, n); \
1046 needed = appendStringInfoVA(&buf, fmt, args); \
1047 va_end(args); \
1048 if (needed == 0) \
1049 break; \
1050 enlargeStringInfo(&buf, needed); \
1051 } \
1052 /* Save the completed message into the stack item */ \
1053 if (edata->targetfield) \
1054 pfree(edata->targetfield); \
1055 edata->targetfield = pstrdup(buf.data); \
1056 pfree(buf.data); \
1057 }
1058
1059
1060/*
1061 * errmsg --- add a primary error message text to the current error
1062 *
1063 * In addition to the usual %-escapes recognized by printf, "%m" in
1064 * fmt is replaced by the error message for the caller's value of errno.
1065 *
1066 * Note: no newline is needed at the end of the fmt string, since
1067 * ereport will provide one for the output methods that need it.
1068 */
1069int
1070errmsg(const char *fmt,...)
1071{
1073 MemoryContext oldcontext;
1074
1077 oldcontext = MemoryContextSwitchTo(edata->assoc_context);
1078
1079 edata->message_id = fmt;
1080 EVALUATE_MESSAGE(edata->domain, message, false, true);
1081
1082 MemoryContextSwitchTo(oldcontext);
1084 return 0; /* return value does not matter */
1085}
1086
1087/*
1088 * Add a backtrace to the containing ereport() call. This is intended to be
1089 * added temporarily during debugging.
1090 */
1091int
1093{
1095 MemoryContext oldcontext;
1096
1099 oldcontext = MemoryContextSwitchTo(edata->assoc_context);
1100
1101 set_backtrace(edata, 1);
1102
1103 MemoryContextSwitchTo(oldcontext);
1105
1106 return 0;
1107}
1108
1109/*
1110 * Compute backtrace data and add it to the supplied ErrorData. num_skip
1111 * specifies how many inner frames to skip. Use this to avoid showing the
1112 * internal backtrace support functions in the backtrace. This requires that
1113 * this and related functions are not inlined.
1114 */
1115static void
1116set_backtrace(ErrorData *edata, int num_skip)
1117{
1118 StringInfoData errtrace;
1119
1120 initStringInfo(&errtrace);
1121
1122#ifdef HAVE_BACKTRACE_SYMBOLS
1123 {
1124 void *buf[100];
1125 int nframes;
1126 char **strfrms;
1127
1128 nframes = backtrace(buf, lengthof(buf));
1129 strfrms = backtrace_symbols(buf, nframes);
1130 if (strfrms == NULL)
1131 return;
1132
1133 for (int i = num_skip; i < nframes; i++)
1134 appendStringInfo(&errtrace, "\n%s", strfrms[i]);
1135 free(strfrms);
1136 }
1137#else
1138 appendStringInfoString(&errtrace,
1139 "backtrace generation is not supported by this installation");
1140#endif
1141
1142 edata->backtrace = errtrace.data;
1143}
1144
1145/*
1146 * errmsg_internal --- add a primary error message text to the current error
1147 *
1148 * This is exactly like errmsg() except that strings passed to errmsg_internal
1149 * are not translated, and are customarily left out of the
1150 * internationalization message dictionary. This should be used for "can't
1151 * happen" cases that are probably not worth spending translation effort on.
1152 * We also use this for certain cases where we *must* not try to translate
1153 * the message because the translation would fail and result in infinite
1154 * error recursion.
1155 */
1156int
1157errmsg_internal(const char *fmt,...)
1158{
1160 MemoryContext oldcontext;
1161
1164 oldcontext = MemoryContextSwitchTo(edata->assoc_context);
1165
1166 edata->message_id = fmt;
1167 EVALUATE_MESSAGE(edata->domain, message, false, false);
1168
1169 MemoryContextSwitchTo(oldcontext);
1171 return 0; /* return value does not matter */
1172}
1173
1174
1175/*
1176 * errmsg_plural --- add a primary error message text to the current error,
1177 * with support for pluralization of the message text
1178 */
1179int
1180errmsg_plural(const char *fmt_singular, const char *fmt_plural,
1181 unsigned long n,...)
1182{
1184 MemoryContext oldcontext;
1185
1188 oldcontext = MemoryContextSwitchTo(edata->assoc_context);
1189
1190 edata->message_id = fmt_singular;
1191 EVALUATE_MESSAGE_PLURAL(edata->domain, message, false);
1192
1193 MemoryContextSwitchTo(oldcontext);
1195 return 0; /* return value does not matter */
1196}
1197
1198
1199/*
1200 * errdetail --- add a detail error message text to the current error
1201 */
1202int
1203errdetail(const char *fmt,...)
1204{
1206 MemoryContext oldcontext;
1207
1210 oldcontext = MemoryContextSwitchTo(edata->assoc_context);
1211
1212 EVALUATE_MESSAGE(edata->domain, detail, false, true);
1213
1214 MemoryContextSwitchTo(oldcontext);
1216 return 0; /* return value does not matter */
1217}
1218
1219
1220/*
1221 * errdetail_internal --- add a detail error message text to the current error
1222 *
1223 * This is exactly like errdetail() except that strings passed to
1224 * errdetail_internal are not translated, and are customarily left out of the
1225 * internationalization message dictionary. This should be used for detail
1226 * messages that seem not worth translating for one reason or another
1227 * (typically, that they don't seem to be useful to average users).
1228 */
1229int
1230errdetail_internal(const char *fmt,...)
1231{
1233 MemoryContext oldcontext;
1234
1237 oldcontext = MemoryContextSwitchTo(edata->assoc_context);
1238
1239 EVALUATE_MESSAGE(edata->domain, detail, false, false);
1240
1241 MemoryContextSwitchTo(oldcontext);
1243 return 0; /* return value does not matter */
1244}
1245
1246
1247/*
1248 * errdetail_log --- add a detail_log error message text to the current error
1249 */
1250int
1251errdetail_log(const char *fmt,...)
1252{
1254 MemoryContext oldcontext;
1255
1258 oldcontext = MemoryContextSwitchTo(edata->assoc_context);
1259
1260 EVALUATE_MESSAGE(edata->domain, detail_log, false, true);
1261
1262 MemoryContextSwitchTo(oldcontext);
1264 return 0; /* return value does not matter */
1265}
1266
1267/*
1268 * errdetail_log_plural --- add a detail_log error message text to the current error
1269 * with support for pluralization of the message text
1270 */
1271int
1272errdetail_log_plural(const char *fmt_singular, const char *fmt_plural,
1273 unsigned long n,...)
1274{
1276 MemoryContext oldcontext;
1277
1280 oldcontext = MemoryContextSwitchTo(edata->assoc_context);
1281
1282 EVALUATE_MESSAGE_PLURAL(edata->domain, detail_log, false);
1283
1284 MemoryContextSwitchTo(oldcontext);
1286 return 0; /* return value does not matter */
1287}
1288
1289
1290/*
1291 * errdetail_plural --- add a detail error message text to the current error,
1292 * with support for pluralization of the message text
1293 */
1294int
1295errdetail_plural(const char *fmt_singular, const char *fmt_plural,
1296 unsigned long n,...)
1297{
1299 MemoryContext oldcontext;
1300
1303 oldcontext = MemoryContextSwitchTo(edata->assoc_context);
1304
1305 EVALUATE_MESSAGE_PLURAL(edata->domain, detail, false);
1306
1307 MemoryContextSwitchTo(oldcontext);
1309 return 0; /* return value does not matter */
1310}
1311
1312
1313/*
1314 * errhint --- add a hint error message text to the current error
1315 */
1316int
1317errhint(const char *fmt,...)
1318{
1320 MemoryContext oldcontext;
1321
1324 oldcontext = MemoryContextSwitchTo(edata->assoc_context);
1325
1326 EVALUATE_MESSAGE(edata->domain, hint, false, true);
1327
1328 MemoryContextSwitchTo(oldcontext);
1330 return 0; /* return value does not matter */
1331}
1332
1333
1334/*
1335 * errhint_plural --- add a hint error message text to the current error,
1336 * with support for pluralization of the message text
1337 */
1338int
1339errhint_plural(const char *fmt_singular, const char *fmt_plural,
1340 unsigned long n,...)
1341{
1343 MemoryContext oldcontext;
1344
1347 oldcontext = MemoryContextSwitchTo(edata->assoc_context);
1348
1349 EVALUATE_MESSAGE_PLURAL(edata->domain, hint, false);
1350
1351 MemoryContextSwitchTo(oldcontext);
1353 return 0; /* return value does not matter */
1354}
1355
1356
1357/*
1358 * errcontext_msg --- add a context error message text to the current error
1359 *
1360 * Unlike other cases, multiple calls are allowed to build up a stack of
1361 * context information. We assume earlier calls represent more-closely-nested
1362 * states.
1363 */
1364int
1365errcontext_msg(const char *fmt,...)
1366{
1368 MemoryContext oldcontext;
1369
1372 oldcontext = MemoryContextSwitchTo(edata->assoc_context);
1373
1374 EVALUATE_MESSAGE(edata->context_domain, context, true, true);
1375
1376 MemoryContextSwitchTo(oldcontext);
1378 return 0; /* return value does not matter */
1379}
1380
1381/*
1382 * set_errcontext_domain --- set message domain to be used by errcontext()
1383 *
1384 * errcontext_msg() can be called from a different module than the original
1385 * ereport(), so we cannot use the message domain passed in errstart() to
1386 * translate it. Instead, each errcontext_msg() call should be preceded by
1387 * a set_errcontext_domain() call to specify the domain. This is usually
1388 * done transparently by the errcontext() macro.
1389 */
1390int
1391set_errcontext_domain(const char *domain)
1392{
1394
1395 /* we don't bother incrementing recursion_depth */
1397
1398 /* the default text domain is the backend's */
1399 edata->context_domain = domain ? domain : PG_TEXTDOMAIN("postgres");
1400
1401 return 0; /* return value does not matter */
1402}
1403
1404
1405/*
1406 * errhidestmt --- optionally suppress STATEMENT: field of log entry
1407 *
1408 * This should be called if the message text already includes the statement.
1409 */
1410int
1411errhidestmt(bool hide_stmt)
1412{
1414
1415 /* we don't bother incrementing recursion_depth */
1417
1418 edata->hide_stmt = hide_stmt;
1419
1420 return 0; /* return value does not matter */
1421}
1422
1423/*
1424 * errhidecontext --- optionally suppress CONTEXT: field of log entry
1425 *
1426 * This should only be used for verbose debugging messages where the repeated
1427 * inclusion of context would bloat the log volume too much.
1428 */
1429int
1430errhidecontext(bool hide_ctx)
1431{
1433
1434 /* we don't bother incrementing recursion_depth */
1436
1437 edata->hide_ctx = hide_ctx;
1438
1439 return 0; /* return value does not matter */
1440}
1441
1442/*
1443 * errposition --- add cursor position to the current error
1444 */
1445int
1446errposition(int cursorpos)
1447{
1449
1450 /* we don't bother incrementing recursion_depth */
1452
1453 edata->cursorpos = cursorpos;
1454
1455 return 0; /* return value does not matter */
1456}
1457
1458/*
1459 * internalerrposition --- add internal cursor position to the current error
1460 */
1461int
1463{
1465
1466 /* we don't bother incrementing recursion_depth */
1468
1469 edata->internalpos = cursorpos;
1470
1471 return 0; /* return value does not matter */
1472}
1473
1474/*
1475 * internalerrquery --- add internal query text to the current error
1476 *
1477 * Can also pass NULL to drop the internal query text entry. This case
1478 * is intended for use in error callback subroutines that are editorializing
1479 * on the layout of the error report.
1480 */
1481int
1482internalerrquery(const char *query)
1483{
1485
1486 /* we don't bother incrementing recursion_depth */
1488
1489 if (edata->internalquery)
1490 {
1491 pfree(edata->internalquery);
1492 edata->internalquery = NULL;
1493 }
1494
1495 if (query)
1496 edata->internalquery = MemoryContextStrdup(edata->assoc_context, query);
1497
1498 return 0; /* return value does not matter */
1499}
1500
1501/*
1502 * err_generic_string -- used to set individual ErrorData string fields
1503 * identified by PG_DIAG_xxx codes.
1504 *
1505 * This intentionally only supports fields that don't use localized strings,
1506 * so that there are no translation considerations.
1507 *
1508 * Most potential callers should not use this directly, but instead prefer
1509 * higher-level abstractions, such as errtablecol() (see relcache.c).
1510 */
1511int
1512err_generic_string(int field, const char *str)
1513{
1515
1516 /* we don't bother incrementing recursion_depth */
1518
1519 switch (field)
1520 {
1523 break;
1524 case PG_DIAG_TABLE_NAME:
1526 break;
1529 break;
1532 break;
1535 break;
1536 default:
1537 elog(ERROR, "unsupported ErrorData field id: %d", field);
1538 break;
1539 }
1540
1541 return 0; /* return value does not matter */
1542}
1543
1544/*
1545 * set_errdata_field --- set an ErrorData string field
1546 */
1547static void
1548set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str)
1549{
1550 Assert(*ptr == NULL);
1551 *ptr = MemoryContextStrdup(cxt, str);
1552}
1553
1554/*
1555 * geterrcode --- return the currently set SQLSTATE error code
1556 *
1557 * This is only intended for use in error callback subroutines, since there
1558 * is no other place outside elog.c where the concept is meaningful.
1559 */
1560int
1562{
1564
1565 /* we don't bother incrementing recursion_depth */
1567
1568 return edata->sqlerrcode;
1569}
1570
1571/*
1572 * geterrlevel --- return the currently set error level
1573 *
1574 * This is only intended for use in error callback subroutines, since there
1575 * is no other place outside elog.c where the concept is meaningful.
1576 */
1577int
1579{
1581
1582 /* we don't bother incrementing recursion_depth */
1584
1585 return edata->elevel;
1586}
1587
1588/*
1589 * geterrposition --- return the currently set error position (0 if none)
1590 *
1591 * This is only intended for use in error callback subroutines, since there
1592 * is no other place outside elog.c where the concept is meaningful.
1593 */
1594int
1596{
1598
1599 /* we don't bother incrementing recursion_depth */
1601
1602 return edata->cursorpos;
1603}
1604
1605/*
1606 * getinternalerrposition --- same for internal error position
1607 *
1608 * This is only intended for use in error callback subroutines, since there
1609 * is no other place outside elog.c where the concept is meaningful.
1610 */
1611int
1613{
1615
1616 /* we don't bother incrementing recursion_depth */
1618
1619 return edata->internalpos;
1620}
1621
1622
1623/*
1624 * Functions to allow construction of error message strings separately from
1625 * the ereport() call itself.
1626 *
1627 * The expected calling convention is
1628 *
1629 * pre_format_elog_string(errno, domain), var = format_elog_string(format,...)
1630 *
1631 * which can be hidden behind a macro such as GUC_check_errdetail(). We
1632 * assume that any functions called in the arguments of format_elog_string()
1633 * cannot result in re-entrant use of these functions --- otherwise the wrong
1634 * text domain might be used, or the wrong errno substituted for %m. This is
1635 * okay for the current usage with GUC check hooks, but might need further
1636 * effort someday.
1637 *
1638 * The result of format_elog_string() is stored in ErrorContext, and will
1639 * therefore survive until FlushErrorState() is called.
1640 */
1642static const char *save_format_domain;
1643
1644void
1645pre_format_elog_string(int errnumber, const char *domain)
1646{
1647 /* Save errno before evaluation of argument functions can change it */
1648 save_format_errnumber = errnumber;
1649 /* Save caller's text domain */
1650 save_format_domain = domain;
1651}
1652
1653char *
1654format_elog_string(const char *fmt,...)
1655{
1656 ErrorData errdata;
1657 ErrorData *edata;
1658 MemoryContext oldcontext;
1659
1660 /* Initialize a mostly-dummy error frame */
1661 edata = &errdata;
1662 MemSet(edata, 0, sizeof(ErrorData));
1663 /* the default text domain is the backend's */
1665 /* set the errno to be used to interpret %m */
1667
1668 oldcontext = MemoryContextSwitchTo(ErrorContext);
1669
1670 edata->message_id = fmt;
1671 EVALUATE_MESSAGE(edata->domain, message, false, true);
1672
1673 MemoryContextSwitchTo(oldcontext);
1674
1675 return edata->message;
1676}
1677
1678
1679/*
1680 * Actual output of the top-of-stack error message
1681 *
1682 * In the ereport(ERROR) case this is called from PostgresMain (or not at all,
1683 * if the error is caught by somebody). For all other severity levels this
1684 * is called by errfinish.
1685 */
1686void
1688{
1690 MemoryContext oldcontext;
1691
1694 oldcontext = MemoryContextSwitchTo(edata->assoc_context);
1695
1696 /*
1697 * Reset the formatted timestamp fields before emitting any logs. This
1698 * includes all the log destinations and emit_log_hook, as the latter
1699 * could use log_line_prefix or the formatted timestamps.
1700 */
1701 saved_timeval_set = false;
1702 formatted_log_time[0] = '\0';
1703
1704 /*
1705 * Call hook before sending message to log. The hook function is allowed
1706 * to turn off edata->output_to_server, so we must recheck that afterward.
1707 * Making any other change in the content of edata is not considered
1708 * supported.
1709 *
1710 * Note: the reason why the hook can only turn off output_to_server, and
1711 * not turn it on, is that it'd be unreliable: we will never get here at
1712 * all if errstart() deems the message uninteresting. A hook that could
1713 * make decisions in that direction would have to hook into errstart(),
1714 * where it would have much less information available. emit_log_hook is
1715 * intended for custom log filtering and custom log message transmission
1716 * mechanisms.
1717 *
1718 * The log hook has access to both the translated and original English
1719 * error message text, which is passed through to allow it to be used as a
1720 * message identifier. Note that the original text is not available for
1721 * detail, detail_log, hint and context text elements.
1722 */
1723 if (edata->output_to_server && emit_log_hook)
1724 (*emit_log_hook) (edata);
1725
1726 /* Send to server log, if enabled */
1727 if (edata->output_to_server)
1729
1730 /* Send to client, if enabled */
1731 if (edata->output_to_client)
1733
1734 MemoryContextSwitchTo(oldcontext);
1736}
1737
1738/*
1739 * CopyErrorData --- obtain a copy of the topmost error stack entry
1740 *
1741 * This is only for use in error handler code. The data is copied into the
1742 * current memory context, so callers should always switch away from
1743 * ErrorContext first; otherwise it will be lost when FlushErrorState is done.
1744 */
1745ErrorData *
1747{
1749 ErrorData *newedata;
1750
1751 /*
1752 * we don't increment recursion_depth because out-of-memory here does not
1753 * indicate a problem within the error subsystem.
1754 */
1756
1758
1759 /* Copy the struct itself */
1760 newedata = (ErrorData *) palloc(sizeof(ErrorData));
1761 memcpy(newedata, edata, sizeof(ErrorData));
1762
1763 /*
1764 * Make copies of separately-allocated strings. Note that we copy even
1765 * theoretically-constant strings such as filename. This is because those
1766 * could point into JIT-created code segments that might get unloaded at
1767 * transaction cleanup. In some cases we need the copied ErrorData to
1768 * survive transaction boundaries, so we'd better copy those strings too.
1769 */
1770 if (newedata->filename)
1771 newedata->filename = pstrdup(newedata->filename);
1772 if (newedata->funcname)
1773 newedata->funcname = pstrdup(newedata->funcname);
1774 if (newedata->domain)
1775 newedata->domain = pstrdup(newedata->domain);
1776 if (newedata->context_domain)
1777 newedata->context_domain = pstrdup(newedata->context_domain);
1778 if (newedata->message)
1779 newedata->message = pstrdup(newedata->message);
1780 if (newedata->detail)
1781 newedata->detail = pstrdup(newedata->detail);
1782 if (newedata->detail_log)
1783 newedata->detail_log = pstrdup(newedata->detail_log);
1784 if (newedata->hint)
1785 newedata->hint = pstrdup(newedata->hint);
1786 if (newedata->context)
1787 newedata->context = pstrdup(newedata->context);
1788 if (newedata->backtrace)
1789 newedata->backtrace = pstrdup(newedata->backtrace);
1790 if (newedata->message_id)
1791 newedata->message_id = pstrdup(newedata->message_id);
1792 if (newedata->schema_name)
1793 newedata->schema_name = pstrdup(newedata->schema_name);
1794 if (newedata->table_name)
1795 newedata->table_name = pstrdup(newedata->table_name);
1796 if (newedata->column_name)
1797 newedata->column_name = pstrdup(newedata->column_name);
1798 if (newedata->datatype_name)
1799 newedata->datatype_name = pstrdup(newedata->datatype_name);
1800 if (newedata->constraint_name)
1801 newedata->constraint_name = pstrdup(newedata->constraint_name);
1802 if (newedata->internalquery)
1803 newedata->internalquery = pstrdup(newedata->internalquery);
1804
1805 /* Use the calling context for string allocation */
1807
1808 return newedata;
1809}
1810
1811/*
1812 * FreeErrorData --- free the structure returned by CopyErrorData.
1813 *
1814 * Error handlers should use this in preference to assuming they know all
1815 * the separately-allocated fields.
1816 */
1817void
1819{
1820 FreeErrorDataContents(edata);
1821 pfree(edata);
1822}
1823
1824/*
1825 * FreeErrorDataContents --- free the subsidiary data of an ErrorData.
1826 *
1827 * This can be used on either an error stack entry or a copied ErrorData.
1828 */
1829static void
1831{
1832 if (edata->message)
1833 pfree(edata->message);
1834 if (edata->detail)
1835 pfree(edata->detail);
1836 if (edata->detail_log)
1837 pfree(edata->detail_log);
1838 if (edata->hint)
1839 pfree(edata->hint);
1840 if (edata->context)
1841 pfree(edata->context);
1842 if (edata->backtrace)
1843 pfree(edata->backtrace);
1844 if (edata->schema_name)
1845 pfree(edata->schema_name);
1846 if (edata->table_name)
1847 pfree(edata->table_name);
1848 if (edata->column_name)
1849 pfree(edata->column_name);
1850 if (edata->datatype_name)
1851 pfree(edata->datatype_name);
1852 if (edata->constraint_name)
1853 pfree(edata->constraint_name);
1854 if (edata->internalquery)
1855 pfree(edata->internalquery);
1856}
1857
1858/*
1859 * FlushErrorState --- flush the error state after error recovery
1860 *
1861 * This should be called by an error handler after it's done processing
1862 * the error; or as soon as it's done CopyErrorData, if it intends to
1863 * do stuff that is likely to provoke another error. You are not "out" of
1864 * the error subsystem until you have done this.
1865 */
1866void
1868{
1869 /*
1870 * Reset stack to empty. The only case where it would be more than one
1871 * deep is if we serviced an error that interrupted construction of
1872 * another message. We assume control escaped out of that message
1873 * construction and won't ever go back.
1874 */
1876 recursion_depth = 0;
1877 /* Delete all data in ErrorContext */
1879}
1880
1881/*
1882 * ThrowErrorData --- report an error described by an ErrorData structure
1883 *
1884 * This function should be called on an ErrorData structure that isn't stored
1885 * on the errordata stack and hasn't been processed yet. It will call
1886 * errstart() and errfinish() as needed, so those should not have already been
1887 * called.
1888 *
1889 * ThrowErrorData() is useful for handling soft errors. It's also useful for
1890 * re-reporting errors originally reported by background worker processes and
1891 * then propagated (with or without modification) to the backend responsible
1892 * for them.
1893 */
1894void
1896{
1897 ErrorData *newedata;
1898 MemoryContext oldcontext;
1899
1900 if (!errstart(edata->elevel, edata->domain))
1901 return; /* error is not to be reported at all */
1902
1903 newedata = &errordata[errordata_stack_depth];
1905 oldcontext = MemoryContextSwitchTo(newedata->assoc_context);
1906
1907 /* Copy the supplied fields to the error stack entry. */
1908 if (edata->sqlerrcode != 0)
1909 newedata->sqlerrcode = edata->sqlerrcode;
1910 if (edata->message)
1911 newedata->message = pstrdup(edata->message);
1912 if (edata->detail)
1913 newedata->detail = pstrdup(edata->detail);
1914 if (edata->detail_log)
1915 newedata->detail_log = pstrdup(edata->detail_log);
1916 if (edata->hint)
1917 newedata->hint = pstrdup(edata->hint);
1918 if (edata->context)
1919 newedata->context = pstrdup(edata->context);
1920 if (edata->backtrace)
1921 newedata->backtrace = pstrdup(edata->backtrace);
1922 /* assume message_id is not available */
1923 if (edata->schema_name)
1924 newedata->schema_name = pstrdup(edata->schema_name);
1925 if (edata->table_name)
1926 newedata->table_name = pstrdup(edata->table_name);
1927 if (edata->column_name)
1928 newedata->column_name = pstrdup(edata->column_name);
1929 if (edata->datatype_name)
1930 newedata->datatype_name = pstrdup(edata->datatype_name);
1931 if (edata->constraint_name)
1932 newedata->constraint_name = pstrdup(edata->constraint_name);
1933 newedata->cursorpos = edata->cursorpos;
1934 newedata->internalpos = edata->internalpos;
1935 if (edata->internalquery)
1936 newedata->internalquery = pstrdup(edata->internalquery);
1937
1938 MemoryContextSwitchTo(oldcontext);
1940
1941 /* Process the error. */
1942 errfinish(edata->filename, edata->lineno, edata->funcname);
1943}
1944
1945/*
1946 * ReThrowError --- re-throw a previously copied error
1947 *
1948 * A handler can do CopyErrorData/FlushErrorState to get out of the error
1949 * subsystem, then do some processing, and finally ReThrowError to re-throw
1950 * the original error. This is slower than just PG_RE_THROW() but should
1951 * be used if the "some processing" is likely to incur another error.
1952 */
1953void
1955{
1956 ErrorData *newedata;
1957
1958 Assert(edata->elevel == ERROR);
1959
1960 /* Push the data back into the error context */
1963
1964 newedata = get_error_stack_entry();
1965 memcpy(newedata, edata, sizeof(ErrorData));
1966
1967 /* Make copies of separately-allocated fields */
1968 if (newedata->message)
1969 newedata->message = pstrdup(newedata->message);
1970 if (newedata->detail)
1971 newedata->detail = pstrdup(newedata->detail);
1972 if (newedata->detail_log)
1973 newedata->detail_log = pstrdup(newedata->detail_log);
1974 if (newedata->hint)
1975 newedata->hint = pstrdup(newedata->hint);
1976 if (newedata->context)
1977 newedata->context = pstrdup(newedata->context);
1978 if (newedata->backtrace)
1979 newedata->backtrace = pstrdup(newedata->backtrace);
1980 if (newedata->schema_name)
1981 newedata->schema_name = pstrdup(newedata->schema_name);
1982 if (newedata->table_name)
1983 newedata->table_name = pstrdup(newedata->table_name);
1984 if (newedata->column_name)
1985 newedata->column_name = pstrdup(newedata->column_name);
1986 if (newedata->datatype_name)
1987 newedata->datatype_name = pstrdup(newedata->datatype_name);
1988 if (newedata->constraint_name)
1989 newedata->constraint_name = pstrdup(newedata->constraint_name);
1990 if (newedata->internalquery)
1991 newedata->internalquery = pstrdup(newedata->internalquery);
1992
1993 /* Reset the assoc_context to be ErrorContext */
1994 newedata->assoc_context = ErrorContext;
1995
1997 PG_RE_THROW();
1998}
1999
2000/*
2001 * pg_re_throw --- out-of-line implementation of PG_RE_THROW() macro
2002 */
2003void
2005{
2006 /* If possible, throw the error to the next outer setjmp handler */
2007 if (PG_exception_stack != NULL)
2008 siglongjmp(*PG_exception_stack, 1);
2009 else
2010 {
2011 /*
2012 * If we get here, elog(ERROR) was thrown inside a PG_TRY block, which
2013 * we have now exited only to discover that there is no outer setjmp
2014 * handler to pass the error to. Had the error been thrown outside
2015 * the block to begin with, we'd have promoted the error to FATAL, so
2016 * the correct behavior is to make it FATAL now; that is, emit it and
2017 * then call proc_exit.
2018 */
2020
2022 Assert(edata->elevel == ERROR);
2023 edata->elevel = FATAL;
2024
2025 /*
2026 * At least in principle, the increase in severity could have changed
2027 * where-to-output decisions, so recalculate.
2028 */
2031
2032 /*
2033 * We can use errfinish() for the rest, but we don't want it to call
2034 * any error context routines a second time. Since we know we are
2035 * about to exit, it should be OK to just clear the context stack.
2036 */
2037 error_context_stack = NULL;
2038
2039 errfinish(edata->filename, edata->lineno, edata->funcname);
2040 }
2041
2042 /* Doesn't return ... */
2043 ExceptionalCondition("pg_re_throw tried to return", __FILE__, __LINE__);
2044}
2045
2046
2047/*
2048 * GetErrorContextStack - Return the context stack, for display/diags
2049 *
2050 * Returns a pstrdup'd string in the caller's context which includes the PG
2051 * error call stack. It is the caller's responsibility to ensure this string
2052 * is pfree'd (or its context cleaned up) when done.
2053 *
2054 * This information is collected by traversing the error contexts and calling
2055 * each context's callback function, each of which is expected to call
2056 * errcontext() to return a string which can be presented to the user.
2057 */
2058char *
2060{
2061 ErrorData *edata;
2062 ErrorContextCallback *econtext;
2063
2064 /*
2065 * Crank up a stack entry to store the info in.
2066 */
2068
2069 edata = get_error_stack_entry();
2070
2071 /*
2072 * Set up assoc_context to be the caller's context, so any allocations
2073 * done (which will include edata->context) will use their context.
2074 */
2076
2077 /*
2078 * Call any context callback functions to collect the context information
2079 * into edata->context.
2080 *
2081 * Errors occurring in callback functions should go through the regular
2082 * error handling code which should handle any recursive errors, though we
2083 * double-check above, just in case.
2084 */
2085 for (econtext = error_context_stack;
2086 econtext != NULL;
2087 econtext = econtext->previous)
2088 econtext->callback(econtext->arg);
2089
2090 /*
2091 * Clean ourselves off the stack, any allocations done should have been
2092 * using edata->assoc_context, which we set up earlier to be the caller's
2093 * context, so we're free to just remove our entry off the stack and
2094 * decrement recursion depth and exit.
2095 */
2098
2099 /*
2100 * Return a pointer to the string the caller asked for, which should have
2101 * been allocated in their context.
2102 */
2103 return edata->context;
2104}
2105
2106
2107/*
2108 * Initialization of error output file
2109 */
2110void
2112{
2113 int fd,
2114 istty;
2115
2116 if (OutputFileName[0])
2117 {
2118 /*
2119 * A debug-output file name was given.
2120 *
2121 * Make sure we can write the file, and find out if it's a tty.
2122 */
2123 if ((fd = open(OutputFileName, O_CREAT | O_APPEND | O_WRONLY,
2124 0666)) < 0)
2125 ereport(FATAL,
2127 errmsg("could not open file \"%s\": %m", OutputFileName)));
2128 istty = isatty(fd);
2129 close(fd);
2130
2131 /*
2132 * Redirect our stderr to the debug output file.
2133 */
2134 if (!freopen(OutputFileName, "a", stderr))
2135 ereport(FATAL,
2137 errmsg("could not reopen file \"%s\" as stderr: %m",
2138 OutputFileName)));
2139
2140 /*
2141 * If the file is a tty and we're running under the postmaster, try to
2142 * send stdout there as well (if it isn't a tty then stderr will block
2143 * out stdout, so we may as well let stdout go wherever it was going
2144 * before).
2145 */
2146 if (istty && IsUnderPostmaster)
2147 if (!freopen(OutputFileName, "a", stdout))
2148 ereport(FATAL,
2150 errmsg("could not reopen file \"%s\" as stdout: %m",
2151 OutputFileName)));
2152 }
2153}
2154
2155
2156/*
2157 * GUC check_hook for backtrace_functions
2158 *
2159 * We split the input string, where commas separate function names
2160 * and certain whitespace chars are ignored, into a \0-separated (and
2161 * \0\0-terminated) list of function names. This formulation allows
2162 * easy scanning when an error is thrown while avoiding the use of
2163 * non-reentrant strtok(), as well as keeping the output data in a
2164 * single palloc() chunk.
2165 */
2166bool
2168{
2169 int newvallen = strlen(*newval);
2170 char *someval;
2171 int validlen;
2172 int i;
2173 int j;
2174
2175 /*
2176 * Allow characters that can be C identifiers and commas as separators, as
2177 * well as some whitespace for readability.
2178 */
2179 validlen = strspn(*newval,
2180 "0123456789_"
2181 "abcdefghijklmnopqrstuvwxyz"
2182 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
2183 ", \n\t");
2184 if (validlen != newvallen)
2185 {
2186 GUC_check_errdetail("Invalid character.");
2187 return false;
2188 }
2189
2190 if (*newval[0] == '\0')
2191 {
2192 *extra = NULL;
2193 return true;
2194 }
2195
2196 /*
2197 * Allocate space for the output and create the copy. We could discount
2198 * whitespace chars to save some memory, but it doesn't seem worth the
2199 * trouble.
2200 */
2201 someval = guc_malloc(ERROR, newvallen + 1 + 1);
2202 for (i = 0, j = 0; i < newvallen; i++)
2203 {
2204 if ((*newval)[i] == ',')
2205 someval[j++] = '\0'; /* next item */
2206 else if ((*newval)[i] == ' ' ||
2207 (*newval)[i] == '\n' ||
2208 (*newval)[i] == '\t')
2209 ; /* ignore these */
2210 else
2211 someval[j++] = (*newval)[i]; /* copy anything else */
2212 }
2213
2214 /* two \0s end the setting */
2215 someval[j] = '\0';
2216 someval[j + 1] = '\0';
2217
2218 *extra = someval;
2219 return true;
2220}
2221
2222/*
2223 * GUC assign_hook for backtrace_functions
2224 */
2225void
2226assign_backtrace_functions(const char *newval, void *extra)
2227{
2228 backtrace_function_list = (char *) extra;
2229}
2230
2231/*
2232 * GUC check_hook for log_destination
2233 */
2234bool
2236{
2237 char *rawstring;
2238 List *elemlist;
2239 ListCell *l;
2240 int newlogdest = 0;
2241 int *myextra;
2242
2243 /* Need a modifiable copy of string */
2244 rawstring = pstrdup(*newval);
2245
2246 /* Parse string into list of identifiers */
2247 if (!SplitIdentifierString(rawstring, ',', &elemlist))
2248 {
2249 /* syntax error in list */
2250 GUC_check_errdetail("List syntax is invalid.");
2251 pfree(rawstring);
2252 list_free(elemlist);
2253 return false;
2254 }
2255
2256 foreach(l, elemlist)
2257 {
2258 char *tok = (char *) lfirst(l);
2259
2260 if (pg_strcasecmp(tok, "stderr") == 0)
2261 newlogdest |= LOG_DESTINATION_STDERR;
2262 else if (pg_strcasecmp(tok, "csvlog") == 0)
2263 newlogdest |= LOG_DESTINATION_CSVLOG;
2264 else if (pg_strcasecmp(tok, "jsonlog") == 0)
2265 newlogdest |= LOG_DESTINATION_JSONLOG;
2266#ifdef HAVE_SYSLOG
2267 else if (pg_strcasecmp(tok, "syslog") == 0)
2268 newlogdest |= LOG_DESTINATION_SYSLOG;
2269#endif
2270#ifdef WIN32
2271 else if (pg_strcasecmp(tok, "eventlog") == 0)
2272 newlogdest |= LOG_DESTINATION_EVENTLOG;
2273#endif
2274 else
2275 {
2276 GUC_check_errdetail("Unrecognized key word: \"%s\".", tok);
2277 pfree(rawstring);
2278 list_free(elemlist);
2279 return false;
2280 }
2281 }
2282
2283 pfree(rawstring);
2284 list_free(elemlist);
2285
2286 myextra = (int *) guc_malloc(ERROR, sizeof(int));
2287 *myextra = newlogdest;
2288 *extra = myextra;
2289
2290 return true;
2291}
2292
2293/*
2294 * GUC assign_hook for log_destination
2295 */
2296void
2297assign_log_destination(const char *newval, void *extra)
2298{
2299 Log_destination = *((int *) extra);
2300}
2301
2302/*
2303 * GUC assign_hook for syslog_ident
2304 */
2305void
2306assign_syslog_ident(const char *newval, void *extra)
2307{
2308#ifdef HAVE_SYSLOG
2309 /*
2310 * guc.c is likely to call us repeatedly with same parameters, so don't
2311 * thrash the syslog connection unnecessarily. Also, we do not re-open
2312 * the connection until needed, since this routine will get called whether
2313 * or not Log_destination actually mentions syslog.
2314 *
2315 * Note that we make our own copy of the ident string rather than relying
2316 * on guc.c's. This may be overly paranoid, but it ensures that we cannot
2317 * accidentally free a string that syslog is still using.
2318 */
2319 if (syslog_ident == NULL || strcmp(syslog_ident, newval) != 0)
2320 {
2321 if (openlog_done)
2322 {
2323 closelog();
2324 openlog_done = false;
2325 }
2326 free(syslog_ident);
2327 syslog_ident = strdup(newval);
2328 /* if the strdup fails, we will cope in write_syslog() */
2329 }
2330#endif
2331 /* Without syslog support, just ignore it */
2332}
2333
2334/*
2335 * GUC assign_hook for syslog_facility
2336 */
2337void
2339{
2340#ifdef HAVE_SYSLOG
2341 /*
2342 * As above, don't thrash the syslog connection unnecessarily.
2343 */
2344 if (syslog_facility != newval)
2345 {
2346 if (openlog_done)
2347 {
2348 closelog();
2349 openlog_done = false;
2350 }
2352 }
2353#endif
2354 /* Without syslog support, just ignore it */
2355}
2356
2357#ifdef HAVE_SYSLOG
2358
2359/*
2360 * Write a message line to syslog
2361 */
2362static void
2363write_syslog(int level, const char *line)
2364{
2365 static unsigned long seq = 0;
2366
2367 int len;
2368 const char *nlpos;
2369
2370 /* Open syslog connection if not done yet */
2371 if (!openlog_done)
2372 {
2373 openlog(syslog_ident ? syslog_ident : "postgres",
2374 LOG_PID | LOG_NDELAY | LOG_NOWAIT,
2376 openlog_done = true;
2377 }
2378
2379 /*
2380 * We add a sequence number to each log message to suppress "same"
2381 * messages.
2382 */
2383 seq++;
2384
2385 /*
2386 * Our problem here is that many syslog implementations don't handle long
2387 * messages in an acceptable manner. While this function doesn't help that
2388 * fact, it does work around by splitting up messages into smaller pieces.
2389 *
2390 * We divide into multiple syslog() calls if message is too long or if the
2391 * message contains embedded newline(s).
2392 */
2393 len = strlen(line);
2394 nlpos = strchr(line, '\n');
2395 if (syslog_split_messages && (len > PG_SYSLOG_LIMIT || nlpos != NULL))
2396 {
2397 int chunk_nr = 0;
2398
2399 while (len > 0)
2400 {
2401 char buf[PG_SYSLOG_LIMIT + 1];
2402 int buflen;
2403 int i;
2404
2405 /* if we start at a newline, move ahead one char */
2406 if (line[0] == '\n')
2407 {
2408 line++;
2409 len--;
2410 /* we need to recompute the next newline's position, too */
2411 nlpos = strchr(line, '\n');
2412 continue;
2413 }
2414
2415 /* copy one line, or as much as will fit, to buf */
2416 if (nlpos != NULL)
2417 buflen = nlpos - line;
2418 else
2419 buflen = len;
2420 buflen = Min(buflen, PG_SYSLOG_LIMIT);
2421 memcpy(buf, line, buflen);
2422 buf[buflen] = '\0';
2423
2424 /* trim to multibyte letter boundary */
2425 buflen = pg_mbcliplen(buf, buflen, buflen);
2426 if (buflen <= 0)
2427 return;
2428 buf[buflen] = '\0';
2429
2430 /* already word boundary? */
2431 if (line[buflen] != '\0' &&
2432 !isspace((unsigned char) line[buflen]))
2433 {
2434 /* try to divide at word boundary */
2435 i = buflen - 1;
2436 while (i > 0 && !isspace((unsigned char) buf[i]))
2437 i--;
2438
2439 if (i > 0) /* else couldn't divide word boundary */
2440 {
2441 buflen = i;
2442 buf[i] = '\0';
2443 }
2444 }
2445
2446 chunk_nr++;
2447
2449 syslog(level, "[%lu-%d] %s", seq, chunk_nr, buf);
2450 else
2451 syslog(level, "[%d] %s", chunk_nr, buf);
2452
2453 line += buflen;
2454 len -= buflen;
2455 }
2456 }
2457 else
2458 {
2459 /* message short enough */
2461 syslog(level, "[%lu] %s", seq, line);
2462 else
2463 syslog(level, "%s", line);
2464 }
2465}
2466#endif /* HAVE_SYSLOG */
2467
2468#ifdef WIN32
2469/*
2470 * Get the PostgreSQL equivalent of the Windows ANSI code page. "ANSI" system
2471 * interfaces (e.g. CreateFileA()) expect string arguments in this encoding.
2472 * Every process in a given system will find the same value at all times.
2473 */
2474static int
2475GetACPEncoding(void)
2476{
2477 static int encoding = -2;
2478
2479 if (encoding == -2)
2480 encoding = pg_codepage_to_encoding(GetACP());
2481
2482 return encoding;
2483}
2484
2485/*
2486 * Write a message line to the windows event log
2487 */
2488static void
2489write_eventlog(int level, const char *line, int len)
2490{
2491 WCHAR *utf16;
2492 int eventlevel = EVENTLOG_ERROR_TYPE;
2493 static HANDLE evtHandle = INVALID_HANDLE_VALUE;
2494
2495 if (evtHandle == INVALID_HANDLE_VALUE)
2496 {
2497 evtHandle = RegisterEventSource(NULL,
2499 if (evtHandle == NULL)
2500 {
2501 evtHandle = INVALID_HANDLE_VALUE;
2502 return;
2503 }
2504 }
2505
2506 switch (level)
2507 {
2508 case DEBUG5:
2509 case DEBUG4:
2510 case DEBUG3:
2511 case DEBUG2:
2512 case DEBUG1:
2513 case LOG:
2514 case LOG_SERVER_ONLY:
2515 case INFO:
2516 case NOTICE:
2517 eventlevel = EVENTLOG_INFORMATION_TYPE;
2518 break;
2519 case WARNING:
2521 eventlevel = EVENTLOG_WARNING_TYPE;
2522 break;
2523 case ERROR:
2524 case FATAL:
2525 case PANIC:
2526 default:
2527 eventlevel = EVENTLOG_ERROR_TYPE;
2528 break;
2529 }
2530
2531 /*
2532 * If message character encoding matches the encoding expected by
2533 * ReportEventA(), call it to avoid the hazards of conversion. Otherwise,
2534 * try to convert the message to UTF16 and write it with ReportEventW().
2535 * Fall back on ReportEventA() if conversion failed.
2536 *
2537 * Since we palloc the structure required for conversion, also fall
2538 * through to writing unconverted if we have not yet set up
2539 * CurrentMemoryContext.
2540 *
2541 * Also verify that we are not on our way into error recursion trouble due
2542 * to error messages thrown deep inside pgwin32_message_to_UTF16().
2543 */
2545 CurrentMemoryContext != NULL &&
2546 GetMessageEncoding() != GetACPEncoding())
2547 {
2548 utf16 = pgwin32_message_to_UTF16(line, len, NULL);
2549 if (utf16)
2550 {
2551 ReportEventW(evtHandle,
2552 eventlevel,
2553 0,
2554 0, /* All events are Id 0 */
2555 NULL,
2556 1,
2557 0,
2558 (LPCWSTR *) &utf16,
2559 NULL);
2560 /* XXX Try ReportEventA() when ReportEventW() fails? */
2561
2562 pfree(utf16);
2563 return;
2564 }
2565 }
2566 ReportEventA(evtHandle,
2567 eventlevel,
2568 0,
2569 0, /* All events are Id 0 */
2570 NULL,
2571 1,
2572 0,
2573 &line,
2574 NULL);
2575}
2576#endif /* WIN32 */
2577
2578static void
2579write_console(const char *line, int len)
2580{
2581 int rc;
2582
2583#ifdef WIN32
2584
2585 /*
2586 * Try to convert the message to UTF16 and write it with WriteConsoleW().
2587 * Fall back on write() if anything fails.
2588 *
2589 * In contrast to write_eventlog(), don't skip straight to write() based
2590 * on the applicable encodings. Unlike WriteConsoleW(), write() depends
2591 * on the suitability of the console output code page. Since we put
2592 * stderr into binary mode in SubPostmasterMain(), write() skips the
2593 * necessary translation anyway.
2594 *
2595 * WriteConsoleW() will fail if stderr is redirected, so just fall through
2596 * to writing unconverted to the logfile in this case.
2597 *
2598 * Since we palloc the structure required for conversion, also fall
2599 * through to writing unconverted if we have not yet set up
2600 * CurrentMemoryContext.
2601 */
2604 CurrentMemoryContext != NULL)
2605 {
2606 WCHAR *utf16;
2607 int utf16len;
2608
2609 utf16 = pgwin32_message_to_UTF16(line, len, &utf16len);
2610 if (utf16 != NULL)
2611 {
2612 HANDLE stdHandle;
2613 DWORD written;
2614
2615 stdHandle = GetStdHandle(STD_ERROR_HANDLE);
2616 if (WriteConsoleW(stdHandle, utf16, utf16len, &written, NULL))
2617 {
2618 pfree(utf16);
2619 return;
2620 }
2621
2622 /*
2623 * In case WriteConsoleW() failed, fall back to writing the
2624 * message unconverted.
2625 */
2626 pfree(utf16);
2627 }
2628 }
2629#else
2630
2631 /*
2632 * Conversion on non-win32 platforms is not implemented yet. It requires
2633 * non-throw version of pg_do_encoding_conversion(), that converts
2634 * unconvertible characters to '?' without errors.
2635 *
2636 * XXX: We have a no-throw version now. It doesn't convert to '?' though.
2637 */
2638#endif
2639
2640 /*
2641 * We ignore any error from write() here. We have no useful way to report
2642 * it ... certainly whining on stderr isn't likely to be productive.
2643 */
2644 rc = write(fileno(stderr), line, len);
2645 (void) rc;
2646}
2647
2648/*
2649 * get_formatted_log_time -- compute and get the log timestamp.
2650 *
2651 * The timestamp is computed if not set yet, so as it is kept consistent
2652 * among all the log destinations that require it to be consistent. Note
2653 * that the computed timestamp is returned in a static buffer, not
2654 * palloc()'d.
2655 */
2656char *
2658{
2659 pg_time_t stamp_time;
2660 char msbuf[13];
2661
2662 /* leave if already computed */
2663 if (formatted_log_time[0] != '\0')
2664 return formatted_log_time;
2665
2666 if (!saved_timeval_set)
2667 {
2669 saved_timeval_set = true;
2670 }
2671
2672 stamp_time = (pg_time_t) saved_timeval.tv_sec;
2673
2674 /*
2675 * Note: we expect that guc.c will ensure that log_timezone is set up (at
2676 * least with a minimal GMT value) before Log_line_prefix can become
2677 * nonempty or CSV/JSON mode can be selected.
2678 */
2680 /* leave room for milliseconds... */
2681 "%Y-%m-%d %H:%M:%S %Z",
2682 pg_localtime(&stamp_time, log_timezone));
2683
2684 /* 'paste' milliseconds into place... */
2685 sprintf(msbuf, ".%03d", (int) (saved_timeval.tv_usec / 1000));
2686 memcpy(formatted_log_time + 19, msbuf, 4);
2687
2688 return formatted_log_time;
2689}
2690
2691/*
2692 * reset_formatted_start_time -- reset the start timestamp
2693 */
2694void
2696{
2697 formatted_start_time[0] = '\0';
2698}
2699
2700/*
2701 * get_formatted_start_time -- compute and get the start timestamp.
2702 *
2703 * The timestamp is computed if not set yet. Note that the computed
2704 * timestamp is returned in a static buffer, not palloc()'d.
2705 */
2706char *
2708{
2709 pg_time_t stamp_time = (pg_time_t) MyStartTime;
2710
2711 /* leave if already computed */
2712 if (formatted_start_time[0] != '\0')
2713 return formatted_start_time;
2714
2715 /*
2716 * Note: we expect that guc.c will ensure that log_timezone is set up (at
2717 * least with a minimal GMT value) before Log_line_prefix can become
2718 * nonempty or CSV/JSON mode can be selected.
2719 */
2721 "%Y-%m-%d %H:%M:%S %Z",
2722 pg_localtime(&stamp_time, log_timezone));
2723
2724 return formatted_start_time;
2725}
2726
2727/*
2728 * check_log_of_query -- check if a query can be logged
2729 */
2730bool
2732{
2733 /* log required? */
2735 return false;
2736
2737 /* query log wanted? */
2738 if (edata->hide_stmt)
2739 return false;
2740
2741 /* query string available? */
2742 if (debug_query_string == NULL)
2743 return false;
2744
2745 return true;
2746}
2747
2748/*
2749 * get_backend_type_for_log -- backend type for log entries
2750 *
2751 * Returns a pointer to a static buffer, not palloc()'d.
2752 */
2753const char *
2755{
2756 const char *backend_type_str;
2757
2758 if (MyProcPid == PostmasterPid)
2759 backend_type_str = "postmaster";
2760 else if (MyBackendType == B_BG_WORKER)
2761 backend_type_str = MyBgworkerEntry->bgw_type;
2762 else
2763 backend_type_str = GetBackendTypeDesc(MyBackendType);
2764
2765 return backend_type_str;
2766}
2767
2768/*
2769 * process_log_prefix_padding --- helper function for processing the format
2770 * string in log_line_prefix
2771 *
2772 * Note: This function returns NULL if it finds something which
2773 * it deems invalid in the format string.
2774 */
2775static const char *
2776process_log_prefix_padding(const char *p, int *ppadding)
2777{
2778 int paddingsign = 1;
2779 int padding = 0;
2780
2781 if (*p == '-')
2782 {
2783 p++;
2784
2785 if (*p == '\0') /* Did the buf end in %- ? */
2786 return NULL;
2787 paddingsign = -1;
2788 }
2789
2790 /* generate an int version of the numerical string */
2791 while (*p >= '0' && *p <= '9')
2792 padding = padding * 10 + (*p++ - '0');
2793
2794 /* format is invalid if it ends with the padding number */
2795 if (*p == '\0')
2796 return NULL;
2797
2798 padding *= paddingsign;
2799 *ppadding = padding;
2800 return p;
2801}
2802
2803/*
2804 * Format log status information using Log_line_prefix.
2805 */
2806static void
2808{
2810}
2811
2812/*
2813 * Format log status info; append to the provided buffer.
2814 */
2815void
2817{
2818 /* static counter for line numbers */
2819 static long log_line_number = 0;
2820
2821 /* has counter been reset in current process? */
2822 static int log_my_pid = 0;
2823 int padding;
2824 const char *p;
2825
2826 /*
2827 * This is one of the few places where we'd rather not inherit a static
2828 * variable's value from the postmaster. But since we will, reset it when
2829 * MyProcPid changes. MyStartTime also changes when MyProcPid does, so
2830 * reset the formatted start timestamp too.
2831 */
2832 if (log_my_pid != MyProcPid)
2833 {
2834 log_line_number = 0;
2835 log_my_pid = MyProcPid;
2837 }
2838 log_line_number++;
2839
2840 if (format == NULL)
2841 return; /* in case guc hasn't run yet */
2842
2843 for (p = format; *p != '\0'; p++)
2844 {
2845 if (*p != '%')
2846 {
2847 /* literal char, just copy */
2849 continue;
2850 }
2851
2852 /* must be a '%', so skip to the next char */
2853 p++;
2854 if (*p == '\0')
2855 break; /* format error - ignore it */
2856 else if (*p == '%')
2857 {
2858 /* string contains %% */
2860 continue;
2861 }
2862
2863
2864 /*
2865 * Process any formatting which may exist after the '%'. Note that
2866 * process_log_prefix_padding moves p past the padding number if it
2867 * exists.
2868 *
2869 * Note: Since only '-', '0' to '9' are valid formatting characters we
2870 * can do a quick check here to pre-check for formatting. If the char
2871 * is not formatting then we can skip a useless function call.
2872 *
2873 * Further note: At least on some platforms, passing %*s rather than
2874 * %s to appendStringInfo() is substantially slower, so many of the
2875 * cases below avoid doing that unless non-zero padding is in fact
2876 * specified.
2877 */
2878 if (*p > '9')
2879 padding = 0;
2880 else if ((p = process_log_prefix_padding(p, &padding)) == NULL)
2881 break;
2882
2883 /* process the option */
2884 switch (*p)
2885 {
2886 case 'a':
2887 if (MyProcPort)
2888 {
2889 const char *appname = application_name;
2890
2891 if (appname == NULL || *appname == '\0')
2892 appname = _("[unknown]");
2893 if (padding != 0)
2894 appendStringInfo(buf, "%*s", padding, appname);
2895 else
2896 appendStringInfoString(buf, appname);
2897 }
2898 else if (padding != 0)
2900 padding > 0 ? padding : -padding);
2901
2902 break;
2903 case 'b':
2904 {
2905 const char *backend_type_str = get_backend_type_for_log();
2906
2907 if (padding != 0)
2908 appendStringInfo(buf, "%*s", padding, backend_type_str);
2909 else
2910 appendStringInfoString(buf, backend_type_str);
2911 break;
2912 }
2913 case 'u':
2914 if (MyProcPort)
2915 {
2916 const char *username = MyProcPort->user_name;
2917
2918 if (username == NULL || *username == '\0')
2919 username = _("[unknown]");
2920 if (padding != 0)
2921 appendStringInfo(buf, "%*s", padding, username);
2922 else
2924 }
2925 else if (padding != 0)
2927 padding > 0 ? padding : -padding);
2928 break;
2929 case 'd':
2930 if (MyProcPort)
2931 {
2932 const char *dbname = MyProcPort->database_name;
2933
2934 if (dbname == NULL || *dbname == '\0')
2935 dbname = _("[unknown]");
2936 if (padding != 0)
2937 appendStringInfo(buf, "%*s", padding, dbname);
2938 else
2940 }
2941 else if (padding != 0)
2943 padding > 0 ? padding : -padding);
2944 break;
2945 case 'c':
2946 if (padding != 0)
2947 {
2948 char strfbuf[128];
2949
2950 snprintf(strfbuf, sizeof(strfbuf) - 1, INT64_HEX_FORMAT ".%x",
2952 appendStringInfo(buf, "%*s", padding, strfbuf);
2953 }
2954 else
2956 break;
2957 case 'p':
2958 if (padding != 0)
2959 appendStringInfo(buf, "%*d", padding, MyProcPid);
2960 else
2962 break;
2963
2964 case 'P':
2965 if (MyProc)
2966 {
2967 PGPROC *leader = MyProc->lockGroupLeader;
2968
2969 /*
2970 * Show the leader only for active parallel workers. This
2971 * leaves out the leader of a parallel group.
2972 */
2973 if (leader == NULL || leader->pid == MyProcPid)
2975 padding > 0 ? padding : -padding);
2976 else if (padding != 0)
2977 appendStringInfo(buf, "%*d", padding, leader->pid);
2978 else
2979 appendStringInfo(buf, "%d", leader->pid);
2980 }
2981 else if (padding != 0)
2983 padding > 0 ? padding : -padding);
2984 break;
2985
2986 case 'l':
2987 if (padding != 0)
2988 appendStringInfo(buf, "%*ld", padding, log_line_number);
2989 else
2990 appendStringInfo(buf, "%ld", log_line_number);
2991 break;
2992 case 'm':
2993 /* force a log timestamp reset */
2994 formatted_log_time[0] = '\0';
2995 (void) get_formatted_log_time();
2996
2997 if (padding != 0)
2998 appendStringInfo(buf, "%*s", padding, formatted_log_time);
2999 else
3001 break;
3002 case 't':
3003 {
3004 pg_time_t stamp_time = (pg_time_t) time(NULL);
3005 char strfbuf[128];
3006
3007 pg_strftime(strfbuf, sizeof(strfbuf),
3008 "%Y-%m-%d %H:%M:%S %Z",
3009 pg_localtime(&stamp_time, log_timezone));
3010 if (padding != 0)
3011 appendStringInfo(buf, "%*s", padding, strfbuf);
3012 else
3013 appendStringInfoString(buf, strfbuf);
3014 }
3015 break;
3016 case 'n':
3017 {
3018 char strfbuf[128];
3019
3020 if (!saved_timeval_set)
3021 {
3023 saved_timeval_set = true;
3024 }
3025
3026 snprintf(strfbuf, sizeof(strfbuf), "%ld.%03d",
3027 (long) saved_timeval.tv_sec,
3028 (int) (saved_timeval.tv_usec / 1000));
3029
3030 if (padding != 0)
3031 appendStringInfo(buf, "%*s", padding, strfbuf);
3032 else
3033 appendStringInfoString(buf, strfbuf);
3034 }
3035 break;
3036 case 's':
3037 {
3039
3040 if (padding != 0)
3041 appendStringInfo(buf, "%*s", padding, start_time);
3042 else
3044 }
3045 break;
3046 case 'i':
3047 if (MyProcPort)
3048 {
3049 const char *psdisp;
3050 int displen;
3051
3052 psdisp = get_ps_display(&displen);
3053 if (padding != 0)
3054 appendStringInfo(buf, "%*s", padding, psdisp);
3055 else
3056 appendBinaryStringInfo(buf, psdisp, displen);
3057 }
3058 else if (padding != 0)
3060 padding > 0 ? padding : -padding);
3061 break;
3062 case 'r':
3064 {
3065 if (padding != 0)
3066 {
3067 if (MyProcPort->remote_port && MyProcPort->remote_port[0] != '\0')
3068 {
3069 /*
3070 * This option is slightly special as the port
3071 * number may be appended onto the end. Here we
3072 * need to build 1 string which contains the
3073 * remote_host and optionally the remote_port (if
3074 * set) so we can properly align the string.
3075 */
3076
3077 char *hostport;
3078
3079 hostport = psprintf("%s(%s)", MyProcPort->remote_host, MyProcPort->remote_port);
3080 appendStringInfo(buf, "%*s", padding, hostport);
3081 pfree(hostport);
3082 }
3083 else
3084 appendStringInfo(buf, "%*s", padding, MyProcPort->remote_host);
3085 }
3086 else
3087 {
3088 /* padding is 0, so we don't need a temp buffer */
3090 if (MyProcPort->remote_port &&
3091 MyProcPort->remote_port[0] != '\0')
3092 appendStringInfo(buf, "(%s)",
3094 }
3095 }
3096 else if (padding != 0)
3098 padding > 0 ? padding : -padding);
3099 break;
3100 case 'h':
3102 {
3103 if (padding != 0)
3104 appendStringInfo(buf, "%*s", padding, MyProcPort->remote_host);
3105 else
3107 }
3108 else if (padding != 0)
3110 padding > 0 ? padding : -padding);
3111 break;
3112 case 'q':
3113 /* in postmaster and friends, stop if %q is seen */
3114 /* in a backend, just ignore */
3115 if (MyProcPort == NULL)
3116 return;
3117 break;
3118 case 'v':
3119 /* keep VXID format in sync with lockfuncs.c */
3120 if (MyProc != NULL && MyProc->vxid.procNumber != INVALID_PROC_NUMBER)
3121 {
3122 if (padding != 0)
3123 {
3124 char strfbuf[128];
3125
3126 snprintf(strfbuf, sizeof(strfbuf) - 1, "%d/%u",
3128 appendStringInfo(buf, "%*s", padding, strfbuf);
3129 }
3130 else
3132 }
3133 else if (padding != 0)
3135 padding > 0 ? padding : -padding);
3136 break;
3137 case 'x':
3138 if (padding != 0)
3139 appendStringInfo(buf, "%*u", padding, GetTopTransactionIdIfAny());
3140 else
3142 break;
3143 case 'e':
3144 if (padding != 0)
3145 appendStringInfo(buf, "%*s", padding, unpack_sql_state(edata->sqlerrcode));
3146 else
3148 break;
3149 case 'Q':
3150 if (padding != 0)
3151 appendStringInfo(buf, "%*lld", padding,
3152 (long long) pgstat_get_my_query_id());
3153 else
3154 appendStringInfo(buf, "%lld",
3155 (long long) pgstat_get_my_query_id());
3156 break;
3157 default:
3158 /* format error - ignore it */
3159 break;
3160 }
3161 }
3162}
3163
3164/*
3165 * Unpack MAKE_SQLSTATE code. Note that this returns a pointer to a
3166 * static buffer.
3167 */
3168char *
3169unpack_sql_state(int sql_state)
3170{
3171 static char buf[12];
3172 int i;
3173
3174 for (i = 0; i < 5; i++)
3175 {
3176 buf[i] = PGUNSIXBIT(sql_state);
3177 sql_state >>= 6;
3178 }
3179
3180 buf[i] = '\0';
3181 return buf;
3182}
3183
3184
3185/*
3186 * Write error report to server's log
3187 */
3188static void
3190{
3192 bool fallback_to_stderr = false;
3193
3195
3196 log_line_prefix(&buf, edata);
3197 appendStringInfo(&buf, "%s: ", _(error_severity(edata->elevel)));
3198
3201
3202 if (edata->message)
3203 append_with_tabs(&buf, edata->message);
3204 else
3205 append_with_tabs(&buf, _("missing error text"));
3206
3207 if (edata->cursorpos > 0)
3208 appendStringInfo(&buf, _(" at character %d"),
3209 edata->cursorpos);
3210 else if (edata->internalpos > 0)
3211 appendStringInfo(&buf, _(" at character %d"),
3212 edata->internalpos);
3213
3214 appendStringInfoChar(&buf, '\n');
3215
3217 {
3218 if (edata->detail_log)
3219 {
3220 log_line_prefix(&buf, edata);
3221 appendStringInfoString(&buf, _("DETAIL: "));
3223 appendStringInfoChar(&buf, '\n');
3224 }
3225 else if (edata->detail)
3226 {
3227 log_line_prefix(&buf, edata);
3228 appendStringInfoString(&buf, _("DETAIL: "));
3229 append_with_tabs(&buf, edata->detail);
3230 appendStringInfoChar(&buf, '\n');
3231 }
3232 if (edata->hint)
3233 {
3234 log_line_prefix(&buf, edata);
3235 appendStringInfoString(&buf, _("HINT: "));
3236 append_with_tabs(&buf, edata->hint);
3237 appendStringInfoChar(&buf, '\n');
3238 }
3239 if (edata->internalquery)
3240 {
3241 log_line_prefix(&buf, edata);
3242 appendStringInfoString(&buf, _("QUERY: "));
3244 appendStringInfoChar(&buf, '\n');
3245 }
3246 if (edata->context && !edata->hide_ctx)
3247 {
3248 log_line_prefix(&buf, edata);
3249 appendStringInfoString(&buf, _("CONTEXT: "));
3250 append_with_tabs(&buf, edata->context);
3251 appendStringInfoChar(&buf, '\n');
3252 }
3254 {
3255 /* assume no newlines in funcname or filename... */
3256 if (edata->funcname && edata->filename)
3257 {
3258 log_line_prefix(&buf, edata);
3259 appendStringInfo(&buf, _("LOCATION: %s, %s:%d\n"),
3260 edata->funcname, edata->filename,
3261 edata->lineno);
3262 }
3263 else if (edata->filename)
3264 {
3265 log_line_prefix(&buf, edata);
3266 appendStringInfo(&buf, _("LOCATION: %s:%d\n"),
3267 edata->filename, edata->lineno);
3268 }
3269 }
3270 if (edata->backtrace)
3271 {
3272 log_line_prefix(&buf, edata);
3273 appendStringInfoString(&buf, _("BACKTRACE: "));
3274 append_with_tabs(&buf, edata->backtrace);
3275 appendStringInfoChar(&buf, '\n');
3276 }
3277 }
3278
3279 /*
3280 * If the user wants the query that generated this error logged, do it.
3281 */
3282 if (check_log_of_query(edata))
3283 {
3284 log_line_prefix(&buf, edata);
3285 appendStringInfoString(&buf, _("STATEMENT: "));
3287 appendStringInfoChar(&buf, '\n');
3288 }
3289
3290#ifdef HAVE_SYSLOG
3291 /* Write to syslog, if enabled */
3293 {
3294 int syslog_level;
3295
3296 switch (edata->elevel)
3297 {
3298 case DEBUG5:
3299 case DEBUG4:
3300 case DEBUG3:
3301 case DEBUG2:
3302 case DEBUG1:
3303 syslog_level = LOG_DEBUG;
3304 break;
3305 case LOG:
3306 case LOG_SERVER_ONLY:
3307 case INFO:
3308 syslog_level = LOG_INFO;
3309 break;
3310 case NOTICE:
3311 case WARNING:
3313 syslog_level = LOG_NOTICE;
3314 break;
3315 case ERROR:
3316 syslog_level = LOG_WARNING;
3317 break;
3318 case FATAL:
3319 syslog_level = LOG_ERR;
3320 break;
3321 case PANIC:
3322 default:
3323 syslog_level = LOG_CRIT;
3324 break;
3325 }
3326
3327 write_syslog(syslog_level, buf.data);
3328 }
3329#endif /* HAVE_SYSLOG */
3330
3331#ifdef WIN32
3332 /* Write to eventlog, if enabled */
3334 {
3335 write_eventlog(edata->elevel, buf.data, buf.len);
3336 }
3337#endif /* WIN32 */
3338
3339 /* Write to csvlog, if enabled */
3341 {
3342 /*
3343 * Send CSV data if it's safe to do so (syslogger doesn't need the
3344 * pipe). If this is not possible, fallback to an entry written to
3345 * stderr.
3346 */
3348 write_csvlog(edata);
3349 else
3350 fallback_to_stderr = true;
3351 }
3352
3353 /* Write to JSON log, if enabled */
3355 {
3356 /*
3357 * Send JSON data if it's safe to do so (syslogger doesn't need the
3358 * pipe). If this is not possible, fallback to an entry written to
3359 * stderr.
3360 */
3362 {
3363 write_jsonlog(edata);
3364 }
3365 else
3366 fallback_to_stderr = true;
3367 }
3368
3369 /*
3370 * Write to stderr, if enabled or if required because of a previous
3371 * limitation.
3372 */
3375 fallback_to_stderr)
3376 {
3377 /*
3378 * Use the chunking protocol if we know the syslogger should be
3379 * catching stderr output, and we are not ourselves the syslogger.
3380 * Otherwise, just do a vanilla write to stderr.
3381 */
3384#ifdef WIN32
3385
3386 /*
3387 * In a win32 service environment, there is no usable stderr. Capture
3388 * anything going there and write it to the eventlog instead.
3389 *
3390 * If stderr redirection is active, it was OK to write to stderr above
3391 * because that's really a pipe to the syslogger process.
3392 */
3393 else if (pgwin32_is_service())
3394 write_eventlog(edata->elevel, buf.data, buf.len);
3395#endif
3396 else
3397 write_console(buf.data, buf.len);
3398 }
3399
3400 /* If in the syslogger process, try to write messages direct to file */
3401 if (MyBackendType == B_LOGGER)
3403
3404 /* No more need of the message formatted for stderr */
3405 pfree(buf.data);
3406}
3407
3408/*
3409 * Send data to the syslogger using the chunked protocol
3410 *
3411 * Note: when there are multiple backends writing into the syslogger pipe,
3412 * it's critical that each write go into the pipe indivisibly, and not
3413 * get interleaved with data from other processes. Fortunately, the POSIX
3414 * spec requires that writes to pipes be atomic so long as they are not
3415 * more than PIPE_BUF bytes long. So we divide long messages into chunks
3416 * that are no more than that length, and send one chunk per write() call.
3417 * The collector process knows how to reassemble the chunks.
3418 *
3419 * Because of the atomic write requirement, there are only two possible
3420 * results from write() here: -1 for failure, or the requested number of
3421 * bytes. There is not really anything we can do about a failure; retry would
3422 * probably be an infinite loop, and we can't even report the error usefully.
3423 * (There is noplace else we could send it!) So we might as well just ignore
3424 * the result from write(). However, on some platforms you get a compiler
3425 * warning from ignoring write()'s result, so do a little dance with casting
3426 * rc to void to shut up the compiler.
3427 */
3428void
3430{
3432 int fd = fileno(stderr);
3433 int rc;
3434
3435 Assert(len > 0);
3436
3437 p.proto.nuls[0] = p.proto.nuls[1] = '\0';
3438 p.proto.pid = MyProcPid;
3439 p.proto.flags = 0;
3442 else if (dest == LOG_DESTINATION_CSVLOG)
3444 else if (dest == LOG_DESTINATION_JSONLOG)
3446
3447 /* write all but the last chunk */
3448 while (len > PIPE_MAX_PAYLOAD)
3449 {
3450 /* no need to set PIPE_PROTO_IS_LAST yet */
3452 memcpy(p.proto.data, data, PIPE_MAX_PAYLOAD);
3454 (void) rc;
3457 }
3458
3459 /* write the last chunk */
3461 p.proto.len = len;
3462 memcpy(p.proto.data, data, len);
3463 rc = write(fd, &p, PIPE_HEADER_SIZE + len);
3464 (void) rc;
3465}
3466
3467
3468/*
3469 * Append a text string to the error report being built for the client.
3470 *
3471 * This is ordinarily identical to pq_sendstring(), but if we are in
3472 * error recursion trouble we skip encoding conversion, because of the
3473 * possibility that the problem is a failure in the encoding conversion
3474 * subsystem itself. Code elsewhere should ensure that the passed-in
3475 * strings will be plain 7-bit ASCII, and thus not in need of conversion,
3476 * in such cases. (In particular, we disable localization of error messages
3477 * to help ensure that's true.)
3478 */
3479static void
3481{
3484 else
3486}
3487
3488/*
3489 * Write error report to client
3490 */
3491static void
3493{
3494 StringInfoData msgbuf;
3495
3496 /*
3497 * We no longer support pre-3.0 FE/BE protocol, except here. If a client
3498 * tries to connect using an older protocol version, it's nice to send the
3499 * "protocol version not supported" error in a format the client
3500 * understands. If protocol hasn't been set yet, early in backend
3501 * startup, assume modern protocol.
3502 */
3504 {
3505 /* New style with separate fields */
3506 const char *sev;
3507 char tbuf[12];
3508
3509 /* 'N' (Notice) is for nonfatal conditions, 'E' is for errors */
3510 if (edata->elevel < ERROR)
3512 else
3514
3515 sev = error_severity(edata->elevel);
3516 pq_sendbyte(&msgbuf, PG_DIAG_SEVERITY);
3517 err_sendstring(&msgbuf, _(sev));
3519 err_sendstring(&msgbuf, sev);
3520
3521 pq_sendbyte(&msgbuf, PG_DIAG_SQLSTATE);
3522 err_sendstring(&msgbuf, unpack_sql_state(edata->sqlerrcode));
3523
3524 /* M field is required per protocol, so always send something */
3526 if (edata->message)
3527 err_sendstring(&msgbuf, edata->message);
3528 else
3529 err_sendstring(&msgbuf, _("missing error text"));
3530
3531 if (edata->detail)
3532 {
3534 err_sendstring(&msgbuf, edata->detail);
3535 }
3536
3537 /* detail_log is intentionally not used here */
3538
3539 if (edata->hint)
3540 {
3542 err_sendstring(&msgbuf, edata->hint);
3543 }
3544
3545 if (edata->context)
3546 {
3547 pq_sendbyte(&msgbuf, PG_DIAG_CONTEXT);
3548 err_sendstring(&msgbuf, edata->context);
3549 }
3550
3551 if (edata->schema_name)
3552 {
3554 err_sendstring(&msgbuf, edata->schema_name);
3555 }
3556
3557 if (edata->table_name)
3558 {
3560 err_sendstring(&msgbuf, edata->table_name);
3561 }
3562
3563 if (edata->column_name)
3564 {
3566 err_sendstring(&msgbuf, edata->column_name);
3567 }
3568
3569 if (edata->datatype_name)
3570 {
3572 err_sendstring(&msgbuf, edata->datatype_name);
3573 }
3574
3575 if (edata->constraint_name)
3576 {
3578 err_sendstring(&msgbuf, edata->constraint_name);
3579 }
3580
3581 if (edata->cursorpos > 0)
3582 {
3583 snprintf(tbuf, sizeof(tbuf), "%d", edata->cursorpos);
3585 err_sendstring(&msgbuf, tbuf);
3586 }
3587
3588 if (edata->internalpos > 0)
3589 {
3590 snprintf(tbuf, sizeof(tbuf), "%d", edata->internalpos);
3592 err_sendstring(&msgbuf, tbuf);
3593 }
3594
3595 if (edata->internalquery)
3596 {
3598 err_sendstring(&msgbuf, edata->internalquery);
3599 }
3600
3601 if (edata->filename)
3602 {
3604 err_sendstring(&msgbuf, edata->filename);
3605 }
3606
3607 if (edata->lineno > 0)
3608 {
3609 snprintf(tbuf, sizeof(tbuf), "%d", edata->lineno);
3611 err_sendstring(&msgbuf, tbuf);
3612 }
3613
3614 if (edata->funcname)
3615 {
3617 err_sendstring(&msgbuf, edata->funcname);
3618 }
3619
3620 pq_sendbyte(&msgbuf, '\0'); /* terminator */
3621
3622 pq_endmessage(&msgbuf);
3623 }
3624 else
3625 {
3626 /* Old style --- gin up a backwards-compatible message */
3628
3630
3631 appendStringInfo(&buf, "%s: ", _(error_severity(edata->elevel)));
3632
3633 if (edata->message)
3635 else
3636 appendStringInfoString(&buf, _("missing error text"));
3637
3638 appendStringInfoChar(&buf, '\n');
3639
3640 /* 'N' (Notice) is for nonfatal conditions, 'E' is for errors */
3641 pq_putmessage_v2((edata->elevel < ERROR) ? 'N' : 'E', buf.data, buf.len + 1);
3642
3643 pfree(buf.data);
3644 }
3645
3646 /*
3647 * This flush is normally not necessary, since postgres.c will flush out
3648 * waiting data when control returns to the main loop. But it seems best
3649 * to leave it here, so that the client has some clue what happened if the
3650 * backend dies before getting back to the main loop ... error/notice
3651 * messages should not be a performance-critical path anyway, so an extra
3652 * flush won't hurt much ...
3653 */
3654 pq_flush();
3655}
3656
3657
3658/*
3659 * Support routines for formatting error messages.
3660 */
3661
3662
3663/*
3664 * error_severity --- get string representing elevel
3665 *
3666 * The string is not localized here, but we mark the strings for translation
3667 * so that callers can invoke _() on the result.
3668 */
3669const char *
3671{
3672 const char *prefix;
3673
3674 switch (elevel)
3675 {
3676 case DEBUG1:
3677 case DEBUG2:
3678 case DEBUG3:
3679 case DEBUG4:
3680 case DEBUG5:
3681 prefix = gettext_noop("DEBUG");
3682 break;
3683 case LOG:
3684 case LOG_SERVER_ONLY:
3685 prefix = gettext_noop("LOG");
3686 break;
3687 case INFO:
3688 prefix = gettext_noop("INFO");
3689 break;
3690 case NOTICE:
3691 prefix = gettext_noop("NOTICE");
3692 break;
3693 case WARNING:
3695 prefix = gettext_noop("WARNING");
3696 break;
3697 case ERROR:
3698 prefix = gettext_noop("ERROR");
3699 break;
3700 case FATAL:
3701 prefix = gettext_noop("FATAL");
3702 break;
3703 case PANIC:
3704 prefix = gettext_noop("PANIC");
3705 break;
3706 default:
3707 prefix = "???";
3708 break;
3709 }
3710
3711 return prefix;
3712}
3713
3714
3715/*
3716 * append_with_tabs
3717 *
3718 * Append the string to the StringInfo buffer, inserting a tab after any
3719 * newline.
3720 */
3721static void
3723{
3724 char ch;
3725
3726 while ((ch = *str++) != '\0')
3727 {
3729 if (ch == '\n')
3731 }
3732}
3733
3734
3735/*
3736 * Write errors to stderr (or by equal means when stderr is
3737 * not available). Used before ereport/elog can be used
3738 * safely (memory context, GUC load etc)
3739 */
3740void
3741write_stderr(const char *fmt,...)
3742{
3743 va_list ap;
3744
3745#ifdef WIN32
3746 char errbuf[2048]; /* Arbitrary size? */
3747#endif
3748
3749 fmt = _(fmt);
3750
3751 va_start(ap, fmt);
3752#ifndef WIN32
3753 /* On Unix, we just fprintf to stderr */
3754 vfprintf(stderr, fmt, ap);
3755 fflush(stderr);
3756#else
3757 vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
3758
3759 /*
3760 * On Win32, we print to stderr if running on a console, or write to
3761 * eventlog if running as a service
3762 */
3763 if (pgwin32_is_service()) /* Running as a service */
3764 {
3765 write_eventlog(ERROR, errbuf, strlen(errbuf));
3766 }
3767 else
3768 {
3769 /* Not running as service, write to stderr */
3770 write_console(errbuf, strlen(errbuf));
3771 fflush(stderr);
3772 }
3773#endif
3774 va_end(ap);
3775}
void ExceptionalCondition(const char *conditionName, const char *fileName, int lineNumber)
Definition: assert.c:30
uint64 pgstat_get_my_query_id(void)
#define INT64_HEX_FORMAT
Definition: c.h:508
#define pg_attribute_format_arg(a)
Definition: c.h:212
#define pg_noinline
Definition: c.h:272
#define Min(x, y)
Definition: c.h:961
#define pg_attribute_cold
Definition: c.h:297
#define gettext_noop(x)
Definition: c.h:1153
#define Max(x, y)
Definition: c.h:955
#define Assert(condition)
Definition: c.h:815
#define PG_TEXTDOMAIN(domain)
Definition: c.h:1171
#define gettext(x)
Definition: c.h:1136
#define pg_unreachable()
Definition: c.h:318
#define unlikely(x)
Definition: c.h:333
#define lengthof(array)
Definition: c.h:745
#define MemSet(start, val, len)
Definition: c.h:977
void write_csvlog(ErrorData *edata)
Definition: csvlog.c:63
@ DestRemote
Definition: dest.h:89
@ DestDebug
Definition: dest.h:88
@ DestNone
Definition: dest.h:87
void assign_syslog_facility(int newval, void *extra)
Definition: elog.c:2338
int getinternalerrposition(void)
Definition: elog.c:1612
static bool should_output_to_client(int elevel)
Definition: elog.c:244
void assign_syslog_ident(const char *newval, void *extra)
Definition: elog.c:2306
int errcode_for_socket_access(void)
Definition: elog.c:953
bool errsave_start(struct Node *context, const char *domain)
Definition: elog.c:629
static void log_line_prefix(StringInfo buf, ErrorData *edata)
Definition: elog.c:2807
static const char * process_log_prefix_padding(const char *p, int *ppadding)
Definition: elog.c:2776
int err_generic_string(int field, const char *str)
Definition: elog.c:1512
int errmsg_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
Definition: elog.c:1180
void errsave_finish(struct Node *context, const char *filename, int lineno, const char *funcname)
Definition: elog.c:681
int geterrlevel(void)
Definition: elog.c:1578
static char formatted_log_time[FORMATTED_TS_LEN]
Definition: elog.c:160
int internalerrquery(const char *query)
Definition: elog.c:1482
static char formatted_start_time[FORMATTED_TS_LEN]
Definition: elog.c:159
int internalerrposition(int cursorpos)
Definition: elog.c:1462
static void send_message_to_frontend(ErrorData *edata)
Definition: elog.c:3492
bool check_log_of_query(ErrorData *edata)
Definition: elog.c:2731
int errmsg_internal(const char *fmt,...)
Definition: elog.c:1157
static void append_with_tabs(StringInfo buf, const char *str)
Definition: elog.c:3722
int geterrcode(void)
Definition: elog.c:1561
char * format_elog_string(const char *fmt,...)
Definition: elog.c:1654
int errhidestmt(bool hide_stmt)
Definition: elog.c:1411
bool errstart(int elevel, const char *domain)
Definition: elog.c:342
void EmitErrorReport(void)
Definition: elog.c:1687
bool syslog_split_messages
Definition: elog.c:113
static void FreeErrorDataContents(ErrorData *edata)
Definition: elog.c:1830
static int errordata_stack_depth
Definition: elog.c:147
char * GetErrorContextStack(void)
Definition: elog.c:2059
void DebugFileOpen(void)
Definition: elog.c:2111
static void err_sendstring(StringInfo buf, const char *str)
Definition: elog.c:3480
void FreeErrorData(ErrorData *edata)
Definition: elog.c:1818
void assign_backtrace_functions(const char *newval, void *extra)
Definition: elog.c:2226
const char * error_severity(int elevel)
Definition: elog.c:3670
static ErrorData * get_error_stack_entry(void)
Definition: elog.c:751
#define FORMATTED_TS_LEN
Definition: elog.c:158
int errdetail_internal(const char *fmt,...)
Definition: elog.c:1230
static bool saved_timeval_set
Definition: elog.c:156
int errcode_for_file_access(void)
Definition: elog.c:876
static char * backtrace_function_list
Definition: elog.c:116
int errdetail(const char *fmt,...)
Definition: elog.c:1203
int Log_error_verbosity
Definition: elog.c:108
void pg_re_throw(void)
Definition: elog.c:2004
int errcontext_msg(const char *fmt,...)
Definition: elog.c:1365
static int save_format_errnumber
Definition: elog.c:1641
bool check_backtrace_functions(char **newval, void **extra, GucSource source)
Definition: elog.c:2167
void pre_format_elog_string(int errnumber, const char *domain)
Definition: elog.c:1645
static int recursion_depth
Definition: elog.c:149
ErrorContextCallback * error_context_stack
Definition: elog.c:94
int errbacktrace(void)
Definition: elog.c:1092
static struct timeval saved_timeval
Definition: elog.c:155
int Log_destination
Definition: elog.c:110
void ReThrowError(ErrorData *edata)
Definition: elog.c:1954
static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str)
Definition: elog.c:1548
char * get_formatted_start_time(void)
Definition: elog.c:2707
static bool matches_backtrace_functions(const char *funcname)
Definition: elog.c:825
ErrorData * CopyErrorData(void)
Definition: elog.c:1746
bool check_log_destination(char **newval, void **extra, GucSource source)
Definition: elog.c:2235
void FlushErrorState(void)
Definition: elog.c:1867
int errdetail_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
Definition: elog.c:1295
int errhint(const char *fmt,...)
Definition: elog.c:1317
static bool is_log_level_output(int elevel, int log_min_level)
Definition: elog.c:201
void ThrowErrorData(ErrorData *edata)
Definition: elog.c:1895
bool message_level_is_interesting(int elevel)
Definition: elog.c:272
void write_pipe_chunks(char *data, int len, int dest)
Definition: elog.c:3429
int errhidecontext(bool hide_ctx)
Definition: elog.c:1430
emit_log_hook_type emit_log_hook
Definition: elog.c:105
bool syslog_sequence_numbers
Definition: elog.c:112
int geterrposition(void)
Definition: elog.c:1595
static void send_message_to_server_log(ErrorData *edata)
Definition: elog.c:3189
char * Log_destination_string
Definition: elog.c:111
static void write_console(const char *line, int len)
Definition: elog.c:2579
#define EVALUATE_MESSAGE(domain, targetfield, appendval, translateit)
Definition: elog.c:989
static void set_stack_entry_location(ErrorData *edata, const char *filename, int lineno, const char *funcname)
Definition: elog.c:795
pg_attribute_cold bool errstart_cold(int elevel, const char *domain)
Definition: elog.c:326
#define CHECK_STACK_DEPTH()
Definition: elog.c:164
static void set_stack_entry_domain(ErrorData *edata, const char *domain)
Definition: elog.c:778
#define EVALUATE_MESSAGE_PLURAL(domain, targetfield, appendval)
Definition: elog.c:1025
static bool should_output_to_server(int elevel)
Definition: elog.c:235
const char * get_backend_type_for_log(void)
Definition: elog.c:2754
int errcode(int sqlerrcode)
Definition: elog.c:853
int errdetail_log_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
Definition: elog.c:1272
void write_stderr(const char *fmt,...)
Definition: elog.c:3741
int errmsg(const char *fmt,...)
Definition: elog.c:1070
void log_status_format(StringInfo buf, const char *format, ErrorData *edata)
Definition: elog.c:2816
char * get_formatted_log_time(void)
Definition: elog.c:2657
bool in_error_recursion_trouble(void)
Definition: elog.c:293
void errfinish(const char *filename, int lineno, const char *funcname)
Definition: elog.c:473
static const char * err_gettext(const char *str) pg_attribute_format_arg(1)
Definition: elog.c:305
int errposition(int cursorpos)
Definition: elog.c:1446
#define ERRORDATA_STACK_SIZE
Definition: elog.c:143
int errhint_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
Definition: elog.c:1339
int errdetail_log(const char *fmt,...)
Definition: elog.c:1251
char * unpack_sql_state(int sql_state)
Definition: elog.c:3169
static pg_noinline void set_backtrace(ErrorData *edata, int num_skip)
Definition: elog.c:1116
char * Log_line_prefix
Definition: elog.c:109
#define _(x)
Definition: elog.c:90
int set_errcontext_domain(const char *domain)
Definition: elog.c:1391
void reset_formatted_start_time(void)
Definition: elog.c:2695
static ErrorData errordata[ERRORDATA_STACK_SIZE]
Definition: elog.c:145
sigjmp_buf * PG_exception_stack
Definition: elog.c:96
static const char * save_format_domain
Definition: elog.c:1642
void assign_log_destination(const char *newval, void *extra)
Definition: elog.c:2297
@ PGERROR_VERBOSE
Definition: elog.h:482
@ PGERROR_DEFAULT
Definition: elog.h:481
#define LOG
Definition: elog.h:31
void(* emit_log_hook_type)(ErrorData *edata)
Definition: elog.h:472
#define PG_RE_THROW()
Definition: elog.h:412
#define DEBUG3
Definition: elog.h:28
#define LOG_SERVER_ONLY
Definition: elog.h:32
#define WARNING_CLIENT_ONLY
Definition: elog.h:38
#define FATAL
Definition: elog.h:41
#define WARNING
Definition: elog.h:36
#define LOG_DESTINATION_JSONLOG
Definition: elog.h:497
#define DEBUG2
Definition: elog.h:29
#define PGUNSIXBIT(val)
Definition: elog.h:54
#define PANIC
Definition: elog.h:42
#define DEBUG1
Definition: elog.h:30
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:225
#define NOTICE
Definition: elog.h:35
#define LOG_DESTINATION_SYSLOG
Definition: elog.h:494
#define LOG_DESTINATION_STDERR
Definition: elog.h:493
#define INFO
Definition: elog.h:34
#define ereport(elevel,...)
Definition: elog.h:149
#define LOG_DESTINATION_EVENTLOG
Definition: elog.h:495
#define DEBUG5
Definition: elog.h:26
#define LOG_DESTINATION_CSVLOG
Definition: elog.h:496
#define DEBUG4
Definition: elog.h:27
#define palloc_object(type)
Definition: fe_memutils.h:74
volatile uint32 QueryCancelHoldoffCount
Definition: globals.c:43
ProtocolVersion FrontendProtocol
Definition: globals.c:29
pid_t PostmasterPid
Definition: globals.c:105
volatile uint32 InterruptHoldoffCount
Definition: globals.c:42
int MyProcPid
Definition: globals.c:46
bool IsUnderPostmaster
Definition: globals.c:119
volatile uint32 CritSectionCount
Definition: globals.c:44
bool ExitOnAnyError
Definition: globals.c:122
struct Port * MyProcPort
Definition: globals.c:50
pg_time_t MyStartTime
Definition: globals.c:47
char OutputFileName[MAXPGPATH]
Definition: globals.c:78
void * guc_malloc(int elevel, size_t size)
Definition: guc.c:638
#define newval
#define GUC_check_errdetail
Definition: guc.h:476
GucSource
Definition: guc.h:108
char * event_source
Definition: guc_tables.c:508
int client_min_messages
Definition: guc_tables.c:523
int log_min_error_statement
Definition: guc_tables.c:521
static int syslog_facility
Definition: guc_tables.c:586
char * application_name
Definition: guc_tables.c:543
int log_min_messages
Definition: guc_tables.c:522
char * backtrace_functions
Definition: guc_tables.c:531
const char * str
#define free(a)
Definition: header.h:65
#define funcname
Definition: indent_codes.h:69
static char * username
Definition: initdb.c:153
#define close(a)
Definition: win32.h:12
#define write(a, b, c)
Definition: win32.h:14
bool proc_exit_inprogress
Definition: ipc.c:40
void proc_exit(int code)
Definition: ipc.c:104
int j
Definition: isn.c:73
int i
Definition: isn.c:72
void write_jsonlog(ErrorData *edata)
Definition: jsonlog.c:109
#define pq_flush()
Definition: libpq.h:46
static void const char * fmt
static void const char fflush(stdout)
va_end(args)
vfprintf(stderr, fmt, args)
exit(1)
va_start(args, fmt)
void list_free(List *list)
Definition: list.c:1546
int pg_mbcliplen(const char *mbstr, int len, int limit)
Definition: mbutils.c:1083
int GetMessageEncoding(void)
Definition: mbutils.c:1308
char * MemoryContextStrdup(MemoryContext context, const char *string)
Definition: mcxt.c:1683
void MemoryContextReset(MemoryContext context)
Definition: mcxt.c:383
char * pstrdup(const char *in)
Definition: mcxt.c:1696
void pfree(void *pointer)
Definition: mcxt.c:1521
void * palloc(Size size)
Definition: mcxt.c:1317
MemoryContext CurrentMemoryContext
Definition: mcxt.c:143
MemoryContext ErrorContext
Definition: mcxt.c:150
#define CHECK_FOR_INTERRUPTS()
Definition: miscadmin.h:122
@ B_LOGGER
Definition: miscadmin.h:372
@ B_BG_WORKER
Definition: miscadmin.h:345
const char * GetBackendTypeDesc(BackendType backendType)
Definition: miscinit.c:263
BackendType MyBackendType
Definition: miscinit.c:64
#define IsA(nodeptr, _type_)
Definition: nodes.h:158
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:124
static char format
#define DEFAULT_EVENT_SOURCE
const void size_t len
const void * data
static time_t start_time
Definition: pg_ctl.c:95
int32 encoding
Definition: pg_database.h:41
static char * filename
Definition: pg_dumpall.c:119
#define lfirst(lc)
Definition: pg_list.h:172
static rewind_source * source
Definition: pg_rewind.c:89
static char * buf
Definition: pg_test_fsync.c:72
@ DISCONNECT_FATAL
Definition: pgstat.h:58
@ DISCONNECT_NORMAL
Definition: pgstat.h:56
SessionEndType pgStatSessionEndCause
int64 pg_time_t
Definition: pgtime.h:23
size_t pg_strftime(char *s, size_t maxsize, const char *format, const struct pg_tm *t)
Definition: strftime.c:128
struct pg_tm * pg_localtime(const pg_time_t *timep, const pg_tz *tz)
Definition: localtime.c:1344
PGDLLIMPORT pg_tz * log_timezone
Definition: pgtz.c:31
#define vsnprintf
Definition: port.h:237
#define ALL_CONNECTION_FAILURE_ERRNOS
Definition: port.h:121
int pg_strcasecmp(const char *s1, const char *s2)
Definition: pgstrcasecmp.c:36
#define sprintf
Definition: port.h:240
#define snprintf
Definition: port.h:238
CommandDest whereToSendOutput
Definition: postgres.c:90
const char * debug_query_string
Definition: postgres.c:87
#define PG_DIAG_INTERNAL_QUERY
Definition: postgres_ext.h:63
#define PG_DIAG_SCHEMA_NAME
Definition: postgres_ext.h:65
#define PG_DIAG_CONSTRAINT_NAME
Definition: postgres_ext.h:69
#define PG_DIAG_DATATYPE_NAME
Definition: postgres_ext.h:68
#define PG_DIAG_SOURCE_LINE
Definition: postgres_ext.h:71
#define PG_DIAG_STATEMENT_POSITION
Definition: postgres_ext.h:61
#define PG_DIAG_SOURCE_FILE
Definition: postgres_ext.h:70
#define PG_DIAG_MESSAGE_HINT
Definition: postgres_ext.h:60
#define PG_DIAG_SQLSTATE
Definition: postgres_ext.h:57
#define PG_DIAG_SEVERITY_NONLOCALIZED
Definition: postgres_ext.h:56
#define PG_DIAG_TABLE_NAME
Definition: postgres_ext.h:66
#define PG_DIAG_MESSAGE_PRIMARY
Definition: postgres_ext.h:58
#define PG_DIAG_COLUMN_NAME
Definition: postgres_ext.h:67
#define PG_DIAG_MESSAGE_DETAIL
Definition: postgres_ext.h:59
#define PG_DIAG_CONTEXT
Definition: postgres_ext.h:64
#define PG_DIAG_SEVERITY
Definition: postgres_ext.h:55
#define PG_DIAG_SOURCE_FUNCTION
Definition: postgres_ext.h:72
#define PG_DIAG_INTERNAL_POSITION
Definition: postgres_ext.h:62
bool redirection_done
Definition: postmaster.c:363
bool ClientAuthInProgress
Definition: postmaster.c:360
BackgroundWorker * MyBgworkerEntry
Definition: postmaster.c:196
int pq_putmessage_v2(char msgtype, const char *s, size_t len)
Definition: pqcomm.c:1559
#define PG_PROTOCOL_MAJOR(v)
Definition: pqcomm.h:87
void pq_sendstring(StringInfo buf, const char *str)
Definition: pqformat.c:195
void pq_endmessage(StringInfo buf)
Definition: pqformat.c:296
void pq_beginmessage(StringInfo buf, char msgtype)
Definition: pqformat.c:88
void pq_send_ascii_string(StringInfo buf, const char *str)
Definition: pqformat.c:227
static void pq_sendbyte(StringInfo buf, uint8 byt)
Definition: pqformat.h:160
static int fd(const char *x, int i)
Definition: preproc-init.c:105
#define INVALID_PROC_NUMBER
Definition: procnumber.h:26
#define PqMsg_ErrorResponse
Definition: protocol.h:44
#define PqMsg_NoticeResponse
Definition: protocol.h:49
const char * get_ps_display(int *displen)
Definition: ps_status.c:532
char * psprintf(const char *fmt,...)
Definition: psprintf.c:43
PGPROC * MyProc
Definition: proc.c:66
char * dbname
Definition: streamutil.c:50
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:145
void appendBinaryStringInfo(StringInfo str, const void *data, int datalen)
Definition: stringinfo.c:281
void appendStringInfoSpaces(StringInfo str, int count)
Definition: stringinfo.c:260
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:230
void appendStringInfoChar(StringInfo str, char ch)
Definition: stringinfo.c:242
void initStringInfo(StringInfo str)
Definition: stringinfo.c:97
#define appendStringInfoCharMacro(str, ch)
Definition: stringinfo.h:231
char bgw_type[BGW_MAXLEN]
Definition: bgworker.h:92
struct ErrorContextCallback * previous
Definition: elog.h:296
void(* callback)(void *arg)
Definition: elog.h:297
int internalpos
Definition: elog.h:453
char * schema_name
Definition: elog.h:447
char * context
Definition: elog.h:444
const char * domain
Definition: elog.h:437
char * internalquery
Definition: elog.h:454
int saved_errno
Definition: elog.h:455
int sqlerrcode
Definition: elog.h:439
struct MemoryContextData * assoc_context
Definition: elog.h:458
const char * filename
Definition: elog.h:434
bool output_to_server
Definition: elog.h:430
int elevel
Definition: elog.h:429
char * datatype_name
Definition: elog.h:450
char * detail
Definition: elog.h:441
const char * context_domain
Definition: elog.h:438
const char * funcname
Definition: elog.h:436
char * table_name
Definition: elog.h:448
char * backtrace
Definition: elog.h:445
char * message
Definition: elog.h:440
bool hide_stmt
Definition: elog.h:432
char * detail_log
Definition: elog.h:442
int lineno
Definition: elog.h:435
const char * message_id
Definition: elog.h:446
char * hint
Definition: elog.h:443
bool hide_ctx
Definition: elog.h:433
char * constraint_name
Definition: elog.h:451
int cursorpos
Definition: elog.h:452
bool output_to_client
Definition: elog.h:431
char * column_name
Definition: elog.h:449
bool details_wanted
Definition: miscnodes.h:48
ErrorData * error_data
Definition: miscnodes.h:49
bool error_occurred
Definition: miscnodes.h:47
Definition: pg_list.h:54
Definition: nodes.h:129
Definition: proc.h:162
LocalTransactionId lxid
Definition: proc.h:200
struct PGPROC::@124 vxid
ProcNumber procNumber
Definition: proc.h:195
int pid
Definition: proc.h:182
PGPROC * lockGroupLeader
Definition: proc.h:304
char data[FLEXIBLE_ARRAY_MEMBER]
Definition: syslogger.h:50
char nuls[2]
Definition: syslogger.h:46
char * user_name
Definition: libpq-be.h:154
char * remote_port
Definition: libpq-be.h:146
char * database_name
Definition: libpq-be.h:153
char * remote_host
Definition: libpq-be.h:141
void write_syslogger_file(const char *buffer, int count, int destination)
Definition: syslogger.c:1093
#define PIPE_PROTO_DEST_JSONLOG
Definition: syslogger.h:67
#define PIPE_PROTO_IS_LAST
Definition: syslogger.h:63
#define PIPE_PROTO_DEST_CSVLOG
Definition: syslogger.h:66
#define PIPE_PROTO_DEST_STDERR
Definition: syslogger.h:65
#define PIPE_MAX_PAYLOAD
Definition: syslogger.h:60
#define PIPE_HEADER_SIZE
Definition: syslogger.h:59
PipeProtoHeader proto
Definition: syslogger.h:55
bool SplitIdentifierString(char *rawstring, char separator, List **namelist)
Definition: varlena.c:3432
int pgwin32_is_service(void)
int gettimeofday(struct timeval *tp, void *tzp)
TransactionId GetTopTransactionIdIfAny(void)
Definition: xact.c:440