Commit Graph

7389 Commits

Author SHA1 Message Date
Jussi Saurio
87bf488bbc chore: use rusqlite 0.37 with bundled sqlite everywhere 2025-08-11 15:13:57 +03:00
Pekka Enberg
909338fad1 Merge 'Simulator should delete files after a successful run' from Pedro Muniz
I was getting IO errors for too many files when running the simulator
locally. It seemed that the simulator did not delete files after a
successful run. After this change, I did not get anymore errors

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

Closes #2520
2025-08-11 15:09:32 +03:00
Pekka Enberg
221e030d98 Merge 'Fix performance regression in prepare' from Piotr Rżysko
Attempt at fixing https://github.com/tursodatabase/turso/issues/2527.

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

Closes #2532
2025-08-11 15:08:10 +03:00
Pekka Enberg
4a53c44466 Merge 'Add support for PRAGMA freelist_count' from bit-aloo
Implements `PRAGMA freelist_count` to return the current number of free
pages in the database.

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

Closes #2531
2025-08-11 15:07:58 +03:00
Pekka Enberg
08ab998404 Merge 'Initial pass on incremental view maintenance with DBSP' from Glauber Costa
Implement very basic views using DBSP
This is just the bare minimum that I needed to convince myself that this
 approach will work. The only views that we support are slices of the
 main table: no aggregations, no joins, no projections.
 * drop view is implemented.
 * view population is implemented.
 * deletes, inserts and updates are implemented.
 much like indexes before, a flag must be passed to enable views.

Closes #2530
2025-08-11 14:09:35 +03:00
Pekka Enberg
fb023ac62d Merge 'SQLite C API improvements: add bind_text and bind_blob' from Danawan Bimantoro
Add support for more of the SQLite C API.
Bind functions:
- sqlite3_bind_text (with destructor callback)
- sqlite3_bind_blob
Column functions:
- sqlite3_column_text
- sqlite3_column_blob
- sqlite3_column_bytes

Closes #2528
2025-08-11 12:32:46 +03:00
Pekka Enberg
f65a12a699 Merge 'perf/clickbench: enable rest of queries since we support DISTINCT and REGEXP_REPLACE' from Jussi Saurio
Closes #2537
2025-08-11 12:32:02 +03:00
Pekka Enberg
cdaea7f274 core/vdbe: Make apply_view_deltas() return early if views are disabled
Currently, we have a borrow problem because parse_schema_rows() already
borrows `schema`, but then `apply_view_deltas` does the same:

```
thread 'main' panicked at core/vdbe/mod.rs:450:49:
already mutably borrowed: BorrowError
stack backtrace:
   0: __rustc::rust_begin_unwind
             at /rustc/6b00bc3880198600130e1cf62b8f8a93494488cc/library/std/src/panicking.rs:697:5
   1: core::panicking::panic_fmt
             at /rustc/6b00bc3880198600130e1cf62b8f8a93494488cc/library/core/src/panicking.rs:75:14
   2: core::cell::panic_already_mutably_borrowed
             at /rustc/6b00bc3880198600130e1cf62b8f8a93494488cc/library/core/src/cell.rs:799:5
   3: core::cell::RefCell<T>::borrow
             at /rustc/6b00bc3880198600130e1cf62b8f8a93494488cc/library/core/src/cell.rs:987:25
   4: turso_core::vdbe::Program::apply_view_deltas
             at ./core/vdbe/mod.rs:450:26
   5: turso_core::vdbe::Program::commit_txn
             at ./core/vdbe/mod.rs:468:9
   6: turso_core::vdbe::execute::op_halt
             at ./core/vdbe/execute.rs:1954:15
   7: turso_core::vdbe::Program::step
             at ./core/vdbe/mod.rs:430:19
   8: turso_core::Statement::step
             at ./core/lib.rs:1914:23
   9: turso_core::util::parse_schema_rows
             at ./core/util.rs:91:15
  10: turso_core::Connection::parse_schema_rows::{{closure}}
             at ./core/lib.rs:1518:17
  11: turso_core::Connection::with_schema_mut
             at ./core/lib.rs:1625:9
  12: turso_core::Connection::parse_schema_rows
             at ./core/lib.rs:1515:9
```

However, this is a read transaction and views are not even enabled,
let's just make `apply_view_deltas()` return early if there's no
processing needed, to skip the schema borrow altogether.
2025-08-11 12:26:11 +03:00
Pekka Enberg
e829201fdd cli: Fix .schema SQL statement some more
We need to fetch name and type too, but also sort in both places
consistently.
2025-08-11 11:52:57 +03:00
Pekka Enberg
4923d95ca3 cli: Fix schema object ordering
SQLite orders schema objects by rowid, not by name.
2025-08-11 11:43:23 +03:00
Jussi Saurio
51f2aad7a4 perf/clickbench: enable rest of queries since we support DISTINCT and REGEXP_REPLACE 2025-08-11 11:32:37 +03:00
Pekka Enberg
3aa885690c core/vdbe: Don't call rowid() unless view processing is enabled
Currently, the simulator complains of the following error:

```
Error: failed with error: 'attempt to multiply with overflow'
```

However, we don't enable views in the simulator so -- despite being an
issue -- we should never see this. Let's fix `op_delete()` some more not
to not even call rowid() unless view processing is enabled.
2025-08-11 10:56:58 +03:00
Pekka Enberg
6f3278f6ed core/vdbe: Perform view processing in op_delete only if views are enabled
Like in op_insert(), let's perform view processing only if views are
actually enabled.
2025-08-11 10:26:16 +03:00
Pekka Enberg
8a31fc069d Merge branch 'main' into dbsp-views 2025-08-11 10:08:18 +03:00
Pekka Enberg
a9fdaa8305 Merge 'Add table name to the delete bytecode' from Glauber Costa
When building views (soon), it will be important to know which table is
being deleted. Getting from the cursor id is very cumbersome.
What we are doing here is symmetrical to op_insert, and sqlite also
passes table information in one of the registers (p4)

Closes #2529
2025-08-11 09:50:15 +03:00
Piotr Rzysko
40a8058083 Use mimalloc in benchmark.rs 2025-08-11 08:02:35 +02:00
bit-aloo
4dfa0d77c5 put freelist_count lexicographically in pragma name enum 2025-08-11 11:06:56 +05:30
Pekka Enberg
62f1fd2038 core/incremental: Make clippy happy 2025-08-11 08:36:53 +03:00
Pekka Enberg
87322ad1e4 core/incremental: Evaluate view expressions
...tests were failing because we are testing with expressions, but
didn't support them.
2025-08-11 08:27:10 +03:00
Pekka Enberg
6e8d1a5c7d Merge 'Initial pass on incremental view maintenance with DBSP' from Glauber Costa
Implement very basic views using DBSP
This is just the bare minimum that I needed to convince myself that this
 approach will work. The only views that we support are slices of the
 main table: no aggregations, no joins, no projections.
 * drop view is implemented.
 * view population is implemented.
 * deletes, inserts and updates are implemented.
 much like indexes before, a flag must be passed to enable views.

Closes #2530
2025-08-11 07:45:43 +03:00
Glauber Costa
145d6eede7 Implement very basic views using DBSP
This is just the bare minimum that I needed to convince myself that this
approach will work. The only views that we support are slices of the
main table: no aggregations, no joins, no projections.

drop view is implemented.
view population is implemented.
deletes, inserts and updates are implemented.

much like indexes before, a flag must be passed to enable views.
2025-08-10 23:34:04 -05:00
bit-aloo
e165deb09d update compact md 2025-08-11 10:03:58 +05:30
bit-aloo
d2171e24a5 add pragma freelist_count 2025-08-11 10:03:46 +05:30
bit-aloo
cf12c90428 expose freepage_list in pager 2025-08-11 09:57:46 +05:30
Glauber Costa
d5b7533ff8 Implement a DBSP module
We are not using the DBSP crate because it is very heavy on Tokio and
other dependencies that won't make sense for us to consume.
2025-08-10 23:15:26 -05:00
Glauber Costa
e255fc9a81 Add table name to the delete bytecode
When building views (soon), it will be important to know which table
is being deleted. Getting from the cursor id is very cumbersome.

What we are doing here is symmetrical to op_insert, and sqlite also
passes table information in one of the registers (p4)
2025-08-10 22:50:25 -05:00
Glauber Costa
e9b8f6fba9 Add table name to the delete bytecode
When building views (soon), it will be important to know which table
is being deleted. Getting from the cursor id is very cumbersome.

What we are doing here is symmetrical to op_insert, and sqlite also
passes table information in one of the registers (p4)
2025-08-10 16:10:45 -05:00
danawan
85ca5e07ee fix clippy in test 2025-08-10 18:31:08 +07:00
danawan
f450524ddb sqlite3 api add bind_text and bind_blob 2025-08-10 18:20:52 +07:00
Preston Thorpe
efd6fde389 Merge 'docs: fix CLI command and add homebrew install instructions for MacOS' from Mattia
Hi there,
I wasn't able to run the Turso CLI locally following the manual in the
docs (with both the release version and Homebrew). I found out that the
right command is `tursodb` rather than just turso as specified in the
cli/Cargo.toml.
This MR updates the docs and also mention the instruction to install it
with Homebrew.
Demo:
<img width="629" height="129" alt="image" src="https://github.com/user-
attachments/assets/3c684328-dab6-436a-bae6-4b6199f5b0b5" />

Reviewed-by: Preston Thorpe <preston@turso.tech>

Closes #2514
2025-08-09 15:42:26 -04:00
Preston Thorpe
dbd9195828 Merge 'Reimplement LimboRwLock in the WAL' from Preston Thorpe
This PR rewrites the `LimboRwLock`, which previously used 3 separate
`AtomicU32` values to store the lock state, in favor of a single,
packed, cache friendly `AtomicU64`.
The previous impl has some complexity and rather hairy edge cases/issues
because we are not updating the lock state together. This PR also
adjusts it to use `Acquire`/`Release` for `load`/`store` operations, and
tries to improve the API of using the locks.

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

Closes #2518
2025-08-09 15:38:36 -04:00
pedrocarlo
0c9ecbc768 simulator should delete files after a successful run 2025-08-09 16:25:51 -03:00
PThorpe92
01f281bae5 Fix doc test/comment 2025-08-09 14:41:15 -04:00
PThorpe92
3d518baef5 Fix assertion to make sure a reader or writer exists when unlock is called 2025-08-09 14:40:03 -04:00
PThorpe92
f81bc3236a Use a single packed u64 for LimboRwLock and relax memory ordering 2025-08-09 14:08:25 -04:00
Mattia Pitossi
398bea9f12 docs: fix command add homebrew install instructions for MacOS 2025-08-09 11:58:11 +02:00
Preston Thorpe
54613cceec Merge 'BufferPool: add arena backed pool to support fixed opcodes and coalescing' from Preston Thorpe
This PR introduces a BufferPool which allocates all (usually) of the
memory we will need up front as two large arenas (one for WAL frames and
one for DB pages) and hands our pages from those two arena allocations.
(each will be 3 MB by default, because 8MB is typically the RL_MEMLOCK
limit so without `setcap cap_ipc_lock` changed, it will not be able to
properly register the arenas with io_uring).
Any additional memory needed will fall back to the previous style buffer
pool, with a simple thread local cache, which should be slightly faster
for most cases.

Closes #2419
2025-08-08 14:38:21 -04:00
PThorpe92
718114f5da Keep free api consistent with try_alloc, size instead of pages 2025-08-08 11:50:16 -04:00
PThorpe92
213d589dd1 Apply review suggestions, remove FreeEntry 2025-08-08 11:07:29 -04:00
PThorpe92
84ffed709a Round up allocation for wal frame arena to next page multiple of 64 2025-08-08 10:55:29 -04:00
PThorpe92
d182b836ef Remove basic test for buffer pool to avoid race conditions in CI 2025-08-08 10:55:29 -04:00
PThorpe92
faf248df03 Add more docs and comments for TempBufferCache 2025-08-08 10:55:28 -04:00
PThorpe92
34d90d5acb Remove Clone impl for Buffer and PageContent to make any copying of page data explicit 2025-08-08 10:55:28 -04:00
PThorpe92
d41377454c Fix test asserting for arena size instead of page size 2025-08-08 10:55:28 -04:00
PThorpe92
d7e4ba21f8 Add explanation for using 3mb limit 2025-08-08 10:55:28 -04:00
PThorpe92
ff7d9fe961 Add basic test for buffer pool initialization and basic use 2025-08-08 10:55:28 -04:00
PThorpe92
66964fd8d2 Add documentation and comments to new buffer pool, add get_frame api 2025-08-08 10:55:28 -04:00
PThorpe92
d94e252ef9 Actually pre-register two arenas with the ring 2025-08-08 10:55:28 -04:00
PThorpe92
f9df267f42 Increase test arena size and fix import 2025-08-08 10:55:28 -04:00
PThorpe92
39d230a899 Add bitmap for tracking pages in arena 2025-08-08 10:55:27 -04:00