> On Dec 13, 2021, at 10:18 PM, Jeff Davis <pg...@j-davis.com> wrote:
> 
>>    This is implemented but I still need to update the documentation
>> before
>>    posting.
> 
> We also discussed how much of the insert path we want to include in the
> apply worker. The immediate need is for the patch to support RLS, but
> it raised the question: "why not just use the entire ExecInsert()
> path?".

I went a different direction with this.  The need is to prevent non-superuser 
subscription owners from *circumventing* RLS.  For this patch set, I'm just 
checking whether RLS should be enforced against the subscription owner, and if 
so, raising an ERROR, same as for a privilege violation.  This should be 
sufficient in practice, as the table owner, roles with bypassrls privilege, and 
superusers should still be able to replicate into an RLS enabled table.

The problem with actually *supporting* RLS is that the current logical 
replication implementation is a mix of different practical (rather than 
theoretical) design choices.  After working to get RLS working as part of that, 
I became concerned that there may be subtle differences between how I was 
making RLS work in logical replication vs. how it works for regular 
inserts/updates/deletes.  Rather than create a mess that would need to be 
supported going forward, I bailed out and just forbade it.

As far as completeness and a clean implementation (but not performance) are 
concerned, using ExecInsert is quite appealing.  I think that would require 
reworking the logical replication protocol to send more than one row at a time, 
so that the overhead of such a choice is not paid *per row*.  That seems quite 
out of scope for this release cycle, though.

—
Mark Dilger
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company





Reply via email to