diff options
author | unknown <ramil/ram@mysql.com/ramil.myoffice.izhnet.ru> | 2008-04-08 10:20:58 +0500 |
---|---|---|
committer | unknown <ramil/ram@mysql.com/ramil.myoffice.izhnet.ru> | 2008-04-08 10:20:58 +0500 |
commit | 9fd89afca04400812a8fec6b1802bf60518bd2ac (patch) | |
tree | 26ae6d2fe47544933c13ab27096db0b064cf0088 /sql/lock.cc | |
parent | ccd31e9dd4ef9ac3266690231626237d13d53e17 (diff) | |
download | mariadb-git-9fd89afca04400812a8fec6b1802bf60518bd2ac.tar.gz |
Fix for bug #35732: read-only blocks SELECT statements in InnoDB
Problem: SELECTs prohibited for a transactional SE in autocommit mode
if read_only is set.
Fix: allow them.
mysql-test/r/read_only_innodb.result:
Fix for bug #35732: read-only blocks SELECT statements in InnoDB
- test result.
mysql-test/t/read_only_innodb.test:
Fix for bug #35732: read-only blocks SELECT statements in InnoDB
- test case.
sql/handler.cc:
Fix for bug #35732: read-only blocks SELECT statements in InnoDB
- in autocommit mode thd->transaction.all list is empty thus
is_real_trans set to TRUE for any SELECTs, so using it in the
"read_only" check is insufficient.
ha_check_and_coalesce_trx_read_only() changed to return number
of engines with read-write changes. This value is used in the
"read-only" check and checks for GLOBAL READ LOCK.
sql/lock.cc:
Fix for bug #35732: read-only blocks SELECT statements in InnoDB
- added assert(protect_against_global_read_lock) before decreasing,
in order to catch (uint) 0 - 1 situation due to wrong
wait_if_global_read_lock()/start_waiting_global_read_lock() call
sequence.
Diffstat (limited to 'sql/lock.cc')
-rw-r--r-- | sql/lock.cc | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/sql/lock.cc b/sql/lock.cc index a0d6faa6604..675b94c2175 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -1533,6 +1533,7 @@ void start_waiting_global_read_lock(THD *thd) if (unlikely(thd->global_read_lock)) DBUG_VOID_RETURN; (void) pthread_mutex_lock(&LOCK_global_read_lock); + DBUG_ASSERT(protect_against_global_read_lock); tmp= (!--protect_against_global_read_lock && (waiting_for_read_lock || global_read_lock_blocks_commit)); (void) pthread_mutex_unlock(&LOCK_global_read_lock); |