@@ -1280,6 +1280,124 @@ DROP FUNCTION my_non_sec_definer_reader_function;
1280
1280
statement ok
1281
1281
DROP TABLE sensitive_data_table CASCADE;
1282
1282
1283
+ subtest alter_policy
1284
+
1285
+ statement ok
1286
+ CREATE TABLE alter_policy_table (c1 INT NOT NULL PRIMARY KEY, c2 TEXT, FAMILY (c1, c2));
1287
+
1288
+ statement ok
1289
+ ALTER TABLE alter_policy_table ENABLE ROW LEVEL SECURITY, FORCE ROW LEVEL SECURITY;
1290
+
1291
+ statement ok
1292
+ CREATE ROLE alter_policy_role;
1293
+
1294
+ statement ok
1295
+ CREATE ROLE aux1;
1296
+
1297
+ statement ok
1298
+ CREATE USER aux2;
1299
+
1300
+ statement ok
1301
+ CREATE SEQUENCE seq1;
1302
+
1303
+ statement ok
1304
+ GRANT ALL ON seq1 TO alter_policy_role;
1305
+
1306
+ statement ok
1307
+ ALTER TABLE alter_policy_table OWNER TO alter_policy_role;
1308
+
1309
+ statement ok
1310
+ SET ROLE alter_policy_role;
1311
+
1312
+ statement ok
1313
+ CREATE POLICY p ON alter_policy_table FOR INSERT WITH CHECK (false);
1314
+
1315
+ statement error pq: new row violates row-level security policy for table "alter_policy_table"
1316
+ INSERT INTO alter_policy_table VALUES (1, 'one'), (2, 'two'), (3, 'three');
1317
+
1318
+ statement error pq: only WITH CHECK expression allowed for INSERT
1319
+ ALTER POLICY p ON alter_policy_table USING (true);
1320
+
1321
+ statement ok
1322
+ ALTER POLICY p ON alter_policy_table WITH CHECK (nextval('seq1') < 10000);
1323
+
1324
+ statement ok
1325
+ INSERT INTO alter_policy_table VALUES (1, 'one'), (2, 'two'), (3, 'three');
1326
+
1327
+ query I
1328
+ SELECT c1 FROM alter_policy_table ORDER BY c1;
1329
+ ----
1330
+
1331
+ statement ok
1332
+ ALTER POLICY p ON alter_policy_table RENAME TO p_ins;
1333
+
1334
+ statement ok
1335
+ CREATE POLICY p ON alter_policy_table FOR SELECT TO aux1 USING (c1 > 0);
1336
+
1337
+ query I
1338
+ SELECT c1 FROM alter_policy_table ORDER BY c1;
1339
+ ----
1340
+
1341
+ statement error pq: policy "p_sel" for table "alter_policy_table" does not exist
1342
+ ALTER POLICY p_sel ON alter_policy_table WITH CHECK (true);
1343
+
1344
+ statement error pq: WITH CHECK cannot be applied to SELECT or DELETE
1345
+ ALTER POLICY p ON alter_policy_table WITH CHECK (true);
1346
+
1347
+ statement ok
1348
+ ALTER POLICY p ON alter_policy_table TO alter_policy_role,aux1,aux2 USING (c1 != 1);
1349
+
1350
+ query I
1351
+ SELECT c1 FROM alter_policy_table ORDER BY c1;
1352
+ ----
1353
+ 2
1354
+ 3
1355
+
1356
+ statement ok
1357
+ ALTER POLICY p ON alter_policy_table RENAME TO p_sel;
1358
+
1359
+ query TT
1360
+ SHOW CREATE TABLE alter_policy_table;
1361
+ ----
1362
+ alter_policy_table CREATE TABLE public.alter_policy_table (
1363
+ c1 INT8 NOT NULL,
1364
+ c2 STRING NULL,
1365
+ CONSTRAINT alter_policy_table_pkey PRIMARY KEY (c1 ASC),
1366
+ FAMILY fam_0_c1_c2 (c1, c2)
1367
+ );
1368
+ ALTER TABLE public.alter_policy_table ENABLE ROW LEVEL SECURITY, FORCE ROW LEVEL SECURITY;
1369
+ CREATE POLICY p_ins ON public.alter_policy_table AS PERMISSIVE FOR INSERT TO public WITH CHECK (nextval('public.seq1'::REGCLASS) < 10000:::INT8);
1370
+ CREATE POLICY p_sel ON public.alter_policy_table AS PERMISSIVE FOR SELECT TO aux1, alter_policy_role, aux2 USING (c1 != 1:::INT8)
1371
+
1372
+ # TODO(143358): Include roles in the SHOW POLICIES output.
1373
+ query TTTTT colnames
1374
+ SELECT name,cmd,type,using_expr,with_check_expr
1375
+ FROM [SHOW POLICIES FOR alter_policy_table]
1376
+ ORDER BY name DESC;
1377
+ ----
1378
+ name cmd type using_expr with_check_expr
1379
+ p_sel SELECT permissive c1 != 1:::INT8 ·
1380
+ p_ins INSERT permissive · nextval('public.seq1'::REGCLASS) < 10000:::INT8
1381
+
1382
+ statement ok
1383
+ SET ROLE root;
1384
+
1385
+ statement error pq: cannot drop sequence seq1 because other objects depend on it
1386
+ DROP SEQUENCE seq1;
1387
+
1388
+ # Change the policy so there isn't a dependency on seq1 anymore.
1389
+ statement ok
1390
+ ALTER POLICY p_ins ON alter_policy_table WITH CHECK (true);
1391
+
1392
+ statement ok
1393
+ DROP SEQUENCE seq1;
1394
+
1395
+ statement ok
1396
+ DROP TABLE alter_policy_table;
1397
+
1398
+ statement ok
1399
+ DROP ROLE alter_policy_role, aux1, aux2;
1400
+
1283
1401
# Verify that you need to be the table owner to do any of the RLS DDLs
1284
1402
subtest table_owner_and_rls_ddl
1285
1403
@@ -1313,14 +1431,14 @@ DROP POLICY p1 on table_owner_test;
1313
1431
statement ok
1314
1432
CREATE POLICY new_p1 on table_owner_test;
1315
1433
1316
- statement error pq: unimplemented: ALTER POLICY is not yet implemented
1434
+ statement ok
1317
1435
ALTER POLICY new_p1 on table_owner_test RENAME TO p1;
1318
1436
1319
- statement error pq: unimplemented: ALTER POLICY is not yet implemented
1437
+ statement ok
1320
1438
ALTER POLICY p1 on table_owner_test RENAME TO new_p1;
1321
1439
1322
- statement error pq: unimplemented: ALTER POLICY is not yet implemented
1323
- ALTER POLICY p1 on table_owner_test USING (true);
1440
+ statement ok
1441
+ ALTER POLICY new_p1 on table_owner_test USING (true);
1324
1442
1325
1443
statement ok
1326
1444
SET ROLE nontab_owner;
@@ -1337,10 +1455,10 @@ CREATE POLICY p2 on table_owner_test;
1337
1455
statement error pq: must be owner of relation table_owner_test
1338
1456
DROP POLICY new_p1 on table_owner_test;
1339
1457
1340
- statement error pq: unimplemented: ALTER POLICY is not yet implemented
1458
+ statement error pq: must be owner of relation table_owner_test
1341
1459
ALTER POLICY new_p1 on table_owner_test WITH CHECK (true);
1342
1460
1343
- statement error pq: unimplemented: ALTER POLICY is not yet implemented
1461
+ statement error pq: must be owner of relation table_owner_test
1344
1462
ALTER POLICY new_p1 on table_owner_test RENAME TO p1;
1345
1463
1346
1464
statement ok
@@ -2634,12 +2752,9 @@ query I
2634
2752
UPDATE cnt SET counter = counter + 1 RETURNING counter;
2635
2753
----
2636
2754
2637
- # Now replace the UPDATE policy with one that allows everything.
2755
+ # Now alter the UPDATE policy with one that allows everything.
2638
2756
statement ok
2639
- DROP POLICY upd1 ON cnt;
2640
-
2641
- statement ok
2642
- CREATE POLICY upd1 ON cnt FOR UPDATE USING (true);
2757
+ ALTER POLICY upd1 ON cnt USING (true);
2643
2758
2644
2759
query I
2645
2760
UPDATE cnt SET counter = counter + 1 RETURNING counter;
@@ -2648,10 +2763,7 @@ UPDATE cnt SET counter = counter + 1 RETURNING counter;
2648
2763
2649
2764
# Update the UPDATE policy so that it allows old rows but blocks all new rows.
2650
2765
statement ok
2651
- DROP POLICY upd1 ON cnt;
2652
-
2653
- statement ok
2654
- CREATE POLICY upd1 ON cnt FOR UPDATE USING (true) WITH CHECK (false);
2766
+ ALTER POLICY upd1 ON cnt USING (true) WITH CHECK (false);
2655
2767
2656
2768
# We are able to read the row but cannot write a new row as it violates the
2657
2769
# update policy.
@@ -2673,10 +2785,7 @@ select counter from cnt;
2673
2785
2674
2786
# Now change the select policy to be always false, and delete policy to be always true.
2675
2787
statement ok
2676
- DROP POLICY sel1 ON cnt;
2677
-
2678
- statement ok
2679
- CREATE POLICY sel1 ON cnt FOR SELECT USING (false);
2788
+ ALTER POLICY sel1 ON cnt USING (false);
2680
2789
2681
2790
statement ok
2682
2791
CREATE POLICY del1 ON cnt FOR DELETE USING (true);
0 commit comments