Merge 'Add support for offset in select queries' from Ben Li

#739
Started adding support for `LIMIT...OFFSET...`
- New `OffsetLimit` opcode
- `OFFSET` is now supported for:
    - `SELECT...LIMIT...OFFSET`
    - `SELECT...GROUP BY...LIMIT...OFFSET`
    - `SELECT...ORDER BY...LIMIT...OFFSET`
    - Subqueries for `SELECT` statements
**In progress/todo**
- [x] Testing
- [x] Handle negative offset value
- **(will make in separate PR)** Add support for
`DELETE...LIMIT...OFFSET`
- **(will make in separate PR)** Use `limit + offset` sum register from
`OffsetLimit` to constrain number of records inserted into sorter

Closes #779
This commit is contained in:
Pekka Enberg
2025-01-30 13:29:49 +02:00
16 changed files with 223 additions and 18 deletions

View File

@@ -22,3 +22,4 @@ source $testdir/where.test
source $testdir/compare.test
source $testdir/changes.test
source $testdir/total-changes.test
source $testdir/offset.test

47
testing/offset.test Normal file
View File

@@ -0,0 +1,47 @@
#!/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}