summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <guilhem@gbichot3.local>2007-03-22 17:31:39 +0100
committerunknown <guilhem@gbichot3.local>2007-03-22 17:31:39 +0100
commit8ceea7c4760ab5aa67d0604acc8a4e4ab6c04475 (patch)
tree40d87f2fcafb87f2625ebda757a6984f129f7ecc
parentc4e4bc323519d8e9ba1be8505c19d732f6ab8199 (diff)
downloadmariadb-git-8ceea7c4760ab5aa67d0604acc8a4e4ab6c04475.tar.gz
Fix for BUG#26194 "mysqlbinlog --base64-output produces invalid SQL";
when it was printing a Query event, it produced invalid SQL (missing the BINLOG keyword, so the SQL started with the base64 string, which is incorrect). Note: no testcase; I have a .test which shows that the bugfix works, but it triggers BUG#26361 and so gives Valgrind warnings. I'm sending this test to the fixer of BUG#26361 for her/him to push when she/he fixes BUG#26361. client/mysqlbinlog.cc: writing the header (a line started with "#", i.e. a comment) and the body (the real operation) of an event to the same IO_CACHE (result_cache) confused the logic of Log_event::print_base64() (which is that if the cache is not empty then the BINLOG keyword should not be printed); it caused the BINLOG keyword to miss hence a syntactically wrong output of "mysqlbinlog --base64-output" for Query events. So we just use the two IO_CACHE already available in "print_event_info". sql/log_event.cc: using the new small inline function. Note that the replication code should one day be fixed to trap all errors (like disk write errors). sql/log_event.h: small inline function to group two operations: copying an IO_CACHE to a FILE, and reinitializing this IO_CACHE for being filled again. sql/records.cc: fix after merge
-rw-r--r--client/mysqlbinlog.cc16
-rw-r--r--sql/log_event.cc9
-rw-r--r--sql/log_event.h8
-rw-r--r--sql/records.cc3
4 files changed, 20 insertions, 16 deletions
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc
index 940fac6da38..50235534cb8 100644
--- a/client/mysqlbinlog.cc
+++ b/client/mysqlbinlog.cc
@@ -483,19 +483,17 @@ static int
write_event_header_and_base64(Log_event *ev, FILE *result_file,
PRINT_EVENT_INFO *print_event_info)
{
+ IO_CACHE *head= &print_event_info->head_cache;
+ IO_CACHE *body= &print_event_info->body_cache;
DBUG_ENTER("write_event_header_and_base64");
- /* Write header and base64 output to cache */
- IO_CACHE result_cache;
- if (open_cached_file(&result_cache, NULL, NULL, 0, MYF(MY_WME | MY_NABP)))
- return 1;
- ev->print_header(&result_cache, print_event_info, FALSE);
- ev->print_base64(&result_cache, print_event_info, FALSE);
+ /* Write header and base64 output to cache */
+ ev->print_header(head, print_event_info, FALSE);
+ ev->print_base64(body, print_event_info, FALSE);
/* Read data from cache and write to result file */
- my_b_copy_to_file(&result_cache, result_file);
- close_cached_file(&result_cache);
- DBUG_RETURN(0);
+ DBUG_RETURN(copy_event_cache_to_file_and_reinit(head, result_file) ||
+ copy_event_cache_to_file_and_reinit(body, result_file));
}
diff --git a/sql/log_event.cc b/sql/log_event.cc
index f8d3c43bfba..dc411c14f93 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -75,8 +75,7 @@ public:
~Write_on_release_cache()
{
- if (!my_b_copy_to_file(m_cache, m_file))
- reinit_io_cache(m_cache, WRITE_CACHE, 0L, FALSE, TRUE);
+ copy_event_cache_to_file_and_reinit(m_cache, m_file);
if (m_flags | FLUSH_F)
fflush(m_file);
}
@@ -6160,10 +6159,8 @@ void Rows_log_event::print_helper(FILE *file,
if (get_flags(STMT_END_F))
{
- my_b_copy_to_file(head, file);
- my_b_copy_to_file(body, file);
- reinit_io_cache(head, WRITE_CACHE, 0, FALSE, TRUE);
- reinit_io_cache(body, WRITE_CACHE, 0, FALSE, TRUE);
+ copy_event_cache_to_file_and_reinit(head, file);
+ copy_event_cache_to_file_and_reinit(body, file);
}
}
#endif
diff --git a/sql/log_event.h b/sql/log_event.h
index 7cbe8925d9a..656860a2b55 100644
--- a/sql/log_event.h
+++ b/sql/log_event.h
@@ -2230,4 +2230,12 @@ private:
#endif
};
+static inline bool copy_event_cache_to_file_and_reinit(IO_CACHE *cache,
+ FILE *file)
+{
+ return
+ my_b_copy_to_file(cache, file) ||
+ reinit_io_cache(cache, WRITE_CACHE, 0, FALSE, TRUE);
+}
+
#endif /* _log_event_h */
diff --git a/sql/records.cc b/sql/records.cc
index 0923ab1d75e..0fb9f4f9650 100644
--- a/sql/records.cc
+++ b/sql/records.cc
@@ -150,7 +150,8 @@ void init_read_record(READ_RECORD *info,THD *thd, TABLE *table,
info->file= table->file;
info->forms= &info->table; /* Only one table */
- if (table->s->tmp_table == TMP_TABLE && !table->sort.addon_field)
+ if (table->s->tmp_table == NON_TRANSACTIONAL_TMP_TABLE &&
+ !table->sort.addon_field)
VOID(table->file->extra(HA_EXTRA_MMAP));
if (table->sort.addon_field)