Loading mysql-test/r/bdb.result +16 −0 Original line number Diff line number Diff line Loading @@ -1191,6 +1191,22 @@ A a drop table t1; create table t1( pk1 text not null, pk2 text not null, pk3 char(4), key1 int, key2 int, primary key(pk1(4), pk2(4), pk3), key(key1), key(key2) ) engine=bdb; insert into t1 values (concat('aaa-', repeat('A', 4000)), concat('eee-', repeat('e', 4000)), 'a++a', 1, 1); insert into t1 values (concat('bbb-', repeat('B', 4000)), concat('ggg-', repeat('G', 4000)), 'b++b', 1, 1); select substring(pk1, 1, 4), substring(pk1, 4001), substring(pk2, 1, 4), substring(pk2, 4001), pk3, key1, key2 from t1 force index(key1, key2) where key1 < 3 or key2 < 3; substring(pk1, 1, 4) substring(pk1, 4001) substring(pk2, 1, 4) substring(pk2, 4001) pk3 key1 key2 aaa- AAAA eee- eeee a++a 1 1 bbb- BBBB ggg- GGGG b++b 1 1 drop table t1; create table t1 ( pk1 varchar(8) not null default '', pk2 varchar(4) not null default '', key1 int(11) default null, Loading mysql-test/r/flush_table.result 0 → 100644 +120 −0 Original line number Diff line number Diff line drop table if exists t1; create table t1 (a int not null auto_increment primary key); insert into t1 values(0); lock table t1 read; flush table t1; check table t1; Table Op Msg_type Msg_text test.t1 check status OK drop table t1; drop database if exists test_test; create database test_test; use test_test; create table t1(table_id char(20) primary key); insert into t1 values ('test_test.t1'); insert into t1 values (''); handler t1 open; handler t1 read first limit 9; table_id test_test.t1 create table t2(table_id char(20) primary key); insert into t2 values ('test_test.t2'); insert into t2 values (''); handler t2 open; handler t2 read first limit 9; table_id test_test.t2 use test; drop table if exists t1; create table t1(table_id char(20) primary key); insert into t1 values ('test.t1'); insert into t1 values (''); handler t1 open; handler t1 read first limit 9; table_id test.t1 use test; handler test.t1 read first limit 9; table_id test.t1 handler test.t2 read first limit 9; Unknown table 't2' in HANDLER handler test_test.t1 read first limit 9; table_id test_test.t1 handler test_test.t2 read first limit 9; table_id test_test.t2 handler test_test.t1 close; drop table test_test.t1; handler test_test.t2 close; drop table test_test.t2; drop database test_test; use test; handler test.t1 close; drop table test.t1; drop table if exists t1; drop table if exists t2; create table t1(table_id char(20) primary key); create table t2(table_id char(20) primary key); insert into t1 values ('test.t1'); insert into t1 values (''); insert into t2 values ('test.t2'); insert into t2 values (''); handler t1 open as a1; handler t1 open as a2; handler t2 open; handler a1 read first limit 9; table_id test.t1 handler a2 read first limit 9; table_id test.t1 handler t2 read first limit 9; table_id test.t2 flush tables; handler a1 read first limit 9; Unknown table 'a1' in HANDLER handler a2 read first limit 9; Unknown table 'a2' in HANDLER handler t2 read first limit 9; Unknown table 't2' in HANDLER handler t1 open as a1; handler t1 open as a2; handler t2 open; handler a1 read first limit 9; table_id test.t1 handler a2 read first limit 9; table_id test.t1 handler t2 read first limit 9; table_id test.t2 flush table t1; handler a1 read first limit 9; Unknown table 'a1' in HANDLER handler a2 read first limit 9; Unknown table 'a2' in HANDLER handler t2 read first limit 9; table_id test.t2 flush table t2; handler t2 close; Unknown table 't2' in HANDLER drop table t1; drop table t2; mysql-test/t/bdb.test +19 −0 Original line number Diff line number Diff line Loading @@ -830,6 +830,25 @@ explain select a from t1; select a from t1; drop table t1; # # bug#2686 - index_merge select on BerkeleyDB table with varchar PK causes mysqld to crash # create table t1( pk1 text not null, pk2 text not null, pk3 char(4), key1 int, key2 int, primary key(pk1(4), pk2(4), pk3), key(key1), key(key2) ) engine=bdb; insert into t1 values (concat('aaa-', repeat('A', 4000)), concat('eee-', repeat('e', 4000)), 'a++a', 1, 1); insert into t1 values (concat('bbb-', repeat('B', 4000)), concat('ggg-', repeat('G', 4000)), 'b++b', 1, 1); select substring(pk1, 1, 4), substring(pk1, 4001), substring(pk2, 1, 4), substring(pk2, 4001), pk3, key1, key2 from t1 force index(key1, key2) where key1 < 3 or key2 < 3; drop table t1; # # bug#2688 - Wrong index_merge query results for BDB table with variable length primary key # Loading mysql-test/t/flush_table.test +108 −7 Original line number Diff line number Diff line Loading @@ -4,10 +4,111 @@ # Test of flush table # #drop table if exists t1; #create table t1 (a int not null auto_increment primary key); #insert into t1 values(0); #lock table t1 read; #flush table t1; #check table t1; #drop table t1; drop table if exists t1; create table t1 (a int not null auto_increment primary key); insert into t1 values(0); lock table t1 read; flush table t1; check table t1; drop table t1; # # Check if two database names beginning the same are seen as different. # # This database begins like the usual 'test' database. # --disable_warnings drop database if exists test_test; --enable_warnings create database test_test; use test_test; create table t1(table_id char(20) primary key); insert into t1 values ('test_test.t1'); insert into t1 values (''); handler t1 open; handler t1 read first limit 9; create table t2(table_id char(20) primary key); insert into t2 values ('test_test.t2'); insert into t2 values (''); handler t2 open; handler t2 read first limit 9; # # This is the usual 'test' database. # use test; --disable_warnings drop table if exists t1; --enable_warnings create table t1(table_id char(20) primary key); insert into t1 values ('test.t1'); insert into t1 values (''); handler t1 open; handler t1 read first limit 9; # # Check accesibility of all the tables. # use test; handler test.t1 read first limit 9; --error 1109; handler test.t2 read first limit 9; handler test_test.t1 read first limit 9; handler test_test.t2 read first limit 9; # # Cleanup. # handler test_test.t1 close; drop table test_test.t1; handler test_test.t2 close; drop table test_test.t2; drop database test_test; # use test; handler test.t1 close; drop table test.t1; # # In the following test FLUSH TABLES produces a deadlock # (hang forever) if the fix for bug#3565 is missing. # --disable_warnings drop table if exists t1; drop table if exists t2; --enable_warnings create table t1(table_id char(20) primary key); create table t2(table_id char(20) primary key); insert into t1 values ('test.t1'); insert into t1 values (''); insert into t2 values ('test.t2'); insert into t2 values (''); handler t1 open as a1; handler t1 open as a2; handler t2 open; handler a1 read first limit 9; handler a2 read first limit 9; handler t2 read first limit 9; flush tables; --error 1109; handler a1 read first limit 9; --error 1109; handler a2 read first limit 9; --error 1109; handler t2 read first limit 9; # handler t1 open as a1; handler t1 open as a2; handler t2 open; handler a1 read first limit 9; handler a2 read first limit 9; handler t2 read first limit 9; flush table t1; --error 1109; handler a1 read first limit 9; --error 1109; handler a2 read first limit 9; handler t2 read first limit 9; flush table t2; --error 1109; handler t2 close; drop table t1; drop table t2; sql/field.cc +80 −0 Original line number Diff line number Diff line Loading @@ -4167,6 +4167,42 @@ uint32 Field_blob::get_length(const char *pos) } /* Put a blob length field into a record buffer. SYNOPSIS Field_blob::put_length() pos Pointer into the record buffer. length The length value to put. DESCRIPTION Depending on the maximum length of a blob, its length field is put into 1 to 4 bytes. This is a property of the blob object, described by 'packlength'. RETURN nothing */ void Field_blob::put_length(char *pos, uint32 length) { switch (packlength) { case 1: *pos= (char) length; break; case 2: int2store(pos, length); break; case 3: int3store(pos, length); break; case 4: int4store(pos, length); break; } } void Field_blob::store(const char *from,uint len) { if (!len) Loading Loading @@ -4525,6 +4561,50 @@ char *Field_blob::pack_key(char *to, const char *from, uint max_length) return to+length; } /* Unpack a blob key into a record buffer. SYNOPSIS Field_blob::unpack_key() to Pointer into the record buffer. from Pointer to the packed key. max_length Key length limit from key description. DESCRIPTION A blob key has a maximum size of 64K-1. In its packed form, the length field is one or two bytes long, depending on 'max_length'. Depending on the maximum length of a blob, its length field is put into 1 to 4 bytes. This is a property of the blob object, described by 'packlength'. Blobs are internally stored apart from the record buffer, which contains a pointer to the blob buffer. RETURN Pointer into 'from' past the last byte copied from packed key. */ const char *Field_blob::unpack_key(char *to, const char *from, uint max_length) { /* get length of the blob key */ uint32 length= *((uchar*) from++); if (max_length > 255) length+= (*((uchar*) from++)) << 8; /* put the length into the record buffer */ put_length(to, length); /* put the address of the blob buffer or NULL */ if (length) memcpy_fixed(to + packlength, &from, sizeof(from)); else bzero(to + packlength, sizeof(from)); /* point to first byte of next field in 'from' */ return from + length; } /* Create a packed key that will be used for storage from a MySQL key */ char *Field_blob::pack_key_from_key_image(char *to, const char *from, Loading Loading
mysql-test/r/bdb.result +16 −0 Original line number Diff line number Diff line Loading @@ -1191,6 +1191,22 @@ A a drop table t1; create table t1( pk1 text not null, pk2 text not null, pk3 char(4), key1 int, key2 int, primary key(pk1(4), pk2(4), pk3), key(key1), key(key2) ) engine=bdb; insert into t1 values (concat('aaa-', repeat('A', 4000)), concat('eee-', repeat('e', 4000)), 'a++a', 1, 1); insert into t1 values (concat('bbb-', repeat('B', 4000)), concat('ggg-', repeat('G', 4000)), 'b++b', 1, 1); select substring(pk1, 1, 4), substring(pk1, 4001), substring(pk2, 1, 4), substring(pk2, 4001), pk3, key1, key2 from t1 force index(key1, key2) where key1 < 3 or key2 < 3; substring(pk1, 1, 4) substring(pk1, 4001) substring(pk2, 1, 4) substring(pk2, 4001) pk3 key1 key2 aaa- AAAA eee- eeee a++a 1 1 bbb- BBBB ggg- GGGG b++b 1 1 drop table t1; create table t1 ( pk1 varchar(8) not null default '', pk2 varchar(4) not null default '', key1 int(11) default null, Loading
mysql-test/r/flush_table.result 0 → 100644 +120 −0 Original line number Diff line number Diff line drop table if exists t1; create table t1 (a int not null auto_increment primary key); insert into t1 values(0); lock table t1 read; flush table t1; check table t1; Table Op Msg_type Msg_text test.t1 check status OK drop table t1; drop database if exists test_test; create database test_test; use test_test; create table t1(table_id char(20) primary key); insert into t1 values ('test_test.t1'); insert into t1 values (''); handler t1 open; handler t1 read first limit 9; table_id test_test.t1 create table t2(table_id char(20) primary key); insert into t2 values ('test_test.t2'); insert into t2 values (''); handler t2 open; handler t2 read first limit 9; table_id test_test.t2 use test; drop table if exists t1; create table t1(table_id char(20) primary key); insert into t1 values ('test.t1'); insert into t1 values (''); handler t1 open; handler t1 read first limit 9; table_id test.t1 use test; handler test.t1 read first limit 9; table_id test.t1 handler test.t2 read first limit 9; Unknown table 't2' in HANDLER handler test_test.t1 read first limit 9; table_id test_test.t1 handler test_test.t2 read first limit 9; table_id test_test.t2 handler test_test.t1 close; drop table test_test.t1; handler test_test.t2 close; drop table test_test.t2; drop database test_test; use test; handler test.t1 close; drop table test.t1; drop table if exists t1; drop table if exists t2; create table t1(table_id char(20) primary key); create table t2(table_id char(20) primary key); insert into t1 values ('test.t1'); insert into t1 values (''); insert into t2 values ('test.t2'); insert into t2 values (''); handler t1 open as a1; handler t1 open as a2; handler t2 open; handler a1 read first limit 9; table_id test.t1 handler a2 read first limit 9; table_id test.t1 handler t2 read first limit 9; table_id test.t2 flush tables; handler a1 read first limit 9; Unknown table 'a1' in HANDLER handler a2 read first limit 9; Unknown table 'a2' in HANDLER handler t2 read first limit 9; Unknown table 't2' in HANDLER handler t1 open as a1; handler t1 open as a2; handler t2 open; handler a1 read first limit 9; table_id test.t1 handler a2 read first limit 9; table_id test.t1 handler t2 read first limit 9; table_id test.t2 flush table t1; handler a1 read first limit 9; Unknown table 'a1' in HANDLER handler a2 read first limit 9; Unknown table 'a2' in HANDLER handler t2 read first limit 9; table_id test.t2 flush table t2; handler t2 close; Unknown table 't2' in HANDLER drop table t1; drop table t2;
mysql-test/t/bdb.test +19 −0 Original line number Diff line number Diff line Loading @@ -830,6 +830,25 @@ explain select a from t1; select a from t1; drop table t1; # # bug#2686 - index_merge select on BerkeleyDB table with varchar PK causes mysqld to crash # create table t1( pk1 text not null, pk2 text not null, pk3 char(4), key1 int, key2 int, primary key(pk1(4), pk2(4), pk3), key(key1), key(key2) ) engine=bdb; insert into t1 values (concat('aaa-', repeat('A', 4000)), concat('eee-', repeat('e', 4000)), 'a++a', 1, 1); insert into t1 values (concat('bbb-', repeat('B', 4000)), concat('ggg-', repeat('G', 4000)), 'b++b', 1, 1); select substring(pk1, 1, 4), substring(pk1, 4001), substring(pk2, 1, 4), substring(pk2, 4001), pk3, key1, key2 from t1 force index(key1, key2) where key1 < 3 or key2 < 3; drop table t1; # # bug#2688 - Wrong index_merge query results for BDB table with variable length primary key # Loading
mysql-test/t/flush_table.test +108 −7 Original line number Diff line number Diff line Loading @@ -4,10 +4,111 @@ # Test of flush table # #drop table if exists t1; #create table t1 (a int not null auto_increment primary key); #insert into t1 values(0); #lock table t1 read; #flush table t1; #check table t1; #drop table t1; drop table if exists t1; create table t1 (a int not null auto_increment primary key); insert into t1 values(0); lock table t1 read; flush table t1; check table t1; drop table t1; # # Check if two database names beginning the same are seen as different. # # This database begins like the usual 'test' database. # --disable_warnings drop database if exists test_test; --enable_warnings create database test_test; use test_test; create table t1(table_id char(20) primary key); insert into t1 values ('test_test.t1'); insert into t1 values (''); handler t1 open; handler t1 read first limit 9; create table t2(table_id char(20) primary key); insert into t2 values ('test_test.t2'); insert into t2 values (''); handler t2 open; handler t2 read first limit 9; # # This is the usual 'test' database. # use test; --disable_warnings drop table if exists t1; --enable_warnings create table t1(table_id char(20) primary key); insert into t1 values ('test.t1'); insert into t1 values (''); handler t1 open; handler t1 read first limit 9; # # Check accesibility of all the tables. # use test; handler test.t1 read first limit 9; --error 1109; handler test.t2 read first limit 9; handler test_test.t1 read first limit 9; handler test_test.t2 read first limit 9; # # Cleanup. # handler test_test.t1 close; drop table test_test.t1; handler test_test.t2 close; drop table test_test.t2; drop database test_test; # use test; handler test.t1 close; drop table test.t1; # # In the following test FLUSH TABLES produces a deadlock # (hang forever) if the fix for bug#3565 is missing. # --disable_warnings drop table if exists t1; drop table if exists t2; --enable_warnings create table t1(table_id char(20) primary key); create table t2(table_id char(20) primary key); insert into t1 values ('test.t1'); insert into t1 values (''); insert into t2 values ('test.t2'); insert into t2 values (''); handler t1 open as a1; handler t1 open as a2; handler t2 open; handler a1 read first limit 9; handler a2 read first limit 9; handler t2 read first limit 9; flush tables; --error 1109; handler a1 read first limit 9; --error 1109; handler a2 read first limit 9; --error 1109; handler t2 read first limit 9; # handler t1 open as a1; handler t1 open as a2; handler t2 open; handler a1 read first limit 9; handler a2 read first limit 9; handler t2 read first limit 9; flush table t1; --error 1109; handler a1 read first limit 9; --error 1109; handler a2 read first limit 9; handler t2 read first limit 9; flush table t2; --error 1109; handler t2 close; drop table t1; drop table t2;
sql/field.cc +80 −0 Original line number Diff line number Diff line Loading @@ -4167,6 +4167,42 @@ uint32 Field_blob::get_length(const char *pos) } /* Put a blob length field into a record buffer. SYNOPSIS Field_blob::put_length() pos Pointer into the record buffer. length The length value to put. DESCRIPTION Depending on the maximum length of a blob, its length field is put into 1 to 4 bytes. This is a property of the blob object, described by 'packlength'. RETURN nothing */ void Field_blob::put_length(char *pos, uint32 length) { switch (packlength) { case 1: *pos= (char) length; break; case 2: int2store(pos, length); break; case 3: int3store(pos, length); break; case 4: int4store(pos, length); break; } } void Field_blob::store(const char *from,uint len) { if (!len) Loading Loading @@ -4525,6 +4561,50 @@ char *Field_blob::pack_key(char *to, const char *from, uint max_length) return to+length; } /* Unpack a blob key into a record buffer. SYNOPSIS Field_blob::unpack_key() to Pointer into the record buffer. from Pointer to the packed key. max_length Key length limit from key description. DESCRIPTION A blob key has a maximum size of 64K-1. In its packed form, the length field is one or two bytes long, depending on 'max_length'. Depending on the maximum length of a blob, its length field is put into 1 to 4 bytes. This is a property of the blob object, described by 'packlength'. Blobs are internally stored apart from the record buffer, which contains a pointer to the blob buffer. RETURN Pointer into 'from' past the last byte copied from packed key. */ const char *Field_blob::unpack_key(char *to, const char *from, uint max_length) { /* get length of the blob key */ uint32 length= *((uchar*) from++); if (max_length > 255) length+= (*((uchar*) from++)) << 8; /* put the length into the record buffer */ put_length(to, length); /* put the address of the blob buffer or NULL */ if (length) memcpy_fixed(to + packlength, &from, sizeof(from)); else bzero(to + packlength, sizeof(from)); /* point to first byte of next field in 'from' */ return from + length; } /* Create a packed key that will be used for storage from a MySQL key */ char *Field_blob::pack_key_from_key_image(char *to, const char *from, Loading