]> granicus.if.org Git - postgresql/commitdiff
Only quote libpq connection string values that need quoting.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 25 Feb 2013 17:53:04 +0000 (19:53 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 25 Feb 2013 17:53:04 +0000 (19:53 +0200)
There's no harm in excessive quoting per se, but it makes the strings nicer
to read. The values can get quite unwieldy, when they're first quoted within
within single-quotes when included in the connection string, and then all
the single-quotes are escaped when the connection string is passed as a
shell argument.

src/bin/pg_dump/pg_dumpall.c

index ac3f57e5fe1ed627f465f141591856a987116b47..5488021bcae0f9a52d04a62ffed3e91c5f115991 100644 (file)
@@ -2038,15 +2038,40 @@ dumpTimestamp(char *msg)
 static void
 doConnStrQuoting(PQExpBuffer buf, const char *str)
 {
-       while (*str)
+       const char *s;
+       bool needquotes;
+
+       /*
+        * If the string consists entirely of plain ASCII characters, no need to
+        * quote it. This is quite conservative, but better safe than sorry.
+        */
+       needquotes = false;
+       for (s = str; *s; s++)
+       {
+               if (!((*s >= 'a' && *s <= 'z') || (*s >= 'A' && *s <= 'Z') ||
+                         (*s >= '0' && *s <= '9') || *s == '_' || *s == '.'))
+               {
+                       needquotes = true;
+                       break;
+               }
+       }
+
+       if (needquotes)
        {
-               /* ' and \ must be escaped by to \' and \\ */
-               if (*str == '\'' || *str == '\\')
-                       appendPQExpBufferChar(buf, '\\');
+               appendPQExpBufferChar(buf, '\'');
+               while (*str)
+               {
+                       /* ' and \ must be escaped by to \' and \\ */
+                       if (*str == '\'' || *str == '\\')
+                               appendPQExpBufferChar(buf, '\\');
 
-               appendPQExpBufferChar(buf, *str);
-               str++;
+                       appendPQExpBufferChar(buf, *str);
+                       str++;
+               }
+               appendPQExpBufferChar(buf, '\'');
        }
+       else
+               appendPQExpBufferStr(buf, str);
 }
 
 /*