From: Tom Lane Date: Thu, 4 Nov 2010 19:28:35 +0000 (-0400) Subject: Use appendStringInfoString() where appropriate in elog.c. X-Git-Tag: REL9_1_ALPHA3~210 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=09211659d9d8fd62f9de09703c90ed4f072c4a47;p=postgresql Use appendStringInfoString() where appropriate in elog.c. The nominally equivalent call appendStringInfo(buf, "%s", str) can be significantly slower when str is large. In particular, the former usage in EVALUATE_MESSAGE led to O(N^2) behavior when collecting a large number of context lines, as I found out while testing recursive functions. The other changes are just neatnik-ism and seem unlikely to save anything meaningful, but a cycle shaved is a cycle earned. --- diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index e321b99249..6e2cef9504 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -667,8 +667,10 @@ errcode_for_socket_access(void) /* Expand %m in format string */ \ fmtbuf = expand_fmt_string(fmt, edata); \ initStringInfo(&buf); \ - if ((appendval) && edata->targetfield) \ - appendStringInfo(&buf, "%s\n", edata->targetfield); \ + if ((appendval) && edata->targetfield) { \ + appendStringInfoString(&buf, edata->targetfield); \ + appendStringInfoChar(&buf, '\n'); \ + } \ /* Generate actual output --- have to use appendStringInfoVA */ \ for (;;) \ { \ @@ -708,8 +710,10 @@ errcode_for_socket_access(void) /* Expand %m in format string */ \ fmtbuf = expand_fmt_string(fmt, edata); \ initStringInfo(&buf); \ - if ((appendval) && edata->targetfield) \ - appendStringInfo(&buf, "%s\n", edata->targetfield); \ + if ((appendval) && edata->targetfield) { \ + appendStringInfoString(&buf, edata->targetfield); \ + appendStringInfoChar(&buf, '\n'); \ + } \ /* Generate actual output --- have to use appendStringInfoVA */ \ for (;;) \ { \ @@ -1809,7 +1813,7 @@ log_line_prefix(StringInfo buf, ErrorData *edata) if (appname == NULL || *appname == '\0') appname = _("[unknown]"); - appendStringInfo(buf, "%s", appname); + appendStringInfoString(buf, appname); } break; case 'u': @@ -1819,7 +1823,7 @@ log_line_prefix(StringInfo buf, ErrorData *edata) if (username == NULL || *username == '\0') username = _("[unknown]"); - appendStringInfo(buf, "%s", username); + appendStringInfoString(buf, username); } break; case 'd': @@ -1829,7 +1833,7 @@ log_line_prefix(StringInfo buf, ErrorData *edata) if (dbname == NULL || *dbname == '\0') dbname = _("[unknown]"); - appendStringInfo(buf, "%s", dbname); + appendStringInfoString(buf, dbname); } break; case 'c': @@ -1877,7 +1881,7 @@ log_line_prefix(StringInfo buf, ErrorData *edata) case 'r': if (MyProcPort && MyProcPort->remote_host) { - appendStringInfo(buf, "%s", MyProcPort->remote_host); + appendStringInfoString(buf, MyProcPort->remote_host); if (MyProcPort->remote_port && MyProcPort->remote_port[0] != '\0') appendStringInfo(buf, "(%s)", @@ -1886,7 +1890,7 @@ log_line_prefix(StringInfo buf, ErrorData *edata) break; case 'h': if (MyProcPort && MyProcPort->remote_host) - appendStringInfo(buf, "%s", MyProcPort->remote_host); + appendStringInfoString(buf, MyProcPort->remote_host); break; case 'q': /* in postmaster and friends, stop if %q is seen */ @@ -2004,9 +2008,12 @@ write_csvlog(ErrorData *edata) if (MyProcPort && MyProcPort->remote_host) { appendStringInfoChar(&buf, '"'); - appendStringInfo(&buf, "%s", MyProcPort->remote_host); + appendStringInfoString(&buf, MyProcPort->remote_host); if (MyProcPort->remote_port && MyProcPort->remote_port[0] != '\0') - appendStringInfo(&buf, ":%s", MyProcPort->remote_port); + { + appendStringInfoChar(&buf, ':'); + appendStringInfoString(&buf, MyProcPort->remote_port); + } appendStringInfoChar(&buf, '"'); } appendStringInfoChar(&buf, ','); @@ -2053,40 +2060,40 @@ write_csvlog(ErrorData *edata) appendStringInfoChar(&buf, ','); /* Error severity */ - appendStringInfo(&buf, "%s", error_severity(edata->elevel)); + appendStringInfoString(&buf, error_severity(edata->elevel)); appendStringInfoChar(&buf, ','); /* SQL state code */ - appendStringInfo(&buf, "%s", unpack_sql_state(edata->sqlerrcode)); + appendStringInfoString(&buf, unpack_sql_state(edata->sqlerrcode)); appendStringInfoChar(&buf, ','); /* errmessage */ appendCSVLiteral(&buf, edata->message); - appendStringInfoCharMacro(&buf, ','); + appendStringInfoChar(&buf, ','); /* errdetail or errdetail_log */ if (edata->detail_log) appendCSVLiteral(&buf, edata->detail_log); else appendCSVLiteral(&buf, edata->detail); - appendStringInfoCharMacro(&buf, ','); + appendStringInfoChar(&buf, ','); /* errhint */ appendCSVLiteral(&buf, edata->hint); - appendStringInfoCharMacro(&buf, ','); + appendStringInfoChar(&buf, ','); /* internal query */ appendCSVLiteral(&buf, edata->internalquery); - appendStringInfoCharMacro(&buf, ','); + appendStringInfoChar(&buf, ','); /* if printed internal query, print internal pos too */ if (edata->internalpos > 0 && edata->internalquery != NULL) appendStringInfo(&buf, "%d", edata->internalpos); - appendStringInfoCharMacro(&buf, ','); + appendStringInfoChar(&buf, ','); /* errcontext */ appendCSVLiteral(&buf, edata->context); - appendStringInfoCharMacro(&buf, ','); + appendStringInfoChar(&buf, ','); /* user query --- only reported if not disabled by the caller */ if (is_log_level_output(edata->elevel, log_min_error_statement) && @@ -2095,10 +2102,10 @@ write_csvlog(ErrorData *edata) print_stmt = true; if (print_stmt) appendCSVLiteral(&buf, debug_query_string); - appendStringInfoCharMacro(&buf, ','); + appendStringInfoChar(&buf, ','); if (print_stmt && edata->cursorpos > 0) appendStringInfo(&buf, "%d", edata->cursorpos); - appendStringInfoCharMacro(&buf, ','); + appendStringInfoChar(&buf, ','); /* file error location */ if (Log_error_verbosity >= PGERROR_VERBOSE) @@ -2117,7 +2124,7 @@ write_csvlog(ErrorData *edata) appendCSVLiteral(&buf, msgbuf.data); pfree(msgbuf.data); } - appendStringInfoCharMacro(&buf, ','); + appendStringInfoChar(&buf, ','); /* application name */ if (application_name)