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