• unknown's avatar
    Fix for BUG#11151 "LOAD DATA INFILE commits transaction in 5.0". · a0b7b242
    unknown authored
    In 5.0 we made LOAD DATA INFILE autocommit in all engines, while
    only NDB wanted that. Users and trainers complained that it affected
    InnoDB and was a change compared to 4.1 where only NDB autocommitted.
    To revert to the behaviour of 4.1, we move the autocommit logic out of mysql_load() into
    ha_ndbcluster::external_lock().
    The result is that LOAD DATA INFILE commits all uncommitted changes
    of NDB if this is an NDB table, its own changes if this is an NDB
    table, but does not affect other engines.
    Note: even though there is no "commit the full transaction at end"
    anymore, LOAD DATA INFILE stays disabled in routines (re-entrency
    problems per a comment of Pem).
    Note: ha_ndbcluster::has_transactions() does not give reliable results
    because it says "yes" even if transactions are disabled in this engine...
    
    
    sql/ha_ndbcluster.cc:
      NDB wants to do autocommit if this is LOAD DATA INFILE.
      For this to not affect all other engines, we move the logic
      inside ha_ndbcluster.
    sql/sql_load.cc:
      This ha_enable_transaction() in mysql_load() forced an autocommit
      in all engines, while only NDB wants to do that.
      So we move the logic inside ha_ndbcluster.cc.
    mysql-test/include/loaddata_autocom.inc:
      test for engines to see if they autocommit or not in LOAD DATA INFILE
    mysql-test/r/loaddata_autocom_innodb.result:
      result for InnoDB (no autocommit)
    mysql-test/r/loaddata_autocom_ndb.result:
      result for NDB (autocommit)
    mysql-test/r/rpl_ndb_innodb_trans.result:
      result for InnoDB+NDB transactions. Observe that when ROLLBACK
      cannot rollback the LOAD DATA INFILE in NDB it issues warning 1196
      as appropriate.
    mysql-test/t/loaddata_autocom_innodb.test:
      test that InnoDB does not autocommit in LOAD DATA INFILE.
    mysql-test/t/loaddata_autocom_ndb.test:
      test that NDB does autocommit in LOAD DATA INFIL
    mysql-test/t/rpl_ndb_innodb_trans-slave.opt:
      need to tell the slave to use innodb
    mysql-test/t/rpl_ndb_innodb_trans.test:
      test of transactions mixing NDB and InnoDB. To see if ROLLBACK
      rolls back in both engines, with the exception of LOAD DATA INFILE
      which does not roll back NDB: we see that a LOAD DATA INFILE in NDB
      commits all what has been done in NDB so far, commits its changes,
      but does not commit in other engines.
    a0b7b242
ha_ndbcluster.cc 227 KB