• unknown's avatar
    Fix for bug #11158 "Can't perform multi-delete in stored procedure". · 4e0bbc1b
    unknown authored
    In order to make multi-delete SP friendly we need to have all table 
    locks for the elements of main statement table list properly set 
    at the end of parsing.
    
    Also performed small cleanup: We don't need relink_tables_for_multidelete()
    any longer since the only case now when TABLE_LIST::correspondent_table
    is non-zero are tables in auxilary table list of multi-delete and these
    tables are handled specially in mysql_multi_delete_prepare().
    
    
    mysql-test/r/sp-threads.result:
      Added test case for bug #11158 "Can't perform multi-delete in stored
      procedure".
    mysql-test/t/sp-threads.test:
      Added test case for bug #11158 "Can't perform multi-delete in stored
      procedure".
    sql/mysql_priv.h:
      - Removed third argument from the declaration of multi_delete_precheck()
        as nowdays we calculate number of tables in multi-delete from which
        we are going to delete rows right at the end of statement parsing.
      - Introduced definition of multi_delete_set_locks_and_link_aux_tables()
        which is responsible for propagation of proper table locks from
        multi-delete's auxilary table list to the main list and binding
        corresponding tables in these two lists.
    sql/sql_base.cc:
      Removed relink_tables_for_multidelete() routine and its invocations.
      We don't need them in 5.0 since the only case now when
      TABLE_LIST::correspondent_table is non-zero are tables in auxilary table
      list of multi-delete and these tables are handled specially in
      mysql_multi_delete_prepare().
    sql/sql_lex.h:
      LEX::table_count
        Added description of new role of this LEX member for multi-delete. 
        Now for this statement we store number of tables from which we should
        delete records there.
    sql/sql_parse.cc:
      multi_delete_precheck():
        Moved code which is responsible for iterating through auxilary table
        list and binding its elements with corresponding elements of main
        table list, and properly updating locks in it to separate function -
        multi_delete_set_locks_and_link_aux_tables(). This is because in order
        to make multi-delete SP friendly we need to have all locks set properly
        at the end of statement parsing. So we are introducing new function
        which will be called from parser.
        We also calculate number of tables from which we are going to perform
        deletions there and store this number for later usage in
        LEX::table_count.
        Also removed some no longer needed code.
    sql/sql_prepare.cc:
      mysql_test_multidelete():
        Now multi_delete_precheck() takes only two arguments, so we don't
        need to pass fake third parameter.
    sql/sql_yacc.yy:
      delete:
        In order to make multi-delete SP friendly we need to have all table 
        locks for the elements of main statement table list properly set 
        at the end of parsing.
    4e0bbc1b
sql_lex.h 30.4 KB