diff --git a/src/test/regress/expected/database.out b/src/test/regress/expected/database.out new file mode 100644 index 0000000..f6bb833 --- /dev/null +++ b/src/test/regress/expected/database.out @@ -0,0 +1,140 @@ +-- +-- tests functions in dbcommands.c script +-- +-- Should fail. Check for cases when DROP DATABASE is not allowed +DROP DATABASE db_db2; -- doesn't exist +ERROR: database "db_db2" does not exist +DROP DATABASE IF EXISTS db_db2; -- doesn't exist with IF EXISTS; +NOTICE: database "db_db2" does not exist, skipping +DROP DATABASE template1; -- can't drop a template database +ERROR: cannot drop a template database +DROP DATABASE regression; -- can't drop a database in use +ERROR: cannot drop the currently open database +-- Should fail. Can't CREATE DATABASE inside a transaction +BEGIN TRANSACTION; +CREATE DATABASE db_db3; +ERROR: CREATE DATABASE cannot run inside a transaction block +ROLLBACK; +-- Should fail. Can't DROP DATABASE inside a transaction +BEGIN TRANSACTION; +DROP DATABASE regression; +ERROR: DROP DATABASE cannot run inside a transaction block +ROLLBACK; +-- Should fail. ALTER DATABASE RENAME TO on invalid DB +ALTER DATABASE db_db1_nonexistent RENAME TO db_db1a; -- Database does not exist +ERROR: database "db_db1_nonexistent" does not exist +ALTER DATABASE regression RENAME TO regression; -- Database can't be renamed to itself +ERROR: database "regression" already exists +--ALTER DATABASE regression RENAME TO db_db1a; -- Can't rename current database +-- Should fail. ALTER DATABASE RENAME TO without permission +CREATE ROLE rol_db7; +SET ROLE rol_db7; +ALTER DATABASE regression RENAME TO db_db7; +ERROR: must be owner of database regression +RESET ROLE; +DROP ROLE rol_db7; +-- Should fail. ALTER DATABASE RENAME TO with OWNER rights without CREATEDB +BEGIN TRANSACTION; +CREATE ROLE rol_db8; +ALTER DATABASE regression OWNER TO rol_db8; +SET ROLE rol_db8; +ALTER DATABASE regression RENAME TO db_db8a; +ERROR: permission denied to rename database +ROLLBACK; +-- Should fail. ALTER DATABASE SET / WITH with invalid values +ALTER DATABASE regression SET invalid_parameter; +ERROR: syntax error at or near ";" +LINE 1: ALTER DATABASE regression SET invalid_parameter; + ^ +ALTER DATABASE regression WITH CONNECTION LIMIT = -100; +ERROR: invalid connection limit: -100 +ALTER DATABASE regression WITH CONNECTION LIMIT = 8ASDF; +ERROR: syntax error at or near "ASDF" +LINE 1: ALTER DATABASE regression WITH CONNECTION LIMIT = 8ASDF; + ^ +-- Should fail. ALTER DATABASE with redundant options +ALTER DATABASE regression WITH CONNECTION LIMIT 1 CONNECTION LIMIT 2; +ERROR: conflicting or redundant options +-- Should work. ALTER DATABASE SET / WITH with valid values +ALTER DATABASE regression WITH CONNECTION LIMIT = -1; +ALTER DATABASE regression WITH CONNECTION LIMIT = 0; +ALTER DATABASE regression WITH CONNECTION LIMIT = 100; +ALTER DATABASE regression SET SEED = 0.5; +-- Should fail. Can't set Tablespace within transaction +BEGIN TRANSACTION; +ALTER DATABASE regression SET TABLESPACE pg_default; +ERROR: ALTER DATABASE SET TABLESPACE cannot run inside a transaction block +ROLLBACK; +-- Should work. ALTER DATABASE OWNER TO requires CREATEDB rights for grantor +BEGIN TRANSACTION; +CREATE ROLE rol_db15; +CREATE ROLE rol_db14 IN ROLE rol_db15; -- CREATE rol_db14 to be a member of rol_db15 +ALTER DATABASE regression OWNER TO rol_db14; +SET ROLE rol_db14; +ALTER DATABASE regression OWNER TO rol_db15; +ERROR: permission denied to change owner of database +ROLLBACK; +-- Should fail. CREATE DATABASE with invalid values +CREATE DATABASE db_db18 ENCODING 'invalid_encoding'; +ERROR: invalid_encoding is not a valid encoding name +CREATE DATABASE db_db18 ENCODING 123456789; +ERROR: 123456789 is not a valid encoding code +CREATE DATABASE db_db18 CONNECTION LIMIT -10; +ERROR: invalid connection limit: -10 +CREATE DATABASE db_db18 TEMPLATE invalid_template; +ERROR: template database "invalid_template" does not exist +CREATE DATABASE regression; -- DATABASE already exists +ERROR: database "regression" already exists +-- Should fail. CREATE DATABASE with redundant options +CREATE DATABASE db_db18 TABLESPACE tablespace_db18a TABLESPACE tablespace_db18b; +ERROR: conflicting or redundant options +CREATE DATABASE db_db18 OWNER rol_db18a OWNER rol_db18b; +ERROR: conflicting or redundant options +CREATE DATABASE db_db18 TEMPLATE template_db18a TEMPLATE template_db18b; +ERROR: conflicting or redundant options +CREATE DATABASE db_db18 ENCODING 'UTF8' ENCODING 'UTF8'; +ERROR: conflicting or redundant options +CREATE DATABASE db_db18 CONNECTION LIMIT 10 CONNECTION LIMIT 10; +ERROR: conflicting or redundant options +-- Should fail. CREATE DATABASE using non-template DB as template without SUPERUSER +CREATE ROLE rol_db19 CREATEDB; +CREATE DATABASE db_db19; +SET ROLE rol_db19; +CREATE DATABASE db_db20 TEMPLATE db_db19; +ERROR: permission denied to copy database "db_db19" +RESET ROLE; +DROP DATABASE db_db19; +DROP ROLE rol_db19; +-- Should fail. Trying to CREATE / ALTER / DROP DATABASE without rights +CREATE ROLE rol_db21; +CREATE DATABASE db_db21; +SET ROLE rol_db21; +ALTER DATABASE regression SET TABLESPACE tablespace_db16; +ERROR: must be owner of database regression +CREATE DATABASE db_db21a; +ERROR: permission denied to create database +ALTER DATABASE db_db21 OWNER TO rol_db21; +ERROR: must be owner of database db_db21 +DROP DATABASE db_db21; +ERROR: must be owner of database db_db21 +RESET ROLE; +DROP ROLE rol_db21; +DROP DATABASE db_db21; +-- Should fail. CREATE / ALTER DATABASE should not have pg_global as TABLESPACE +CREATE DATABASE db_db22 TABLESPACE pg_global; +ERROR: pg_global cannot be used as default tablespace +CREATE DATABASE db_db22a; +ALTER DATABASE db_db22a SET TABLESPACE pg_global; +ERROR: pg_global cannot be used as default tablespace +DROP DATABASE db_db22a; +-- Should work. ALTER DATABASE SET with bogus OWNER +BEGIN TRANSACTION; +ALTER DATABASE regression OWNER TO rol_db23_does_not_exist; +ERROR: role "rol_db23_does_not_exist" does not exist +ROLLBACK; +-- Should work. ALTER DATABASE SET OWNER to self! +BEGIN TRANSACTION; +CREATE ROLE rol_db24; +ALTER DATABASE regression OWNER TO rol_db24; +ALTER DATABASE regression OWNER TO rol_db24; -- Set OWNER TO previous OWNER +ROLLBACK; diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 2af28b1..243f377 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -88,7 +88,7 @@ test: privileges security_label collate matview # ---------- # Another group of parallel tests # ---------- -test: alter_generic misc psql +test: alter_generic misc psql database # rules cannot run concurrently with any test that creates a view test: rules diff --git a/src/test/regress/sql/database.sql b/src/test/regress/sql/database.sql new file mode 100644 index 0000000..b911e89 --- /dev/null +++ b/src/test/regress/sql/database.sql @@ -0,0 +1,120 @@ +-- +-- tests functions in dbcommands.c script +-- + +-- Should fail. Check for cases when DROP DATABASE is not allowed +DROP DATABASE db_db2; -- doesn't exist +DROP DATABASE IF EXISTS db_db2; -- doesn't exist with IF EXISTS; +DROP DATABASE template1; -- can't drop a template database +DROP DATABASE regression; -- can't drop a database in use + +-- Should fail. Can't CREATE DATABASE inside a transaction +BEGIN TRANSACTION; +CREATE DATABASE db_db3; +ROLLBACK; + +-- Should fail. Can't DROP DATABASE inside a transaction +BEGIN TRANSACTION; +DROP DATABASE regression; +ROLLBACK; + +-- Should fail. ALTER DATABASE RENAME TO on invalid DB +ALTER DATABASE db_db1_nonexistent RENAME TO db_db1a; -- Database does not exist +ALTER DATABASE regression RENAME TO regression; -- Database can't be renamed to itself +--ALTER DATABASE regression RENAME TO db_db1a; -- Can't rename current database + +-- Should fail. ALTER DATABASE RENAME TO without permission +CREATE ROLE rol_db7; +SET ROLE rol_db7; +ALTER DATABASE regression RENAME TO db_db7; +RESET ROLE; +DROP ROLE rol_db7; + +-- Should fail. ALTER DATABASE RENAME TO with OWNER rights without CREATEDB +BEGIN TRANSACTION; +CREATE ROLE rol_db8; +ALTER DATABASE regression OWNER TO rol_db8; +SET ROLE rol_db8; +ALTER DATABASE regression RENAME TO db_db8a; +ROLLBACK; + +-- Should fail. ALTER DATABASE SET / WITH with invalid values +ALTER DATABASE regression SET invalid_parameter; +ALTER DATABASE regression WITH CONNECTION LIMIT = -100; +ALTER DATABASE regression WITH CONNECTION LIMIT = 8ASDF; + +-- Should fail. ALTER DATABASE with redundant options +ALTER DATABASE regression WITH CONNECTION LIMIT 1 CONNECTION LIMIT 2; + +-- Should work. ALTER DATABASE SET / WITH with valid values +ALTER DATABASE regression WITH CONNECTION LIMIT = -1; +ALTER DATABASE regression WITH CONNECTION LIMIT = 0; +ALTER DATABASE regression WITH CONNECTION LIMIT = 100; +ALTER DATABASE regression SET SEED = 0.5; + +-- Should fail. Can't set Tablespace within transaction +BEGIN TRANSACTION; +ALTER DATABASE regression SET TABLESPACE pg_default; +ROLLBACK; + +-- Should work. ALTER DATABASE OWNER TO requires CREATEDB rights for grantor +BEGIN TRANSACTION; +CREATE ROLE rol_db15; +CREATE ROLE rol_db14 IN ROLE rol_db15; -- CREATE rol_db14 to be a member of rol_db15 +ALTER DATABASE regression OWNER TO rol_db14; +SET ROLE rol_db14; +ALTER DATABASE regression OWNER TO rol_db15; +ROLLBACK; + +-- Should fail. CREATE DATABASE with invalid values +CREATE DATABASE db_db18 ENCODING 'invalid_encoding'; +CREATE DATABASE db_db18 ENCODING 123456789; +CREATE DATABASE db_db18 CONNECTION LIMIT -10; +CREATE DATABASE db_db18 TEMPLATE invalid_template; +CREATE DATABASE regression; -- DATABASE already exists + +-- Should fail. CREATE DATABASE with redundant options +CREATE DATABASE db_db18 TABLESPACE tablespace_db18a TABLESPACE tablespace_db18b; +CREATE DATABASE db_db18 OWNER rol_db18a OWNER rol_db18b; +CREATE DATABASE db_db18 TEMPLATE template_db18a TEMPLATE template_db18b; +CREATE DATABASE db_db18 ENCODING 'UTF8' ENCODING 'UTF8'; +CREATE DATABASE db_db18 CONNECTION LIMIT 10 CONNECTION LIMIT 10; + +-- Should fail. CREATE DATABASE using non-template DB as template without SUPERUSER +CREATE ROLE rol_db19 CREATEDB; +CREATE DATABASE db_db19; +SET ROLE rol_db19; +CREATE DATABASE db_db20 TEMPLATE db_db19; +RESET ROLE; +DROP DATABASE db_db19; +DROP ROLE rol_db19; + +-- Should fail. Trying to CREATE / ALTER / DROP DATABASE without rights +CREATE ROLE rol_db21; +CREATE DATABASE db_db21; +SET ROLE rol_db21; +ALTER DATABASE regression SET TABLESPACE tablespace_db16; +CREATE DATABASE db_db21a; +ALTER DATABASE db_db21 OWNER TO rol_db21; +DROP DATABASE db_db21; +RESET ROLE; +DROP ROLE rol_db21; +DROP DATABASE db_db21; + +-- Should fail. CREATE / ALTER DATABASE should not have pg_global as TABLESPACE +CREATE DATABASE db_db22 TABLESPACE pg_global; +CREATE DATABASE db_db22a; +ALTER DATABASE db_db22a SET TABLESPACE pg_global; +DROP DATABASE db_db22a; + +-- Should work. ALTER DATABASE SET with bogus OWNER +BEGIN TRANSACTION; +ALTER DATABASE regression OWNER TO rol_db23_does_not_exist; +ROLLBACK; + +-- Should work. ALTER DATABASE SET OWNER to self! +BEGIN TRANSACTION; +CREATE ROLE rol_db24; +ALTER DATABASE regression OWNER TO rol_db24; +ALTER DATABASE regression OWNER TO rol_db24; -- Set OWNER TO previous OWNER +ROLLBACK;