mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MDEV-34580: Assertion `(key_part->key_part_flag & 4) == 0' failed key_hashnr
Remove an assert added by fix for MDEV-34417. BNL-H join can be used with prefix keys. This happens when there are real prefix indexes on the equi-join columns (although it probably doesn't make a lot of sense). Anyway, remove the assert. The code receives properly truncated key values for hashing/comparison so it can handle them just fine.
This commit is contained in:
@ -6420,3 +6420,23 @@ DROP TABLE t1,t2,t3;
|
|||||||
#
|
#
|
||||||
# End of 10.4 tests
|
# End of 10.4 tests
|
||||||
#
|
#
|
||||||
|
#
|
||||||
|
# MDEV-34580: Assertion `(key_part->key_part_flag & 4) == 0' failed key_hashnr
|
||||||
|
#
|
||||||
|
SET join_cache_level=3;
|
||||||
|
CREATE TABLE t1 ( a TIMESTAMP , b varchar(100), c varchar(10) ) ;
|
||||||
|
INSERT INTO t1 (b,c) VALUES ('GHOBS','EMLCG'),('t','p');
|
||||||
|
CREATE TABLE t2 (a varchar(100), b varchar(100), c varchar(10) , KEY b (b(66))) ;
|
||||||
|
insert into t2 select seq, seq, seq from seq_1_to_20;
|
||||||
|
explain
|
||||||
|
SELECT t1.a FROM t1 JOIN t2 ON t1.b = t2.b ;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
1 SIMPLE t2 hash_ALL b #hash#b 69 test.t1.b 20 Using where; Using join buffer (flat, BNLH join)
|
||||||
|
SELECT t1.a FROM t1 JOIN t2 ON t1.b = t2.b ;
|
||||||
|
a
|
||||||
|
set join_cache_level=default;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
#
|
||||||
|
# End of 10.5 tests
|
||||||
|
#
|
||||||
|
@ -4300,3 +4300,25 @@ DROP TABLE t1,t2,t3;
|
|||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.4 tests
|
--echo # End of 10.4 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-34580: Assertion `(key_part->key_part_flag & 4) == 0' failed key_hashnr
|
||||||
|
--echo #
|
||||||
|
--source include/have_sequence.inc
|
||||||
|
SET join_cache_level=3;
|
||||||
|
|
||||||
|
CREATE TABLE t1 ( a TIMESTAMP , b varchar(100), c varchar(10) ) ;
|
||||||
|
INSERT INTO t1 (b,c) VALUES ('GHOBS','EMLCG'),('t','p');
|
||||||
|
|
||||||
|
CREATE TABLE t2 (a varchar(100), b varchar(100), c varchar(10) , KEY b (b(66))) ;
|
||||||
|
insert into t2 select seq, seq, seq from seq_1_to_20;
|
||||||
|
|
||||||
|
explain
|
||||||
|
SELECT t1.a FROM t1 JOIN t2 ON t1.b = t2.b ;
|
||||||
|
SELECT t1.a FROM t1 JOIN t2 ON t1.b = t2.b ;
|
||||||
|
|
||||||
|
set join_cache_level=default;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.5 tests
|
||||||
|
--echo #
|
||||||
|
14
sql/key.cc
14
sql/key.cc
@ -755,10 +755,12 @@ ulong key_hashnr(KEY *key_info, uint used_key_parts, const uchar *key)
|
|||||||
if (is_string)
|
if (is_string)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Prefix keys are not possible in BNLH joins.
|
Surprisingly, BNL-H joins may use prefix keys. This may happen
|
||||||
Use the whole string to calculate the hash.
|
when there is a real index on the column used in equi-join.
|
||||||
|
|
||||||
|
In this case, the passed key tuple is already a prefix, no
|
||||||
|
special handling is required.
|
||||||
*/
|
*/
|
||||||
DBUG_ASSERT((key_part->key_part_flag & HA_PART_KEY_SEG) == 0);
|
|
||||||
cs->hash_sort(pos+pack_length, length, &nr, &nr2);
|
cs->hash_sort(pos+pack_length, length, &nr, &nr2);
|
||||||
key+= pack_length;
|
key+= pack_length;
|
||||||
}
|
}
|
||||||
@ -862,10 +864,10 @@ bool key_buf_cmp(KEY *key_info, uint used_key_parts,
|
|||||||
if (is_string)
|
if (is_string)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Prefix keys are not possible in BNLH joins.
|
Surprisingly, BNL-H joins may use prefix keys. This may happen
|
||||||
Compare whole strings.
|
when there is a real index on the column used in equi-join.
|
||||||
|
In this case, we get properly truncated prefixes here.
|
||||||
*/
|
*/
|
||||||
DBUG_ASSERT((key_part->key_part_flag & HA_PART_KEY_SEG) == 0);
|
|
||||||
if (cs->strnncollsp(pos1 + pack_length, length1,
|
if (cs->strnncollsp(pos1 + pack_length, length1,
|
||||||
pos2 + pack_length, length2))
|
pos2 + pack_length, length2))
|
||||||
return true;
|
return true;
|
||||||
|
Reference in New Issue
Block a user