• unknown's avatar
    Fix for bug #9486 "Can't perform multi-update in stored procedure". · 34983181
    unknown authored
    New more SP-locking friendly approach to handling locks in multi-update.
    Now we mark all tables of multi-update as needing write lock at parsing
    stage and if possible downgrade lock at execution stage (For its work
    SP-locking mechanism needs to know all lock types right after parsing
    stage).
    
    
    mysql-test/r/sp-threads.result:
      Added test for bug #9486 "Can't perform multi-update in stored procedure".
    mysql-test/t/sp-threads.test:
      Added test for bug #9486 "Can't perform multi-update in stored procedure".
    sql/sp_head.cc:
      SP_TABLE, sp_head::merge_table_list()/add_used_tables_to_table_list():
        Since some queries during their execution (e.g. multi-update)
        may change type of lock for some of their tables and thus change
        lock_type member for some of elements of table list, we should
        store type of lock in SP_TABLE struct explicitly instead of using
        lock_type member of TABLE_LIST object pointed by SP_TABLE::table.
    sql/sql_lex.h:
      Removed no longer used LEX::multi_lock_option member.
    sql/sql_prepare.cc:
      mysql_test_update():
        We don't need to bother about LEX::multi_lock_option if we convert
        multi-update to update anymore. Since nowdays multi-update uses 
        TABLE_LIST::lock_type for specifying lock level of updated tables
        instead of LEX::multi_lock_option.
    sql/sql_update.cc:
      mysql_update()/mysql_multi_update_prepare():
       Now we mark all tables of multi-update as needing write lock at parsing
       stage and if possible downgrade lock at execution stage. Old approach
       (don't set lock type until execution stage) was not working well with
       SP-locking (For its work SP-locking mechanism needs to know all lock 
       types right after parsing stage).
      
      mysql_multi_update():
        We should return FALSE if no error occurs.
    sql/sql_yacc.yy:
      update:
       Now we mark all tables of multi-update as needing write lock at parsing
       stage and if possible downgrade lock at execution stage. Old approach
       (don't set lock type until execution stage) was not working well with
       SP-locking (For its work SP-locking mechanism needs to know all lock 
       types right after parsing stage).
    34983181
sql_yacc.yy 215 KB