• Alexander Barkov's avatar
    MDEV-32837 long unique does not work like unique key when using replace · 97fcafb9
    Alexander Barkov authored
    write_record() when performing REPLACE has an optimization:
    - if the unique violation happened in the last unique key, then do UPDATE
    - otherwise, do DELETE+INSERT
    
    This patch changes the way of detecting if this optimization
    can be applied if the table has long (hash based) unique
    (i.e. UNIQUE..USING HASH) constraints.
    
    Problem:
    
    The old condition did not take into account that
    TABLE_SHARE and TABLE see long uniques differently:
    - TABLE_SHARE sees as HA_KEY_ALG_LONG_HASH and HA_NOSAME
    - TABLE sees as usual non-unique indexes
    So the old condition could erroneously decide that the UPDATE optimization
    is possible when there are still some unique hash constraints in the table.
    
    Fix:
    
    - If the current key is a long unique, it now works as follows:
    
      UPDATE can be done if the current long unique is the last
      long unique, and there are no in-engine (normal) uniques.
    
    - For in-engine uniques nothing changes, it still works as before:
    
      If the current key is an in-engine (normal) unique:
      UPDATE can be done if it is the last normal unique.
    97fcafb9
sql_insert.cc 172 KB