Skip to content

Commit

Permalink
MDEV-11525 Assertion `cp + len <= buff + buff_size' failed in JOIN_CA…
Browse files Browse the repository at this point in the history
…CHE::write_record_data

Workaround for join_cache + index on vcols + keyread bug.
Initialize the record to avoid caching garbage in non-read fields.

A proper fix (do not cache non-read fields at all) is done in 10.2
in commits 5d7607f..8d99166
  • Loading branch information
vuvova committed Feb 27, 2017
1 parent eef2101 commit 8897b50
Show file tree
Hide file tree
Showing 3 changed files with 146 additions and 0 deletions.
109 changes: 109 additions & 0 deletions mysql-test/suite/vcol/r/vcol_select_myisam.result
Original file line number Diff line number Diff line change
Expand Up @@ -295,3 +295,112 @@ Note 1003 select `test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a` from `test`.`t1`
SELECT * FROM t1 NATURAL JOIN t2;
b a
DROP TABLE t1,t2;
create table t1 (
pk integer auto_increment,
bi integer not null,
vi integer generated always as (bi) persistent,
bc varchar(1) not null,
vc varchar(2) generated always as (concat(bc, bc)) persistent,
primary key (pk),
key (vi, vc));
insert t1 (bi, bc) values (0, 'x'), (0, 'n'), (1, 'w'), (7, 's'), (0, 'a'), (4, 'd'), (1, 'w'), (1, 'j'), (1, 'm'), (4, 'k'), (7, 't'), (4, 'k'), (2, 'e'), (0, 'i'), (1, 't'), (6, 'z'), (3, 'c'), (6, 'i'), (8, 'v');
create table t2 (
pk integer auto_increment,
bi integer not null,
vi integer generated always as (bi) persistent,
bc varchar(257) not null,
vc varchar(2) generated always as (concat(bc, bc)) persistent,
primary key (pk),
key (vi, vc));
insert t2 (bi, bc) values (1, 'c'), (8, 'm'), (9, 'd'), (6, 'y'), (1, 't'), (6, 'd'), (2, 's'), (4, 'r'), (8, 'm'), (4, 'b'), (4, 'x'), (7, 'g'), (4, 'p'), (1, 'q'), (9, 'w'), (4, 'd'), (8, 'e'), (4, 'b'), (8, 'y');
explain # should be using join buffer
select t2.vi from (t2 as t3 right join (t2 left join t1 on (t1.bi = t2.vi)) on (t1.vc = t2.vc));
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 index NULL vi 10 NULL 19 Using index
1 SIMPLE t1 ALL NULL NULL NULL NULL 19 Using where; Using join buffer (flat, BNL join)
1 SIMPLE t3 index NULL PRIMARY 4 NULL 19 Using where; Using index; Using join buffer (incremental, BNL join)
select t2.vi from (t2 as t3 right join (t2 left join t1 on (t1.bi = t2.vi)) on (t1.vc = t2.vc));
vi
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
6
6
6
6
7
7
8
8
8
8
9
9
drop table t2,t1;
32 changes: 32 additions & 0 deletions mysql-test/suite/vcol/t/vcol_select_myisam.test
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,35 @@ SELECT * FROM t1 NATURAL JOIN t2;
SELECT * FROM t1 NATURAL JOIN t2;

DROP TABLE t1,t2;

#
# MDEV-11525 Assertion `cp + len <= buff + buff_size' failed in JOIN_CACHE::write_record_data
#

create table t1 (
pk integer auto_increment,
bi integer not null,
vi integer generated always as (bi) persistent,
bc varchar(1) not null,
vc varchar(2) generated always as (concat(bc, bc)) persistent,
primary key (pk),
key (vi, vc));
insert t1 (bi, bc) values (0, 'x'), (0, 'n'), (1, 'w'), (7, 's'), (0, 'a'), (4, 'd'), (1, 'w'), (1, 'j'), (1, 'm'), (4, 'k'), (7, 't'), (4, 'k'), (2, 'e'), (0, 'i'), (1, 't'), (6, 'z'), (3, 'c'), (6, 'i'), (8, 'v');
create table t2 (
pk integer auto_increment,
bi integer not null,
vi integer generated always as (bi) persistent,
bc varchar(257) not null,
vc varchar(2) generated always as (concat(bc, bc)) persistent,
primary key (pk),
key (vi, vc));
insert t2 (bi, bc) values (1, 'c'), (8, 'm'), (9, 'd'), (6, 'y'), (1, 't'), (6, 'd'), (2, 's'), (4, 'r'), (8, 'm'), (4, 'b'), (4, 'x'), (7, 'g'), (4, 'p'), (1, 'q'), (9, 'w'), (4, 'd'), (8, 'e'), (4, 'b'), (8, 'y');
explain # should be using join buffer
select t2.vi from (t2 as t3 right join (t2 left join t1 on (t1.bi = t2.vi)) on (t1.vc = t2.vc));
--sorted_result
select t2.vi from (t2 as t3 right join (t2 left join t1 on (t1.bi = t2.vi)) on (t1.vc = t2.vc));
drop table t2,t1;

#
# End of 5.5 tests
#
5 changes: 5 additions & 0 deletions sql/sql_join_cache.cc
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,11 @@ void JOIN_CACHE::create_remaining_fields()
{
MY_BITMAP *rem_field_set;
TABLE *table= tab->table;
#if MYSQL_VERSION_ID < 100204
empty_record(table);
#else
#error remove
#endif

if (all_read_fields)
rem_field_set= table->read_set;
Expand Down

0 comments on commit 8897b50

Please sign in to comment.