Pekka Enberg
c7a67a1bf4
Fix ResultRow operands
...
Fix ResultRow operands to follow SQLite bytecode format for consistency.
2024-07-05 18:13:06 +03:00
Pekka Enberg
be11460c0e
Merge pull request #68 from penberg/insn-dump-cleanup
...
Clean up insn_to_str()
2024-07-05 11:53:57 +03:00
Pekka Enberg
2f3c3b5404
Clean up insn_to_str()
...
The SQLite documentation explicitly says that P1, P2, and P3 are 32-bit
signed integers. P4 is a value, and P5 is a 16-bit unsigned integer.
Although we use different types for operands, the `EXPLAIN` output
should be compatible with SQLite and, therefore, use those types.
2024-07-05 11:39:21 +03:00
Pekka Enberg
8a09f2a29e
Tweak mascot size
2024-07-05 09:52:29 +03:00
Pekka Enberg
2ee21443c0
Limbo mascot
2024-07-05 09:51:56 +03:00
Pekka Enberg
4a089e6e4e
Merge pull request #67 from pereman2/fix-float-parse
2024-07-05 08:43:11 +03:00
Pekka Enberg
5f4927b5a4
Merge pull request #66 from pereman2/agg-evaluate-extra
2024-07-05 08:42:29 +03:00
Pere Diaz Bou
ae524a07e2
core: Insn::Real support
...
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com >
2024-07-04 17:19:05 +02:00
Pere Diaz Bou
6bebfccd99
core: fix evaluating columns a part from agg
...
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com >
2024-07-04 17:02:54 +02:00
Pekka Enberg
f4369c873f
Simplify AggFinal emission in translate_select()
2024-07-04 12:21:27 +03:00
Pekka Enberg
e988ca0129
Consolidate AggregateFunction and AggFunc enums
2024-07-04 12:19:17 +03:00
Pekka Enberg
0f9f178746
Emit DecrJumpZero for aggregations too
...
SQLite emits a DecrJumpZero instruction after ResultRow even when there
are aggregation functions:
```
sqlite> EXPLAIN SELECT avg(age) FROM users LIMIT 1;
addr opcode p1 p2 p3 p4 p5 comment
---- ------------- ---- ---- ---- ------------- -- -------------
0 Init 0 13 0 0 Start at 13
1 Integer 1 1 0 0 r[1]=1; LIMIT counter
2 Null 0 2 3 0 r[2..3]=NULL
3 OpenRead 0 2 0 10 0 root=2 iDb=0; users
4 Rewind 0 8 0 0
5 Column 0 9 4 0 r[4]= cursor 0 column 9
6 AggStep 0 4 3 avg(1) 1 accum=r[3] step(r[4])
7 Next 0 5 0 1
8 AggFinal 3 1 0 avg(1) 0 accum=r[3] N=1
9 Copy 3 5 0 0 r[5]=r[3]
10 ResultRow 5 1 0 0 output=r[5]
11 DecrJumpZero 1 12 0 0 if (--r[1])==0 goto 12
12 Halt 0 0 0 0
13 Transaction 0 0 1 0 1 usesStmtJournal=0
14 Goto 0 1 0 0
```
This does not seem to have any user-visible difference in semantics
because we always jump to Halt regardless of the limit. Howwever, to
keep generated code consistent with SQLite and avoid special-case paths,
let's just emit the instruction.
2024-07-04 11:55:10 +03:00
Pekka Enberg
e3031c2594
Simplify translate_select()
2024-07-04 11:37:34 +03:00
Pekka Enberg
3b297dd05b
Fix analyze_column() to use RustDoc format
2024-07-04 11:25:37 +03:00
Pekka Enberg
a24174640f
Merge pull request #64 from penberg/refactor-translate
2024-07-04 08:35:31 +03:00
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