1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-05 09:19:17 +03:00

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
This commit is contained in:
Michael Paquier 2020-02-27 11:21:23 +09:00
parent 3e5308969a
commit 3340034f2c

View File

@ -177,6 +177,13 @@ main(int argc, char *argv[])
dbname = get_user_name_or_exit(progname); 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); initPQExpBuffer(&sql);
appendPQExpBuffer(&sql, "CREATE DATABASE %s", appendPQExpBuffer(&sql, "CREATE DATABASE %s",
@ -187,23 +194,25 @@ main(int argc, char *argv[])
if (tablespace) if (tablespace)
appendPQExpBuffer(&sql, " TABLESPACE %s", fmtId(tablespace)); appendPQExpBuffer(&sql, " TABLESPACE %s", fmtId(tablespace));
if (encoding) if (encoding)
appendPQExpBuffer(&sql, " ENCODING '%s'", encoding); {
appendPQExpBufferStr(&sql, " ENCODING ");
appendStringLiteralConn(&sql, encoding, conn);
}
if (template) if (template)
appendPQExpBuffer(&sql, " TEMPLATE %s", fmtId(template)); appendPQExpBuffer(&sql, " TEMPLATE %s", fmtId(template));
if (lc_collate) if (lc_collate)
appendPQExpBuffer(&sql, " LC_COLLATE '%s'", lc_collate); {
appendPQExpBufferStr(&sql, " LC_COLLATE ");
appendStringLiteralConn(&sql, lc_collate, conn);
}
if (lc_ctype) if (lc_ctype)
appendPQExpBuffer(&sql, " LC_CTYPE '%s'", lc_ctype); {
appendPQExpBufferStr(&sql, " LC_CTYPE ");
appendStringLiteralConn(&sql, lc_ctype, conn);
}
appendPQExpBufferChar(&sql, ';'); 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) if (echo)
printf("%s\n", sql.data); printf("%s\n", sql.data);
result = PQexec(conn, sql.data); result = PQexec(conn, sql.data);