• Jorgen Loland's avatar
    BUG#11882110: UPDATE REPORTS ER_KEY_NOT_FOUND IF TABLE IS · 8e35f7a8
    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.
    
    
    mysql-test/r/multi_update.result:
      Add test for bug#11882110
    mysql-test/r/multi_update_innodb.result:
      Add test for bug#11882110
    mysql-test/t/multi_update.test:
      Add test for bug#11882110
    mysql-test/t/multi_update_innodb.test:
      Add test for bug#11882110
    sql/sql_update.cc:
      unsafe_key_update() wrongly checked if the primary key index
      number was the same as updated column number. Now it is checked
      whether any of the columns making up the primary key is updated.
    sql/table.h:
      Fix comment on TABLE_SHARE::primary_key. Incorrect comment
      was introduced by an earlier merge conflict (as per dlenev)
    8e35f7a8
table.h 69.6 KB