summaryrefslogtreecommitdiffstats
path: root/src/bin/scripts/t/020_createdb.pl
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:17:33 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:17:33 +0000
commit5e45211a64149b3c659b90ff2de6fa982a5a93ed (patch)
tree739caf8c461053357daa9f162bef34516c7bf452 /src/bin/scripts/t/020_createdb.pl
parentInitial commit. (diff)
downloadpostgresql-15-5e45211a64149b3c659b90ff2de6fa982a5a93ed.tar.xz
postgresql-15-5e45211a64149b3c659b90ff2de6fa982a5a93ed.zip
Adding upstream version 15.5.upstream/15.5
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/bin/scripts/t/020_createdb.pl')
-rw-r--r--src/bin/scripts/t/020_createdb.pl161
1 files changed, 161 insertions, 0 deletions
diff --git a/src/bin/scripts/t/020_createdb.pl b/src/bin/scripts/t/020_createdb.pl
new file mode 100644
index 0000000..2e712f4
--- /dev/null
+++ b/src/bin/scripts/t/020_createdb.pl
@@ -0,0 +1,161 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('createdb');
+program_version_ok('createdb');
+program_options_handling_ok('createdb');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->issues_sql_like(
+ [ 'createdb', 'foobar1' ],
+ qr/statement: CREATE DATABASE foobar1/,
+ 'SQL CREATE DATABASE run');
+$node->issues_sql_like(
+ [ 'createdb', '-l', 'C', '-E', 'LATIN1', '-T', 'template0', 'foobar2' ],
+ qr/statement: CREATE DATABASE foobar2 ENCODING 'LATIN1'/,
+ 'create database with encoding');
+
+if ($ENV{with_icu} eq 'yes')
+{
+ # This fails because template0 uses libc provider and has no ICU
+ # locale set. It would succeed if template0 used the icu
+ # provider. XXX Maybe split into multiple tests?
+ $node->command_fails(
+ [
+ 'createdb', '-T', 'template0', '-E', 'UTF8',
+ '--locale-provider=icu', 'foobar4'
+ ],
+ 'create database with ICU fails without ICU locale specified');
+
+ $node->issues_sql_like(
+ [
+ 'createdb', '-T',
+ 'template0', '-E', 'UTF8', '--locale-provider=icu',
+ '--icu-locale=en', 'foobar5'
+ ],
+ qr/statement: CREATE DATABASE foobar5 .* LOCALE_PROVIDER icu ICU_LOCALE 'en'/,
+ 'create database with ICU locale specified');
+
+ $node->command_fails(
+ [
+ 'createdb', '-T', 'template0', '-E', 'UTF8',
+ '--locale-provider=icu',
+ '--icu-locale=@colNumeric=lower', 'foobarX'
+ ],
+ 'fails for invalid ICU locale');
+
+ $node->command_fails_like(
+ [
+ 'createdb', '-T',
+ 'template0', '--locale-provider=icu',
+ '--encoding=SQL_ASCII', 'foobarX'
+ ],
+ qr/ERROR: encoding "SQL_ASCII" is not supported with ICU provider/,
+ 'fails for encoding not supported by ICU');
+
+ # additional node, which uses the icu provider
+ my $node2 = PostgreSQL::Test::Cluster->new('icu');
+ $node2->init(extra => ['--locale-provider=icu', '--icu-locale=en']);
+ $node2->start;
+
+ $node2->command_ok(
+ [ 'createdb', '-T', 'template0', '--locale-provider=libc', 'foobar55' ],
+ 'create database with libc provider from template database with icu provider');
+
+ $node2->command_ok(
+ [ 'createdb', '-T', 'template0', '--icu-locale', 'en-US', 'foobar56' ],
+ 'create database with icu locale from template database with icu provider');
+}
+else
+{
+ $node->command_fails(
+ [ 'createdb', '-T', 'template0', '--locale-provider=icu', 'foobar4' ],
+ 'create database with ICU fails since no ICU support');
+}
+
+$node->command_fails([ 'createdb', 'foobar1' ],
+ 'fails if database already exists');
+
+$node->command_fails(
+ [ 'createdb', '-T', 'template0', '--locale-provider=xyz', 'foobarX' ],
+ 'fails for invalid locale provider');
+
+# Check use of templates with shared dependencies copied from the template.
+my ($ret, $stdout, $stderr) = $node->psql(
+ 'foobar2',
+ 'CREATE ROLE role_foobar;
+CREATE TABLE tab_foobar (id int);
+ALTER TABLE tab_foobar owner to role_foobar;
+CREATE POLICY pol_foobar ON tab_foobar FOR ALL TO role_foobar;');
+$node->issues_sql_like(
+ [ 'createdb', '-l', 'C', '-T', 'foobar2', 'foobar3' ],
+ qr/statement: CREATE DATABASE foobar3 TEMPLATE foobar2/,
+ 'create database with template');
+($ret, $stdout, $stderr) = $node->psql(
+ 'foobar3',
+ "SELECT pg_describe_object(classid, objid, objsubid) AS obj,
+ pg_describe_object(refclassid, refobjid, 0) AS refobj
+ FROM pg_shdepend s JOIN pg_database d ON (d.oid = s.dbid)
+ WHERE d.datname = 'foobar3' ORDER BY obj;", on_error_die => 1);
+chomp($stdout);
+like(
+ $stdout,
+ qr/^policy pol_foobar on table tab_foobar\|role role_foobar
+table tab_foobar\|role role_foobar$/,
+ 'shared dependencies copied over to target database');
+
+# Check quote handling with incorrect option values.
+$node->command_checks_all(
+ [ 'createdb', '--encoding', "foo'; SELECT '1", 'foobar2' ],
+ 1,
+ [qr/^$/],
+ [qr/^createdb: error: "foo'; SELECT '1" is not a valid encoding name/s],
+ 'createdb with incorrect --encoding');
+$node->command_checks_all(
+ [ 'createdb', '--lc-collate', "foo'; SELECT '1", 'foobar2' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/^createdb: error: database creation failed: ERROR: invalid locale name|^createdb: error: database creation failed: ERROR: new collation \(foo'; SELECT '1\) is incompatible with the collation of the template database/s
+ ],
+ 'createdb with incorrect --lc-collate');
+$node->command_checks_all(
+ [ 'createdb', '--lc-ctype', "foo'; SELECT '1", 'foobar2' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/^createdb: error: database creation failed: ERROR: invalid locale name|^createdb: error: database creation failed: ERROR: new LC_CTYPE \(foo'; SELECT '1\) is incompatible with the LC_CTYPE of the template database/s
+ ],
+ 'createdb with incorrect --lc-ctype');
+
+$node->command_checks_all(
+ [ 'createdb', '--strategy', "foo", 'foobar2' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/^createdb: error: database creation failed: ERROR: invalid create database strategy "foo"/s
+ ],
+ 'createdb with incorrect --strategy');
+
+# Check database creation strategy
+$node->issues_sql_like(
+ [ 'createdb', '-T', 'foobar2', '-S', 'wal_log', 'foobar6' ],
+ qr/statement: CREATE DATABASE foobar6 STRATEGY wal_log TEMPLATE foobar2/,
+ 'create database with WAL_LOG strategy');
+
+$node->issues_sql_like(
+ [ 'createdb', '-T', 'foobar2', '-S', 'file_copy', 'foobar7' ],
+ qr/statement: CREATE DATABASE foobar7 STRATEGY file_copy TEMPLATE foobar2/,
+ 'create database with FILE_COPY strategy');
+
+done_testing();