# # Bug #27454796 - WRONG GROUP BY RESULTS WITH TEMPTABLE AND NO PAD COLLATIONS # # Notes: # - The TRIM is used below as it cannot be predicted which rows # would be selected by GROUP BY and VARCHAR columns preserves # the spaces. # - SELECTs with GROUP test indexes with HASH algorithm. # - SELECTs with subqueries test indexes with BTREE algorithm. # --echo # --echo # Prepare --echo # SET @big_tables_saved = @@big_tables; SET @optimizer_switch_saved = @@optimizer_switch; --echo # --echo # Check if selected collations have required padding mode --echo # SELECT pad_attribute FROM information_schema.collations WHERE collation_name = 'utf8mb4_0900_ai_ci'; SELECT pad_attribute FROM information_schema.collations WHERE collation_name = 'utf8mb4_general_ci'; --echo # --echo # Create test tables --echo # CREATE TABLE table_char_no_pad ( f1 CHAR(20) COLLATE utf8mb4_0900_ai_ci ); INSERT INTO table_char_no_pad VALUES ('ABC '); INSERT INTO table_char_no_pad VALUES ('XYZ'); INSERT INTO table_char_no_pad VALUES ('XYZ '); INSERT INTO table_char_no_pad VALUES ('ABC '); CREATE TABLE table_varchar_no_pad ( f1 VARCHAR(20) COLLATE utf8mb4_0900_ai_ci ); INSERT INTO table_varchar_no_pad VALUES ('ABC '); INSERT INTO table_varchar_no_pad VALUES ('XYZ'); INSERT INTO table_varchar_no_pad VALUES ('XYZ '); INSERT INTO table_varchar_no_pad VALUES ('ABC '); CREATE TABLE table_char_pad_space ( f1 CHAR(20) COLLATE utf8mb4_general_ci ); INSERT INTO table_char_pad_space VALUES ('ABC '); INSERT INTO table_char_pad_space VALUES ('XYZ'); INSERT INTO table_char_pad_space VALUES ('XYZ '); INSERT INTO table_char_pad_space VALUES ('ABC '); CREATE TABLE table_varchar_pad_space ( f1 VARCHAR(20) COLLATE utf8mb4_general_ci ); INSERT INTO table_varchar_pad_space VALUES ('ABC '); INSERT INTO table_varchar_pad_space VALUES ('XYZ'); INSERT INTO table_varchar_pad_space VALUES ('XYZ '); INSERT INTO table_varchar_pad_space VALUES ('ABC '); SHOW STATUS LIKE 'Created_tmp_tables'; SHOW STATUS LIKE 'Created_tmp_disk_tables'; --echo # --echo # Disable optimization to force creating BTREE indexes. --echo # SET @@optimizer_switch = "derived_merge=off"; --echo # --echo # Test with Temptable engine --echo # SET SESSION big_tables = 0; SET @@internal_tmp_mem_storage_engine = TempTable; --sorted_result SELECT f1, COUNT(*) FROM table_varchar_no_pad GROUP BY f1; --sorted_result SELECT f1, COUNT(*) FROM table_char_no_pad GROUP BY f1; --sorted_result SELECT TRIM(f1), COUNT(*) FROM table_varchar_pad_space GROUP BY f1; --sorted_result SELECT f1, COUNT(*) FROM table_char_pad_space GROUP BY f1; --sorted_result SELECT f1 FROM (SELECT * FROM table_varchar_no_pad) AS dt WHERE f1 = 'ABC'; --sorted_result SELECT f1 FROM (SELECT * FROM table_char_no_pad) AS dt WHERE f1 = 'ABC'; --sorted_result SELECT f1 FROM (SELECT * FROM table_varchar_pad_space) AS dt WHERE f1 = 'ABC'; --sorted_result SELECT f1 FROM (SELECT * FROM table_char_pad_space) AS dt WHERE f1 = 'ABC'; SHOW STATUS LIKE 'Created_tmp_tables'; SHOW STATUS LIKE 'Created_tmp_disk_tables'; --echo # --echo # Test with Heap engine --echo # SET SESSION big_tables = 0; SET @@internal_tmp_mem_storage_engine = MEMORY; --sorted_result SELECT f1, COUNT(*) FROM table_varchar_no_pad GROUP BY f1; --sorted_result SELECT f1, COUNT(*) FROM table_char_no_pad GROUP BY f1; --sorted_result SELECT TRIM(f1), COUNT(*) FROM table_varchar_pad_space GROUP BY f1; --sorted_result SELECT f1, COUNT(*) FROM table_char_pad_space GROUP BY f1; --sorted_result SELECT f1 FROM (SELECT * FROM table_varchar_no_pad) AS dt WHERE f1 = 'ABC'; --sorted_result SELECT f1 FROM (SELECT * FROM table_char_no_pad) AS dt WHERE f1 = 'ABC'; --sorted_result SELECT f1 FROM (SELECT * FROM table_varchar_pad_space) AS dt WHERE f1 = 'ABC'; --sorted_result SELECT f1 FROM (SELECT * FROM table_char_pad_space) AS dt WHERE f1 = 'ABC'; SHOW STATUS LIKE 'Created_tmp_tables'; SHOW STATUS LIKE 'Created_tmp_disk_tables'; -- echo # -- echo # Restore default engine -- echo # SET @@internal_tmp_mem_storage_engine = default; --echo # --echo # Test with disk temp table engine --echo # SET SESSION big_tables = 1; --sorted_result SELECT f1, COUNT(*) FROM table_varchar_no_pad GROUP BY f1; --sorted_result SELECT f1, COUNT(*) FROM table_char_no_pad GROUP BY f1; --sorted_result SELECT TRIM(f1), COUNT(*) FROM table_varchar_pad_space GROUP BY f1; --sorted_result SELECT f1, COUNT(*) FROM table_char_pad_space GROUP BY f1; --sorted_result SELECT f1 FROM (SELECT * FROM table_varchar_no_pad) AS dt WHERE f1 = 'ABC'; --sorted_result SELECT f1 FROM (SELECT * FROM table_char_no_pad) AS dt WHERE f1 = 'ABC'; --sorted_result SELECT f1 FROM (SELECT * FROM table_varchar_pad_space) AS dt WHERE f1 = 'ABC'; --sorted_result SELECT f1 FROM (SELECT * FROM table_char_pad_space) AS dt WHERE f1 = 'ABC'; SHOW STATUS LIKE 'Created_tmp_tables'; SHOW STATUS LIKE 'Created_tmp_disk_tables'; --echo # --echo # Cleanup --echo # SET SESSION big_tables = @big_tables_saved; SET @@optimizer_switch = @optimizer_switch_saved; DROP TABLE table_varchar_no_pad; DROP TABLE table_char_no_pad; DROP TABLE table_varchar_pad_space; DROP TABLE table_char_pad_space;