|
| 1 | +# |
| 2 | +# Each block records the answer computed with memory to spare, then |
| 3 | +# recomputes it with the duplicate filter starved, and compares. |
| 4 | +# |
| 5 | +CREATE TABLE t1 (pk INT AUTO_INCREMENT PRIMARY KEY, a VARCHAR(100) NOT NULL); |
| 6 | +INSERT INTO t1 (a) SELECT LPAD(seq, 4, '0') FROM seq_1_to_50; |
| 7 | +INSERT INTO t1 (a) SELECT a FROM t1 ORDER BY pk; |
| 8 | +SELECT COUNT(*) AS rows_in_table, COUNT(DISTINCT a) AS distinct_values FROM t1; |
| 9 | +rows_in_table distinct_values |
| 10 | +100 50 |
| 11 | +SELECT GROUP_CONCAT(DISTINCT a) INTO @gc FROM t1; |
| 12 | +SELECT GROUP_CONCAT(DISTINCT a ORDER BY a) INTO @gc_order FROM t1; |
| 13 | +SELECT JSON_ARRAYAGG(DISTINCT a) INTO @ja FROM t1; |
| 14 | +SELECT JSON_ARRAYAGG(DISTINCT a ORDER BY a) INTO @ja_order FROM t1; |
| 15 | +SET @@tmp_memory_table_size=0; |
| 16 | +SELECT GROUP_CONCAT(DISTINCT a) = @gc AS gc_unchanged FROM t1; |
| 17 | +gc_unchanged |
| 18 | +1 |
| 19 | +SELECT GROUP_CONCAT(DISTINCT a ORDER BY a) = @gc_order AS gc_order_unchanged FROM t1; |
| 20 | +gc_order_unchanged |
| 21 | +1 |
| 22 | +SELECT JSON_ARRAYAGG(DISTINCT a) = @ja AS ja_unchanged FROM t1; |
| 23 | +ja_unchanged |
| 24 | +1 |
| 25 | +SELECT JSON_ARRAYAGG(DISTINCT a ORDER BY a) = @ja_order AS ja_order_unchanged FROM t1; |
| 26 | +ja_order_unchanged |
| 27 | +1 |
| 28 | +SET @@tmp_memory_table_size=DEFAULT; |
| 29 | +DROP TABLE t1; |
| 30 | +# |
| 31 | +# Values wide enough that the filter flushes on nearly every row. |
| 32 | +# Here the ORDER BY case used to return a single value out of 30. |
| 33 | +# |
| 34 | +CREATE TABLE t2 (a VARCHAR(2000)) AS |
| 35 | +SELECT CONCAT(seq, REPEAT('.', 1990)) AS a FROM seq_1_to_30; |
| 36 | +SELECT COUNT(*) AS rows_in_table, COUNT(DISTINCT a) AS distinct_values FROM t2; |
| 37 | +rows_in_table distinct_values |
| 38 | +30 30 |
| 39 | +SELECT GROUP_CONCAT(DISTINCT a) INTO @gc FROM t2; |
| 40 | +SELECT GROUP_CONCAT(DISTINCT a ORDER BY a) INTO @gc_order FROM t2; |
| 41 | +SET @@tmp_memory_table_size=1000, @@max_heap_table_size=1000; |
| 42 | +Warnings: |
| 43 | +Warning 1292 Truncated incorrect tmp_memory_table_size value: '1000' |
| 44 | +Warning 1292 Truncated incorrect max_heap_table_size value: '1000' |
| 45 | +SELECT GROUP_CONCAT(DISTINCT a) = @gc AS gc_unchanged FROM t2; |
| 46 | +gc_unchanged |
| 47 | +1 |
| 48 | +SELECT GROUP_CONCAT(DISTINCT a ORDER BY a) = @gc_order AS gc_order_unchanged FROM t2; |
| 49 | +gc_order_unchanged |
| 50 | +1 |
| 51 | +SET @@tmp_memory_table_size=DEFAULT, @@max_heap_table_size=DEFAULT; |
| 52 | +DROP TABLE t2; |
| 53 | +# |
| 54 | +# ORDER BY does not order the rows that tie on the ordering |
| 55 | +# expression. Which of them comes first is not specified, but it |
| 56 | +# must not depend on the memory available or on the order the rows |
| 57 | +# are read in. |
| 58 | +# |
| 59 | +CREATE TABLE t3 (a BIT(2), b VARCHAR(10), c BIT); |
| 60 | +INSERT INTO t3 VALUES (1, 'a', 0), (0, 'b', 1), (0, 'c', 0), (3, 'd', 1), |
| 61 | +(1, 'e', 1), (3, 'f', 1), (0, 'g', 1); |
| 62 | +SELECT GROUP_CONCAT(DISTINCT a, c ORDER BY a) AS at_default FROM t3; |
| 63 | +at_default |
| 64 | +01,00,11,10,31 |
| 65 | +SET @@tmp_memory_table_size=0; |
| 66 | +SELECT GROUP_CONCAT(DISTINCT a, c ORDER BY a) AS at_zero FROM t3; |
| 67 | +at_zero |
| 68 | +01,00,11,10,31 |
| 69 | +SET @@tmp_memory_table_size=DEFAULT; |
| 70 | +DELETE FROM t3; |
| 71 | +INSERT INTO t3 VALUES (0, 'c', 0), (0, 'b', 1), (1, 'a', 0), (3, 'd', 1), |
| 72 | +(1, 'e', 1), (3, 'f', 1), (0, 'g', 1); |
| 73 | +SELECT GROUP_CONCAT(DISTINCT a, c ORDER BY a) AS reversed_scan_order FROM t3; |
| 74 | +reversed_scan_order |
| 75 | +01,00,11,10,31 |
| 76 | +DROP TABLE t3; |
| 77 | +# |
| 78 | +# The sort tree can overflow too. Starving it makes repack_tree() |
| 79 | +# cut rows out of the group, which is expected, but the rows that |
| 80 | +# do come back must still be deduplicated and still be in order. |
| 81 | +# |
| 82 | +CREATE TABLE t4 (pk INT AUTO_INCREMENT PRIMARY KEY, a VARCHAR(20)); |
| 83 | +INSERT INTO t4 (a) SELECT LPAD(seq, 6, '0') FROM seq_1_to_200; |
| 84 | +INSERT INTO t4 (a) SELECT a FROM t4 ORDER BY pk; |
| 85 | +SET @@tmp_memory_table_size=0, @@group_concat_max_len=4000; |
| 86 | +SELECT GROUP_CONCAT(DISTINCT a ORDER BY a) INTO @gc FROM t4; |
| 87 | +Warnings: |
| 88 | +Warning 1260 Row 32 was cut by group_concat() |
| 89 | +SELECT JSON_ARRAYAGG(DISTINCT a ORDER BY a) INTO @ja FROM t4; |
| 90 | +SET @@tmp_memory_table_size=DEFAULT, @@group_concat_max_len=DEFAULT; |
| 91 | +SELECT COUNT(*) = COUNT(DISTINCT val) AS gc_no_duplicates, |
| 92 | +GROUP_CONCAT(val ORDER BY val) = @gc AS gc_ascending |
| 93 | +FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@gc, ',', seq), ',', -1) AS val |
| 94 | +FROM seq_1_to_500 |
| 95 | +WHERE seq <= 1 + LENGTH(@gc) - LENGTH(REPLACE(@gc, ',', ''))) split; |
| 96 | +gc_no_duplicates gc_ascending |
| 97 | +1 1 |
| 98 | +SELECT JSON_VALID(@ja) AS ja_valid, |
| 99 | +COUNT(*) = COUNT(DISTINCT val) AS ja_no_duplicates, |
| 100 | +JSON_ARRAYAGG(val ORDER BY val) = @ja AS ja_ascending |
| 101 | +FROM (SELECT JSON_UNQUOTE(JSON_EXTRACT(@ja, CONCAT('$[', seq - 1, ']'))) AS val |
| 102 | +FROM seq_1_to_500 WHERE seq <= JSON_LENGTH(@ja)) split; |
| 103 | +ja_valid ja_no_duplicates ja_ascending |
| 104 | +1 1 1 |
| 105 | +DROP TABLE t4; |
0 commit comments