]> granicus.if.org Git - postgresql/commitdiff
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. */