169 lines
5.0 KiB
Plaintext
169 lines
5.0 KiB
Plaintext
#
|
|
# 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;
|