Pekka Enberg
5deea70a77
Merge pull request #92 from haaawk/to_sql
...
Simplify BTreeTable::to_sql
2024-07-07 14:20:02 +03:00
Pekka Enberg
b8165f52b1
Merge pull request #90 from crrow/topic/fix-error-handling-for-invalid-file
...
Replace unwrap() in PageIO.get() with proper error handling
2024-07-07 14:19:47 +03:00
Piotr Jastrzebski
708cae99b8
Simplify BTreeTable::to_sql
...
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com >
2024-07-07 13:15:04 +02:00
Ryan Tan
9c2988e0ed
fix: replace unwrap() with ?
2024-07-07 19:12:48 +08:00
Piotr Jastrzebski
81cf0430de
Improve normalize_ident
...
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com >
2024-07-07 13:05:00 +02:00
Pekka Enberg
f1206ef29d
Merge pull request #88 from haaawk/tests
...
Mark test code cfg(test) instead of allow(dead_code)
2024-07-07 14:00:00 +03:00
Pekka Enberg
ae92e2f7e7
Merge pull request #87 from haaawk/remove_allocation
...
Remove unneded allocation
2024-07-07 13:59:37 +03:00
Piotr Jastrzebski
8ce1c4a1ab
Mark test code cfg(test) instead of allow(dead_code)
...
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com >
2024-07-07 12:59:06 +02:00
Pekka Enberg
30ec86a81e
Add sorter utility functions and opcodes
...
This adds basic in-memory sorting utility functions, similar to SQLite's
src/vdbesort.c. We need to improve this later with external sorting so
to support large data sets.
This also adds sorting functionality to the VDBE. Note that none of this
is wired to SQL translation yet so it's unused for now.
2024-07-07 13:56:55 +03:00
Piotr Jastrzebski
5eea420994
Simplify normalize_ident
...
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com >
2024-07-07 12:46:09 +02:00
Piotr Jastrzebski
83c7e7bd95
Remove unneeded allocation
...
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com >
2024-07-07 12:45:49 +02:00
Pekka Enberg
dac8f4dcba
Format source code with cargo fmt
2024-07-07 12:28:02 +03:00
Pekka Enberg
519e6b141f
Add Table::column_is_rowid_alias() helper
...
We need to check for rowid alias elsewhere too with ORDER BY, for
example, so let's extract a small helper for that.
2024-07-07 12:27:08 +03:00
Piotr Jastrzebski
fdbd010d89
Remove incorrect Column::is_rowid_alias
...
Fixes #83
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com >
2024-07-07 10:06:45 +02:00
Piotr Jastrzebski
3b3ea9a54f
Derive Clone for Buffer
...
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com >
2024-07-07 09:28:58 +02:00
Piotr Jastrzebski
1004215853
Remove submit from LinuxIO write
...
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com >
2024-07-07 09:24:44 +02:00
Piotr Jastrzebski
7b6c6ef9f1
Remove unneeded clone in add_table
...
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com >
2024-07-07 08:47:47 +02:00
Pekka Enberg
e54e1e661f
Merge pull request #75 from heyrutvik/wait-for-completion
...
wait for the read completion
2024-07-06 15:37:33 +03:00
Piotr Sarna
5bd3d283d1
translate: special case for LIMIT 0
...
Fixes #55
2024-07-06 10:58:19 +02:00
Rutvik Patel
fd9af2739e
wait for the read completion
...
The submit_and_wait command waits for `n` completion events.
We were providing an incorrect argument, which caused the issue.
2024-07-06 13:48:58 +05:30
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
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
4a089e6e4e
Merge pull request #67 from pereman2/fix-float-parse
2024-07-05 08:43:11 +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
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
400c5210b2
Remove unreachable patterns
2024-07-03 11:41:31 +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
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
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
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
1d4850df37
Fix invalid database path
2024-06-29 17:36:36 +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
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