summaryrefslogtreecommitdiff
path: root/sql/ha_innodb.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/ha_innodb.cc')
-rw-r--r--sql/ha_innodb.cc27
1 files changed, 23 insertions, 4 deletions
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index 12aa7c0b6f5..23c6082da92 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -2292,7 +2292,18 @@ convert_search_mode_to_innobase(
case HA_READ_AFTER_KEY: return(PAGE_CUR_G);
case HA_READ_BEFORE_KEY: return(PAGE_CUR_L);
case HA_READ_PREFIX: return(PAGE_CUR_GE);
- case HA_READ_PREFIX_LAST: return(PAGE_CUR_LE_OR_EXTENDS);
+ case HA_READ_PREFIX_LAST: return(PAGE_CUR_LE);
+ /* TODO: 1) this should really be
+ return(PAGE_CUR_LE_OR_EXTENDS); but since MySQL uses
+ a wrong flag in search, we convert this to PAGE_CUR_LE;
+ 2) if the character set is not latin1, then InnoDB
+ uses a MySQL function innobase_mysql_cmp() to
+ compare CHAR and VARCHAR strings; since that function
+ does not return the number of matched bytes,
+ PAGE_CUR_LE_OR_EXTENDS does not currently work: we
+ should probably write my_sortncmp_with_n_matcehd_bytes()
+ to determine if a field 'extends' another;
+ see dev-public discussion on Feb 7th, 2003 */
default: assert(0);
}
@@ -4175,7 +4186,10 @@ static void free_share(INNOBASE_SHARE *share)
}
/*********************************************************************
-Stores a MySQL lock into a 'lock' field in a handle. */
+Converts a MySQL table lock stored in the 'lock' field of the handle to
+a proper type before storing the lock. MySQL also calls this when it
+releases a lock. */
+
THR_LOCK_DATA**
ha_innobase::store_lock(
@@ -4201,8 +4215,13 @@ ha_innobase::store_lock(
binlog) requires the use of a locking read */
prebuilt->select_lock_type = LOCK_S;
- } else {
- /* We set possible LOCK_X value in external_lock, not yet
+ } else if (lock_type != TL_IGNORE) {
+
+ /* In ha_berkeley.cc there is a comment that MySQL
+ may in exceptional cases call this with TL_IGNORE also
+ when it is NOT going to release the lock. */
+
+ /* We set possible LOCK_X value in external_lock, not yet
here even if this would be SELECT ... FOR UPDATE */
prebuilt->select_lock_type = LOCK_NONE;