Browse Source
MDEV-6255 DUPLICATE KEY Errors on SELECT .. GROUP BY that uses temporary and filesort.
MDEV-6255 DUPLICATE KEY Errors on SELECT .. GROUP BY that uses temporary and filesort.
The problem was that my_hash_sort didn't properly delete end-space characters properly, so strings that should compare identically was seen as different strings. (Space was handled correctly, but not NBSP) This caused duplicate key errors when a heap table was converted to Aria as part of overflow in group by. Fixed by removing all characters that compares as end space when creating a hash. Other things: - Fixed that --sorted_results also works for errors in mysqltest. - Speed up hash by not comparing strings that has different hash. - Speed up many my_hash_sort functions by using registers to calculate hash instead of pointers. This was previously done for some functions, but not for all. - Made a macro of the hash function, to simplify code and to be able to experiment with new hash functions. client/mysqltest.cc: Fixed that --sorted_results also works for error messages. mysql-test/r/ctype_partitions.result: New test to ensure that partitions on hash works mysql-test/suite/multi_source/gtid.result: Updated result mysql-test/suite/multi_source/gtid.test: Test that --sorted_result works for error messages mysql-test/suite/multi_source/gtid_ignore_duplicates.result: Updated result mysql-test/suite/multi_source/gtid_ignore_duplicates.test: Updated result mysql-test/suite/multi_source/load_data.result: Updated result mysql-test/suite/multi_source/load_data.test: Updated result mysql-test/t/ctype_partitions.test: New test to ensure that partitions on hash works storage/heap/hp_write.c: Speed up hash by not comparing strings that has different hash. storage/maria/ma_check.c: Extra debug strings/ctype-bin.c: Use macro for hash function strings/ctype-latin1.c: Use macro for hash function Use registers to calculate hash (speedup) strings/ctype-mb.c: Use macro for hash function Use registers to calculate hash (speedup) strings/ctype-simple.c: Use macro for hash function Use same variable names as in other my_hash_sort functions. Update my_hash_sort_simple() to properly remove end space (patch by Bar) strings/ctype-uca.c: Ignore duplicated space inside strings and end space in my_hash_sort_uca(). This fixed MDEV-6255 Use macro for hash function Use registers to calculate hash (speedup) strings/ctype-ucs2.c: Use macro for hash function Use registers to calculate hash (speedup) strings/ctype-utf8.c: Use macro for hash function Use registers to calculate hash (speedup) strings/strings_def.h: Made a macro of the hash function, to simplify code and to be able to experiment with new hash functions.pull/22/head
19 changed files with 237 additions and 83 deletions
-
12client/mysqltest.cc
-
51mysql-test/r/ctype_partitions.result
-
2mysql-test/suite/multi_source/gtid.result
-
2mysql-test/suite/multi_source/gtid.test
-
2mysql-test/suite/multi_source/gtid_ignore_duplicates.result
-
4mysql-test/suite/multi_source/gtid_ignore_duplicates.test
-
2mysql-test/suite/multi_source/load_data.result
-
1mysql-test/suite/multi_source/load_data.test
-
29mysql-test/t/ctype_partitions.test
-
3storage/heap/hp_write.c
-
2storage/maria/ma_check.c
-
8strings/ctype-bin.c
-
10strings/ctype-latin1.c
-
8strings/ctype-mb.c
-
46strings/ctype-simple.c
-
38strings/ctype-uca.c
-
56strings/ctype-ucs2.c
-
28strings/ctype-utf8.c
-
16strings/strings_def.h
@ -0,0 +1,51 @@ |
|||
# |
|||
# MDEV-6255 DUPLICATE KEY Errors on SELECT .. GROUP BY that uses temporary and filesort |
|||
# |
|||
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET cp1251 COLLATE cp1251_ukrainian_ci); |
|||
INSERT INTO t1 VALUES (0x20),(0x60),(0x6060),(0x606060); |
|||
SELECT HEX(a) FROM t1 WHERE a=0x60; |
|||
HEX(a) |
|||
20 |
|||
60 |
|||
6060 |
|||
606060 |
|||
ALTER TABLE t1 PARTITION BY KEY(a) PARTITIONS 3; |
|||
SELECT HEX(a) FROM t1 WHERE a=0x60; |
|||
HEX(a) |
|||
20 |
|||
60 |
|||
6060 |
|||
606060 |
|||
DROP TABLE t1; |
|||
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET koi8u COLLATE koi8u_general_ci); |
|||
INSERT INTO t1 VALUES (0x20),(0x60),(0x6060),(0x606060); |
|||
SELECT HEX(a) FROM t1 WHERE a=0x60; |
|||
HEX(a) |
|||
20 |
|||
60 |
|||
6060 |
|||
606060 |
|||
ALTER TABLE t1 PARTITION BY KEY(a) PARTITIONS 3; |
|||
SELECT HEX(a) FROM t1 WHERE a=0x60; |
|||
HEX(a) |
|||
20 |
|||
60 |
|||
6060 |
|||
606060 |
|||
DROP TABLE t1; |
|||
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET cp1250 COLLATE cp1250_general_ci); |
|||
INSERT INTO t1 VALUES (0x20),(0xA0),(0xA0A0),(0xA0A0A0); |
|||
SELECT HEX(a) FROM t1 WHERE a=0xA0; |
|||
HEX(a) |
|||
20 |
|||
A0 |
|||
A0A0 |
|||
A0A0A0 |
|||
ALTER TABLE t1 PARTITION BY KEY(a) PARTITIONS 3; |
|||
SELECT HEX(a) FROM t1 WHERE a=0xA0; |
|||
HEX(a) |
|||
20 |
|||
A0 |
|||
A0A0 |
|||
A0A0A0 |
|||
DROP TABLE t1; |
|||
@ -0,0 +1,29 @@ |
|||
--source include/have_partition.inc |
|||
|
|||
--echo # |
|||
--echo # MDEV-6255 DUPLICATE KEY Errors on SELECT .. GROUP BY that uses temporary and filesort |
|||
--echo # |
|||
|
|||
# cp1251_ukrainian_ci: 0x20 SPACE is equal to 0x60 GRAVE ACCENT |
|||
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET cp1251 COLLATE cp1251_ukrainian_ci); |
|||
INSERT INTO t1 VALUES (0x20),(0x60),(0x6060),(0x606060); |
|||
SELECT HEX(a) FROM t1 WHERE a=0x60; |
|||
ALTER TABLE t1 PARTITION BY KEY(a) PARTITIONS 3; |
|||
SELECT HEX(a) FROM t1 WHERE a=0x60; |
|||
DROP TABLE t1; |
|||
|
|||
# koi8u_general_ci: 0x20 SPACE is equal to 0x60 GRAVE ACCENT |
|||
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET koi8u COLLATE koi8u_general_ci); |
|||
INSERT INTO t1 VALUES (0x20),(0x60),(0x6060),(0x606060); |
|||
SELECT HEX(a) FROM t1 WHERE a=0x60; |
|||
ALTER TABLE t1 PARTITION BY KEY(a) PARTITIONS 3; |
|||
SELECT HEX(a) FROM t1 WHERE a=0x60; |
|||
DROP TABLE t1; |
|||
|
|||
# cp1250_general_ci: 0x20 SPACE is equal to 0xA0 NO-BREAK SPACE |
|||
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET cp1250 COLLATE cp1250_general_ci); |
|||
INSERT INTO t1 VALUES (0x20),(0xA0),(0xA0A0),(0xA0A0A0); |
|||
SELECT HEX(a) FROM t1 WHERE a=0xA0; |
|||
ALTER TABLE t1 PARTITION BY KEY(a) PARTITIONS 3; |
|||
SELECT HEX(a) FROM t1 WHERE a=0xA0; |
|||
DROP TABLE t1; |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue