Commit d454b567 authored by unknown's avatar unknown

check for mysql_bin_log.is_open() before my_b_tell(&thd->transaction.trans_log

in ha_commit_trans - why it didn't crash earlier ?


mysql-test/r/null.result:
  after merge fix
parent e5e6f2a6
...@@ -156,3 +156,22 @@ drop table t1; ...@@ -156,3 +156,22 @@ drop table t1;
select cast(NULL as signed); select cast(NULL as signed);
cast(NULL as signed) cast(NULL as signed)
NULL NULL
create table t1(i int, key(i));
insert into t1 values(1);
insert into t1 select i*2 from t1;
insert into t1 select i*2 from t1;
insert into t1 select i*2 from t1;
insert into t1 select i*2 from t1;
insert into t1 select i*2 from t1;
insert into t1 select i*2 from t1;
insert into t1 select i*2 from t1;
insert into t1 select i*2 from t1;
insert into t1 select i*2 from t1;
explain select * from t1 where i=2 or i is null;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref_or_null i i 5 const 10 Using where; Using index
alter table t1 change i i int not null;
explain select * from t1 where i=2 or i is null;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref i i 4 const 7 Using where; Using index
drop table t1;
...@@ -472,7 +472,7 @@ int ha_release_temporary_latches(THD *thd) ...@@ -472,7 +472,7 @@ int ha_release_temporary_latches(THD *thd)
int ha_commit_trans(THD *thd, THD_TRANS* trans) int ha_commit_trans(THD *thd, THD_TRANS* trans)
{ {
int error=0; int error=0;
DBUG_ENTER("ha_commit"); DBUG_ENTER("ha_commit_trans");
#ifdef USING_TRANSACTIONS #ifdef USING_TRANSACTIONS
if (opt_using_transactions) if (opt_using_transactions)
{ {
...@@ -480,8 +480,8 @@ int ha_commit_trans(THD *thd, THD_TRANS* trans) ...@@ -480,8 +480,8 @@ int ha_commit_trans(THD *thd, THD_TRANS* trans)
bool operation_done= 0, need_start_waiters= 0; bool operation_done= 0, need_start_waiters= 0;
/* If transaction has done some updates to tables */ /* If transaction has done some updates to tables */
if (trans == &thd->transaction.all && if (trans == &thd->transaction.all && mysql_bin_log.is_open() &&
my_b_tell(&thd->transaction.trans_log)) my_b_tell(&thd->transaction.trans_log))
{ {
if (error= wait_if_global_read_lock(thd, 0, 0)) if (error= wait_if_global_read_lock(thd, 0, 0))
{ {
...@@ -576,7 +576,7 @@ int ha_commit_trans(THD *thd, THD_TRANS* trans) ...@@ -576,7 +576,7 @@ int ha_commit_trans(THD *thd, THD_TRANS* trans)
int ha_rollback_trans(THD *thd, THD_TRANS *trans) int ha_rollback_trans(THD *thd, THD_TRANS *trans)
{ {
int error=0; int error=0;
DBUG_ENTER("ha_rollback"); DBUG_ENTER("ha_rollback_trans");
#ifdef USING_TRANSACTIONS #ifdef USING_TRANSACTIONS
if (opt_using_transactions) if (opt_using_transactions)
{ {
...@@ -587,7 +587,7 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans) ...@@ -587,7 +587,7 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans)
if ((error=ndbcluster_rollback(thd, trans->ndb_tid))) if ((error=ndbcluster_rollback(thd, trans->ndb_tid)))
{ {
if (error == -1) if (error == -1)
my_error(ER_ERROR_DURING_ROLLBACK, MYF(0)); my_error(ER_ERROR_DURING_ROLLBACK, MYF(0));
error=1; error=1;
} }
trans->ndb_tid = 0; trans->ndb_tid = 0;
...@@ -768,12 +768,12 @@ bool ha_flush_logs() ...@@ -768,12 +768,12 @@ bool ha_flush_logs()
{ {
bool result=0; bool result=0;
#ifdef HAVE_BERKELEY_DB #ifdef HAVE_BERKELEY_DB
if ((have_berkeley_db == SHOW_OPTION_YES) && if ((have_berkeley_db == SHOW_OPTION_YES) &&
berkeley_flush_logs()) berkeley_flush_logs())
result=1; result=1;
#endif #endif
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
if ((have_innodb == SHOW_OPTION_YES) && if ((have_innodb == SHOW_OPTION_YES) &&
innobase_flush_logs()) innobase_flush_logs())
result=1; result=1;
#endif #endif
...@@ -868,7 +868,7 @@ my_off_t ha_get_ptr(byte *ptr, uint pack_length) ...@@ -868,7 +868,7 @@ my_off_t ha_get_ptr(byte *ptr, uint pack_length)
int handler::ha_open(const char *name, int mode, int test_if_locked) int handler::ha_open(const char *name, int mode, int test_if_locked)
{ {
int error; int error;
DBUG_ENTER("handler::open"); DBUG_ENTER("handler::ha_open");
DBUG_PRINT("enter",("name: %s db_type: %d db_stat: %d mode: %d lock_test: %d", DBUG_PRINT("enter",("name: %s db_type: %d db_stat: %d mode: %d lock_test: %d",
name, table->db_type, table->db_stat, mode, name, table->db_type, table->db_stat, mode,
test_if_locked)); test_if_locked));
...@@ -967,7 +967,7 @@ void handler::update_auto_increment() ...@@ -967,7 +967,7 @@ void handler::update_auto_increment()
{ {
longlong nr; longlong nr;
THD *thd; THD *thd;
DBUG_ENTER("update_auto_increment"); DBUG_ENTER("handler::update_auto_increment");
if (table->next_number_field->val_int() != 0 || if (table->next_number_field->val_int() != 0 ||
table->auto_increment_field_not_null && table->auto_increment_field_not_null &&
current_thd->variables.sql_mode & MODE_NO_AUTO_VALUE_ON_ZERO) current_thd->variables.sql_mode & MODE_NO_AUTO_VALUE_ON_ZERO)
...@@ -1025,7 +1025,7 @@ longlong handler::get_auto_increment() ...@@ -1025,7 +1025,7 @@ longlong handler::get_auto_increment()
void handler::print_error(int error, myf errflag) void handler::print_error(int error, myf errflag)
{ {
DBUG_ENTER("print_error"); DBUG_ENTER("handler::print_error");
DBUG_PRINT("enter",("error: %d",error)); DBUG_PRINT("enter",("error: %d",error));
int textno=ER_GET_ERRNO; int textno=ER_GET_ERRNO;
...@@ -1164,7 +1164,7 @@ bool handler::get_error_message(int error, String* buf) ...@@ -1164,7 +1164,7 @@ bool handler::get_error_message(int error, String* buf)
uint handler::get_dup_key(int error) uint handler::get_dup_key(int error)
{ {
DBUG_ENTER("get_dup_key"); DBUG_ENTER("handler::get_dup_key");
table->file->errkey = (uint) -1; table->file->errkey = (uint) -1;
if (error == HA_ERR_FOUND_DUPP_KEY || error == HA_ERR_FOUND_DUPP_UNIQUE) if (error == HA_ERR_FOUND_DUPP_KEY || error == HA_ERR_FOUND_DUPP_UNIQUE)
info(HA_STATUS_ERRKEY | HA_STATUS_NO_LOCK); info(HA_STATUS_ERRKEY | HA_STATUS_NO_LOCK);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment