• Peter Eisentraut's avatar
    Fix optimization of foreign-key on update actions · 1ffa59a8
    Peter Eisentraut authored
    In RI_FKey_pk_upd_check_required(), we check among other things
    whether the old and new key are equal, so that we don't need to run
    cascade actions when nothing has actually changed.  This was using the
    equality operator.  But the effect of this is that if a value in the
    primary key is changed to one that "looks" different but compares as
    equal, the update is not propagated.  (Examples are float -0 and 0 and
    case-insensitive text.)  This appears to violate the SQL standard, and
    it also behaves inconsistently if in a multicolumn key another key is
    also updated that would cause the row to compare as not equal.
    
    To fix, if we are looking at the PK table in ri_KeysEqual(), then do a
    bytewise comparison similar to record_image_eq() instead of using the
    equality operators.  This only makes a difference for ON UPDATE
    CASCADE, but for consistency we treat all changes to the PK the same.  For
    the FK table, we continue to use the equality operators.
    
    Discussion: https://www.postgresql.org/message-id/flat/3326fc2e-bc02-d4c5-e3e5-e54da466e89a@2ndquadrant.com
    1ffa59a8
foreign_key.sql 49.7 KB