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:42 -04:00
parent 42279b291a
commit c8186b3c22
1 changed files with 10 additions and 2 deletions

View File

@ -603,7 +603,7 @@ pgss_ProcessUtility(Node *parsetree, const char *queryString,
{
instr_time start;
instr_time duration;
uint64 rows = 0;
uint64 rows;
BufferUsage bufusage;
bufusage = pgBufferUsage;
@ -632,7 +632,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. */