• unknown's avatar
    Bug #29136 erred multi-delete on trans table does not rollback the statement · c8b6d105
    unknown authored
    similar to bug_27716, but it was stressed on in the synopsis on that there is another
    side of the artifact affecting behaviour in transaction.
    
    Fixed with deploying multi_delete::send_error() - otherwise never called - and refining its logic
    to perform binlogging job if needed.
    
    The changeset includes the following side effects:
    - added tests to check bug_23333's scenarios on the mixture of tables for multi_update;
    - fixes bug@30763 with two-liner patch and a test coinciding to one added for bug_23333.
    
    
    mysql-test/r/innodb.result:
      results changed
    mysql-test/r/mix_innodb_myisam_binlog.result:
      results changed
    mysql-test/r/multi_update.result:
      results changed
    mysql-test/t/innodb.test:
      trans table specific test added
    mysql-test/t/mix_innodb_myisam_binlog.test:
      multi-update  and multi-delete of mixure of ta and not-ta tables tests added (relates to bug_23333).
    mysql-test/t/multi_update.test:
      testing another branch of mult-delete: send_eof() (binloggin there), send_error (early return)
    sql/sql_class.h:
      a new flag to designate the fact the statement's error has been handled.
      The flag is checked by ::send_error() methods (multi_update and _delete classes)
    sql/sql_delete.cc:
      expanding multi_delete::send_error to 
      1. early return if error_handled == t
      2. binlogging locally if there was a non-trans table modified side effect
    sql/sql_parse.cc:
      adding multi_update::send_error which can perform binlogging and rollback job in needed
    sql/sql_update.cc:
      issues relating to
       
      1. bug_27716 with zeroing of `updated' to serve as the flag of early return from send_error().
         The flag is changed to be a new member error_handled; also moved outside binlogging branch.
         The reason for this change is that bug_23333 fixes were pushed after the bug_27716's and they
         left this flaw (also no test coverage).
      2. bug_30763 with assertion on trans_safe. I decide to make 2 liner fix for that bug here instead of to remove
         those two assertions. This new bug test case is the same as for multi-update on the mixure of tables.
         The rational for this fix:
         presumption for mutli_update::trans_safe to be set to zero at
         multi_update::multi_update or multi_update::initialize_tables() is incorrect.
      
         trans_safe := false should happen only when a non-transactional table gets modified. 
         Therefore, at initialization the member must be be set to true.
    c8b6d105
sql_delete.cc 28.2 KB