• unknown's avatar
    Proposed fix for bug#24491 "using alias from source table in insert ... · 1dead07d
    unknown authored
    on duplicate key".
    
    INSERT ... SELECT ... ON DUPLICATE KEY UPDATE which was used in
    stored routine or as prepared statement and which in its ON DUPLICATE
    KEY clause erroneously tried to assign value to a column mentioned only
    in its SELECT part was properly emitting error on the first execution
    but succeeded on the second and following executions.
    
    Code which is responsible for name resolution of fields mentioned in
    UPDATE clause (e.g. see select_insert::prepare()) modifies table list
    and Name_resolution_context used in this process. It uses
    Name_resolution_context_state::save_state/restore_state() to revert
    these modifications. Unfortunately those two methods failed to revert
    properly modifications to TABLE_LIST::next_name_resolution_table
    and this broke name resolution process for successive executions.
    
    This patch fixes Name_resolution_context_state::save_state/restore_state()
    in such way that it properly handles TABLE_LIST::next_name_resolution_table.
    
    
    mysql-test/r/ps.result:
      Added test case for bug#24491 "using alias from source table in insert ...
      on duplicate key"
    mysql-test/r/sp-error.result:
      Added test case for bug#24491 "using alias from source table in insert ...
      on duplicate key"
    mysql-test/t/ps.test:
      Added test case for bug#24491 "using alias from source table in insert ...
      on duplicate key"
    mysql-test/t/sp-error.test:
      Added test case for bug#24491 "using alias from source table in insert ...
      on duplicate key"
    sql/item.h:
      Name_resolution_context::save_state/restore_state():
        At the moment these methods are used only by code implementing
        INSERT and INSERT ... SELECT statements. This code doesn't modify
       'next_name_resolution_table' member of table list element
        corresponding to the first table of SELECT clause (pointed by
        'first_name_resolution_table'). But it modifies table list element
        corresponding to the target table of INSERT (pointed by 'table_list')
        So these methods were changed to reflect this.
    1dead07d
item.h 79.3 KB