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:
parent
143152439d
commit
83bd732eb2
@ -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);
|
||||||
|
@ -3,7 +3,7 @@ use warnings;
|
|||||||
|
|
||||||
use PostgresNode;
|
use PostgresNode;
|
||||||
use TestLib;
|
use TestLib;
|
||||||
use Test::More tests => 13;
|
use Test::More tests => 22;
|
||||||
|
|
||||||
program_help_ok('createdb');
|
program_help_ok('createdb');
|
||||||
program_version_ok('createdb');
|
program_version_ok('createdb');
|
||||||
@ -24,3 +24,27 @@ $node->issues_sql_like(
|
|||||||
|
|
||||||
$node->command_fails([ 'createdb', 'foobar1' ],
|
$node->command_fails([ 'createdb', 'foobar1' ],
|
||||||
'fails if database already exists');
|
'fails if database already exists');
|
||||||
|
|
||||||
|
# Check quote handling with incorrect option values.
|
||||||
|
$node->command_checks_all(
|
||||||
|
[ 'createdb', '--encoding', "foo'; SELECT '1", 'foobar2' ],
|
||||||
|
1,
|
||||||
|
[qr/^$/],
|
||||||
|
[qr/^createdb: "foo'; SELECT '1" is not a valid encoding name/s],
|
||||||
|
'createdb with incorrect --lc-collate');
|
||||||
|
$node->command_checks_all(
|
||||||
|
[ 'createdb', '--lc-collate', "foo'; SELECT '1", 'foobar2' ],
|
||||||
|
1,
|
||||||
|
[qr/^$/],
|
||||||
|
[
|
||||||
|
qr/^createdb: database creation failed: ERROR: invalid locale name/s
|
||||||
|
],
|
||||||
|
'createdb with incorrect --lc-collate');
|
||||||
|
$node->command_checks_all(
|
||||||
|
[ 'createdb', '--lc-ctype', "foo'; SELECT '1", 'foobar2' ],
|
||||||
|
1,
|
||||||
|
[qr/^$/],
|
||||||
|
[
|
||||||
|
qr/^createdb: database creation failed: ERROR: invalid locale name/s
|
||||||
|
],
|
||||||
|
'createdb with incorrect --lc-ctype');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user