Commit a7a4519a authored by Varun Gupta's avatar Varun Gupta

MDEV-14241: Server crash in key_copy / get_matching_chain_by_join_key or valgrind warnings

In this case we were using the optimization derived_with_keys but we could not create a key
because the length of the key was greater than the max allowed(MI_MAX_KEY_LENGTH).
To do the join we needed to create a hash join key instead, but in the explain output it
showed that we were still referring to derived keys which were created but not used.
parent 4f96b401
...@@ -1011,4 +1011,29 @@ id id data ...@@ -1011,4 +1011,29 @@ id id data
2 2 yes 2 2 yes
1 NULL NULL 1 NULL NULL
drop table t1; drop table t1;
#
# MDEV-14241: Server crash in key_copy / get_matching_chain_by_join_key
# or valgrind warnings
#
CREATE TABLE t1 (a VARCHAR(10)) ENGINE=MyISAM;
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 VALUES ('foo'),('bar');
CREATE TABLE t2 (b integer auto_increment primary key) ENGINE=MyISAM;
INSERT INTO t2 VALUES (NULL),(NULL);
CREATE TABLE t3 (c VARCHAR(1024) CHARACTER SET utf8, d INT) ENGINE=MyISAM;
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v3 AS SELECT * FROM t3;
INSERT INTO t3 VALUES ('abc',NULL),('def',4);
SET join_cache_level= 8;
explain
SELECT * FROM v1, t2, v3 WHERE a = c AND b = d;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 2
1 PRIMARY <derived3> hash_ALL NULL #hash#$hj 3075 func 2 Using where; Using join buffer (flat, BNLH join)
1 PRIMARY t2 eq_ref PRIMARY PRIMARY 4 v3.d 1 Using index
3 DERIVED t3 ALL NULL NULL NULL NULL 2
2 DERIVED t1 ALL NULL NULL NULL NULL 2
SELECT * FROM v1, t2, v3 WHERE a = c AND b = d;
a b c d
DROP VIEW v1, v3;
DROP TABLE t1, t2, t3;
# end of 5.5 # end of 5.5
...@@ -864,5 +864,28 @@ select distinct t1.id, tt.id, tt.data ...@@ -864,5 +864,28 @@ select distinct t1.id, tt.id, tt.data
drop table t1; drop table t1;
--echo #
--echo # MDEV-14241: Server crash in key_copy / get_matching_chain_by_join_key
--echo # or valgrind warnings
--echo #
CREATE TABLE t1 (a VARCHAR(10)) ENGINE=MyISAM;
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 VALUES ('foo'),('bar');
CREATE TABLE t2 (b integer auto_increment primary key) ENGINE=MyISAM;
INSERT INTO t2 VALUES (NULL),(NULL);
CREATE TABLE t3 (c VARCHAR(1024) CHARACTER SET utf8, d INT) ENGINE=MyISAM;
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v3 AS SELECT * FROM t3;
INSERT INTO t3 VALUES ('abc',NULL),('def',4);
SET join_cache_level= 8;
explain
SELECT * FROM v1, t2, v3 WHERE a = c AND b = d;
SELECT * FROM v1, t2, v3 WHERE a = c AND b = d;
DROP VIEW v1, v3;
DROP TABLE t1, t2, t3;
--echo # end of 5.5 --echo # end of 5.5
...@@ -9513,7 +9513,7 @@ void JOIN::drop_unused_derived_keys() ...@@ -9513,7 +9513,7 @@ void JOIN::drop_unused_derived_keys()
table->use_index(tab->ref.key); table->use_index(tab->ref.key);
if (table->s->keys) if (table->s->keys)
{ {
if (tab->ref.key >= 0) if (tab->ref.key >= 0 && tab->ref.key < MAX_KEY)
tab->ref.key= 0; tab->ref.key= 0;
else else
table->s->keys= 0; table->s->keys= 0;
......
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