blob: f14b33d794bc4b61abe88e686c9560f3c0ee87a8 [file] [log] [blame]
--
-- ROLE
--
--
-- Test setting roles per-user and per user in a database.
--
-- This also covers an old bug with dispatching GUCs with units in ALTER ROLE
-- statement (MPP-15479).
--
DROP ROLE IF EXISTS role_setting_test_1;
DROP ROLE IF EXISTS role_setting_test_2;
DROP ROLE IF EXISTS role_setting_test_3;
DROP ROLE IF EXISTS role_setting_test_4;
DROP ROLE IF EXISTS role_setting_test_5;
DROP ROLE IF EXISTS role_setting_test_6;
CREATE ROLE role_setting_test_1 NOLOGIN;
CREATE ROLE role_setting_test_2 NOLOGIN;
CREATE ROLE role_setting_test_3 NOLOGIN;
CREATE ROLE role_setting_test_4 NOLOGIN;
CREATE ROLE role_setting_test_5 NOLOGIN;
CREATE ROLE role_setting_test_6 NOLOGIN;
CREATE SCHEMA common_schema;
/* Alter Role Set, with a GUC with units (statement_mem) and not (search_path) */
ALTER ROLE role_setting_test_1 SET statement_mem TO '150MB';
ALTER ROLE role_setting_test_1 SET search_path = common_schema;
ALTER ROLE role_setting_test_2 IN DATABASE regression SET statement_mem TO '150MB';
ALTER ROLE role_setting_test_2 IN DATABASE regression SET search_path = common_schema;
/* Alter Role Reset */
ALTER ROLE role_setting_test_3 SET statement_mem TO '150MB';
ALTER ROLE role_setting_test_3 IN DATABASE regression SET statement_mem TO '150MB';
ALTER ROLE role_setting_test_3 SET search_path = common_schema;
ALTER ROLE role_setting_test_3 IN DATABASE regression SET search_path = common_schema;
ALTER ROLE role_setting_test_3 RESET statement_mem;
ALTER ROLE role_setting_test_3 IN DATABASE regression RESET search_path;
/* Alter Role Reset All */
ALTER ROLE role_setting_test_5 SET statement_mem TO '150MB';
ALTER ROLE role_setting_test_5 IN DATABASE regression SET statement_mem TO '150MB';
ALTER ROLE role_setting_test_6 SET statement_mem TO '150MB';
ALTER ROLE role_setting_test_6 IN DATABASE regression SET statement_mem TO '150MB';
ALTER ROLE role_setting_test_5 RESET ALL;
ALTER ROLE role_setting_test_6 IN DATABASE regression RESET ALL;
\drds role_setting_test_*
-- Note: Don't drop the test roles, so that they get tested with pg_dump/restore, too,
-- if you dump the regression database.
create role superuser;
create role u1;
set role superuser;
create table t1(a int, b int constraint c check (b>=100));
create view t1_view as select * from t1;
grant all privileges on t1, t1_view to u1;
set role superuser;
revoke all privileges on TABLE t1, t1_view FROM u1;
set role u1;
select * from t1_view order by 1;
reset role;
drop view t1_view;
drop table t1;
drop role u1;
drop role superuser;
-- Test creating user who has been renamed before.
CREATE USER jonathan11 WITH PASSWORD 'abc1';
CREATE USER jonathan12 WITH PASSWORD 'abc2';
ALTER USER jonathan11 RENAME TO jona11;
ALTER USER jonathan12 RENAME TO jona12;
DROP USER jona11;
DROP USER jona12;
CREATE USER jonathan12 WITH PASSWORD 'abc2';
ALTER USER jonathan11 RENAME TO jona11;
ALTER USER jonathan12 RENAME TO jona12;
CREATE GROUP marketing WITH USER jona11,jona12;
ALTER GROUP marketing RENAME TO market;
DROP GROUP market;
DROP USER jona11;
DROP USER jona12;
-- Test that a non-superuser cannot use ALTER USER RESET ALL to reset
-- superuser-only GUCs. (A bug that was fixed in PostgreSQL commit
-- e429448f33.)
-- First, drop old user, if it was left over from previous run of this test.
set client_min_messages='warning';
drop role if exists guctestrole;
reset client_min_messages;
-- Create a user with two per-user settings. One is superuser-only,
-- and another is not.
create user guctestrole;
alter user guctestrole set zero_damaged_pages=off; -- PGC_SUSET
alter user guctestrole set application_name='test'; -- PGC_USERSET
select rolconfig from pg_roles where rolname = 'guctestrole';
-- Switch to non-superuser role, and issue ALTER USER RESET ALL.
-- It should clear the 'application_name' setting, but not the
-- 'zero_damaged_pages' setting, because it's superuser-only.
set role guctestrole;
alter user guctestrole reset all;
select rolconfig from pg_roles where rolname = 'guctestrole';
reset role;
-- Test ALTER USER ALL
BEGIN;
ALTER USER ALL SET application_name TO 'alter_user_all_test';
ALTER USER ALL RESET ALL;
ROLLBACK;
-- Various syntax for GRANT/REVOKE with ONLY keywords.
-- Only cover syntax correctness here, the actual grant behavior
-- for ONLY is tested in partition.sql
create table grant_only_syntax1 (a int);
create table grant_only_syntax2 (a int);
create role test_role;
-- These should all work
grant select on table grant_only_syntax1, grant_only_syntax2 to test_role;
grant select on table only grant_only_syntax1, grant_only_syntax2 to test_role;
grant select on table grant_only_syntax1, only grant_only_syntax2 to test_role;
grant select on table only grant_only_syntax1, only grant_only_syntax2 to test_role;
grant select on grant_only_syntax1, grant_only_syntax2 to test_role;
grant select on only grant_only_syntax1, grant_only_syntax2 to test_role;
grant select on grant_only_syntax1, only grant_only_syntax2 to test_role;
grant select on only grant_only_syntax1, only grant_only_syntax2 to test_role;
revoke select on table grant_only_syntax1, grant_only_syntax2 from test_role;
revoke select on table only grant_only_syntax1, grant_only_syntax2 from test_role;
revoke select on table grant_only_syntax1, only grant_only_syntax2 from test_role;
revoke select on table only grant_only_syntax1, only grant_only_syntax2 from test_role;
revoke select on grant_only_syntax1, grant_only_syntax2 from test_role;
revoke select on only grant_only_syntax1, grant_only_syntax2 from test_role;
revoke select on grant_only_syntax1, only grant_only_syntax2 from test_role;
revoke select on only grant_only_syntax1, only grant_only_syntax2 from test_role;
drop table grant_only_syntax1;
drop table grant_only_syntax2;
drop role test_role;
-- should be able to create gp_ roles, but not pg_ ones
drop role if exists gp_regresstestrole;
create role gp_regresstestrole;
create role pg_regresstestrole;