Avoid unportable usage of sscanf(UINT64_FORMAT).
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 27 May 2014 02:23:33 +0000 (22:23 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 27 May 2014 02:23:33 +0000 (22:23 -0400)
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

contrib/pg_stat_statements/pg_stat_statements.c

index 87044cece27d312091e17955bddd45cc1b0169db..5a841d79d47e1200d90a3baf6b987ffc8f6fbce6 100644 (file)
@@ -809,7 +809,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;
@@ -842,7 +842,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. */