Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
createdb: Fix quoting of --encoding, --lc-ctype and --lc-collate
authorMichael Paquier <michael@paquier.xyz>
Thu, 27 Feb 2020 02:21:28 +0000 (11:21 +0900)
committerMichael Paquier <michael@paquier.xyz>
Thu, 27 Feb 2020 02:21:28 +0000 (11:21 +0900)
The original coding failed to properly quote those arguments, leading to
failures when using quotes in the values used.  As the quoting can be
encoding-sensitive, the connection to the backend needs to be taken
before applying the correct quoting.

Author: Michael Paquier
Reviewed-by: Daniel Gustafsson
Discussion: https://postgr.es/m/20200214041004.GB1998@paquier.xyz
Backpatch-through: 9.5

src/bin/scripts/createdb.c

index 9049ccc7ccec58ae5e6d03c52df2a3b2cccd3460..413573097693fd9f4fab5c33f37cf15651521b97 100644 (file)
@@ -177,6 +177,13 @@ main(int argc, char *argv[])
            dbname = get_user_name_or_exit(progname);
    }
 
+   /* No point in trying to use postgres db when creating postgres db. */
+   if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0)
+       maintenance_db = "template1";
+
+   conn = connectMaintenanceDatabase(maintenance_db, host, port, username,
+                                     prompt_password, progname, echo);
+
    initPQExpBuffer(&sql);
 
    appendPQExpBuffer(&sql, "CREATE DATABASE %s",
@@ -187,23 +194,25 @@ main(int argc, char *argv[])
    if (tablespace)
        appendPQExpBuffer(&sql, " TABLESPACE %s", fmtId(tablespace));
    if (encoding)
-       appendPQExpBuffer(&sql, " ENCODING '%s'", encoding);
+   {
+       appendPQExpBufferStr(&sql, " ENCODING ");
+       appendStringLiteralConn(&sql, encoding, conn);
+   }
    if (template)
        appendPQExpBuffer(&sql, " TEMPLATE %s", fmtId(template));
    if (lc_collate)
-       appendPQExpBuffer(&sql, " LC_COLLATE '%s'", lc_collate);
+   {
+       appendPQExpBufferStr(&sql, " LC_COLLATE ");
+       appendStringLiteralConn(&sql, lc_collate, conn);
+   }
    if (lc_ctype)
-       appendPQExpBuffer(&sql, " LC_CTYPE '%s'", lc_ctype);
+   {
+       appendPQExpBufferStr(&sql, " LC_CTYPE ");
+       appendStringLiteralConn(&sql, lc_ctype, conn);
+   }
 
    appendPQExpBufferChar(&sql, ';');
 
-   /* No point in trying to use postgres db when creating postgres db. */
-   if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0)
-       maintenance_db = "template1";
-
-   conn = connectMaintenanceDatabase(maintenance_db, host, port, username,
-                                     prompt_password, progname, echo);
-
    if (echo)
        printf("%s\n", sql.data);
    result = PQexec(conn, sql.data);