Commit Graph

224 Commits

Author SHA1 Message Date
Pekka Enberg
c4e3cce8a2 Introduce Select struct
This introduces an intermediate `Select` struct, which hopefully makes
the codegen a bit simpler by transforming the complext AST to something
more straight-forward.
2024-07-03 22:09:21 +03:00
Pekka Enberg
883e494ac5 Don't import AST types directly
Instead, use the `ast::<type>` qualifier in the code to make it more
explicit where we're dealing with AST and where we're dealing with our
own data types. Paves the way for a `Select` struct.
2024-07-03 20:23:55 +03:00
Pekka Enberg
f9647a58d3 Use Vec::with_capacity() in analyze_columns() 2024-07-03 16:25:00 +03:00
Pekka Enberg
5b12e7af78 Add TCL tests for avg() and sum() 2024-07-03 11:50:22 +03:00
Pekka Enberg
5f678ca57d sqlite3: Disable missing_safety_doc warnings
There's no point in sprinkling safety documentation to all functions.
This is, after all, the unsafe C API...
2024-07-03 11:43:01 +03:00
Pekka Enberg
400c5210b2 Remove unreachable patterns 2024-07-03 11:41:31 +03:00
Pekka Enberg
addfb3cbc0 Remove unused lifetime parameter 2024-07-03 11:40:08 +03:00
Pekka Enberg
4474d067fe Code cleanups to make Clippy happy 2024-07-03 11:39:29 +03:00
Pekka Enberg
307fed0848 Format source code with cargo fmt 2024-07-03 11:38:12 +03:00
Pekka Enberg
32f72e91fe Merge pull request #60 from pereman2/agg-uppercase
core: fix agg function uppercase parsing
2024-07-03 11:37:48 +03:00
Pere Diaz Bou
9242e5c671 core: fix agg function uppercase parsing
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-07-03 08:56:30 +02:00
Pekka Enberg
6457bc3dc3 Merge pull request #61 from pereman2/sum 2024-07-02 09:17:09 +03:00
Pere Diaz Bou
56badf2513 core: fix initialization of sum vdbe
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-07-01 20:30:45 +02:00
Pere Diaz Bou
271397b214 core: sum aggregation
```
Welcome to Limbo SQL shell!
> select sum(age), avg(age) from users;
504915|50.4915
>
fedora :: ~/fun/limbo » sqlite3 database.db
SQLite version 3.40.1 2022-12-28 14:03:47
Enter ".help" for usage hints.
sqlite> select sum(age), avg(age) from users;
504915|50.4915
```

Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-07-01 20:19:50 +02:00
Pekka Enberg
106fe5f259 Generate testing.db with age column 2024-06-30 19:24:38 +03:00
Pekka Enberg
962ead96fc Use Faker API in gen-database.py to generate random integer 2024-06-30 19:24:13 +03:00
Pekka Enberg
5fbcdbb424 Fix SELECT .. LIMIT not respecting the limit
Fix the codegen to emit DecrJumpZero in the right place.
2024-06-30 19:11:45 +03:00
Pekka Enberg
1573844680 Make all.test exit with failure if test fails 2024-06-30 17:35:05 +03:00
Pekka Enberg
dbd3f359fe Merge pull request #58 from pereman2/avg
core: Avg aggregation function
2024-06-30 17:30:50 +03:00
Pere Diaz Bou
1419ae93bc gen-database: add age to user table to test agg
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-06-30 12:48:19 +02:00
Pere Diaz Bou
123f6353f7 core: rename ColumnAggregationInfo -> ColumnInfo
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-06-30 12:48:19 +02:00
Pere Diaz Bou
1cd6101b44 core: add some comments explaining analyze_column
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-06-30 12:48:19 +02:00
Pere Diaz Bou
18c2f5f8d2 core: clean up warnings
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-06-30 12:48:19 +02:00
Pere Diaz Bou
c7d40806fd core: Avg aggregation function
Simple implementation for aggregation functions. The code added is
purposely so that we can add things like `CEILING(avg(n))` in the future. Aggregation function
impose a higher level of complexity that requires us to plan ahead
several things:

* simple avg: `select avg(id) from users`
* nested avg: `select ceiling(avg(id)) from users`
* avg with other columns: `select ceiling(avg(id)), * from users` (yes,
  this is valid sqllite). For now I'm nullifying extra columns for
  simplicity.
* avg with other agg functions: `select avg(id), sum(id) from users`.
  This should be supported.
* At last -- Order By is a painful enough case to treat alone (not done
  in this pr)

Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-06-30 12:48:19 +02:00
Pekka Enberg
650288e786 Switch testing.db to WAL mode 2024-06-29 17:36:58 +03:00
Pekka Enberg
1d4850df37 Fix invalid database path 2024-06-29 17:36:36 +03:00
Pekka Enberg
19e237ce17 Update README 2024-06-29 10:41:16 +03:00
Pekka Enberg
1d45b97903 New cover image for README 2024-06-29 10:37:37 +03:00
Pekka Enberg
cc101b1b00 Use larger and more realistic database for testing 2024-06-29 10:03:11 +03:00
Pekka Enberg
4d8e0f1214 core: Clean up translate.rs by moving update_pragma()
Makes the code flow read better from top to bottom.
2024-06-28 08:44:27 +03:00
Pekka Enberg
dc26db4f0d Remove duplicate default-run 2024-06-28 08:39:36 +03:00
Pekka Enberg
7a61c1a756 Merge pull request #56 from penberg/sim
Initial pass on deterministic simulator
2024-06-27 19:49:13 +03:00
Pekka Enberg
2684341bac Initial pass on deterministic simulator
The simulator does not do much, but does discover failures on Linux with
io_uring, though, so it's a start.
2024-06-27 18:32:04 +03:00
Pekka Enberg
df230dc830 Fix DecrJumpZero usage in translate_select()
SQLite special-cases `LIMIT 0` by emitting an explicit `Goto` to avoid
executing any `ResultRow` statements. We, however, hacked around this in
DecrJumpZero but also the placement of the generated instruction.

Let's follow SQLite codegen here. We still need to fix `LIMIT 0`,
though.
2024-06-24 21:43:19 +03:00
Pekka Enberg
6290c8167d Unify SELECT .. LIMIT handling in translate_select()
Working towards a saner translate_select(), let's unify `SELECT ..
LIMIT` handling across different types of select statements.
2024-06-24 21:36:34 +03:00
Pekka Enberg
bdbbbda84f Extract translate_column() function 2024-06-22 09:44:35 +03:00
Pekka Enberg
828fb813a8 core: Fix codegen for rowid alias
We should emit `Column` bytecode for a primary key, unless it is an alias for a rowid.
2024-06-21 13:10:21 +03:00
Pekka Enberg
8d4d2f32ee core: Fix INTEGER data type detection 2024-06-21 13:09:43 +03:00
Pekka Enberg
ffa999b458 Update SQLite compatibility table 2024-06-19 21:59:59 +03:00
Pekka Enberg
6c41e27bd2 Add test case for PRAGMA cache_size 2024-06-19 21:59:31 +03:00
Pekka Enberg
50720791ad Merge pull request #51 from pereman2/pragma_cache_size
core: pragma cache_size support
2024-06-19 21:59:05 +03:00
Pere Diaz Bou
427103b199 core,wasm: add missing write procedure to wasm 2024-06-19 20:54:55 +02:00
Pere Diaz Bou
932ae7bf3f core: update pragma in transalte 2024-06-19 20:37:17 +02:00
Pere Diaz Bou
7e03cc70d0 core: add minimum cache_size 2024-06-19 20:37:17 +02:00
Pere Diaz Bou
1884aab3b8 core: resize page cache
Abstract page cache with PageCache so that we can call resize inside
refcell
2024-06-19 20:37:17 +02:00
Pere Diaz Bou
53c348402a core: parse unary and write to disk 2024-06-19 20:37:15 +02:00
Pere Diaz Bou
d795a7a3ba core: introduce pseudo program with pragma
Introduced pragma statement parsing and update in memory of default page cache size.

There are some more "improvements" to the print insn procedure —  I couldn't decide what was the preferred way in rust to do printing on different int types so I went with the stupidest I could think of at the moment.
2024-06-19 20:32:21 +02:00
Pekka Enberg
17a22278c2 Merge pull request #52 from penberg/io-writepath
core: I/O write path
2024-06-19 21:30:36 +03:00
Pere Diaz Bou
377073e158 core: I/O write path 2024-06-19 21:26:40 +03:00
Pekka Enberg
d6fbea25ba testing: SELECT .. LIMIT test case 2024-06-19 17:48:24 +03:00