diff options
author | gbichot@quadita2.mysql.com <> | 2005-03-25 14:51:17 +0100 |
---|---|---|
committer | gbichot@quadita2.mysql.com <> | 2005-03-25 14:51:17 +0100 |
commit | ead47f47013ac36f474548f543a500fd4284788e (patch) | |
tree | 491287043eee4a43ead2c59964c69508b2df64ed /sql/sql_load.cc | |
parent | 7b0e872695674dd0383976df994dd971c99449a6 (diff) | |
download | mariadb-git-ead47f47013ac36f474548f543a500fd4284788e.tar.gz |
WWe now store the catalog in Query_log_event in binlog WITHOUT its end zero.
This saves one byte per Query_log_event on disk compared to 5.0.[0..3]. Compatibility problems with 5.0.x where x<4
are explained in the comments in log_event.cc. Putting back s/my_open(O_TRUNC)/(my_delete+my_create) change which had
been wiped away by somebody doing a wrong 4.1->5.0 merge (which happened just
before 5.0.3 :( ). Applying it to new events for LOAD DATA INFILE.
If slave fails in Execute_load_query_log_event::exec_event(),
don't delete the file (so that it's re-usable at next START SLAVE).
And (youpi!) fix for BUG#3247 "a partially completed LOAD DATA INFILE is not
executed at all on the slave" (storing an Execute_load_query_log_event
to binlog, with its error code, instead of Delete_file_log_event).
Diffstat (limited to 'sql/sql_load.cc')
-rw-r--r-- | sql/sql_load.cc | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/sql/sql_load.cc b/sql/sql_load.cc index e2f7c9d62c8..a0fed715405 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -81,6 +81,9 @@ static int read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, List<Item> &set_values, READ_INFO &read_info, String &enclosed, ulong skip_lines, bool ignore_check_option_errors); +static bool write_execute_load_query_log_event(THD *thd, + bool duplicates, bool ignore, + bool transactional_table); /* @@ -413,8 +416,14 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, /* If the file was not empty, wrote_create_file is true */ if (lf_info.wrote_create_file) { - Delete_file_log_event d(thd, db, transactional_table); - mysql_bin_log.write(&d); + if ((info.copied || info.deleted) && !transactional_table) + write_execute_load_query_log_event(thd, handle_duplicates, + ignore, transactional_table); + else + { + Delete_file_log_event d(thd, db, transactional_table); + mysql_bin_log.write(&d); + } } } #endif /*!EMBEDDED_LIBRARY*/ @@ -437,16 +446,8 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, */ read_info.end_io_cache(); if (lf_info.wrote_create_file) - { - Execute_load_query_log_event e(thd, thd->query, thd->query_length, - (char*)thd->lex->fname_start - (char*)thd->query, - (char*)thd->lex->fname_end - (char*)thd->query, - (handle_duplicates == DUP_REPLACE) ? LOAD_DUP_REPLACE : - (ignore ? LOAD_DUP_IGNORE : - LOAD_DUP_ERROR), - transactional_table, FALSE); - mysql_bin_log.write(&e); - } + write_execute_load_query_log_event(thd, handle_duplicates, + ignore, transactional_table); } #endif /*!EMBEDDED_LIBRARY*/ if (transactional_table) @@ -462,6 +463,23 @@ err: DBUG_RETURN(error); } + +/* Not a very useful function; just to avoid duplication of code */ +static bool write_execute_load_query_log_event(THD *thd, + bool duplicates, bool ignore, + bool transactional_table) +{ + Execute_load_query_log_event + e(thd, thd->query, thd->query_length, + (char*)thd->lex->fname_start - (char*)thd->query, + (char*)thd->lex->fname_end - (char*)thd->query, + (duplicates == DUP_REPLACE) ? LOAD_DUP_REPLACE : + (ignore ? LOAD_DUP_IGNORE : LOAD_DUP_ERROR), + transactional_table, FALSE); + return mysql_bin_log.write(&e); +} + + /**************************************************************************** ** Read of rows of fixed size + optional garage + optonal newline ****************************************************************************/ |