diff options
author | Michael Paquier <michael@paquier.xyz> | 2020-02-27 11:21:07 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2020-02-27 11:21:07 +0900 |
commit | 83bd732eb2c83a26db9eefb4595615fa289620a8 (patch) | |
tree | ae6f3d4627036c7cf47d4efd7fa5823fd44aa04f /src/bin/scripts/createdb.c | |
parent | 143152439dc9482b1ae983f2819453e7300eca7f (diff) | |
download | postgresql-83bd732eb2c83a26db9eefb4595615fa289620a8.tar.gz postgresql-83bd732eb2c83a26db9eefb4595615fa289620a8.zip |
createdb: Fix quoting of --encoding, --lc-ctype and --lc-collate
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
Diffstat (limited to 'src/bin/scripts/createdb.c')
-rw-r--r-- | src/bin/scripts/createdb.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/src/bin/scripts/createdb.c b/src/bin/scripts/createdb.c index fc108882e43..153135ce9eb 100644 --- a/src/bin/scripts/createdb.c +++ b/src/bin/scripts/createdb.c @@ -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); |