@@ -2969,4 +2969,175 @@ DROP ROLE test_role1;
29692969statement ok
29702970DROP ROLE test_role2;
29712971
2972+ # Ensure that if a role has the BYPASSRLS option or privilege set, that it's
2973+ # exempt from policies.
2974+ subtest bypassrls
2975+
2976+ statement ok
2977+ CREATE TABLE bypassrls (id INT PRIMARY KEY, val TEXT);
2978+
2979+ statement ok
2980+ CREATE USER bypassrls_user;
2981+
2982+ statement ok
2983+ GRANT ALL ON bypassrls TO bypassrls_user;
2984+
2985+ statement ok
2986+ ALTER TABLE bypassrls ENABLE ROW LEVEL SECURITY;
2987+
2988+ statement ok
2989+ CREATE POLICY pol1 ON bypassrls TO bypassrls_user USING (val like 'visible: %');
2990+
2991+ statement ok
2992+ CREATE FUNCTION insert_policy_violation_as_session_user(id INT) RETURNS TABLE(id INT, description TEXT)
2993+ LANGUAGE SQL AS
2994+ $$
2995+ INSERT INTO bypassrls VALUES (id, 'hidden: value') RETURNING id, val
2996+ $$;
2997+
2998+ # This function is like the above, except it will always be run as admin since
2999+ # it uses SECURITY DEFINER.
3000+ statement ok
3001+ CREATE FUNCTION insert_policy_violation_as_admin(id INT) RETURNS TABLE(id INT, description TEXT)
3002+ LANGUAGE SQL AS
3003+ $$
3004+ INSERT INTO bypassrls VALUES (id, 'hidden: value') RETURNING id, val
3005+ $$ SECURITY DEFINER;
3006+
3007+ statement ok
3008+ INSERT INTO bypassrls VALUES (0, 'visible: 0'), (1, 'hidden: 1'), (2, 'visible: 2');
3009+
3010+ query IT
3011+ SELECT * FROM insert_policy_violation_as_admin(10);
3012+ ----
3013+ 10 hidden: value
3014+
3015+ query IT
3016+ SELECT * FROM insert_policy_violation_as_session_user(11);
3017+ ----
3018+ 11 hidden: value
3019+
3020+ query IT
3021+ SELECT * FROM bypassrls ORDER BY id;
3022+ ----
3023+ 0 visible: 0
3024+ 1 hidden: 1
3025+ 2 visible: 2
3026+ 10 hidden: value
3027+ 11 hidden: value
3028+
3029+ statement ok
3030+ SET ROLE bypassrls_user;
3031+
3032+ query IT
3033+ SELECT * FROM bypassrls ORDER BY id;
3034+ ----
3035+ 0 visible: 0
3036+ 2 visible: 2
3037+
3038+ query IT
3039+ SELECT * FROM insert_policy_violation_as_admin(20);
3040+ ----
3041+ 20 hidden: value
3042+
3043+ statement error pq: new row violates row-level security policy for table "bypassrls"
3044+ SELECT * FROM insert_policy_violation_as_session_user(21);
3045+
3046+ statement ok
3047+ SET ROLE root;
3048+
3049+ statement error pq: conflicting role options
3050+ ALTER ROLE bypassrls_user BYPASSRLS NOBYPASSRLS;
3051+
3052+ statement ok
3053+ ALTER ROLE bypassrls_user BYPASSRLS;
3054+
3055+ statement ok
3056+ SET ROLE bypassrls_user;
3057+
3058+ query IT
3059+ SELECT * FROM bypassrls ORDER BY id;
3060+ ----
3061+ 0 visible: 0
3062+ 1 hidden: 1
3063+ 2 visible: 2
3064+ 10 hidden: value
3065+ 11 hidden: value
3066+ 20 hidden: value
3067+
3068+ query IT
3069+ SELECT * FROM insert_policy_violation_as_admin(30);
3070+ ----
3071+ 30 hidden: value
3072+
3073+ query IT
3074+ SELECT * FROM insert_policy_violation_as_session_user(31);
3075+ ----
3076+ 31 hidden: value
3077+
3078+ statement ok
3079+ SET ROLE root
3080+
3081+ statement ok
3082+ ALTER ROLE bypassrls_user NOBYPASSRLS;
3083+
3084+ statement ok
3085+ GRANT SYSTEM BYPASSRLS TO bypassrls_user;
3086+
3087+ query TTB colnames
3088+ SELECT * FROM [SHOW SYSTEM GRANTS] WHERE privilege_type = 'BYPASSRLS';
3089+ ----
3090+ grantee privilege_type is_grantable
3091+ bypassrls_user BYPASSRLS false
3092+
3093+ statement ok
3094+ SET ROLE bypassrls_user;
3095+
3096+ query IT
3097+ SELECT * FROM bypassrls ORDER BY id;
3098+ ----
3099+ 0 visible: 0
3100+ 1 hidden: 1
3101+ 2 visible: 2
3102+ 10 hidden: value
3103+ 11 hidden: value
3104+ 20 hidden: value
3105+ 30 hidden: value
3106+ 31 hidden: value
3107+
3108+ query IT
3109+ SELECT * FROM insert_policy_violation_as_session_user(40);
3110+ ----
3111+ 40 hidden: value
3112+
3113+ statement ok
3114+ SET ROLE root;
3115+
3116+ statement ok
3117+ REVOKE SYSTEM BYPASSRLS FROM bypassrls_user;
3118+
3119+ statement ok
3120+ SET ROLE bypassrls_user;
3121+
3122+ query IT
3123+ SELECT * FROM bypassrls ORDER BY id;
3124+ ----
3125+ 0 visible: 0
3126+ 2 visible: 2
3127+
3128+ statement error pq: new row violates row-level security policy for table "bypassrls"
3129+ SELECT * FROM insert_policy_violation_as_session_user(50);
3130+
3131+ statement ok
3132+ SET ROLE root;
3133+
3134+ statement ok
3135+ DROP FUNCTION insert_policy_violation_as_admin, insert_policy_violation_as_session_user
3136+
3137+ statement ok
3138+ DROP TABLE bypassrls;
3139+
3140+ statement ok
3141+ DROP USER bypassrls_user;
3142+
29723143subtest end
0 commit comments