# 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 :.*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 :.*\(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 :.*\(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