mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Fixed bug #32556: assert in "using index for group-by" :
is_last_prefix <= 0, file .\opt_range.cc. SELECT ... GROUP BY bit field failed with an assertion if the bit length of that field was not divisible by 8. sql/key.cc: Fixed bug #32556. Copying of "uneven" bits of a bit field was duplicated in the key_copy() and in the Field_bit::get_key_image(). So, instead of copying of the rest of a bit field, Field_bit::get_key_image() copied "uneven" bits to key image again, and the lowest field byte was not copied to key at all. Duplicated code has been removed from the key_copy function. mysql-test/t/type_bit.test: Added test case for bug #32556. mysql-test/r/type_bit.result: Added test case for bug #32556.
This commit is contained in:
@ -672,4 +672,14 @@ COUNT(DISTINCT b,c)
|
|||||||
2
|
2
|
||||||
2
|
2
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
|
CREATE TABLE t1(a BIT(13), KEY(a));
|
||||||
|
INSERT INTO t1(a) VALUES
|
||||||
|
(65535),(65525),(65535),(65535),(65535),(65535),(65535),(65535),(65535),(65535);
|
||||||
|
EXPLAIN SELECT 1 FROM t1 GROUP BY a;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 range NULL a 3 NULL 6 Using index for group-by
|
||||||
|
SELECT 1 FROM t1 GROUP BY a;
|
||||||
|
1
|
||||||
|
1
|
||||||
|
DROP TABLE t1;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
|
@ -318,4 +318,19 @@ INSERT INTO t2 VALUES (3, 2, 'two'), (2, 3, 'three'), (2, 0, 'zero'),
|
|||||||
SELECT COUNT(DISTINCT b,c) FROM t2 GROUP BY a;
|
SELECT COUNT(DISTINCT b,c) FROM t2 GROUP BY a;
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#32556 assert in "using index for group-by" : is_last_prefix <= 0,
|
||||||
|
# file .\opt_range.cc
|
||||||
|
|
||||||
|
CREATE TABLE t1(a BIT(13), KEY(a));
|
||||||
|
--disable_warnings
|
||||||
|
INSERT INTO t1(a) VALUES
|
||||||
|
(65535),(65525),(65535),(65535),(65535),(65535),(65535),(65535),(65535),(65535);
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
EXPLAIN SELECT 1 FROM t1 GROUP BY a;
|
||||||
|
SELECT 1 FROM t1 GROUP BY a;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
13
sql/key.cc
13
sql/key.cc
@ -106,19 +106,6 @@ void key_copy(byte *to_key, byte *from_record, KEY *key_info, uint key_length)
|
|||||||
key_part->null_bit);
|
key_part->null_bit);
|
||||||
key_length--;
|
key_length--;
|
||||||
}
|
}
|
||||||
if (key_part->type == HA_KEYTYPE_BIT)
|
|
||||||
{
|
|
||||||
Field_bit *field= (Field_bit *) (key_part->field);
|
|
||||||
if (field->bit_len)
|
|
||||||
{
|
|
||||||
uchar bits= get_rec_bits((uchar*) from_record +
|
|
||||||
key_part->null_offset +
|
|
||||||
(key_part->null_bit == 128),
|
|
||||||
field->bit_ofs, field->bit_len);
|
|
||||||
*to_key++= bits;
|
|
||||||
key_length--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (key_part->key_part_flag & HA_BLOB_PART ||
|
if (key_part->key_part_flag & HA_BLOB_PART ||
|
||||||
key_part->key_part_flag & HA_VAR_LENGTH_PART)
|
key_part->key_part_flag & HA_VAR_LENGTH_PART)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user