Daniel Boll
5fc9ccdc8c
Update checkpoint result initialization and WAL frame handling
...
- Use `CheckpointResult::default()` instead of `CheckpointResult::new()`
- Correct WAL frame header salt and checksum handling
- Ensure frame ID is 1-based and adjust frame offset calculation
- Add `Default` implementation for `CheckpointResult`
- Use random values for WAL header salts
2025-03-25 21:38:12 -03:00
Pere Diaz Bou
8642d416c7
Introduce immutable record.
...
Currently we have a Record, which is a dumb vector of cloned values.
This is incredibly bad for performance as we do not want to clone
objects unless needed. Therefore, let's start by introducing this type
so that any record that has already been serialized will be returned
from btree in the format of a simple payload with reference to payload.
2025-03-25 17:35:41 +01:00
Pekka Enberg
79620946c1
Merge 'JSON cache' from Ihor Andrianov
...
SQLite uses a similar approach for operations where up to 4 JSON objects
are accessed multiple times in a single query.
`SELECT json_extact(a, 'some_path'), json_remove(a, 'some_path')
json_set(a, 'some_path', 'some_value') from t;`
Closes #1163
2025-03-25 18:11:33 +02:00
Pekka Enberg
920b2efe31
Merge 'Bump rusqlite to 0.34' from Pere Diaz Bou
...
Closes #1175
2025-03-25 18:09:18 +02:00
Ihor Andrianov
7c1d827d33
clippy
2025-03-25 17:13:31 +02:00
Ihor Andrianov
8bfacf3955
add lazy and bucket cursor
2025-03-25 16:55:29 +02:00
Levy A.
dd10fb13a7
fix: unary + is a noop
2025-03-25 11:43:19 -03:00
Pere Diaz Bou
004dc374b2
bump rusqlite to 0.34
2025-03-25 14:17:31 +01:00
Pekka Enberg
28919038f1
Merge 'core: Rename FileStorage to DatabaseFile' from Pekka Enberg
...
Reviewed-by: Pere Diaz Bou <pere-altea@homail.com >
Closes #1174
2025-03-25 11:35:00 +02:00
Pekka Enberg
df6af6ed79
core: Rename FileStorage to DatabaseFile
2025-03-25 11:15:16 +02:00
Pekka Enberg
1f29e1fe08
Add PyPI link to README
2025-03-25 09:49:44 +02:00
Pekka Enberg
b507ac401d
Merge 'Fix a typo in README.md' from Tshepang Mbambo
...
Closes #1173
2025-03-25 09:31:05 +02:00
Pekka Enberg
93c0a29611
Merge 'Fix platform specific FFI C pointer type casts' from Preston Thorpe
...
Fixes #1159
Closes #1170
2025-03-25 09:10:16 +02:00
Pekka Enberg
731c3f037a
Merge 'Improve Python bindings' from Diego Reis
...
Yet another PR to close #494 .
While testing the code provided in the issue I noticed that it wasn't
closing the connection as it should, leading to lifetime issues like:
`Connection is unsendable, but is being dropped on another thread`. The
following code works fine:
```python
import limbo
def main():
con = limbo.connect("test.db")
cur = con.cursor()
try:
cur.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
email TEXT NOT NULL,
role TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT (datetime('now'))
)
""")
# Insert some sample data
sample_users = [
("alice", "alice@example.com ", "admin"),
("bob", "bob@example.com ", "user"),
("charlie", "charlie@example.com ", "moderator"),
("diana", "diana@example.com ", "user")
]
for username, email, role in sample_users:
cur.execute("""
INSERT INTO users (username, email, role)
VALUES (?, ?, ?)
""", (username, email, role))
con.commit()
# Query the table
res = cur.execute("SELECT * FROM users")
record = res.fetchone()
print(record)
finally:
# Ensure connection is closed on the same thread <----
con.close()
pass
main()
```
You can test it [here](https://colab.research.google.com/drive/1NJau6Y9H
TRJrnYK_xp2AzwP_qEH8VsQx?usp=sharing)
To address these issues, this PR:
- Adds support for `with statement` a common resource management pattern
in Python;
- Close connection if it is dropped
Closes #1164
2025-03-25 09:08:01 +02:00
Tshepang Mbambo
8b48c4b7b7
readme: typo
2025-03-25 09:06:40 +02:00
krishvishal
1660ae5542
missed adding _ and a space.
2025-03-25 12:04:48 +05:30
krishvishal
785be8479f
Fix a fuzzer failure and add tcl test covering the failure
2025-03-25 11:43:51 +05:30
krishvishal
f12e3a6993
For a few TCL tests more.
2025-03-25 10:28:48 +05:30
krishvishal
a8129d5e58
Add TCL tests for compute_shl
2025-03-25 10:26:08 +05:30
krishvishal
b55dc586bd
change compute_shl implementation to handle negation with overflow
2025-03-25 10:10:15 +05:30
krishvishal
6fe7e419e2
cleanup
2025-03-25 08:58:18 +05:30
krishvishal
ac29563efb
Add test to verify balancing after maintains the following:
...
1. Delete is working properly.
2. Balancing after delete still maintains the validity of btree.
2025-03-25 08:55:13 +05:30
krishvishal
bf1718925e
Delete with balancing now works!!
2025-03-25 08:38:18 +05:30
PThorpe92
e9420e7d2b
Fix platform specific ffi c ptr types
2025-03-24 22:48:07 -04:00
PThorpe92
334f0a928a
Adjust test to reflect new parse error
2025-03-24 21:05:50 -04:00
PThorpe92
4384659e5f
Adjust vtab schema creation to display the underlying columns
2025-03-24 20:50:54 -04:00
Diego Reis
f499f756fb
core/util: Fix invalid numeric parsing
...
To see details: https://github.com/tursodatabase/limbo/issues/1157
2025-03-24 20:21:09 -03:00
Diego Reis
5dba4999a7
core/util: Add unit tests for parse_numeric_str and fix whitespace handling
2025-03-24 19:56:13 -03:00
PThorpe92
7b55f7a167
Move explain to statement to allow for alternate writer
2025-03-24 18:48:12 -04:00
Diego Reis
160d48d34e
ext/python: Workaround to file permission error
...
To get more info see:
https://github.com/tursodatabase/limbo/actions/runs/14039536389/job/39312362848
2025-03-24 16:39:24 -03:00
Diego Reis
6edf3dd3b1
ext/python: Makes linter happy
2025-03-24 12:40:59 -03:00
krishvishal
6a8d1deee6
Convert implementation into event loop style.
2025-03-24 20:52:17 +05:30
Diego Reis
9a8970b6a8
ext/python: Update example
2025-03-24 12:21:30 -03:00
Diego Reis
ab8187f4e6
ext/python: Gracefully close connection by closing it at Drop
2025-03-24 12:21:15 -03:00
Diego Reis
4ca5b11bed
ext/python: Add support for Context Manager
2025-03-24 12:20:13 -03:00
Ihor Andrianov
59f00ff0c3
fix not removing lock if cache did not exist
2025-03-24 15:09:18 +02:00
Ihor Andrianov
d8e070a360
moved json_cache to state
2025-03-24 14:48:40 +02:00
Ihor Andrianov
e5199b0f1a
add tests
2025-03-24 13:17:59 +02:00
Ihor Andrianov
1511c9b3bf
add json cache to json functions and fix tests
2025-03-24 13:17:58 +02:00
Ihor Andrianov
615de2a0d3
add json_cache struct
2025-03-24 13:17:57 +02:00
Ihor Andrianov
1daab8cd7c
add bench to check json cache
2025-03-24 13:17:57 +02:00
krishvishal
8c164530fa
Remove linear search to obtain cell. current_cell_idx - 1 seems to work reliably.
2025-03-24 16:37:10 +05:30
Pekka Enberg
6798341b05
github: Don't close issues as stale so aggressively
2025-03-24 11:49:13 +02:00
Pekka Enberg
a9099cd6a5
Merge 'Schema translation cleanups' from Pekka Enberg
...
Closes #1161
2025-03-24 11:09:08 +02:00
Pekka Enberg
c5cdc859af
Merge 'core: Fix Destroy opcode root page handling' from Pekka Enberg
...
The `p1` register points to the root page, not to a cursor.
Fixes #1136
Closes #1162
2025-03-24 11:09:00 +02:00
Pekka Enberg
65bf33023c
core: Fix Destroy opcode root page handling
...
The `p1` register points to the root page, not to a cursor.
Fixes #1136
2025-03-24 10:54:49 +02:00
Pekka Enberg
0ec7dbc44e
core: Move translate_create_table() to schema module
2025-03-24 10:44:41 +02:00
Pekka Enberg
0727f4aca6
core: Move temporary table handling to translate_create_table()
2025-03-24 10:38:55 +02:00
Pekka Enberg
7d4ac13926
core: Move translate_drop_table() to schema module
2025-03-24 10:37:02 +02:00
Pekka Enberg
31bbc5144a
Merge 'Initial pass at UPDATE support' from Preston Thorpe
...
This PR is to support `Update` queries. Follows sqlite behavior as much
as possible.
### limbo
```console
limbo> create table t (a,b,c);
limbo> explain update t set a = 1 where b = 2;
addr opcode p1 p2 p3 p4 p5 comment
---- ----------------- ---- ---- ---- ------------- -- -------
0 Init 0 18 0 0 Start at 18
1 OpenWriteAsync 0 2 0 0
2 OpenWriteAwait 0 0 0 0
3 RewindAsync 0 0 0 0
4 RewindAwait 0 17 0 0 Rewind table t
5 Column 0 1 4 0 r[4]=t.b
6 Ne 4 5 15 0 if r[4]!=r[5] goto 15
7 RowId 0 6 0 0 r[6]=t.rowid
8 IsNull 6 17 0 0 if (r[6]==NULL) goto 17
9 Integer 1 1 0 0 r[1]=1
10 Column 0 1 2 0 r[2]=t.b
11 Column 0 2 3 0 r[3]=t.c
12 MakeRecord 1 3 7 0 r[7]=mkrec(r[1..3])
13 InsertAsync 0 7 6 0
14 InsertAwait 0 0 0 0
15 NextAsync 0 0 0 0
16 NextAwait 0 5 0 0
17 Halt 0 0 0 0
18 Transaction 0 1 0 0 write=true
19 Integer 2 5 0 0 r[5]=2
20 Goto 0 1 0 0
```
### sqlite
```console
sqlite> explain update t set a = 1 where b = 2;
addr opcode p1 p2 p3 p4 p5 comment
---- ------------- ---- ---- ---- ------------- -- -------------
0 Init 0 15 0 0 Start at 15
1 Null 0 1 2 0 r[1..2]=NULL
2 Noop 1 0 1 0
3 OpenWrite 0 2 0 2 0 root=2 iDb=0; t
4 Rewind 0 14 0 0
5 Column 0 1 5 0 r[5]= cursor 0 column 1
6 Ne 6 13 5 BINARY-8 81 if r[5]!=r[6] goto 13
7 Rowid 0 2 0 0 r[2]= rowid of 0
8 IsNull 2 14 0 0 if r[2]==NULL goto 14
9 Integer 1 3 0 0 r[3]=1
10 Column 0 1 4 0 r[4]= cursor 0 column 1
11 MakeRecord 3 2 1 0 r[1]=mkrec(r[3..4])
12 Insert 0 1 2 t 7 intkey=r[2] data=r[1]
13 Next 0 5 0 1
14 Halt 0 0 0 0
15 Transaction 0 1 1 0 1 usesStmtJournal=0
16 Integer 2 6 0 0 r[6]=2
17 Goto 0 1 0 0
```
Closes #1130
2025-03-24 09:19:22 +02:00