diff options
author | igor@rurik.mysql.com <> | 2004-11-16 13:58:49 -0800 |
---|---|---|
committer | igor@rurik.mysql.com <> | 2004-11-16 13:58:49 -0800 |
commit | 9edff6c5912c37e06b852c856b0333af8160ef16 (patch) | |
tree | 1b1563842dab4f6c63b31f6b649eb471cc9a875f | |
parent | 8a2ef0a2cad2ace46ce1224c6733d36bcd5982d5 (diff) | |
download | mariadb-git-9edff6c5912c37e06b852c856b0333af8160ef16.tar.gz |
key_cache.result, key_cache.test:
Added a test case for bug #6447.
mf_keycache.c:
Fixed bug #6447. Erronious code in the key_cache_read function
caused problems when reading key blocks with offset>0 into
key cache. The code of key_cache_insert and key_cache_write
was modified similarly.
-rw-r--r-- | mysql-test/r/key_cache.result | 10 | ||||
-rw-r--r-- | mysql-test/t/key_cache.test | 11 | ||||
-rw-r--r-- | mysys/mf_keycache.c | 25 |
3 files changed, 34 insertions, 12 deletions
diff --git a/mysql-test/r/key_cache.result b/mysql-test/r/key_cache.result index fe8708f882d..79b5a6e84b2 100644 --- a/mysql-test/r/key_cache.result +++ b/mysql-test/r/key_cache.result @@ -277,3 +277,13 @@ Key_blocks_unused KEY_BLOCKS_UNUSED set global keycache2.key_buffer_size=0; set global keycache3.key_buffer_size=100; set global keycache3.key_buffer_size=0; +create table t1 (mytext text, FULLTEXT (mytext)); +insert t1 values ('aaabbb'); +check table t1; +Table Op Msg_type Msg_text +test.t1 check status OK +set GLOBAL key_cache_block_size=2048; +check table t1; +Table Op Msg_type Msg_text +test.t1 check status OK +drop table t1; diff --git a/mysql-test/t/key_cache.test b/mysql-test/t/key_cache.test index 9d3125efa61..6dee87ec5a6 100644 --- a/mysql-test/t/key_cache.test +++ b/mysql-test/t/key_cache.test @@ -156,3 +156,14 @@ set global keycache2.key_buffer_size=0; # Test to set up a too small size for a key cache (bug #2064) set global keycache3.key_buffer_size=100; set global keycache3.key_buffer_size=0; + +# Test case for buf 6447 + +create table t1 (mytext text, FULLTEXT (mytext)); +insert t1 values ('aaabbb'); + +check table t1; +set GLOBAL key_cache_block_size=2048; +check table t1; + +drop table t1; diff --git a/mysys/mf_keycache.c b/mysys/mf_keycache.c index 11aadbed6c1..052d6c79ab9 100644 --- a/mysys/mf_keycache.c +++ b/mysys/mf_keycache.c @@ -1699,11 +1699,12 @@ byte *key_cache_read(KEY_CACHE *keycache, keycache_pthread_mutex_unlock(&keycache->cache_lock); goto no_key_cache; } - read_length= length > keycache->key_cache_block_size ? - keycache->key_cache_block_size : length; - KEYCACHE_DBUG_ASSERT(read_length > 0); offset= (uint) (filepos & (keycache->key_cache_block_size-1)); filepos-= offset; + read_length= length; + set_if_smaller(read_length, keycache->key_cache_block_size-offset); + KEYCACHE_DBUG_ASSERT(read_length > 0); + #ifndef THREAD if (block_length > keycache->key_cache_block_size || offset) return_buffer=0; @@ -1773,7 +1774,7 @@ byte *key_cache_read(KEY_CACHE *keycache, return (block->buffer); #endif buff+= read_length; - filepos+= read_length; + filepos+= read_length+offset; } while ((length-= read_length)); DBUG_RETURN(start); @@ -1835,12 +1836,12 @@ int key_cache_insert(KEY_CACHE *keycache, keycache_pthread_mutex_unlock(&keycache->cache_lock); DBUG_RETURN(0); } - read_length= length > keycache->key_cache_block_size ? - keycache->key_cache_block_size : length; - KEYCACHE_DBUG_ASSERT(read_length > 0); offset= (uint) (filepos & (keycache->key_cache_block_size-1)); /* Read data into key cache from buff in key_cache_block_size incr. */ filepos-= offset; + read_length= length; + set_if_smaller(read_length, keycache->key_cache_block_size-offset); + KEYCACHE_DBUG_ASSERT(read_length > 0); inc_counter_for_resize_op(keycache); keycache->global_cache_r_requests++; @@ -1882,7 +1883,7 @@ int key_cache_insert(KEY_CACHE *keycache, DBUG_RETURN(1); buff+= read_length; - filepos+= read_length; + filepos+= read_length+offset; } while ((length-= read_length)); } @@ -1959,12 +1960,12 @@ int key_cache_write(KEY_CACHE *keycache, keycache_pthread_mutex_unlock(&keycache->cache_lock); goto no_key_cache; } - read_length= length > keycache->key_cache_block_size ? - keycache->key_cache_block_size : length; - KEYCACHE_DBUG_ASSERT(read_length > 0); offset= (uint) (filepos & (keycache->key_cache_block_size-1)); /* Write data in key_cache_block_size increments */ filepos-= offset; + read_length= length; + set_if_smaller(read_length, keycache->key_cache_block_size-offset); + KEYCACHE_DBUG_ASSERT(read_length > 0); inc_counter_for_resize_op(keycache); keycache->global_cache_w_requests++; @@ -2032,7 +2033,7 @@ int key_cache_write(KEY_CACHE *keycache, next_block: buff+= read_length; - filepos+= read_length; + filepos+= read_length+offset; offset= 0; } while ((length-= read_length)); |