Pere Diaz Bou
b7970a286d
implement IdxDelete
...
clippy
revert op_idx_ge changes
fmt
fmt again
rever op_idx_gt changes
2025-04-24 16:23:34 +02:00
Jussi Saurio
2e8042510e
Merge 'Pragma page size reading' from Anton Harniakou
...
1) Fix a bug where cli pretty mode would not print pragma results;
2) Add ability to read page_size using PRAGMA page_size;
Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com >
Closes #1394
2025-04-24 11:08:55 +03:00
Jussi Saurio
3798b4aa8b
use SortOrder in sorters always
2025-04-24 10:34:06 +03:00
Anton Harniakou
0a69ea0138
Support reading db page size using PRAGMA page_size
2025-04-24 10:12:02 +03:00
pedrocarlo
b6036cc79d
Primary key constraint working
2025-04-23 16:44:13 -03:00
Levy A.
f1ee92bf2d
numeric types overhaul
2025-04-23 08:34:58 -03:00
Jussi Saurio
f256fb46fd
remove print spam from index insert
2025-04-21 14:59:13 +03:00
PThorpe92
d53c60e071
Prevent double allocations for VFilter args in vdbe
2025-04-17 14:01:45 -04:00
PThorpe92
853af16946
Implement xBestIndex for virtual table api to improve query planning
2025-04-17 13:53:27 -04:00
Jussi Saurio
1189b7a288
codegen: add support for descending indexes
2025-04-16 13:58:12 +03:00
Jussi Saurio
b1073da4a5
btree: add support fo descending indexes
2025-04-16 13:58:12 +03:00
Jussi Saurio
13a703d636
Merge 'Add BeginSubrtn, NotFound and Affinity bytecodes' from Diego Reis
...
I'm working on an optimization of `WHERE .. IN (..)` statements that
requires these bytecodes.
```sh
sqlite> explain select * from users where first_name in ('alice', 'bob', 'charlie');
addr opcode p1 p2 p3 p4 p5 comment
---- ------------- ---- ---- ---- ------------- -- -------------
0 Init 0 35 0 0 Start at 35
1 OpenRead 0 2 0 10 0 root=2 iDb=0; users
2 Rewind 0 34 0 0
3 Noop 0 0 0 0 begin IN expr
4 BeginSubrtn 0 1 0 0 r[1]=NULL <---- Here
5 Once 0 17 0 0
6 OpenEphemeral 1 1 0 k(1,B) 0 nColumn=1; RHS of IN operator
7 String8 0 2 0 alice 0 r[2]='alice'
8 MakeRecord 2 1 3 B 0 r[3]=mkrec(r[2])
9 IdxInsert 1 3 2 1 0 key=r[3]
10 String8 0 2 0 bob 0 r[2]='bob'
11 MakeRecord 2 1 3 B 0 r[3]=mkrec(r[2])
12 IdxInsert 1 3 2 1 0 key=r[3]
13 String8 0 2 0 charlie 0 r[2]='charlie'
14 MakeRecord 2 1 3 B 0 r[3]=mkrec(r[2])
15 IdxInsert 1 3 2 1 0 key=r[3]
16 NullRow 1 0 0 0
17 Return 1 5 1 0
18 Column 0 1 4 0 r[4]= cursor 0 column 1
19 IsNull 4 33 0 0 if r[4]==NULL goto 33
20 Affinity 4 1 0 B 0 affinity(r[4]) <---- Here
21 NotFound 1 33 4 1 0 key=r[4]; end IN expr <---- Here
22 Rowid 0 5 0 0 r[5]=users.rowid
23 Column 0 1 6 0 r[6]= cursor 0 column 1
24 Column 0 2 7 0 r[7]= cursor 0 column 2
25 Column 0 3 8 0 r[8]= cursor 0 column 3
26 Column 0 4 9 0 r[9]= cursor 0 column 4
27 Column 0 5 10 0 r[10]= cursor 0 column 5
28 Column 0 6 11 0 r[11]= cursor 0 column 6
29 Column 0 7 12 0 r[12]= cursor 0 column 7
30 Column 0 8 13 0 r[13]= cursor 0 column 8
31 Column 0 9 14 0 r[14]= cursor 0 column 9
32 ResultRow 5 10 0 0 output=r[5..14]
33 Next 0 3 0 1
34 Halt 0 0 0 0
35 Transaction 0 0 3 0 1 usesStmtJournal=0
36 Goto 0 1 0 0
```
EDIT: [Found](https://sqlite.org/opcode.html#Found ) and
[NoConflict](https://sqlite.org/opcode.html#NoConflict ) can be easily
derived from `NotFound` but I wanted to be concise, I could do it in
another PR :)
Closes #1345
2025-04-15 20:25:55 +03:00
Diego Reis
58efb90467
core: Add Affinity bytecode
...
Apply affinities to a range of P2 registers starting with P1.
P4 is a string that is P2 characters long. The N-th character of the string indicates the column affinity that should be used for the N-th memory cell in the range.
2025-04-15 09:52:04 -03:00
Diego Reis
c5161311fc
core/vdbe: Add NotFound bytecode
...
If P4==0 then register P3 holds a blob constructed by MakeRecord. If P4>0 then register P3 is the first of P4 registers that form an unpacked record.
Cursor P1 is on an index btree. If the record identified by P3 and P4 is not the prefix of any entry in P1 then a jump is made to P2. If P1 does contain an entry whose prefix matches the P3/P4 record then control falls through to the next instruction and P1 is left pointing at the matching entry.
This operation leaves the cursor in a state where it cannot be advanced in either direction. In other words, the Next and Prev opcodes do not work after this operation.
2025-04-15 09:52:04 -03:00
Jussi Saurio
e299a0e77e
vdbe: add Insn::IdxRowId
2025-04-15 15:13:18 +03:00
Jussi Saurio
cc8f89e8e0
Merge 'Fix Unary Negate Operation on Blobs' from Pedro Muniz
...
Fixing stuff that appears in Fuzz testing.
# Before
<img width="668" alt="image" src="https://github.com/user-
attachments/assets/f1f59b63-5173-4932-98b2-774803cb8a8e" />
```
limbo> EXPLAIN SELECT -x'';
addr opcode p1 p2 p3 p4 p5 comment
---- ----------------- ---- ---- ---- ------------- -- -------
0 Init 0 5 0 0 Start at 5
1 Blob 0 2 0 0 r[2]= (len=0)
2 Multiply 3 2 1 0 r[1]=r[3]*r[2]
3 ResultRow 1 1 0 0 output=r[1]
4 Halt 0 0 0 0
5 Integer -1 3 0 0 r[3]=-1
6 Goto 0 1 0 0
```
# After
<img width="175" alt="image" src="https://github.com/user-
attachments/assets/9f361dc3-b243-4d69-bdd2-d6a2bbc0bf20" />
```
limbo> EXPLAIN SELECT -x'';
addr opcode p1 p2 p3 p4 p5 comment
---- ----------------- ---- ---- ---- ------------- -- -------
0 Init 0 5 0 0 Start at 5
1 Blob 0 2 0 0 r[2]= (len=0)
2 Subtract 3 2 1 0 r[1]=r[3]-r[2]
3 ResultRow 1 1 0 0 output=r[1]
4 Halt 0 0 0 0
5 Integer 0 3 0 0 r[3]=0
6 Goto 0 1 0 0
```
# Sqlite
```
sqlite> SELECT -x'';
0
sqlite> EXPLAIN SELECT -x'';
addr opcode p1 p2 p3 p4 p5 comment
---- ------------- ---- ---- ---- ------------- -- -------------
0 Init 0 4 0 0 Start at 4
1 Subtract 3 2 1 0 r[1]=r[2]-r[3]
2 ResultRow 1 1 0 0 output=r[1]
3 Halt 0 0 0 0
4 Integer 0 2 0 0 r[2]=0
5 Blob 0 3 0 0 r[3]= (len=0)
6 Goto 0 1 0 0
```
Closes #1333
2025-04-15 14:42:54 +03:00
Jussi Saurio
6463448fdc
Merge 'Fix incompatibility AND Operation' from Pedro Muniz
...
Sqlite reference implementation: https://github.com/sqlite/sqlite/blob/8
37dc09bce7de8971c7488b70cf5da93c60fbed0/src/vdbe.c#L2558
We did not support blobs before and our ordering of the match statements
were incorrect when one of the arguments was NULL
Closes #1337
2025-04-15 14:37:29 +03:00
Jussi Saurio
5a38b38e71
Merge 'Feature: VDestroy for Dropping Virtual Tables' from Pedro Muniz
...
Reviewed-by: Preston Thorpe (@PThorpe92)
Closes #1274
2025-04-15 14:34:30 +03:00
pedrocarlo
e1ddf5ffcc
Fix Unary Negate Operation on Blobs
2025-04-14 12:05:00 -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
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
d286a56e15
refactor: fold Async/Await insns into a single instruction
2025-04-14 09:40:20 +03:00
pedrocarlo
af456513d1
Fix incompatibility AND Expression
2025-04-13 22:38:43 -03:00
pedrocarlo
2181de79de
add destroy function to vtab
2025-04-13 17:06:12 -03:00
pedrocarlo
000d8756ec
Implment VDestroy opcode
2025-04-13 17:06:12 -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
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
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
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
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
Levy A.
5c0b112125
fix: return null when parameter is unbound
2025-04-12 17:43:04 -03:00
meteorgan
8200b328d8
support modifiers for julianday()
2025-04-12 19:29:20 +08:00
Pekka Enberg
d67e1b604b
Merge 'Added 'likelihood' scalar function' from Sachin Kumar Singh
...
The `likelihood(X,Y)` function returns argument X unchanged. The value Y
in likelihood(X,Y) must be a floating point constant between 0.0 and
1.0, inclusive.
```
sqlite> explain SELECT likelihood(42, 0.0);
addr opcode p1 p2 p3 p4 p5 comment
---- ------------- ---- ---- ---- ------------- -- -------------
0 Init 0 6 0 0 Start at 6
1 Once 0 3 0 0
2 Integer 42 2 0 0 r[2]=42
3 Copy 2 1 0 0 r[1]=r[2]
4 ResultRow 1 1 0 0 output=r[1]
5 Halt 0 0 0 0
6 Goto 0 1 0 0
```
```
limbo> explain SELECT likelihood(42, 0.0);
addr opcode p1 p2 p3 p4 p5 comment
---- ----------------- ---- ---- ---- ------------- -- -------
0 Init 0 4 0 0 Start at 4
1 Copy 2 1 0 0 r[1]=r[2]
2 ResultRow 1 1 0 0 output=r[1]
3 Halt 0 0 0 0
4 Integer 42 2 0 0 r[2]=42
5 Goto 0 1 0 0
```
Closes #1303
2025-04-11 09:34:36 +03:00
Sachin Singh
01fa02364d
correctly handle edge cases
2025-04-11 08:34:29 +05:30
Sachin Singh
482e93bfd0
feat: add likelihood scalar function
2025-04-11 05:54:23 +05:30
Sachin Singh
b7acfa490c
feat: add timediff data and time function
2025-04-11 04:30:57 +05:30
Pere Diaz Bou
8e93471d00
fix cell index selection while balancing
...
Cell index doesn't move in `move_to` unless we don't need to check next
cell. On the other hand, with rightmost pointer, we advance cell index
by 1 even though where we are moving to was to that page
2025-04-10 16:01:24 +02:00
Pekka Enberg
31f0d174d7
core/vdbe: Move exec_*() funtions to execute.rs
2025-04-10 09:42:03 +03:00
Pekka Enberg
5906d7971a
core/vdbe: Clean up imports
2025-04-10 09:25:15 +03:00
PThorpe92
13ae19c78c
Remove unnecessary clones from mc cursors
2025-04-09 11:15:04 -04:00
PThorpe92
62d1447cd6
Adapt query plan to handle vatbs for updates
2025-04-09 11:15:02 -04:00
Pekka Enberg
ddc5e49451
Merge 'Index insert fixes' from Pere Diaz Bou
...
Closes #1279
2025-04-09 17:21:53 +03:00