Pere Diaz Bou
e2d00a9f96
inline start transactions from pager and wal
...
Execute `SELECT 1`/limbo_execute_select_1
time: [30.543 ns 30.585 ns 30.632 ns]
2025-04-02 16:18:36 +02:00
Pere Diaz Bou
2a49fe9bd2
Remove RWLock from Shared wal state
...
WalShared state can be shared without having to wrap everything with a
lock, and instead use atomics on some places and rwlock on others -- for
now.
## Results:
From:
----
Execute `SELECT 1`/limbo_execute_select_1
time: [34.125 ns 34.218 ns 34.324 ns]
Execute `SELECT 1`/sqlite_execute_select_1
time: [28.124 ns 28.254 ns 28.385 ns]
To:
----
Gnuplot not found, using plotters backend
Execute `SELECT 1`/limbo_execute_select_1
time: [31.919 ns 32.113 ns 32.327 ns]
Execute `SELECT 1`/sqlite_execute_select_1
time: [29.662 ns 29.900 ns 30.139 ns]
2025-04-02 16:18:36 +02:00
Pekka Enberg
cd5ef7c7db
Merge 'Reuse register in binary expressions if they're equal ' from Diego Reis
...
Alongside with #1227 , this PR closes #1226
Before:

After:

Closes #1234
2025-04-02 17:02:35 +03:00
Pere Diaz Bou
66f70d571d
fmt
2025-04-02 13:14:26 +00:00
Pere Diaz Bou
f5221589f0
remove wrong usage of feature = json
2025-04-02 15:00:51 +02:00
Pere Diaz Bou
7e4b57f2e2
VDBE with direct function dispatch
...
This PR is unapologetically stolen from @vmg's implementation in Vitess
implemented here https://github.com/vitessio/vitess/pull/12369 . If you
want a more in depth explanation of how this works you can read the
[blog post he carefully
wrote](https://planetscale.com/blog/faster-interpreters-in-go-catching-up-with-cpp ).
In limbo we have a huge problem with [register
spilling](https://en.wikipedia.org/wiki/Register_allocation ), this can
be easily observed with the prolog of `Program::step` before:
```llvm
start:
%e.i.i304.i = alloca [0 x i8], align 8
%formatter.i305.i = alloca [64 x i8], align 8
%buf.i306.i = alloca [24 x i8], align 8
%formatter.i259.i = alloca [64 x i8], align 8
..................... these are repeated for hundreds of lines
.....................
%formatter.i52.i = alloca [64 x i8], align 8
%buf.i53.i = alloca [24 x i8], align 8
%formatter.i.i = alloca [64 x i8], align 8
%buf.i.i = alloca [24 x i8], align 8
%_87.i = alloca [48 x i8], align 8
%_82.i = alloca [24 x i8], align 8
%_73.i = alloca [24 x i8], align 8
%_66.i8446 = alloca [24 x i8], align 8
%_57.i = alloca [24 x i8], align 8
%_48.i = alloca [24 x i8], align 8
```
After these changes we completely remove the need of register spilling
(yes that is the complete prolog):
```llvm
start:
%self1 = alloca [80 x i8], align 8
%pager = alloca [8 x i8], align 8
%mv_store = alloca [8 x i8], align 8
store ptr %0, ptr %mv_store, align 8
store ptr %1, ptr %pager, align 8
%2 = getelementptr inbounds i8, ptr %state, i64 580
%3 = getelementptr inbounds i8, ptr %state, i64 576
%4 = getelementptr inbounds i8, ptr %self, i64 16
%5 = getelementptr inbounds i8, ptr %self, i64 8
%6 = getelementptr inbounds i8, ptr %self1, i64 8
br label %bb1, !dbg !286780
```
When it comes to branch prediction, we don't really fix a lot because
thankfully rust already compiles `match` expressions
to a jump table:
```llvm
%insn = getelementptr inbounds [0 x %"vdbe::insn::Insn"], ptr %self657,
i64 0, i64 %index, !dbg !249527
%332 = load i8, ptr %insn, align 8, !dbg !249528 , !range !38291 ,
!noundef !14
switch i8 %332, label %default.unreachable26674 [
i8 0, label %bb111
i8 1, label %bb101
i8 2, label %bb100
i8 3, label %bb110
...
i8 104, label %bb5
i8 105, label %bb16
i8 106, label %bb14
], !dbg !249530
```
Some results
----
```
function dispatch:
Execute `SELECT 1`/limbo_execute_select_1
time: [29.498 ns 29.548 ns 29.601 ns]
change: [-3.6125% -3.3592% -3.0804%] (p = 0.00 <
0.05)
main:
Execute `SELECT 1`/limbo_execute_select_1
time: [33.789 ns 33.832 ns 33.878 ns]
```
2025-04-02 14:55:37 +02:00
Diego Reis
3c531ac5ec
core/expr: Reuse register in binary expressions if they're equal
2025-04-02 09:15:41 -03:00
Diego Reis
86f8719b69
core/expr: Extract binary insn emission in a separate function
2025-04-02 09:14:01 -03:00
Pekka Enberg
7394ad6854
Disable more b-tree fuzzers...
2025-04-02 13:38:09 +03:00
Pekka Enberg
cc8340d30e
Disable btree_insert_fuzz_run_random test
2025-04-02 09:15:01 +03:00
Pekka Enberg
6199c3994a
Merge 'Create plan for Update queries' from Preston Thorpe
...
closes #1186 , or at least works towards it by implementing an actual
Plan for update queries instead of translating everything inline. This
allows for actually using index's, rewriting const expressions, pushing
predicates instead of hardcoding a full scan in the translation.
### TODOs:
1. `RETURNING` clause/result columns
2. `OFFSET` clauses
3. on conflict
### LIMIT:
By supporting `LIMIT` directly in update queries, we'll have to put the
tests outside of the compatibility tests, maybe in the CLI tests.
Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com >
Closes #1189
2025-04-01 17:33:32 +03:00
Pere Diaz Bou
6b05dbddb0
remove unnecessary code while building count old and size old balancing
2025-04-01 13:11:55 +02:00
Pere Diaz Bou
141303e330
Validate cells inside a page after each operation
...
We need to ensure an operation doesn't transform the cells inside a page
to an invalid state. In debug mode we can enable a
`debug_validate_cells` with `#[cfg(debug_assertions)]` so that it is
skipped on release mode.
Modify pager logs
2025-04-01 11:19:23 +02:00
Pere Diaz Bou
bab748e538
fix key generation
2025-04-01 01:05:07 +02:00
Pere Diaz Bou
d2642dfe0c
skip repeated keys
2025-04-01 00:58:10 +02:00
Pere Diaz Bou
4308f8c73a
Fix propagation of divider cell balancing interior page
...
Newly added divider cells to parent of an interior page must point to
the page in question. Moreover rightmost pointer of the page will point
to previous divider cell pointer.
2025-04-01 00:58:10 +02:00
Pere Diaz Bou
24e4af7ee8
Allow balance_root to balance with interior pages
2025-03-31 12:42:01 +02:00
Pere Diaz Bou
78f6480e8f
remove ignored from fuzz tests
2025-03-31 10:59:28 +02:00
Pere Diaz Bou
bc660446a8
fuzz test ensure we "seek" until done
2025-03-31 10:57:55 +02:00
Pere Diaz Bou
0653ccf711
ensure btree fuzz doesn't repeat keys for now
2025-03-31 10:57:30 +02:00
Pekka Enberg
4c93c69e5a
Merge 'Let remainder (%) accept textual arguments' from Anton Harniakou
...
Also I added more tests for exec_add, exec_subtract, exec_multiply,
exec_divide, exec_remainder.
Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com >
Closes #1214
2025-03-31 10:40:21 +03:00
Pekka Enberg
77e9737b92
Merge 'JSON code cleanups' from Pekka Enberg
...
Just some renames to avoid redundant "json_" prefix and minor
conditional compilation cleanups.
Closes #1216
2025-03-31 10:40:09 +03:00
Pekka Enberg
169864456e
Merge 'Fix IdxCmp insn comparisons' from Jussi Saurio
...
We never hit bugs due to these because of 1. not having multi column
indexes in our TCL test databases, 2. otherwise not really having Rust
tests involving indexes, and 3. `IdxLt` and `IdxLe` not actually being
used anywhere yet
Also as @PThorpe92 pointed out there are some nuances to the comparison
logic we may need to eventually implement regarding comparisons with
uneven number of keys:
https://github.com/sqlite/sqlite/blob/master/src/vdbeaux.c#L4719
Reviewed-by: Preston Thorpe (@PThorpe92)
Closes #1215
2025-03-31 10:40:01 +03:00
Pekka Enberg
5a60815484
core/json: Remove redundant conditional compilation
...
The top-level `json` module declaration is already conditional on "json"
feature so no need to do it here.
2025-03-31 09:40:01 +03:00
Pekka Enberg
6258dda5f1
core/json: Rename json_path.rs to path.rs
2025-03-31 09:40:01 +03:00
Pekka Enberg
4a91988755
core/json: Rename json_operations.rs to ops.rs
2025-03-31 09:33:30 +03:00
Pekka Enberg
4b77f52bac
core/json: Rename json_cache.rs to cache.rs
2025-03-31 09:32:34 +03:00
Jussi Saurio
42e25d23dd
Fix IdxCmp insn comparisons
2025-03-30 23:01:41 +03:00
PThorpe92
211c9a0212
Remove From impl on iteration direction for sort order
2025-03-30 12:18:12 -04:00
PThorpe92
516e443a2b
Fix use index cursor id in emitter and prevent reinsert pk on update
2025-03-30 12:15:25 -04:00
PThorpe92
ff02d74afb
Fix update queries when limit is 0
2025-03-30 12:15:25 -04:00
PThorpe92
a88ce2a4b7
Correct comment on update plan
2025-03-30 12:15:25 -04:00
PThorpe92
3f4636196c
Fix error message for non btree table
2025-03-30 12:15:25 -04:00
PThorpe92
bbbd1df1ab
Replace unwrap in update translation with parse error
2025-03-30 12:15:24 -04:00
PThorpe92
7486149643
Support LIMIT clause on update queries
2025-03-30 12:15:24 -04:00
PThorpe92
b7fca31ef6
Add comments and impl Copy on iterdir type
2025-03-30 12:15:24 -04:00
PThorpe92
3fe14f37a5
Create plan for Update queries
2025-03-30 12:15:24 -04:00
Ihor Andrianov
a234aa3647
remove vec cloning from json agg functions
2025-03-30 19:10:15 +03:00
Ihor Andrianov
40bb867d54
clippy
2025-03-30 19:01:16 +03:00
Ihor Andrianov
db5e364210
made json an optional module again
2025-03-30 19:01:03 +03:00
Ihor Andrianov
6c126dcd97
add jsonb_set
2025-03-30 18:58:40 +03:00
Ihor Andrianov
dba82b40e3
add compat tests
2025-03-30 18:58:40 +03:00
Ihor Andrianov
92a745ca49
fix tests
2025-03-30 18:58:39 +03:00
Ihor Andrianov
101dd51d7c
add jsonb_group_object and array
2025-03-30 18:58:39 +03:00
Ihor Andrianov
c426c13763
make tests pass
2025-03-30 18:58:38 +03:00
Ihor Andrianov
568dc54b9e
big cleanup
2025-03-30 18:58:33 +03:00
Ihor Andrianov
a983c979c6
jsonb_merge, json_group_array, json_group_object
2025-03-30 18:47:33 +03:00
Anton Harniakou
9a61c75ea1
Let remainder (%) accept textual arguments; add more tests for core/vdbe/insn.rs
...
Tests for exec_add, exec_subtract, exec_multiply, exec_divide,
exec_remainder
2025-03-30 12:14:05 +03:00
Pere Diaz Bou
578bc9e3e6
extract constant min_header_size
2025-03-30 11:12:11 +02:00
Pere Diaz Bou
8d74f4b8ab
remove unnecessary partial ord
2025-03-30 11:07:23 +02:00