Commit 7c7ea371 authored by unknown's avatar unknown

Apply InnoDB snapshot ss923

Fixes:
- Bug #18077: InnoDB uses full explicit table locks in stored FUNCTION


sql/ha_innodb.cc:
  Apply InnoDB snapshot ss923
  
  Revision r922:
  ha_innobase::store_lock(): When downgrading table locks, do not
  check thd->in_lock_tables but test if
  thd->lex->sql_command == SQLCOM_LOCK_TABLES
  instead.  Otherwise, stored functions will use table locks.  (Bug #18077)
parent 665d1692
...@@ -6563,7 +6563,8 @@ ha_innobase::store_lock( ...@@ -6563,7 +6563,8 @@ ha_innobase::store_lock(
&& lock_type != TL_IGNORE)) { && lock_type != TL_IGNORE)) {
/* The OR cases above are in this order: /* The OR cases above are in this order:
1) MySQL is doing LOCK TABLES ... READ LOCAL, or 1) MySQL is doing LOCK TABLES ... READ LOCAL, or we
are processing a stored procedure or function, or
2) (we do not know when TL_READ_HIGH_PRIORITY is used), or 2) (we do not know when TL_READ_HIGH_PRIORITY is used), or
3) this is a SELECT ... IN SHARE MODE, or 3) this is a SELECT ... IN SHARE MODE, or
4) we are doing a complex SQL statement like 4) we are doing a complex SQL statement like
...@@ -6625,7 +6626,8 @@ ha_innobase::store_lock( ...@@ -6625,7 +6626,8 @@ ha_innobase::store_lock(
single transaction stored procedure call deterministic single transaction stored procedure call deterministic
(if it does not use a consistent read). */ (if it does not use a consistent read). */
if (lock_type == TL_READ && thd->in_lock_tables) { if (lock_type == TL_READ
&& thd->lex->sql_command == SQLCOM_LOCK_TABLES) {
/* We come here if MySQL is processing LOCK TABLES /* We come here if MySQL is processing LOCK TABLES
... READ LOCAL. MyISAM under that table lock type ... READ LOCAL. MyISAM under that table lock type
reads the table as it was at the time the lock was reads the table as it was at the time the lock was
...@@ -6684,8 +6686,7 @@ ha_innobase::store_lock( ...@@ -6684,8 +6686,7 @@ ha_innobase::store_lock(
(MySQL does have thd->in_lock_tables TRUE there). */ (MySQL does have thd->in_lock_tables TRUE there). */
if (lock_type == TL_READ_NO_INSERT if (lock_type == TL_READ_NO_INSERT
&& (!thd->in_lock_tables && thd->lex->sql_command != SQLCOM_LOCK_TABLES) {
|| thd->lex->sql_command == SQLCOM_CALL)) {
lock_type = TL_READ; lock_type = TL_READ;
} }
......
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