Files
turso/testing/memory-repl.tcl
2024-12-14 21:20:10 -05:00

151 lines
4.0 KiB
Tcl
Executable File

#!/usr/bin/env tclsh
set sqlite_exec [expr {[info exists env(SQLITE_EXEC)] ? $env(SQLITE_EXEC) : "sqlite3"}]
proc start_sqlite_repl {sqlite_exec init_commands} {
set command [list $sqlite_exec ":memory:"]
set pipe [open "|[join $command]" RDWR]
puts $pipe $init_commands
flush $pipe
return $pipe
}
proc execute_sql {pipe sql} {
puts $pipe $sql
flush $pipe
puts $pipe "SELECT 'END_OF_RESULT';"
flush $pipe
set output ""
while {[gets $pipe line] >= 0} {
if {$line eq "END_OF_RESULT"} {
break
}
append output "$line\n"
}
return [string trim $output]
}
proc run_test {pipe sql expected_output} {
set actual_output [execute_sql $pipe $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 {pipe test_name sql expected_output} {
puts "Running test: $test_name"
run_test $pipe $sql $expected_output
}
set init_commands {
CREATE TABLE users (
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
age INTEGER
);
CREATE TABLE products (
id INTEGER PRIMARY KEY,
name TEXT,
price INTEGER
);
INSERT INTO users (id, first_name, last_name, age) VALUES
(1, 'Alice', 'Smith', 30), (2, 'Bob', 'Johnson', 25), (3, 'Charlie', 'Brown', 66), (4, 'David', 'Nichols', 70); INSERT INTO products (id, name, price) VALUES (1, 'Hat', 19.99), (2, 'Shirt', 29.99), (3, 'Shorts', 39.99), (4, 'Dress', 49.99);
CREATE TABLE t(x1, x2, x3, x4);
INSERT INTO t VALUES (zeroblob(1024 - 1), zeroblob(1024 - 2), zeroblob(1024 - 3), zeroblob(1024 - 4));
}
set pipe [start_sqlite_repl $sqlite_exec $init_commands]
do_execsql_test $pipe schema {
.schema
} {CREATE TABLE users (id INTEGER PRIMARY KEY, first_name TEXT, last_name TEXT, age INTEGER);
CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, price INTEGER);
CREATE TABLE t (x1, x2, x3, x4);}
do_execsql_test $pipe "select-avg" {
SELECT avg(age) FROM users;
} {47.75}
do_execsql_test $pipe select-avg-text {
SELECT avg(first_name) FROM users;
} {0.0}
do_execsql_test $pipe select-sum {
SELECT sum(age) FROM users;
} {191}
do_execsql_test $pipe select-sum-text {
SELECT sum(first_name) FROM users;
} {0.0}
do_execsql_test $pipe select-total {
SELECT total(age) FROM users;
} {191.0}
do_execsql_test $pipe select-total-text {
SELECT total(first_name) FROM users WHERE id < 3;
} {0.0}
do_execsql_test $pipe select-limit {
SELECT typeof(id) FROM users LIMIT 1;
} {integer}
do_execsql_test $pipe select-count {
SELECT count(id) FROM users;
} {4}
do_execsql_test $pipe select-count {
SELECT count(*) FROM users;
} {4}
do_execsql_test $pipe select-count-constant-true {
SELECT count(*) FROM users WHERE true;
} {4}
do_execsql_test $pipe select-count-constant-false {
SELECT count(*) FROM users WHERE false;
} {0}
# **atrocious hack to test that we can open new connection
do_execsql_test $pipe test-open-new-db {
.open testing/testing.db
} {}
# now grab random tests from other areas and make sure we are querying that database
do_execsql_test $pipe schema-1 {
.schema users
} {CREATE TABLE users (
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
email TEXT,
phone_number TEXT,
address TEXT,
city TEXT,
state TEXT,
zipcode TEXT,
age INTEGER
);
CREATE INDEX age_idx on users (age);}
do_execsql_test $pipe 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 $pipe left-join-self {
select u1.first_name as user_name, u2.first_name as neighbor_name from users u1 left join users as u2 on u1.id = u2.id + 1 limit 2;
} {Jamie|
Cindy|Jamie}
do_execsql_test $pipe where-clause-eq-string {
select count(1) from users where last_name = 'Rodriguez';
} {61}
puts "All tests passed successfully."
close $pipe
exit 0