Files
email-tracker/external/duckdb/test/optimizer/perfect_ht.test
2025-10-24 19:21:19 -05:00

57 lines
1.6 KiB
SQL

# name: test/optimizer/perfect_ht.test
# description: Test aggregates that can trigger a perfect HT
# group: [optimizer]
statement ok
CREATE TABLE timeseries(year INTEGER, val INTEGER);
statement ok
INSERT INTO timeseries VALUES (1996, 10), (1997, 12), (1996, 20), (2001, 30), (NULL, 1), (1996, NULL);
# this query uses a perfect aggregate HT
query II
EXPLAIN SELECT year, SUM(val), COUNT(val), COUNT(*) FROM timeseries GROUP BY year ORDER BY year;
----
physical_plan <REGEX>:.*PERFECT_HASH_GROUP_BY.*
statement ok
PRAGMA perfect_ht_threshold=0;
# if we set the threshold to 0, the perfect HT is not used anymore
query II
EXPLAIN SELECT year, SUM(val), COUNT(val), COUNT(*) FROM timeseries GROUP BY year ORDER BY year;
----
physical_plan <!REGEX>:.*PERFECT_HASH_GROUP_BY.*
statement ok
PRAGMA perfect_ht_threshold=1;
# if we set it too small, it is not used still
query II
EXPLAIN SELECT year, SUM(val), COUNT(val), COUNT(*) FROM timeseries GROUP BY year ORDER BY year;
----
physical_plan <!REGEX>:.*PERFECT_HASH_GROUP_BY.*
# we can also use it with many columns, as long as the threshold is high enough
statement ok
create table manycolumns as select i a, i b, i c, i d, i e, i f, i g, i h, i, i j from range(0,2) tbl(i);
statement ok
PRAGMA perfect_ht_threshold=30;
query II
explain select a, b, c, d, e, f, g, h, i, j FROM manycolumns GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
----
physical_plan <REGEX>:.*PERFECT_HASH_GROUP_BY.*
# the threshold has to be in range
statement error
PRAGMA perfect_ht_threshold=-1;
----
<REGEX>:.*out of range.*
statement error
PRAGMA perfect_ht_threshold=100;
----
<REGEX>:.*out of range.*