Hello, I checked the latest updatable security barrier view patch. Even though I couldn't find a major design problem in this revision, here are two minor comments below.
I think, it needs to be reviewed by committer to stick direction to implement this feature. Of course, even I know Tom argued the current design of this feature on the up-thread, it does not seem to me Dean's design is not reasonable. Below is minor comments of mine: @@ -932,9 +938,32 @@ inheritance_planner(PlannerInfo *root) if (final_rtable == NIL) final_rtable = subroot.parse->rtable; else - final_rtable = list_concat(final_rtable, + { + List *tmp_rtable = NIL; + ListCell *cell1, *cell2; + + /* + * Planning this new child may have turned some of the original + * RTEs into subqueries (if they had security barrier quals). If + * so, we want to use these in the final rtable. + */ + forboth(cell1, final_rtable, cell2, subroot.parse->rtable) + { + RangeTblEntry *rte1 = (RangeTblEntry *) lfirst(cell1); + RangeTblEntry *rte2 = (RangeTblEntry *) lfirst(cell2); + + if (rte1->rtekind == RTE_RELATION && + rte1->securityQuals != NIL && + rte2->rtekind == RTE_SUBQUERY) + tmp_rtable = lappend(tmp_rtable, rte2); + else + tmp_rtable = lappend(tmp_rtable, rte1); + } Do we have a case if rte1 is regular relation with securityQuals but rte2 is not a sub-query? If so, rte2->rtekind == RTE_SUBQUERY should be a condition in Assert, but the third condition in if-block. In case when a sub-query is simple enough; no qualifier and no projection towards underlying scan, is it pulled-up even if this sub-query has security-barrier attribute, isn't it? See the example below. The view v2 is defined as follows. postgres=# CREATE VIEW v2 WITH (security_barrier) AS SELECT * FROM t2 WHERE x % 10 = 5; CREATE VIEW postgres=# EXPLAIN SELECT * FROM v2 WHERE f_leak(z); QUERY PLAN --------------------------------------------------------- Subquery Scan on v2 (cost=0.00..3.76 rows=1 width=41) Filter: f_leak(v2.z) -> Seq Scan on t2 (cost=0.00..3.50 rows=1 width=41) Filter: ((x % 10) = 5) (4 rows) postgres=# EXPLAIN SELECT * FROM v2; QUERY PLAN --------------------------------------------------- Seq Scan on t2 (cost=0.00..3.50 rows=1 width=41) Filter: ((x % 10) = 5) (2 rows) The second explain result shows the underlying sub-query is pulled-up even though it has security-barrier attribute. (IIRC, it was a new feature in v9.3.) On the other hand, this kind of optimization was not applied on a sub-query being extracted from a relation with securityQuals postgres=# EXPLAIN UPDATE v2 SET z = z; QUERY PLAN -------------------------------------------------------------------- Update on t2 t2_1 (cost=0.00..3.51 rows=1 width=47) -> Subquery Scan on t2 (cost=0.00..3.51 rows=1 width=47) -> Seq Scan on t2 t2_2 (cost=0.00..3.50 rows=1 width=47) Filter: ((x % 10) = 5) (4 rows) If it has no security_barrier option, the view reference is extracted in the rewriter stage, it was pulled up as we expected. postgres=# ALTER VIEW v2 RESET (security_barrier); ALTER VIEW postgres=# EXPLAIN UPDATE t2 SET z = z; QUERY PLAN ----------------------------------------------------------- Update on t2 (cost=0.00..3.00 rows=100 width=47) -> Seq Scan on t2 (cost=0.00..3.00 rows=100 width=47) (2 rows) Probably, it misses something to be checked and applied when we extract a sub-query in prepsecurity.c. # BTW, which code does it pull up? pull_up_subqueries() is not. Thanks, > -----Original Message----- > From: pgsql-hackers-ow...@postgresql.org > [mailto:pgsql-hackers-ow...@postgresql.org] On Behalf Of Dean Rasheed > Sent: Thursday, January 23, 2014 7:06 PM > To: Kaigai, Kouhei(海外, 浩平) > Cc: Craig Ringer; Tom Lane; PostgreSQL Hackers; Kohei KaiGai; Robert Haas; > Simon Riggs > Subject: Re: [HACKERS] WIP patch (v2) for updatable security barrier views > > On 21 January 2014 09:18, Dean Rasheed <dean.a.rash...@gmail.com> wrote: > > Yes, please review the patch from 09-Jan > > > (http://www.postgresql.org/message-id/CAEZATCUiKxOg=vOOvjA2S6G-sixzzxg > 18totggp8zobq6qn...@mail.gmail.com). > > > > After further testing I found a bug --- it involves having a security barrier > view on top of a base relation that has a rule that rewrites the query to > have a different result relation, and possibly also a different command > type, so that the securityQuals are no longer on the result relation, which > is a code path not previously tested and the rowmark handling was wrong. > That's probably a pretty obscure case in the context of security barrier > views, but that code path would be used much more commonly if RLS were built > on top of this. Fortunately the fix is trivial --- updated patch attached. > > Regards, > Dean -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers