Files
turso/testing/agg-functions.test
Piotr Rzysko 569e41cb1e Skip traversing children of aggregate functions
Aggregate functions cannot be nested, and this is validated during the
translation of aggregate function arguments. Therefore, traversing their
child expressions is unnecessary.
2025-09-02 08:22:37 +02:00

202 lines
5.7 KiB
Tcl
Executable File

#!/usr/bin/env tclsh
set testdir [file dirname $argv0]
source $testdir/tester.tcl
do_execsql_test select-avg {
SELECT avg(age) FROM users;
} {50.396}
do_execsql_test select-avg-text {
SELECT avg(first_name) FROM users;
} {0.0}
do_execsql_test select-sum {
SELECT sum(age) FROM users;
} {503960}
do_execsql_test select-sum-text {
SELECT sum(first_name) FROM users;
} {0.0}
do_execsql_test select-total {
SELECT total(age) FROM users;
} {503960.0}
do_execsql_test select-total-text {
SELECT total(first_name) FROM users WHERE id < 3;
} {0.0}
do_execsql_test select-limit {
SELECT typeof(id) FROM users LIMIT 1;
} {integer}
do_execsql_test select-count {
SELECT count(id) FROM users;
} {10000}
do_execsql_test select-count {
SELECT count(*) FROM users;
} {10000}
do_execsql_test select-count-constant-true {
SELECT count(*) FROM users WHERE true;
} {10000}
do_execsql_test select-count-constant-false {
SELECT count(*) FROM users WHERE false;
} {0}
do_execsql_test select-max {
SELECT max(age) FROM users;
} {100}
do_execsql_test select-min {
SELECT min(age) FROM users;
} {1}
do_execsql_test_on_specific_db {:memory:} min-null-regression-test {
CREATE TABLE t (a);
INSERT INTO t VALUES ('abc'), (NULL);
SELECT min(a) FROM t;
} {abc}
do_execsql_test_on_specific_db {:memory:} max-null-regression-test {
CREATE TABLE t (a);
INSERT INTO t VALUES ('abc'), (NULL);
SELECT max(a) FROM t;
} {abc}
do_execsql_test select-max-text {
SELECT max(first_name) FROM users;
} {Zoe}
do_execsql_test select-min-text {
SELECT min(first_name) FROM users;
} {Aaron}
do_execsql_test select-group-concat {
SELECT group_concat(name) FROM products;
} {hat,cap,shirt,sweater,sweatshirt,shorts,jeans,sneakers,boots,coat,accessories}
do_execsql_test select-group-concat-with-delimiter {
SELECT group_concat(name, ';') FROM products;
} {hat;cap;shirt;sweater;sweatshirt;shorts;jeans;sneakers;boots;coat;accessories}
do_execsql_test select-group-concat-with-column-delimiter {
SELECT group_concat(name, id) FROM products;
} {hat2cap3shirt4sweater5sweatshirt6shorts7jeans8sneakers9boots10coat11accessories}
do_execsql_test select-string-agg-with-delimiter {
SELECT string_agg(name, ',') FROM products;
} {hat,cap,shirt,sweater,sweatshirt,shorts,jeans,sneakers,boots,coat,accessories}
do_execsql_test select-string-agg-with-column-delimiter {
SELECT string_agg(name, id) FROM products;
} {hat2cap3shirt4sweater5sweatshirt6shorts7jeans8sneakers9boots10coat11accessories}
do_execsql_test select-agg-unary-negative {
SELECT -max(age) FROM users;
} {-100}
do_execsql_test select-agg-unary-positive {
SELECT +max(age) FROM users;
} {100}
do_execsql_test select-agg-binary-unary-negative {
SELECT min(age) + -max(age) FROM users;
} {-99}
do_execsql_test select-agg-binary-unary-positive {
SELECT min(age) + +max(age) FROM users;
} {101}
do_execsql_test select-non-agg-cols-should-be-not-null {
SELECT id, first_name, sum(age) FROM users LIMIT 1;
} {1|Jamie|503960}
do_execsql_test select-with-group-by-and-agg-1 {
SELECT id, first_name, avg(age) FROM users group by last_name limit 1;
} {274|Debra|66.25}
do_execsql_test select-with-group-by-and-agg-2 {
select first_name, last_name from users where state = 'AL' group by last_name limit 10;
} {Jay|Acosta
Daniel|Adams
Aaron|Baker
Sharon|Becker
Kim|Berg
Donald|Bishop
Brian|Bradford
Jesus|Bradley
John|Brown
Hunter|Burke}
do_execsql_test select-agg-json-array {
SELECT json_group_array(name) FROM products;
} {["hat","cap","shirt","sweater","sweatshirt","shorts","jeans","sneakers","boots","coat","accessories"]}
do_execsql_test select-agg-json-array-object {
SELECT json_group_array(json_object('name', name)) FROM products;
} {[{"name":"hat"},{"name":"cap"},{"name":"shirt"},{"name":"sweater"},{"name":"sweatshirt"},{"name":"shorts"},{"name":"jeans"},{"name":"sneakers"},{"name":"boots"},{"name":"coat"},{"name":"accessories"}]}
do_execsql_test select-distinct-agg-functions {
SELECT sum(distinct age), count(distinct age), avg(distinct age) FROM users;
} {5050|100|50.5}
do_execsql_test select-json-group-object {
select price,
json_group_object(cast (id as text), name)
from products
group by price
order by price;
} {1.0|{"9":"boots"}
18.0|{"3":"shirt"}
25.0|{"4":"sweater"}
33.0|{"10":"coat"}
70.0|{"6":"shorts"}
74.0|{"5":"sweatshirt"}
78.0|{"7":"jeans"}
79.0|{"1":"hat"}
81.0|{"11":"accessories"}
82.0|{"2":"cap","8":"sneakers"}}
do_execsql_test select-json-group-object-no-sorting-required {
select age,
json_group_object(cast (id as text), first_name)
from users
where first_name like 'Am%'
group by age
order by age
limit 5;
} {1|{"6737":"Amy"}
2|{"2297":"Amy","3580":"Amanda"}
3|{"3437":"Amanda"}
5|{"2378":"Amy","3227":"Amy","5605":"Amanda"}
7|{"2454":"Amber"}}
do_execsql_test_error_content select-max-star {
SELECT max(*) FROM users;
} {"wrong number of arguments to function"}
do_execsql_test_error_content select-max-star-in-expression {
SELECT CASE WHEN max(*) > 0 THEN 1 ELSE 0 END FROM users;
} {"wrong number of arguments to function"}
do_execsql_test_error select-scalar-func-star {
SELECT abs(*) FROM users;
} {.*(Invalid aggregate function|wrong number of arguments to function).*}
do_execsql_test_error select-scalar-func-star-in-expression {
SELECT CASE WHEN abs(*) > 0 THEN 1 ELSE 0 END FROM users;
} {.*(Invalid aggregate function|wrong number of arguments to function).*}
do_execsql_test_error_content select-nested-agg-func {
SELECT max(abs(sum(age))), sum(age) FROM users;
} {"misuse of aggregate function"}
do_execsql_test_error_content select-nested-agg-func-in-expression {
SELECT CASE WHEN max(abs(sum(age))) > 0 THEN 1 ELSE 0 END, sum(age) FROM users;
} {"misuse of aggregate function"}