summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorheikki@hundin.mysql.fi <>2005-01-13 19:20:49 +0200
committerheikki@hundin.mysql.fi <>2005-01-13 19:20:49 +0200
commit76789a4c13cdef858b99c978457dddb6160026bc (patch)
treeeb52b12f3b41dd80576d626946e008fa5bce7e81 /sql
parentc5708e1d6508cd64203fec4c3f603fbf1b203a6d (diff)
downloadmariadb-git-76789a4c13cdef858b99c978457dddb6160026bc.tar.gz
ha_innodb.cc:
Fix a theoretical hang over the adaptive hash latch in InnoDB if one runs INSERT ... SELECT ... (binlog not enabled), or a multi-table UPDATE or DELETE, and only the read tables are InnoDB type, the rest are MyISAM; this also fixes bug #7879 for InnoDB type tables
Diffstat (limited to 'sql')
-rw-r--r--sql/ha_innodb.cc9
1 files changed, 7 insertions, 2 deletions
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index 54d93783481..2e441b4f085 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -4927,7 +4927,9 @@ ha_innobase::store_lock(
if ((lock_type == TL_READ && thd->in_lock_tables) ||
(lock_type == TL_READ_HIGH_PRIORITY && thd->in_lock_tables) ||
lock_type == TL_READ_WITH_SHARED_LOCKS ||
- lock_type == TL_READ_NO_INSERT) {
+ lock_type == TL_READ_NO_INSERT ||
+ thd->lex.sql_command != SQLCOM_SELECT) {
+
/* The OR cases above are in this order:
1) MySQL is doing LOCK TABLES ... READ LOCAL, or
2) (we do not know when TL_READ_HIGH_PRIORITY is used), or
@@ -4935,7 +4937,10 @@ ha_innobase::store_lock(
4) we are doing a complex SQL statement like
INSERT INTO ... SELECT ... and the logical logging (MySQL
binlog) requires the use of a locking read, or
- MySQL is doing LOCK TABLES ... READ. */
+ MySQL is doing LOCK TABLES ... READ.
+ 5) we let InnoDB do locking reads for all SQL statements that
+ are not simple SELECTs; note that select_lock_type in this
+ case may get strengthened in ::external_lock() to LOCK_X. */
prebuilt->select_lock_type = LOCK_S;
prebuilt->stored_select_lock_type = LOCK_S;