LCOV - differential code coverage report
Current view: top level - src/backend/utils/error - elog.c (source / functions) Coverage Total Hit UNC LBC UIC UBC GBC GIC GNC CBC EUB ECB DUB DCB
Current: Differential Code Coverage HEAD vs 15 Lines: 67.5 % 1223 825 41 63 256 38 81 460 108 176 267 544 12 42
Current Date: 2023-04-08 15:15:32 Functions: 92.4 % 79 73 6 59 14 6 72 1
Baseline: 15
Baseline Date: 2023-04-08 15:09:40
Legend: Lines: hit not hit

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

Generated by: LCOV version v1.16-55-g56c0a2a