4242 *
4343 *
4444 * IDENTIFICATION
45- * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.194 2007/08/19 01:41:25 adunstan Exp $
45+ * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.195 2007/08/23 01:24:43 adunstan Exp $
4646 *
4747 *-------------------------------------------------------------------------
4848 */
@@ -133,7 +133,8 @@ static const char *error_severity(int elevel);
133133static void append_with_tabs (StringInfo buf ,const char * str );
134134static bool is_log_level_output (int elevel ,int log_min_level );
135135static void write_pipe_chunks (char * data ,int len ,int dest );
136- static void get_error_message (StringInfo buf ,ErrorData * edata );
136+ static void get_csv_error_message (StringInfo buf ,ErrorData * edata );
137+ static void write_csvlog (ErrorData * edata );
137138
138139/*
139140 * errstart --- begin an error-reporting cycle
@@ -1809,9 +1810,7 @@ write_csvlog(ErrorData *edata)
18091810appendStringInfoChar (& buf ,',' );
18101811
18111812/* Error message and cursor position if any */
1812- get_error_message (& msgbuf ,edata );
1813-
1814- appendCSVLiteral (& buf ,msgbuf .data );
1813+ get_csv_error_message (& buf ,edata );
18151814
18161815appendStringInfoChar (& buf ,'\n' );
18171816
@@ -1826,22 +1825,32 @@ write_csvlog(ErrorData *edata)
18261825}
18271826
18281827/*
1829- * Appends the buffer with the error message and the cursor position.
1828+ * Appends the buffer with the error message and the cursor position, all
1829+ * CSV escaped.
18301830 */
18311831static void
1832- get_error_message (StringInfo buf ,ErrorData * edata )
1832+ get_csv_error_message (StringInfo buf ,ErrorData * edata )
18331833{
1834- if (edata -> message )
1835- appendStringInfo (buf ,"%s" ,edata -> message );
1836- else
1837- appendStringInfo (buf ,"%s" ,_ ("missing error text" ));
1834+ char * msg = edata -> message ?edata -> message :_ ("missing error text" );
1835+ char c ;
1836+
1837+ appendStringInfoCharMacro (buf ,'"' );
1838+
1839+ while ( (c = * msg ++ )!= '\0' )
1840+ {
1841+ if (c == '"' )
1842+ appendStringInfoCharMacro (buf ,'"' );
1843+ appendStringInfoCharMacro (buf ,c );
1844+ }
18381845
18391846if (edata -> cursorpos > 0 )
18401847appendStringInfo (buf ,_ (" at character %d" ),
18411848edata -> cursorpos );
18421849else if (edata -> internalpos > 0 )
18431850appendStringInfo (buf ,_ (" at character %d" ),
18441851edata -> internalpos );
1852+
1853+ appendStringInfoCharMacro (buf ,'"' );
18451854}
18461855
18471856/*
@@ -2032,13 +2041,19 @@ send_message_to_server_log(ErrorData *edata)
20322041write (fileno (stderr ),buf .data ,buf .len );
20332042}
20342043
2044+ /* If in the syslogger process, try to write messages direct to file */
2045+ if (am_syslogger )
2046+ write_syslogger_file (buf .data ,buf .len ,LOG_DESTINATION_STDERR );
2047+
2048+ /* Write to CSV log if enabled */
20352049if (Log_destination & LOG_DESTINATION_CSVLOG )
20362050{
20372051if (redirection_done || am_syslogger )
20382052{
20392053/* send CSV data if it's safe to do so (syslogger doesn't need
2040- * the pipe)
2054+ * the pipe). First get back the space in the message buffer.
20412055 */
2056+ pfree (buf .data );
20422057write_csvlog (edata );
20432058}
20442059else
@@ -2051,14 +2066,13 @@ send_message_to_server_log(ErrorData *edata)
20512066/* write message to stderr unless we just sent it above */
20522067write (fileno (stderr ),buf .data ,buf .len );
20532068}
2069+ pfree (buf .data );
20542070}
20552071}
2056-
2057- /* If in the syslogger process, try to write messages direct to file */
2058- if (am_syslogger )
2059- write_syslogger_file (buf .data ,buf .len ,LOG_DESTINATION_STDERR );
2060-
2061- pfree (buf .data );
2072+ else
2073+ {
2074+ pfree (buf .data );
2075+ }
20622076}
20632077
20642078/*