Commit Graph

3974 Commits

Author SHA1 Message Date
pedrocarlo
e1ddf5ffcc Fix Unary Negate Operation on Blobs 2025-04-14 12:05:00 -03:00
Jussi Saurio
e07a6fc5c0 Merge 'Add Ansi Colors to tcl test runner' from Pedro Muniz
Closes #1336. I really do not like only black and white text. Have a
look in CI to see the colors

Closes #1338
2025-04-14 11:59:40 +03:00
Jussi Saurio
d20782350d Merge 'support modifiers for julianday()' from meteorgan
Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com>

Closes #1321
2025-04-14 11:52:43 +03:00
Jussi Saurio
79b08a80ab Merge 'Parse hexidecimal integers' from Anton Harniakou
Fixes #1304
Maybe I should add tests?

Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com>

Closes #1329
2025-04-14 11:49:10 +03:00
Jussi Saurio
4b7a5f39b3 Merge 'Implement Once and OpenAutoindex opcodes' from Jussi Saurio
Some enabler work for enabling autoindexing, which means creating a
transient in memory index when a persistent index is not found. This is
used to avoid nested full table scans.
@pereman2 I added some functionality to your `SmallVec` so would
appreciate a review of those parts

Reviewed-by: Pere Diaz Bou <pere-altea@homail.com>

Closes #1340
2025-04-14 11:45:41 +03:00
Jussi Saurio
23f8fffe12 Add Insn::OpenAutoindex, which is just an alias for OpenEphemeral 2025-04-14 11:23:37 +03:00
Jussi Saurio
9dadc58194 Add support for Insn::Once 2025-04-14 11:23:37 +03:00
Jussi Saurio
f79da7194f implement Iterator for SmallVec and add const generic for array size 2025-04-14 11:23:37 +03:00
Jussi Saurio
f5523e7a23 Merge pull request #1339 from tursodatabase/yeet-async-await-opcodes
refactor: fold Async/Await insns into a single instruction
2025-04-14 10:37:53 +03:00
Jussi Saurio
d286a56e15 refactor: fold Async/Await insns into a single instruction 2025-04-14 09:40:20 +03:00
pedrocarlo
f3a07c86a0 Add Ansi Colors to tcl test runner 2025-04-13 23:36:09 -03:00
Anton Harniakou
499d9b8d45 Add integration tests for hex numbers 2025-04-13 21:50:48 +03:00
Jussi Saurio
472afdd841 Merge 'Add support for OpenEphemeral bytecode' from Diego Reis
First ~actual~ step to close #741, this time I'm following an approach
way closer to what SQLite does by just creating a normal `BTreeCursor`
and using an in-memory pager (thanks @krishvishal for the insight
🤝).

Reviewed-by: Pere Diaz Bou <pere-altea@homail.com>

Closes #1139
2025-04-13 17:25:37 +03:00
Diego Reis
fd79ad2644 core/vdbe: Change is_btree to is_table in OpenEphemeral 2025-04-13 11:15:01 -03:00
Diego Reis
4c315e1bb6 core/vdbe: Update OpenEphemeral to use CreateBtreeFlags 2025-04-13 11:13:25 -03:00
Diego Reis
135330b736 core/pager: Fix page handling issue due change in wal type 2025-04-13 11:10:06 -03:00
Diego Reis
035e6dcef4 core/vdbe: Fix logic error during btree creation
I do thing we should change this 1,2 flag to 0,1 or just an enum, to be more rustacean. The current state can be very misleading
2025-04-13 11:10:06 -03:00
Diego Reis
61c324cca5 core/vdbe: Add missing work to get cursor and transient table usable 2025-04-13 11:10:06 -03:00
Diego Reis
bcac1fe778 core/vdbe: Rename page_io to db_file in OpenEphemeral 2025-04-13 11:10:06 -03:00
Diego Reis
09d83aadf3 Fix dumb conflict errors 2025-04-13 11:10:06 -03:00
Diego Reis
d9bf383507 core/io: Untie MemoryIO's lifetime of the IO layer 2025-04-13 11:10:06 -03:00
Diego Reis
79f8b83cbe Fix dumb clippy errors 2025-04-13 11:10:06 -03:00
Diego Reis
66e12e1c2d core/vdbe: Create OpenEphemeral bytecode
"Open a new cursor P1 to a transient table. The cursor is always opened read/write even if the main database is read-only. The ephemeral table is deleted automatically when the cursor is closed.

If the cursor P1 is already opened on an ephemeral table, the table is cleared (all content is erased)."

There is still some work to do, but this is a basic setup
2025-04-13 11:10:06 -03:00
Diego Reis
e5144bb6a9 core/storage: Create FileMemoryStorage
This is basically a copy of DatabaseStorage but outside the fs compilation flag, this way, we can access MemoryIO regardless the storage medium.
2025-04-13 11:10:06 -03:00
Diego Reis
b519509349 core/io: Add internal in-memory MemoryIO to all IO layers
Honestly I don't have 100% sure if this is a good idea, the reasoning is that in any IO we'll want to do memory only operations like creating tables etc, so may want a common way to access it
2025-04-13 11:10:05 -03:00
Diego Reis
65d4c68cf2 core/pager: Wrap wal with Option 2025-04-13 11:10:05 -03:00
Jussi Saurio
8e601959ad Merge 'Fuzz fix some operations' from Pedro Muniz
Me and @diegoreis42 were late at night, running the new fuzzer and saw
some errors with `Bit-Not` and `Not` operations. Added some tests as
well for those fixes.

Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com>

Closes #1328
2025-04-13 17:02:19 +03:00
Jussi Saurio
cbe3500b7e Merge 'Code clean-ups' from Diego Reis
While developing I found that some things could be improved :)

Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com>

Closes #1325
2025-04-13 17:02:12 +03:00
Jussi Saurio
b51f9bba23 Merge 'Return null when parameter is unbound' from Levy A.
Fix #1323.

Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com>

Closes #1324
2025-04-13 17:02:03 +03:00
Jussi Saurio
f660c65199 Merge 'Enhance robusteness of optimization for Binary expressions' from Diego Reis
fix #1318

Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com>

Closes #1322
2025-04-13 17:01:53 +03:00
Anton Harniakou
9ed34924e6 Parse hexidecimal integers 2025-04-13 11:52:25 +03:00
meteorgan
f3f7a722a7 avoid converting double to string in datetime 2025-04-13 16:41:30 +08:00
pedrocarlo
1297cb107c bit-not and boolean-not
Co-authored-by: Diego Reis <79876389+diegoreis42@users.noreply.github.com>
2025-04-13 02:45:12 -03:00
Diego Reis
51eb2af06a core(refactor): Add CreateBTreeFlags
Passing 1s and 0s with comments is not rustacean, and since we already follow the pattern of struct flags in other sections of the codebase it's better use it here too.
2025-04-13 01:46:30 -03:00
Diego Reis
da484b33aa core/storage: Add asserts to check invariants for current_page
While developing, I had an underflow issue during the casting: `current as usize`. Which could be found way faster with proper asserts.
2025-04-12 22:29:29 -03:00
Levy A.
d210ee1497 cargo fmt 2025-04-12 18:55:48 -03:00
Diego Reis
ff7a4e8297 core: Change always falseness of equivalence between variables expressions to be only on anonymous variables
Named variables are compared by name
2025-04-12 18:04:15 -03:00
Diego Reis
64f8aca823 core: Improve readability of Affinity's doc comment 2025-04-12 17:55:57 -03:00
Diego Reis
029d1d7cce Ignore any .log file inside testing 2025-04-12 17:47:16 -03:00
Levy A.
5c0b112125 fix: return null when parameter is unbound 2025-04-12 17:43:04 -03:00
Diego Reis
db0f07499d core/translate: Fix naive comparison between Binary expressions during register optimization 2025-04-12 16:39:30 -03:00
Diego Reis
73764e198e core: Fix equivalence between variable expressions to be always false
Since until the bind to a value they are treated as NULL. https://sqlite.org/lang_expr.html#varparam
2025-04-12 16:34:39 -03:00
meteorgan
fd8f629ee4 comment format_julian_day() 2025-04-12 22:39:35 +08:00
meteorgan
8200b328d8 support modifiers for julianday() 2025-04-12 19:29:20 +08:00
Jussi Saurio
508df42075 Merge 'Check that index seek key members are not null' from Jussi Saurio
Fixes bug where e.g. `SELECT age FROM users WHERE age > NULL` would
return all rows, since NULL is lower than anything else in index keys,
but in comparison expressions it returns NULL.
Solution: check whether index seek key members can be null, and if they
are null, do not seek and instead exit the loop.
Example bytecode on a table with an index on (a,b,c):
```sql
sqlite> explain select * from t where a = 5 and b = 6 and c > NULL;
addr  opcode         p1    p2    p3    p4             p5  comment
----  -------------  ----  ----  ----  -------------  --  -------------
0     Init           0     18    0                    0   Start at 18
1     OpenRead       0     2     0     5              0   root=2 iDb=0; t
2     OpenRead       1     3     0     k(4,,,,)       0   root=3 iDb=0; abc
3     Integer        5     1     0                    0   r[1]=5
4     Integer        6     2     0                    0   r[2]=6
5     Null           0     3     0                    0   r[3]=NULL
6     IsNull         3     17    0                    0   if r[3]==NULL goto 17
7     SeekGT         1     17    1     3              0   key=r[1..3]
8       IdxGT          1     17    1     2              0   key=r[1..2]
9       DeferredSeek   1     0     0                    0   Move 0 to 1.rowid if needed
10      Column         1     0     4                    0   r[4]= cursor 1 column 0
11      Column         1     1     5                    0   r[5]= cursor 1 column 1
12      Column         1     2     6                    0   r[6]= cursor 1 column 2
13      Column         0     3     7                    0   r[7]= cursor 0 column 3
14      Column         0     4     8                    0   r[8]= cursor 0 column 4
15      ResultRow      4     5     0                    0   output=r[4..8]
16    Next           1     8     0                    0
17    Halt           0     0     0                    0
18    Transaction    0     0     2     0              1   usesStmtJournal=0
19    Goto           0     1     0                    0
sqlite> select * from t where a = 5 and b = 6 and c > NULL;

Limbo v0.0.19-pre.4
Enter ".help" for usage hints.
limbo> explain select * from t where a = 5 and b = 6 and c > NULL;
addr  opcode             p1    p2    p3    p4             p5  comment
----  -----------------  ----  ----  ----  -------------  --  -------
0     Init               0     21    0                    0   Start at 21
1     OpenReadAsync      0     2     0                    0   table=t, root=2
2     OpenReadAwait      0     0     0                    0
3     OpenReadAsync      1     3     0                    0   table=abc, root=3
4     OpenReadAwait      0     0     0                    0
5     Integer            5     6     0                    0   r[6]=5
6     Integer            6     7     0                    0   r[7]=6
7     Null               0     8     0                    0   r[8]=NULL
8     IsNull             8     20    0                    0   if (r[8]==NULL) goto 20
9     SeekGT             1     20    6                    0   key=[6..8]
10      IdxGT            1     20    6                    0   key=[6..7]
11      DeferredSeek     1     0     0                    0
12      Column           0     0     1                    0   r[1]=t.a
13      Column           0     1     2                    0   r[2]=t.b
14      Column           0     2     3                    0   r[3]=t.c
15      Column           0     3     4                    0   r[4]=t.d
16      Column           0     4     5                    0   r[5]=t.e
17      ResultRow        1     5     0                    0   output=r[1..5]
18    NextAsync          1     0     0                    0
19    NextAwait          1     10    0                    0
20    Halt               0     0     0                    0
21    Transaction        0     0     0                    0   write=false
22    Goto               0     1     0                    0
```

Closes #1313
2025-04-12 11:11:57 +03:00
Jussi Saurio
02a2618da9 Merge 'Better diagnostics' from Pedro Muniz
On my journey of improving DX, I thought it would be a good idea to
improve a bit the Diagnostics that `miette` provides. This is the first
step to provide better errors in the CLI. I want to do better errors for
tables and columns afterwards by giving suggestions of possible names to
choose from, like we have in the Rust compiler or Clippy.
# Changed
- `Scanner` now passes its offset to Errors allowing `miette` to
correctly point to error in the sql statement.
- Some personalized help messages for `MalformedHexInteger`
- Help message for `BadNumber` printing the offending `String`
Examples:
| Before | After |
|--------|--------|
| <img width="458" alt="image" src="https://github.com/user-
attachments/assets/a9d62add-66fc-42c0-b5e9-8b1ef3c436d0" /> | <img
width="263" alt="image" src="https://github.com/user-
attachments/assets/e56af563-3225-4d7b-a303-30e5c9c38f5c" /> |
| <img width="458" alt="image" src="https://github.com/user-
attachments/assets/1f5145ee-3a1c-4616-ad0e-6459444cbb2e" /> | <img
width="277" alt="image" src="https://github.com/user-
attachments/assets/c87cba62-08af-477e-865b-fcca55ac725a" /> |
| <img width="458" alt="image" src="https://github.com/user-
attachments/assets/1601649e-5e2a-45c7-b47a-4f0830d7d78f" /> | <img
width="458" alt="image" src="https://github.com/user-
attachments/assets/9f0fef05-2f67-4b20-b8d2-bad7c44a534e" /> |
| <img width="458" alt="image" src="https://github.com/user-
attachments/assets/70b82de0-7d24-4c57-b953-333c758f6f63" /> | <img
width="458" alt="image" src="https://github.com/user-
attachments/assets/889d3654-0f91-44cf-ab8a-a01b462d3a5c" /> |

Closes #1316
2025-04-12 10:40:44 +03:00
Jussi Saurio
edbeced312 Merge 'simulator: provide high level commands on top of a single runner' from Alperen Keleş
Previously, the simulator only generated and ran a single run with the
given configurations, and anyone was free to implement retrial or
looping on top, which is still possible.
I still wanted to start adding some higher level commands on top,
especially now that we have access to bug base, so this PR adds the
following options;
- loop: run the simulator in a loop `n` times, with the option to short
circuit if any run fails.
- list: list all the bugs in the bug base.
- test: run the simulator against a specific bug by providing a
`filter`, this is useful when debugging a certain issue so you can first
run a bunch of tests in a `loop`, and rerun them using `test` when you
think you have a fix.

Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com>

Closes #1317
2025-04-12 10:35:52 +03:00
alpaylan
e13b5bc698 fix min/max-tests bug 2025-04-11 15:33:32 -04:00
alpaylan
84e3ea5d19 Merge branch 'main' of https://github.com/tursodatabase/limbo 2025-04-11 14:10:19 -04:00
alpaylan
9d08693e8f add simulator subcommands 2025-04-11 14:10:12 -04:00