Files
turso/testing/all.test
2024-07-14 20:09:40 +03:00

216 lines
5.8 KiB
Tcl
Executable File

#!/usr/bin/env tclsh
set sqlite_exec [expr {[info exists env(SQLITE_EXEC)] ? $env(SQLITE_EXEC) : "sqlite3"}]
proc evaluate_sql {sqlite_exec sql} {
set command [list $sqlite_exec testing/testing.db $sql]
set output [exec {*}$command]
return $output
}
proc run_test {sqlite_exec sql expected_output} {
set actual_output [evaluate_sql $sqlite_exec $sql]
if {$actual_output ne $expected_output} {
puts "Test FAILED: '$sql'"
puts "returned '$actual_output'"
puts "expected '$expected_output'"
exit 1
}
}
proc do_execsql_test {test_name sql_statements expected_outputs} {
puts "Running test: $test_name"
set combined_sql [join $sql_statements " "]
set combined_expected_output [join $expected_outputs "\n"]
run_test $::sqlite_exec $combined_sql $combined_expected_output
}
do_execsql_test select-const-1 {
SELECT 1
} {1}
do_execsql_test select-const-2 {
SELECT 2
} {2}
do_execsql_test select-avg {
SELECT avg(age) FROM users;
} {50.396}
do_execsql_test select-sum {
SELECT sum(age) FROM users;
} {503960}
do_execsql_test select-total {
SELECT sum(age) FROM users;
} {503960}
do_execsql_test select-limit {
SELECT id FROM users LIMIT 1;
} {1}
do_execsql_test select-count {
SELECT count(id) FROM users;
} {10000}
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 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-limit-0 {
SELECT id FROM users LIMIT 0;
} {}
do_execsql_test pragma-cache-size {
PRAGMA cache_size
} {-2000}
do_execsql_test cross-join {
select * from users, products limit 1;
} {1|Jamie|Foster|dylan00@example.com|496-522-9493|62375\ Johnson\ Rest\ Suite\ 322|West\ Lauriestad|IL|35865|94|1|hat|79.0}
do_execsql_test cross-join-specific-columns {
select first_name, price from users, products limit 1;
} {Jamie|79.0}
do_execsql_test realify {
select price from products limit 1;
} {79.0}
do_execsql_test where-clause-eq {
select last_name from users where id = 2000;
} {Rodriguez}
do_execsql_test where-clause-eq-string {
select count(1) from users where last_name = 'Rodriguez';
} {61}
do_execsql_test where-clause-ne {
select count(1) from users where id != 2000;
} {9999}
do_execsql_test where-clause-gt {
select count(1) from users where id > 2000;
} {8000}
do_execsql_test where-clause-gte {
select count(1) from users where id >= 2000;
} {8001}
do_execsql_test where-clause-lt {
select count(1) from users where id < 2000;
} {1999}
do_execsql_test where-clause-lte {
select count(1) from users where id <= 2000;
} {2000}
do_execsql_test where-clause-unary-true {
select count(1) from users where 1;
} {10000}
# not correct? should be 0?
do_execsql_test where-clause-unary-false {
select count(1) from users where 0;
} {0}
do_execsql_test where-clause-no-table-unary-true {
select 1 where 1;
} {1}
do_execsql_test where-clause-no-table-unary-false {
select 1 where 0;
} {}
do_execsql_test coalesce {
select coalesce(NULL, 1);
} {1}
do_execsql_test coalesce-2 {
select coalesce(NULL, NULL, 1);
} {1}
do_execsql_test coalesce-null {
select coalesce(NULL, NULL, NULL);
} {NULL}
do_execsql_test coalesce-first {
select coalesce(1, 2, 3);
} {1}
do_execsql_test coalesce-from-table {
select coalesce(NULL, 1) from users limit 1;
} {1}
do_execsql_test coalesce-from-table-column {
select coalesce(NULL, age) from users where age = 94 limit 1;
} {94}
do_execsql_test coalesce-from-table-multiple-columns {
select coalesce(NULL, age), coalesce(NULL, id) from users where age = 94 limit 1;
} {94|1}
do_execsql_test inner-join-pk {
select users.first_name as user_name, products.name as product_name from users join products on users.id = products.id;
} {Jamie|hat
Cindy|cap
Tommy|shirt
Jennifer|sweater
Edward|sweatshirt
Nicholas|shorts
Aimee|jeans
Rachel|sneakers
Matthew|boots
Daniel|coat
Travis|accessories}
do_execsql_test inner-join-non-pk-unqualified {
select first_name, name from users join products on first_name != name limit 1;
} {Jamie|hat}
do_execsql_test inner-join-non-pk-qualified {
select users.first_name as user_name, products.name as product_name from users join products on users.first_name = products.name;
} {}
do_execsql_test inner-join-self {
select u1.first_name as user_name, u2.first_name as neighbor_name from users u1 join users as u2 on u1.id = u2.id + 1 limit 1;
} {Cindy|Jamie}
do_execsql_test inner-join-self-with-where {
select u1.first_name as user_name, u2.first_name as neighbor_name from users u1 join users as u2 on u1.id = u2.id + 1 where u1.id = 5 limit 1;
} {Edward|Jennifer}
do_execsql_test inner-join-with-where-2 {
select u.first_name from users u join products as p on u.first_name != p.name where u.last_name = 'Williams' limit 1;
} {Laura}
do_execsql_test select-add {
select u.age + 1 from users u where u.age = 91 limit 1;
} {92}