Avoid unportable usage of sscanf(UINT64_FORMAT).

On Mingw, it seems that scanf() doesn't necessarily accept the same format
codes that printf() does, and in particular it may fail to recognize %llu
even though printf() does.  Since configure only probes printf() behavior
while setting up the INT64_FORMAT macros, this means it's unsafe to use
those macros with scanf().  We had only one instance of such a coding
pattern, in contrib/pg_stat_statements, so change that code to avoid
the problem.

Per buildfarm warnings.  Back-patch to 9.0 where the troublesome code
was introduced.

Michael Paquier
This commit is contained in:
Tom Lane 2014-05-26 22:23:29 -04:00
parent bf2e70ba6c
commit 9d7ded0f42
1 changed files with 10 additions and 2 deletions

View File

@ -962,7 +962,7 @@ pgss_ProcessUtility(Node *parsetree, const char *queryString,
{
instr_time start;
instr_time duration;
uint64 rows = 0;
uint64 rows;
BufferUsage bufusage_start,
bufusage;
uint32 queryId;
@ -995,7 +995,15 @@ pgss_ProcessUtility(Node *parsetree, const char *queryString,
/* parse command tag to retrieve the number of affected rows. */
if (completionTag &&
sscanf(completionTag, "COPY " UINT64_FORMAT, &rows) != 1)
strncmp(completionTag, "COPY ", 5) == 0)
{
#ifdef HAVE_STRTOULL
rows = strtoull(completionTag + 5, NULL, 10);
#else
rows = strtoul(completionTag + 5, NULL, 10);
#endif
}
else
rows = 0;
/* calc differences of buffer counters. */