• Jorgen Loland's avatar
    BUG#11882110: UPDATE REPORTS ER_KEY_NOT_FOUND IF TABLE IS · ebe94178
    Jorgen Loland authored
                  UPDATED TWICE
    
    For multi update it is not allowed to update a column
    of a table if that table is accessed through multiple aliases
    and either
    1) the updated column is used as partitioning key
    2) the updated column is part of the primary key 
       and the primary key is clustered
    
    This check is done in unsafe_key_update().
    
    The bug was that for case 2), it was checked whether
    updated_column_number == table_share->primary_key 
    However, the primary_key variable is the index number of the 
    primary key, not a column number.
    
    Prior to this bugfix, the first column was wrongly believed to be
    the primary key. The columns covered by an index is found in
    table->key_info[idx_number]->key_part. The bugfix is to check if
    any of the columns in the keyparts of the primary key are
    updated.
    
    The user-visible effect is that for storage engines with
    clustered primary key (e.g. InnoDB but not MyISAM) queries
    like 
    "UPDATE t1 AS A JOIN t2 AS B SET A.primkey=..."
    will now error with 
    "ERROR HY000: Primary key/partition key update is not allowed 
    since the table is updated both as 'A' and 'B'." 
    instead of 
    "ERROR 1032 (HY000): Can't find record in 't1_tb'"
    even if primkey is not the first column in the table. This 
    was the intended behavior of bugfix 11764529.
    ebe94178
multi_update.test 22.3 KB