summaryrefslogtreecommitdiff
path: root/sql/sql_load.cc
diff options
context:
space:
mode:
authorunknown <guilhem@mysql.com>2003-09-25 00:14:46 +0200
committerunknown <guilhem@mysql.com>2003-09-25 00:14:46 +0200
commitdae13b541540953f11397d70f482b77d07699f77 (patch)
tree5d0a4646226c2ebce870b175a81f47d772220f12 /sql/sql_load.cc
parent699f3175fe5e28b5e017dbd73a6dafa21d8a410b (diff)
downloadmariadb-git-dae13b541540953f11397d70f482b77d07699f77.tar.gz
Fix for BUG#1391:
"If LOAD DATA INFILE 'small_file' fails on master, slave leaves temp files" (the bug is in the master) mysql-test/r/rpl_loaddata.result: result update mysql-test/std_data/rpl_loaddata2.dat: change to introduce a unique key violation mysql-test/t/rpl_loaddata.test: testcase for bug#1391. sql/sql_load.cc: fix for bug#1391: for a small file, we had in the binlog only the Create_file, not the Delete_file (the Create_file was written when the READ_INFO was destroyed).
Diffstat (limited to 'sql/sql_load.cc')
-rw-r--r--sql/sql_load.cc39
1 files changed, 24 insertions, 15 deletions
diff --git a/sql/sql_load.cc b/sql/sql_load.cc
index 0ae6ccb4c4a..ca540a8cdc0 100644
--- a/sql/sql_load.cc
+++ b/sql/sql_load.cc
@@ -282,22 +282,31 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
ha_autocommit_or_rollback(thd,error);
if (!opt_old_rpl_compat && mysql_bin_log.is_open())
{
+ /*
+ Make sure last block (the one which caused the error) gets logged.
+ This is needed because otherwise after write of
+ (to the binlog, not to read_info (which is a cache))
+ Delete_file_log_event the bad block will remain in read_info (because
+ pre_read is not called at the end of the last block; remember pre_read
+ is called whenever a new block is read from disk).
+ At the end of mysql_load(), the destructor of read_info will call
+ end_io_cache() which will flush read_info, so we will finally have
+ this in the binlog:
+ Append_block # The last successfull block
+ Delete_file
+ Append_block # The failing block
+ which is nonsense.
+ Or could also be (for a small file)
+ Create_file # The failing block
+ which is nonsense (Delete_file is not written in this case, because:
+ Create_file has not been written, so Delete_file is not written, then
+ when read_info is destroyed end_io_cache() is called which writes
+ Create_file.
+ */
+ read_info.end_io_cache();
+ /* If the file was not empty, wrote_create_file is true */
if (lf_info.wrote_create_file)
{
- /*
- Make sure last block (the one which caused the error) gets logged.
- This is needed because otherwise after write of
- (to the binlog, not to read_info (which is a cache))
- Delete_file_log_event the bad block will remain in read_info.
- At the end of mysql_load(), the destructor of read_info will call
- end_io_cache() which will flush read_info, so we will finally have
- this in the binlog:
- Append_block # The last successfull block
- Delete_file
- Append_block # The failing block
- which is nonsense.
- */
- read_info.end_io_cache();
Delete_file_log_event d(thd, db, log_delayed);
mysql_bin_log.write(&d);
}
@@ -327,7 +336,7 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
}
else
{
- read_info.end_io_cache(); // make sure last block gets logged
+ read_info.end_io_cache();
if (lf_info.wrote_create_file)
{
Execute_load_log_event e(thd, db, log_delayed);