On 10/10/17 17:22, Aleksander Alekseev wrote: > Hi Petr, > >> let me start by saying that my view is that this is simply a >> documentation bug. Meaning that I didn't document that it does not work, >> but I also never intended it to work. Main reason is that we can't >> support the semantics of "UPDATE OF" correctly (see bellow). And I think >> it's better to not support something at all rather than making it behave >> differently in different cases. >> >> Now about the proposed patch, I don't think this is correct way to >> support this as it will only work when either PRIMARY KEY column was >> changed or when REPLICA IDENTITY is set to FULL for the table. And even >> then it will have very different semantics from how it works when the >> row is updated by SQL statement (all non-toasted columns will be >> reported as changed regardless of actually being changed or not). >> >> The more proper way to do this would be to run data comparison of the >> new tuple and the existing tuple values which a) will have different >> behavior than normal "UPDATE OF" triggers have because we still can't >> tell what columns were mentioned in the original query and b) will not >> exactly help performance (and perhaps c) one can write the trigger to >> behave this way already without impacting all other use-cases). > > I personally think that solution proposed by Masahiko is much better > than current behavior.
Well the proposed patch adds inconsistent behavior - if in your test you'd change the trigger to be UPDATE OF v instead of k and updated v, it would still not be triggered even with this patch. That's IMHO worse than current behavior which at least consistently doesn't work. > We could document current limitations you've > mentioned and probably add a corresponding warning during execution of > ALTER TABLE ... ENABLE REPLICA TRIGGER. I don't insist on this > particular approach though. > > What I really don't like is that PostgreSQL allows to create something > that supposedly should work but in fact doesn't. Such behavior is > obviously a bug. So as an alternative we could just return an error in > response to ALTER TABLE ... ENABLE REPLICA TRIGGER query for triggers > that we know will never be executed. > Well ENABLE REPLICA is not specific to builtin logical replication though. It only depends on the value of session_replication_role GUC. Any session can set that and if that session executes SQL the UPDATE OF triggers will work as expected. It's similar situation to statement triggers IMHO, we allow ENABLE REPLICA statement triggers but they are not triggered by logical replication because there is no statement. And given that UPDATE OF also depends on statement to work as expected (it's specified to be triggered for columns listed in the statement, not for what has been actually changed by the execution) I don't really see the difference between this and statement triggers except that statement trigger behavior is documented. I understand that it's somewhat confusing and I am not saying it's ideal, but I don't see any other behavior that would work for what your test tries to do and still be consistent with rest of the system. -- Petr Jelinek http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services -- Sent via pgsql-hackers mailing list (firstname.lastname@example.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers