diff options
Diffstat (limited to 'sql/ha_innodb.cc')
-rw-r--r-- | sql/ha_innodb.cc | 27 |
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; |