mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-11525 Assertion `cp + len <= buff + buff_size' failed in JOIN_CACHE::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 5d7607f340f..8d99166c697
This commit is contained in:
@ -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;
|
||||
|
@ -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
|
||||
#
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user