Files
turso/testing/offset.test
2025-10-15 09:41:44 +03:00

116 lines
3.2 KiB
Tcl
Executable File

#!/usr/bin/env tclsh
set testdir [file dirname $argv0]
source $testdir/tester.tcl
do_execsql_test select-offset-0 {
SELECT id FROM users ORDER BY id LIMIT 1 OFFSET 0;
} {1}
do_execsql_test select-offset-1 {
SELECT id FROM users ORDER BY id LIMIT 1 OFFSET 1;
} {2}
do_execsql_test select-offset-negative {
SELECT id FROM users ORDER BY id LIMIT 1 OFFSET -1;
} {1}
do_execsql_test select-offset-0-groupby {
SELECT COUNT(*) FROM users GROUP BY STATE ORDER BY STATE LIMIT 5 OFFSET 0;
} {168
166
162
153
166}
do_execsql_test select-offset-1-groupby {
SELECT COUNT(*) FROM users GROUP BY STATE ORDER BY STATE LIMIT 5 OFFSET 1;
} {166
162
153
166
170}
do_execsql_test select-offset-subquery {
SELECT id, first_name, age
FROM (
SELECT id, first_name, age
FROM users
ORDER BY id ASC
LIMIT 5 OFFSET 2
)
ORDER BY id DESC;
} {7|Aimee|24
6|Nicholas|89
5|Edward|15
4|Jennifer|33
3|Tommy|18}
do_execsql_test_on_specific_db {:memory:} select-limit-comma-offset-equivalence {
CREATE TABLE nums (x INTEGER);
INSERT INTO nums VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
SELECT x FROM nums ORDER BY x LIMIT 3 OFFSET 2;
SELECT x FROM nums ORDER BY x LIMIT 2,3;
} {3
4
5
3
4
5}
# https://github.com/tursodatabase/turso/issues/3300
do_execsql_test_on_specific_db {:memory:} select-ungrouped-aggregate-with-offset-limit {
CREATE TABLE t(a INTEGER);
INSERT INTO t VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
SELECT COUNT(a) FROM t LIMIT 1 OFFSET 1;
} {}
do_execsql_test_on_specific_db {:memory:} offset-expr-can-be-cast-losslessly-1 {
SELECT 1 LIMIT 3 OFFSET 1.1 + 2.9;
} {}
do_execsql_test_on_specific_db {:memory:} offset-expr-can-be-cast-losslessly-2 {
CREATE TABLE T(a);
INSERT INTO T VALUES (1),(2),(3),(4);
SELECT * FROM T LIMIT 1+'2' OFFSET 1.6/2 + 3.6/3 + 4*0.25;
} {4}
# Strings are cast to float. Final result is integer losslessly
do_execsql_test_on_specific_db {:memory:} offset-expr-can-be-cast-losslessly-3 {
CREATE TABLE T(a);
INSERT INTO T VALUES (1),(2),(3),(4);
SELECT * FROM T LIMIT 3 OFFSET '0.8' + '1.2' + '4'*'0.25';
} {4}
# Strings are cast to 0. Expression still valid.
do_execsql_test_on_specific_db {:memory:} offset-expr-int-and-string {
SELECT 1 LIMIT 3 OFFSET 3/3 + 'test' + 4*'test are best';
} {}
do_execsql_test_in_memory_error_content offset-expr-cannot-be-cast-losslessly-1 {
SELECT 1 LIMIT 3 OFFSET 1.1;
} {"datatype mismatch"}
do_execsql_test_in_memory_error_content offset-expr-cannot-be-cast-losslessly-2 {
SELECT 1 LIMIT 3 OFFSET 1.1 + 2.2 + 1.9/8;
} {"datatype mismatch"}
# Return error as float in expression cannot be cast losslessly
do_execsql_test_in_memory_error_content offset-expr-cannot-be-cast-losslessly-3 {
SELECT 1 LIMIT 3 OFFSET 1.1 + 'a';
} {"datatype mismatch"}
do_execsql_test_in_memory_error_content offset-expr-invalid-data-type-1 {
SELECT 1 LIMIT 3 OFFSET 'a';
} {"datatype mismatch"}
do_execsql_test_in_memory_error_content offset-expr-invalid-data-type-2 {
SELECT 1 LIMIT 3 OFFSET NULL;
} {"datatype mismatch"}
# Expression below evaluates to NULL (string → 0)
do_execsql_test_in_memory_error_content offset-expr-invalid-data-type-3 {
SELECT 1 LIMIT 3 OFFSET 1/'iwillbezero ;-; ';
} {"datatype mismatch"}