summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/handler.cc21
-rw-r--r--sql/sql_class.cc6
-rw-r--r--sql/sql_class.h2
3 files changed, 17 insertions, 12 deletions
diff --git a/sql/handler.cc b/sql/handler.cc
index 8a4a6005d85..d69836dadfa 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -486,7 +486,7 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans)
operation_done=1;
}
#endif
- if (trans == &thd->transaction.all)
+ if ((trans == &thd->transaction.all) && mysql_bin_log.is_open())
{
/*
Update the binary log with a BEGIN/ROLLBACK block if we have cached some
@@ -494,7 +494,6 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans)
be rare (updating a non-transactional table inside a transaction...).
*/
if (unlikely((thd->options & OPTION_STATUS_NO_TRANS_UPDATE) &&
- mysql_bin_log.is_open() &&
my_b_tell(&thd->transaction.trans_log)))
mysql_bin_log.write(thd, &thd->transaction.trans_log, 0);
/* Flushed or not, empty the binlog cache */
@@ -559,7 +558,7 @@ int ha_rollback_to_savepoint(THD *thd, char *savepoint_name)
my_error(ER_ERROR_DURING_ROLLBACK, MYF(0), error);
error=1;
}
- else
+ else if (mysql_bin_log.is_open())
{
/*
Write ROLLBACK TO SAVEPOINT to the binlog cache if we have updated some
@@ -567,7 +566,6 @@ int ha_rollback_to_savepoint(THD *thd, char *savepoint_name)
from the SAVEPOINT command.
*/
if (unlikely((thd->options & OPTION_STATUS_NO_TRANS_UPDATE) &&
- mysql_bin_log.is_open() &&
my_b_tell(&thd->transaction.trans_log)))
{
Query_log_event qinfo(thd, thd->query, thd->query_length, TRUE);
@@ -596,23 +594,26 @@ Return value: always 0, that is, succeeds always
int ha_savepoint(THD *thd, char *savepoint_name)
{
- my_off_t binlog_cache_pos=0;
int error=0;
DBUG_ENTER("ha_savepoint");
#ifdef USING_TRANSACTIONS
if (opt_using_transactions)
{
- binlog_cache_pos=my_b_tell(&thd->transaction.trans_log);
-#ifdef HAVE_INNOBASE_DB
- innobase_savepoint(thd,savepoint_name, binlog_cache_pos);
-#endif
- /* Write it to the binary log (see comments of ha_rollback_to_savepoint). */
+ /* Write it to the binary log (see comments of ha_rollback_to_savepoint) */
if (mysql_bin_log.is_open())
{
+#ifdef HAVE_INNOBASE_DB
+ innobase_savepoint(thd,savepoint_name,
+ my_b_tell(&thd->transaction.trans_log));
+#endif
Query_log_event qinfo(thd, thd->query, thd->query_length, TRUE);
if (mysql_bin_log.write(&qinfo))
error= 1;
}
+#ifdef HAVE_INNOBASE_DB
+ else
+ innobase_savepoint(thd,savepoint_name,0);
+#endif
}
#endif /* USING_TRANSACTIONS */
DBUG_RETURN(error);
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 945414f532b..1b4c8bec416 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -169,7 +169,11 @@ THD::THD():user_time(0), current_statement(0), is_fatal_error(0),
tablespace_op=FALSE;
#ifdef USING_TRANSACTIONS
bzero((char*) &transaction,sizeof(transaction));
- if (opt_using_transactions)
+ /*
+ Binlog is always open (if needed) before a THD is created (including
+ bootstrap).
+ */
+ if (opt_using_transactions && mysql_bin_log.is_open())
{
if (open_cached_file(&transaction.trans_log,
mysql_tmpdir, LOG_PREFIX, binlog_cache_size,
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 51039999345..6815d0ae43c 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -684,7 +684,7 @@ public:
delayed_insert *di;
my_bool tablespace_op; /* This is TRUE in DISCARD/IMPORT TABLESPACE */
struct st_transactions {
- IO_CACHE trans_log;
+ IO_CACHE trans_log; // Inited ONLY if binlog is open !
THD_TRANS all; // Trans since BEGIN WORK
THD_TRANS stmt; // Trans for current statement
uint bdb_lock_count;