mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Disallow converting a table to a view if row security is present.
When DefineQueryRewrite() is about to convert a table to a view, it checks the table for features unavailable to views. For example, it rejects tables having triggers. It omits to reject tables having relrowsecurity or a pg_policy record. Fix that. To faciliate the repair, invent relation_has_policies() which indicates the presence of policies on a relation even when row security is disabled for that relation. Reported by Noah Misch. Patch by me, review by Stephen Frost. Back-patch to 9.5 where RLS was introduced.
This commit is contained in:
@ -2997,6 +2997,29 @@ DROP ROLE bob; -- succeeds
|
||||
ROLLBACK TO q;
|
||||
ROLLBACK; -- cleanup
|
||||
--
|
||||
-- Converting table to view
|
||||
--
|
||||
BEGIN;
|
||||
SET ROW_SECURITY = FORCE;
|
||||
CREATE TABLE t (c int);
|
||||
CREATE POLICY p ON t USING (c % 2 = 1);
|
||||
ALTER TABLE t ENABLE ROW LEVEL SECURITY;
|
||||
SAVEPOINT q;
|
||||
CREATE RULE "_RETURN" AS ON SELECT TO t DO INSTEAD
|
||||
SELECT * FROM generate_series(1,5) t0(c); -- fails due to row level security enabled
|
||||
ERROR: could not convert table "t" to a view because it has row security enabled
|
||||
ROLLBACK TO q;
|
||||
ALTER TABLE t DISABLE ROW LEVEL SECURITY;
|
||||
SAVEPOINT q;
|
||||
CREATE RULE "_RETURN" AS ON SELECT TO t DO INSTEAD
|
||||
SELECT * FROM generate_series(1,5) t0(c); -- fails due to policy p on t
|
||||
ERROR: could not convert table "t" to a view because it has row security policies
|
||||
ROLLBACK TO q;
|
||||
DROP POLICY p ON t;
|
||||
CREATE RULE "_RETURN" AS ON SELECT TO t DO INSTEAD
|
||||
SELECT * FROM generate_series(1,5) t0(c); -- succeeds
|
||||
ROLLBACK;
|
||||
--
|
||||
-- Clean up objects
|
||||
--
|
||||
RESET SESSION AUTHORIZATION;
|
||||
|
@ -1260,6 +1260,31 @@ ROLLBACK TO q;
|
||||
|
||||
ROLLBACK; -- cleanup
|
||||
|
||||
--
|
||||
-- Converting table to view
|
||||
--
|
||||
BEGIN;
|
||||
SET ROW_SECURITY = FORCE;
|
||||
CREATE TABLE t (c int);
|
||||
CREATE POLICY p ON t USING (c % 2 = 1);
|
||||
ALTER TABLE t ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
SAVEPOINT q;
|
||||
CREATE RULE "_RETURN" AS ON SELECT TO t DO INSTEAD
|
||||
SELECT * FROM generate_series(1,5) t0(c); -- fails due to row level security enabled
|
||||
ROLLBACK TO q;
|
||||
|
||||
ALTER TABLE t DISABLE ROW LEVEL SECURITY;
|
||||
SAVEPOINT q;
|
||||
CREATE RULE "_RETURN" AS ON SELECT TO t DO INSTEAD
|
||||
SELECT * FROM generate_series(1,5) t0(c); -- fails due to policy p on t
|
||||
ROLLBACK TO q;
|
||||
|
||||
DROP POLICY p ON t;
|
||||
CREATE RULE "_RETURN" AS ON SELECT TO t DO INSTEAD
|
||||
SELECT * FROM generate_series(1,5) t0(c); -- succeeds
|
||||
ROLLBACK;
|
||||
|
||||
--
|
||||
-- Clean up objects
|
||||
--
|
||||
|
Reference in New Issue
Block a user