Commit Graph

249 Commits

Author SHA1 Message Date
Pekka Enberg
095bf494f3 Merge pull request #73 from ishanjain28/makefile_fix
download wasm32-wasi target for wasm builds
2024-07-06 10:17:10 +03:00
Ishan Jain
61f6d69237 download wasm32-wasi target for wasm builds 2024-07-06 12:41:46 +05:30
Pekka Enberg
1149ba11dc Merge pull request #70 from KMJ-007/main
.schema without args shows all tables
2024-07-06 08:56:39 +03:00
Pekka Enberg
a51e79d5a1 Add helper guide for contributors 2024-07-06 08:48:28 +03:00
Karan Janthe
26dcfb7e8f Merge branch 'penberg:main' into main 2024-07-06 11:10:25 +05:30
Karan Janthe
c4e85cb8da .schema without args shows all table indexs 2024-07-06 11:09:29 +05:30
Pekka Enberg
e6f50bec60 Merge pull request #69 from KMJ-007/main
added .schema command in cli
2024-07-06 08:30:21 +03:00
Karan Janthe
8e1c737236 added .schema command in cli 2024-07-06 10:50:26 +05:30
Pekka Enberg
7cf3c80323 Update SQLite compatibility document
We don't support `SELECT ... WHERE` so mark it as such.
2024-07-05 20:07:18 +03:00
Pekka Enberg
5128b89474 Update SQLite compatibility document
We now support avg() and sum() functions.
2024-07-05 20:06:13 +03:00
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