From 151b558e216ab4c9b53d54cae7505e72597655f6 Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Thu, 29 Jan 2004 15:16:48 +0100 Subject: [PATCH] Mark that strings may change on index only reads (for BDB tables). This fixed problem with index reads on character fields with BDB tables. (Bug #2509) --- .bzrignore | 1 + mysql-test/r/bdb.result | 25 +++++++++++++++++++++++++ mysql-test/r/myisam.result | 30 +++++++++++++++++++++++++++++- mysql-test/t/bdb.test | 14 ++++++++++++++ mysql-test/t/myisam.test | 18 +++++++++++++++++- sql/ha_berkeley.h | 2 +- sql/item_strfunc.cc | 11 ++++------- sql/table.cc | 3 ++- 8 files changed, 93 insertions(+), 11 deletions(-) diff --git a/.bzrignore b/.bzrignore index 12cdf99cbc9..572f877a49f 100644 --- a/.bzrignore +++ b/.bzrignore @@ -541,3 +541,4 @@ libmysql_r/vio_priv.h hardcopy.0 scripts/make_sharedlib_distribution sql/udf_example.so +man/*.1 diff --git a/mysql-test/r/bdb.result b/mysql-test/r/bdb.result index 05845df9dd3..2ccb5148d58 100644 --- a/mysql-test/r/bdb.result +++ b/mysql-test/r/bdb.result @@ -1165,3 +1165,28 @@ create table t2 (c char(8) not null, b char(8) not null, a char(8) not null, pri insert into t2 select * from t1; delete t1,t2 from t2,t1 where t1.a<'B' and t2.b=t1.b; drop table t1,t2; +create table t1 (a char(10), key(a), b int not null, key(b)) engine=bdb; +insert into t1 values ('a',1),('A',2); +explain select a from t1; +table type possible_keys key key_len ref rows Extra +t1 ALL NULL NULL NULL NULL 2 +select a from t1; +a +a +A +explain select b from t1; +table type possible_keys key key_len ref rows Extra +t1 index NULL b 4 NULL 2 Using index +select b from t1; +b +1 +2 +alter table t1 modify a char(10) binary; +explain select a from t1; +table type possible_keys key key_len ref rows Extra +t1 index NULL a 11 NULL 2 Using index +select a from t1; +a +A +a +drop table t1; diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result index 68a667f6d95..cc541388a5c 100644 --- a/mysql-test/r/myisam.result +++ b/mysql-test/r/myisam.result @@ -386,7 +386,10 @@ Table Op Msg_type Msg_text test.t1 check status OK drop table t1; create table t1 ( a text not null, key a (a(20))); -insert into t1 values ('aaa '),('aaa'); +insert into t1 values ('aaa '),('aaa'),('aa'); +check table t1; +Table Op Msg_type Msg_text +test.t1 check status OK repair table t1; Table Op Msg_type Msg_text test.t1 repair status OK @@ -394,6 +397,15 @@ select concat(a,'.') from t1 where a='aaa'; concat(a,'.') aaa. aaa . +select concat(a,'.') from t1 where binary a='aaa'; +concat(a,'.') +aaa. +update t1 set a='bbb' where a='aaa'; +select concat(a,'.') from t1; +concat(a,'.') +bbb. +bbb. +aa. drop table t1; create table t1(a text not null, b text not null, c text not null, index (a(10),b(10),c(10))); insert into t1 values('807780', '477', '165'); @@ -403,3 +415,19 @@ select * from t1 where a='807780' and b='477' and c='165'; a b c 807780 477 165 drop table t1; +create table t1 (a int not null auto_increment primary key, b text not null, unique b (b(20))); +insert into t1 (b) values ('a'),('a '),('a '); +select concat(b,'.') from t1; +concat(b,'.') +a. +a . +a . +update t1 set b='b ' where a=2; +update t1 set b='b ' where a > 1; +Duplicate entry 'b ' for key 2 +delete from t1 where b='b'; +select a,concat(b,'.') from t1; +a concat(b,'.') +1 a. +3 a . +drop table t1; diff --git a/mysql-test/t/bdb.test b/mysql-test/t/bdb.test index 2dfaecba9b1..4b490052535 100644 --- a/mysql-test/t/bdb.test +++ b/mysql-test/t/bdb.test @@ -815,3 +815,17 @@ insert into t2 select * from t1; delete t1,t2 from t2,t1 where t1.a<'B' and t2.b=t1.b; drop table t1,t2; + +# +# Test index only read (Bug #2509) +# +create table t1 (a char(10), key(a), b int not null, key(b)) engine=bdb; +insert into t1 values ('a',1),('A',2); +explain select a from t1; +select a from t1; +explain select b from t1; +select b from t1; +alter table t1 modify a char(10) binary; +explain select a from t1; +select a from t1; +drop table t1; diff --git a/mysql-test/t/myisam.test b/mysql-test/t/myisam.test index 394261aae40..7302e5dfdda 100644 --- a/mysql-test/t/myisam.test +++ b/mysql-test/t/myisam.test @@ -390,9 +390,13 @@ drop table t1; # two bugs in myisam-space-stripping feature # create table t1 ( a text not null, key a (a(20))); -insert into t1 values ('aaa '),('aaa'); +insert into t1 values ('aaa '),('aaa'),('aa'); +check table t1; repair table t1; select concat(a,'.') from t1 where a='aaa'; +select concat(a,'.') from t1 where binary a='aaa'; +update t1 set a='bbb' where a='aaa'; +select concat(a,'.') from t1; drop table t1; # @@ -406,3 +410,15 @@ insert into t1 values('807780', '472', '162'); select * from t1 where a='807780' and b='477' and c='165'; drop table t1; +# +# Test text and unique +# +create table t1 (a int not null auto_increment primary key, b text not null, unique b (b(20))); +insert into t1 (b) values ('a'),('a '),('a '); +select concat(b,'.') from t1; +update t1 set b='b ' where a=2; +--error 1062 +update t1 set b='b ' where a > 1; +delete from t1 where b='b'; +select a,concat(b,'.') from t1; +drop table t1; diff --git a/sql/ha_berkeley.h b/sql/ha_berkeley.h index 285bb575699..1925d1c410f 100644 --- a/sql/ha_berkeley.h +++ b/sql/ha_berkeley.h @@ -92,7 +92,7 @@ class ha_berkeley: public handler HA_NULL_KEY | HA_BLOB_KEY | HA_NOT_EXACT_COUNT | HA_PRIMARY_KEY_IN_READ_INDEX | HA_DROP_BEFORE_CREATE | HA_AUTO_PART_KEY | HA_TABLE_SCAN_ON_INDEX | - HA_FILE_BASED), + HA_KEY_READ_WRONG_STR | HA_FILE_BASED), changed_rows(0),last_dup_key((uint) -1),version(0),using_ignore(0) { } diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 74a7c97113e..31c2dc943e5 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1507,14 +1507,11 @@ void Item_func_elt::fix_length_and_dec() { max_length=0; decimals=0; - /* - first numeric argument isn't in args (3.23 and 4.0) - but since 4.1 the cycle should start from 1 - so this change - - should NOT be merged into 4.1!!! - */ +#if MYSQL_VERSION_ID < 40100 for (uint i= 0; i < arg_count ; i++) +#else + for (uint i= 1; i < arg_count ; i++) +#endif { set_if_bigger(max_length,args[i]->max_length); set_if_bigger(decimals,args[i]->decimals); diff --git a/sql/table.cc b/sql/table.cc index c8def7441fd..a90220fa55b 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -498,7 +498,8 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, field->type() != FIELD_TYPE_BLOB) { if (field->key_type() != HA_KEYTYPE_TEXT || - (!(ha_option & HA_KEY_READ_WRONG_STR) && + ((!(ha_option & HA_KEY_READ_WRONG_STR) || + field->flags & BINARY_FLAG) && !(keyinfo->flags & HA_FULLTEXT))) field->part_of_key|= ((key_map) 1 << key); if ((field->key_type() != HA_KEYTYPE_TEXT ||