Commit b9073593 authored by unknown's avatar unknown

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)


BitKeeper/etc/ignore:
  added man/*.1
mysql-test/r/bdb.result:
  New test
mysql-test/r/myisam.result:
  More tests
mysql-test/t/bdb.test:
  Test for idnex only read
mysql-test/t/myisam.test:
  More test to verify pushed bug fix
sql/ha_berkeley.h:
  Mark that strings may change on index only reads
sql/item_strfunc.cc:
  Cleanup
sql/table.cc:
  Allow index only reads on binary strings
parent 4db4ffef
...@@ -541,3 +541,4 @@ libmysql_r/vio_priv.h ...@@ -541,3 +541,4 @@ libmysql_r/vio_priv.h
hardcopy.0 hardcopy.0
scripts/make_sharedlib_distribution scripts/make_sharedlib_distribution
sql/udf_example.so sql/udf_example.so
man/*.1
...@@ -1165,3 +1165,28 @@ create table t2 (c char(8) not null, b char(8) not null, a char(8) not null, pri ...@@ -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; insert into t2 select * from t1;
delete t1,t2 from t2,t1 where t1.a<'B' and t2.b=t1.b; delete t1,t2 from t2,t1 where t1.a<'B' and t2.b=t1.b;
drop table t1,t2; 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;
...@@ -386,7 +386,10 @@ Table Op Msg_type Msg_text ...@@ -386,7 +386,10 @@ Table Op Msg_type Msg_text
test.t1 check status OK test.t1 check status OK
drop table t1; drop table t1;
create table t1 ( a text not null, key a (a(20))); 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; repair table t1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 repair status OK test.t1 repair status OK
...@@ -394,6 +397,15 @@ select concat(a,'.') from t1 where a='aaa'; ...@@ -394,6 +397,15 @@ select concat(a,'.') from t1 where a='aaa';
concat(a,'.') concat(a,'.')
aaa. aaa.
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; 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))); 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'); insert into t1 values('807780', '477', '165');
...@@ -403,3 +415,19 @@ select * from t1 where a='807780' and b='477' and c='165'; ...@@ -403,3 +415,19 @@ select * from t1 where a='807780' and b='477' and c='165';
a b c a b c
807780 477 165 807780 477 165
drop table t1; 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;
...@@ -815,3 +815,17 @@ insert into t2 select * from t1; ...@@ -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; delete t1,t2 from t2,t1 where t1.a<'B' and t2.b=t1.b;
drop table t1,t2; 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;
...@@ -390,9 +390,13 @@ drop table t1; ...@@ -390,9 +390,13 @@ drop table t1;
# two bugs in myisam-space-stripping feature # two bugs in myisam-space-stripping feature
# #
create table t1 ( a text not null, key a (a(20))); 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; repair table t1;
select concat(a,'.') from t1 where a='aaa'; 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; drop table t1;
# #
...@@ -406,3 +410,15 @@ insert into t1 values('807780', '472', '162'); ...@@ -406,3 +410,15 @@ insert into t1 values('807780', '472', '162');
select * from t1 where a='807780' and b='477' and c='165'; select * from t1 where a='807780' and b='477' and c='165';
drop table t1; 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;
...@@ -92,7 +92,7 @@ class ha_berkeley: public handler ...@@ -92,7 +92,7 @@ class ha_berkeley: public handler
HA_NULL_KEY | HA_BLOB_KEY | HA_NOT_EXACT_COUNT | HA_NULL_KEY | HA_BLOB_KEY | HA_NOT_EXACT_COUNT |
HA_PRIMARY_KEY_IN_READ_INDEX | HA_DROP_BEFORE_CREATE | HA_PRIMARY_KEY_IN_READ_INDEX | HA_DROP_BEFORE_CREATE |
HA_AUTO_PART_KEY | HA_TABLE_SCAN_ON_INDEX | 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) changed_rows(0),last_dup_key((uint) -1),version(0),using_ignore(0)
{ {
} }
......
...@@ -1507,14 +1507,11 @@ void Item_func_elt::fix_length_and_dec() ...@@ -1507,14 +1507,11 @@ void Item_func_elt::fix_length_and_dec()
{ {
max_length=0; max_length=0;
decimals=0; decimals=0;
/* #if MYSQL_VERSION_ID < 40100
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!!!
*/
for (uint i= 0; i < arg_count ; i++) 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(max_length,args[i]->max_length);
set_if_bigger(decimals,args[i]->decimals); set_if_bigger(decimals,args[i]->decimals);
......
...@@ -498,7 +498,8 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, ...@@ -498,7 +498,8 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
field->type() != FIELD_TYPE_BLOB) field->type() != FIELD_TYPE_BLOB)
{ {
if (field->key_type() != HA_KEYTYPE_TEXT || 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))) !(keyinfo->flags & HA_FULLTEXT)))
field->part_of_key|= ((key_map) 1 << key); field->part_of_key|= ((key_map) 1 << key);
if ((field->key_type() != HA_KEYTYPE_TEXT || if ((field->key_type() != HA_KEYTYPE_TEXT ||
......
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