mirror of
https://github.com/postgres/postgres.git
synced 2026-01-13 12:22:55 +03:00
To ensure that "make installcheck" can be used safely against an existing installation, we need to be careful about what global object names (database, role, and tablespace names) we use; otherwise we might accidentally clobber important objects. There's been a weak consensus that test databases should have names including "regression", and that test role names should start with "regress_", but we didn't have any particular rule about tablespace names; and neither of the other rules was followed with any consistency either. This commit moves us a long way towards having a hard-and-fast rule that regression test databases must have names including "regression", and that test role and tablespace names must start with "regress_". It's not completely there because I did not touch some test cases in rolenames.sql that test creation of special role names like "session_user". That will require some rethinking of exactly what we want to test, whereas the intent of this patch is just to hit all the cases in which the needed renamings are cosmetic. There is no enforcement mechanism in this patch either, but if we don't add one we can expect that the tests will soon be violating the convention again. Again, that's not such a cosmetic change and it will require discussion. (But I did use a quick-hack enforcement patch to find these cases.) Discussion: <16638.1468620817@sss.pgh.pa.us>
118 lines
3.6 KiB
PL/PgSQL
118 lines
3.6 KiB
PL/PgSQL
--
|
|
-- DEPENDENCIES
|
|
--
|
|
|
|
CREATE USER regress_dep_user;
|
|
CREATE USER regress_dep_user2;
|
|
CREATE USER regress_dep_user3;
|
|
CREATE GROUP regress_dep_group;
|
|
|
|
CREATE TABLE deptest (f1 serial primary key, f2 text);
|
|
|
|
GRANT SELECT ON TABLE deptest TO GROUP regress_dep_group;
|
|
GRANT ALL ON TABLE deptest TO regress_dep_user, regress_dep_user2;
|
|
|
|
-- can't drop neither because they have privileges somewhere
|
|
DROP USER regress_dep_user;
|
|
DROP GROUP regress_dep_group;
|
|
|
|
-- if we revoke the privileges we can drop the group
|
|
REVOKE SELECT ON deptest FROM GROUP regress_dep_group;
|
|
DROP GROUP regress_dep_group;
|
|
|
|
-- can't drop the user if we revoke the privileges partially
|
|
REVOKE SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES ON deptest FROM regress_dep_user;
|
|
DROP USER regress_dep_user;
|
|
|
|
-- now we are OK to drop him
|
|
REVOKE TRIGGER ON deptest FROM regress_dep_user;
|
|
DROP USER regress_dep_user;
|
|
|
|
-- we are OK too if we drop the privileges all at once
|
|
REVOKE ALL ON deptest FROM regress_dep_user2;
|
|
DROP USER regress_dep_user2;
|
|
|
|
-- can't drop the owner of an object
|
|
-- the error message detail here would include a pg_toast_nnn name that
|
|
-- is not constant, so suppress it
|
|
\set VERBOSITY terse
|
|
ALTER TABLE deptest OWNER TO regress_dep_user3;
|
|
DROP USER regress_dep_user3;
|
|
|
|
\set VERBOSITY default
|
|
-- if we drop the object, we can drop the user too
|
|
DROP TABLE deptest;
|
|
DROP USER regress_dep_user3;
|
|
|
|
-- Test DROP OWNED
|
|
CREATE USER regress_dep_user0;
|
|
CREATE USER regress_dep_user1;
|
|
CREATE USER regress_dep_user2;
|
|
SET SESSION AUTHORIZATION regress_dep_user0;
|
|
-- permission denied
|
|
DROP OWNED BY regress_dep_user1;
|
|
DROP OWNED BY regress_dep_user0, regress_dep_user2;
|
|
REASSIGN OWNED BY regress_dep_user0 TO regress_dep_user1;
|
|
REASSIGN OWNED BY regress_dep_user1 TO regress_dep_user0;
|
|
-- this one is allowed
|
|
DROP OWNED BY regress_dep_user0;
|
|
|
|
CREATE TABLE deptest1 (f1 int unique);
|
|
GRANT ALL ON deptest1 TO regress_dep_user1 WITH GRANT OPTION;
|
|
|
|
SET SESSION AUTHORIZATION regress_dep_user1;
|
|
CREATE TABLE deptest (a serial primary key, b text);
|
|
GRANT ALL ON deptest1 TO regress_dep_user2;
|
|
RESET SESSION AUTHORIZATION;
|
|
\z deptest1
|
|
|
|
DROP OWNED BY regress_dep_user1;
|
|
-- all grants revoked
|
|
\z deptest1
|
|
-- table was dropped
|
|
\d deptest
|
|
|
|
-- Test REASSIGN OWNED
|
|
GRANT ALL ON deptest1 TO regress_dep_user1;
|
|
GRANT CREATE ON DATABASE regression TO regress_dep_user1;
|
|
|
|
SET SESSION AUTHORIZATION regress_dep_user1;
|
|
CREATE SCHEMA deptest;
|
|
CREATE TABLE deptest (a serial primary key, b text);
|
|
ALTER DEFAULT PRIVILEGES FOR ROLE regress_dep_user1 IN SCHEMA deptest
|
|
GRANT ALL ON TABLES TO regress_dep_user2;
|
|
CREATE FUNCTION deptest_func() RETURNS void LANGUAGE plpgsql
|
|
AS $$ BEGIN END; $$;
|
|
CREATE TYPE deptest_enum AS ENUM ('red');
|
|
CREATE TYPE deptest_range AS RANGE (SUBTYPE = int4);
|
|
|
|
CREATE TABLE deptest2 (f1 int);
|
|
-- make a serial column the hard way
|
|
CREATE SEQUENCE ss1;
|
|
ALTER TABLE deptest2 ALTER f1 SET DEFAULT nextval('ss1');
|
|
ALTER SEQUENCE ss1 OWNED BY deptest2.f1;
|
|
|
|
-- When reassigning ownership of a composite type, its pg_class entry
|
|
-- should match
|
|
CREATE TYPE deptest_t AS (a int);
|
|
SELECT typowner = relowner
|
|
FROM pg_type JOIN pg_class c ON typrelid = c.oid WHERE typname = 'deptest_t';
|
|
|
|
RESET SESSION AUTHORIZATION;
|
|
REASSIGN OWNED BY regress_dep_user1 TO regress_dep_user2;
|
|
\dt deptest
|
|
|
|
SELECT typowner = relowner
|
|
FROM pg_type JOIN pg_class c ON typrelid = c.oid WHERE typname = 'deptest_t';
|
|
|
|
-- doesn't work: grant still exists
|
|
DROP USER regress_dep_user1;
|
|
DROP OWNED BY regress_dep_user1;
|
|
DROP USER regress_dep_user1;
|
|
|
|
\set VERBOSITY terse
|
|
DROP USER regress_dep_user2;
|
|
DROP OWNED BY regress_dep_user2, regress_dep_user0;
|
|
DROP USER regress_dep_user2;
|
|
DROP USER regress_dep_user0;
|