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

153 lines
2.5 KiB
SQL

# name: test/optimizer/statistics/statistics_aggregate.test
# description: Statistics propagation test with aggregates expression
# group: [statistics]
statement ok
SET default_null_order='nulls_first';
statement ok
CREATE TABLE integers AS SELECT * FROM (VALUES (1), (2), (3)) tbl(i);
statement ok
PRAGMA explain_output = OPTIMIZED_ONLY;
# statistics propagation in groups
# no null values
query II
EXPLAIN SELECT i IS NULL FROM (SELECT i FROM integers GROUP BY i) integers(i);
----
logical_opt <!REGEX>:.*IS_NULL.*
# i=4 is out of range [1,3]
query II
EXPLAIN SELECT i=4 FROM (SELECT i FROM integers GROUP BY i) integers(i);
----
logical_opt <!REGEX>:.*\(i = 4\).*
# i=3 is in range [1,3]
query II
EXPLAIN SELECT i=3 FROM (SELECT i FROM integers GROUP BY i) integers(i);
----
logical_opt <REGEX>:.*\(i = 3\).*
# count without null values
query I
SELECT COUNT(i) FROM integers;
----
3
query II
SELECT i, COUNT(i) FROM integers GROUP BY i ORDER BY i;
----
1 1
2 1
3 1
statement ok
INSERT INTO integers VALUES (NULL);
# count with null values
query I
SELECT COUNT(i) FROM integers;
----
3
query II
SELECT i, COUNT(i) FROM integers GROUP BY i ORDER BY i;
----
NULL 0
1 1
2 1
3 1
# sum
# sum that fits in int64
statement ok
CREATE TABLE bigints AS SELECT i::BIGINT as i FROM (VALUES (1), (2), (3)) tbl(i);
query I
SELECT SUM(i) FROM bigints;
----
6
# avg
query I
SELECT AVG(i) FROM bigints;
----
2
# sum no longer fits in int64
statement ok
INSERT INTO bigints VALUES (9223372036854775806);
query I
SELECT SUM(i) FROM bigints;
----
9223372036854775812
query I
SELECT AVG(i) FROM bigints;
----
2305843009213693952
statement ok
DROP TABLE bigints;
statement ok
CREATE TABLE bigints AS SELECT i::BIGINT as i FROM (VALUES (-1), (-2), (-3)) tbl(i);
query I
SELECT SUM(i) FROM bigints;
----
-6
# avg
query I
SELECT AVG(i) FROM bigints;
----
-2
# sum no longer fits in int64 [negative]
statement ok
INSERT INTO bigints VALUES (-9223372036854775806);
query I
SELECT SUM(i) FROM bigints;
----
-9223372036854775812
query I
SELECT AVG(i) FROM bigints;
----
-2305843009213693952
# now with decimals
# sum that fits in int64
statement ok
CREATE TABLE decimals AS SELECT i::DECIMAL(18,1) as i FROM (VALUES (1), (2), (3)) tbl(i);
query I
SELECT SUM(i) FROM decimals;
----
6.0
# avg
query I
SELECT AVG(i) FROM decimals;
----
2.0
# sum no longer fits in int64
statement ok
INSERT INTO decimals SELECT 99999999999999999.9 FROM repeat(1, 10)
query I
SELECT SUM(i) FROM decimals;
----
1000000000000000005.0
query I
SELECT AVG(i) FROM decimals;
----
76923076923076923