Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
bc26faf
feat: reorder inner joins greedily using estimated row counts
KKould Oct 25, 2026
1143edd
perf: avoid repeated greedy join reordering and prioritize equijoins
KKould Oct 25, 2026
a96efb4
perf: prune uncompetitive greedy join candidates
KKould Oct 25, 2026
9205ba2
perf: materialize reusable quantified subquery inputs
KKould Oct 25, 2026
da6e874
perf: pause quantified input materialization on terminal matches
KKould Oct 25, 2026
46eba36
perf: guard mark apply evaluation with safe boolean predicates
KKould Oct 25, 2026
41546f2
fix: preserve composite unique bounds and continue missing index ranges
KKould Oct 25, 2026
46539c2
perf: share safe guards across mark apply segments
KKould Oct 25, 2026
8a8e897
perf: attach mark producers before consumers and orient nested loops
KKould Oct 25, 2026
9dea151
fix: normalize parameterized mark probes to index key types
KKould Oct 25, 2026
ce85cbb
perf: collect column statistics and refine join cost estimates
KKould Oct 25, 2026
194c681
perf: preserve join properties and account for filtered input work
KKould Oct 25, 2026
4ecab59
perf: account for parameterized inner join input work
KKould Oct 25, 2026
3f40287
fix: preserve child work in cross join cost estimates
KKould Oct 25, 2026
99271ba
perf: reorder unestimated cross joins and make analyze sketches confi…
KKould Oct 25, 2026
76f85d8
perf: reset read executors without rebuilding join inputs
KKould Oct 25, 2026
9544379
perf: collapse projects after join orientation
KKould Oct 25, 2026
496f225
perf: retain large constant IN lists and detach point ranges
KKould Oct 25, 2026
d99218c
perf: skip unused covered index key fields
KKould Oct 25, 2026
a691506
perf: move single-use projection input values
KKould Oct 25, 2026
a54bcab
perf: eliminate intermediate project expressions
KKould Oct 25, 2026
af7d6d5
perf: materialize quantified subqueries with searchable runs
KKould Oct 25, 2026
bafb8d1
fix: restore index scans under aliased tables
KKould Oct 25, 2026
4ff994d
perf: reuse schema caches and track join output positions
KKould Oct 25, 2026
010615c
perf: move left rows for unique index joins
KKould Oct 25, 2026
1d502ab
perf: index binder names and reduce join copying
KKould Oct 25, 2026
4ca0a57
refactor: simplify project elimination and child traversal
KKould Oct 25, 2026
bee9d37
docs: add RFC 0001 for greedy join reorder owning join decisions
KKould Oct 25, 2026
43f9b06
feat(optimizer): propagate constants through equality predicates
KKould Oct 25, 2026
7c8766e
refactor(optimizer): take rule lists as slices
KKould Oct 25, 2026
e90e8ac
test(join_reorder): update greedy tests to current build-side behavior
KKould Oct 25, 2026
5f21ac4
refactor(optimizer): drop unused HepOptimizerPipeline::new
KKould Oct 25, 2026
ab5fc41
feat(planner): unify join cost model (RFC 0001 stage 1)
KKould Oct 25, 2026
83358f8
feat(optimizer): let greedy join reorder own join decisions (RFC 0001…
KKould Oct 25, 2026
d782639
refactor(optimizer): simplify greedy join reorder for left-deep search
KKould Oct 25, 2026
28eca59
perf(optimizer): index join keys by input and compare join columns by…
KKould Oct 25, 2026
b8970fc
perf(optimizer): push predicates through nested joins in one pass
KKould Oct 25, 2026
02c4dcb
refactor(execution): carry rows as TupleImpl to join without material…
KKould Oct 25, 2026
d4361e1
perf(execution): reuse Concat boxes and copy multi-use join rows flat
KKould Oct 25, 2026
593a171
fix(optimizer): propagate index predicates through transparent operators
KKould Oct 25, 2026
dc167ad
perf(execution): skip probed join keys and reuse probe ranges on reset
KKould Oct 25, 2026
cabdfe4
test(optimizer): expect probed join keys to leave no apply predicates
KKould Oct 25, 2026
6a46140
test: align optimizer and ORM regressions with current behavior
KKould Oct 25, 2026
e095bce
fix(storage): decode only view names in SHOW VIEWS without touching T…
KKould Oct 25, 2026
bfa128d
perf(planner): index scalar query values by global position instead o…
KKould Oct 25, 2026
9d3f0a8
perf(planner): bind scalar subquery results into index ranges at exec…
KKould Oct 25, 2026
8f9fa3f
test: run the SQLite sqllogictest corpus from the kitesql-testing sub…
KKould Oct 25, 2026
a710e5c
docs: translate RFC 0001 to English
KKould Oct 25, 2026
0f46019
test: gate constant propagation tests off wasm32
KKould Oct 25, 2026
7176d7f
refactor: split IndexProbeJoin out of MarkApply
KKould Oct 25, 2026
317acdf
refactor(spill): encode TupleImpl through the Option and Vec codecs
KKould Oct 25, 2026
6c4f30b
refactor(expression): split IN point checks so the range detacher sca…
KKould Oct 25, 2026
9f0a00b
perf(optimizer): reuse a histogram buffer across the hint pass and tr…
KKould Oct 25, 2026
41357d2
docs: ask agents to write only necessary tests
KKould Oct 25, 2026
15d6723
refactor(optimizer): price plans on demand and trim redundant tests
KKould Oct 25, 2026
d2dee1e
fix: resolve clippy lints and propagate binder extend errors
KKould Oct 25, 2026
c5fcfa0
ci: run clippy and fix the DeepWiki README badge
KKould Oct 25, 2026
3594b02
feat: add total(), group_concat() and SQLite-style text sums
KKould Oct 25, 2026
249185f
ci: run the SQLite sqllogictest corpus as a required job
KKould Oct 25, 2026
f3d974b
chore: bump to 0.6.0 and refresh TPC-C results
KKould Oct 25, 2026
bbb1cc0
perf: materialize uncorrelated quantified subqueries without estimates
KKould Oct 25, 2026
4844c6f
feat: read-only transactions and transaction type renames
KKould Oct 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,19 @@ jobs:

- name: Run cargo fmt
run: make fmt
# 2.1
clippy:
name: Rust clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2

- name: Run cargo clippy
run: make clippy
# 3
e2e:
name: Rust e2e sqllogictest
Expand All @@ -47,6 +60,19 @@ jobs:

- name: Run sqllogictest suite
run: make test-slt
# 3.1
sqlite-slt:
name: SQLite sqllogictest corpus
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2

- name: Run SQLite sqllogictest corpus
run: make test-slt-sqlite
# 4
coverage:
name: Rust coverage
Expand Down Expand Up @@ -165,3 +191,22 @@ jobs:
with:
name: fuzz-artifacts
path: fuzz/artifacts
# 10
miri:
name: Miri (unsafe code UB check)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly-2026-10-04
components: miri, rust-src
- uses: Swatinem/rust-cache@v2
with:
key: miri

- name: Set up Miri sysroot
run: cargo +nightly-2026-10-04 miri setup

- name: Run Miri tests
run: make miri
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "tests/kitesql-testing"]
path = tests/kitesql-testing
url = https://github.com/KipData/kitesql-testing.git
19 changes: 19 additions & 0 deletions AGENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,18 @@ PRs that modify logic but leave obvious test gaps untouched may be rejected.

---

### 2.4 Write Only Necessary Tests

Coverage means each behavior is tested once, not that every case gets its own test.

- Test each distinct branch or behavior once, at the layer that owns it
- Do not repeat in a driver or caller what the rule or module already tests
- Group related cases into one table-driven test instead of near-identical tests
- Skip tests for trivial control flow (simple loops, early returns, plain delegation)
- When touching a test module, delete tests made redundant by others

---

## 3. Code Simplicity Rules

### 3.1 Prefer Simple Code
Expand Down Expand Up @@ -134,6 +146,13 @@ If code looks similar in multiple places, it probably wants to be reused.
- Avoid exposing internal details
- Keep modules small, focused, and cohesive

### 4.3 Rust Imports

- Declare `use` imports at module scope, not inside functions or methods.
- Import functions and types before using them; do not write fully qualified paths
such as `crate::optimizer::rule::normalization::reorder_joins(...)` in function bodies.
- Use import aliases when names conflict; keep test imports at the test module scope.

---

## 5. Dependency Policy
Expand Down
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[package]
name = "kite_sql"
version = "0.5.0"
version = "0.6.0"
edition = "2021"
build = "build.rs"
authors = ["Kould <kould2333@gmail.com>", "Xwg <loloxwg@gmail.com>"]
Expand Down Expand Up @@ -56,7 +56,7 @@ required-features = ["pprof"]
bumpalo = { version = "3", default-features = false, features = ["collections"] }
ordered-float = { version = "4" }
paste = { version = "1" }
kite_sql_serde_macros = { version = "0.2.4", path = "kite_sql_serde_macros" }
kite_sql_serde_macros = { version = "0.2.5", path = "kite_sql_serde_macros" }

# Optional dependencies for features
comfy-table = { version = "7", default-features = false, optional = true }
Expand Down
16 changes: 15 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ CARGO ?= cargo
GRCOV ?= grcov
WASM_PACK ?= wasm-pack
SQLLOGIC_PATH ?= tests/slt/**/*.slt
SQLITE_LOGIC_PATH ?= tests/kitesql-testing/data/sqlite/**/*.slt
SQLITE_LOGIC_ARGS ?=
PYO3_PYTHON ?= /usr/bin/python3.12
TPCC_MEASURE_TIME ?= 15
TPCC_NUM_WARE ?= 1
Expand Down Expand Up @@ -33,9 +35,12 @@ FUZZ_PASS_EXIT_sql_exec = 70
# sql_gen: bounded generated queries, so crashes, timeouts and OOMs all fail.
FUZZ_ARGS_sql_gen = -max_len=4096
FUZZ_PASS_EXIT_sql_gen = 0
MIRI_TOOLCHAIN ?= nightly-2026-10-04
MIRI_FEATURES ?= spill,decimal,lmdb
MIRI_TESTS ?= types::tuple:: execution::test::
COVERAGE_REPORT_ARGS ?= --llvm --ignore-not-existing --keep-only 'src/**' --ignore 'src/**/tests/**' --ignore 'tests/**' --ignore 'tpcc/**' --excl-start 'GRCOV_EXCL_START' --excl-stop 'GRCOV_EXCL_STOP'

.PHONY: test test-python test-wasm test-slt test-all codecov codecov-html wasm-build check tpcc tpcc-kitesql-rocksdb tpcc-kitesql-lmdb tpcc-lmdb-flamegraph tpcc-lmdb-heaptrack tpcc-sqlite tpcc-dual cargo-check build wasm-examples native-examples fmt clippy fuzz
.PHONY: test test-python test-wasm test-slt test-all codecov codecov-html wasm-build check tpcc tpcc-kitesql-rocksdb tpcc-kitesql-lmdb tpcc-lmdb-flamegraph tpcc-lmdb-heaptrack tpcc-sqlite tpcc-dual cargo-check build wasm-examples native-examples fmt clippy fuzz miri

## Run default Rust tests in the current environment (non-WASM).
test:
Expand Down Expand Up @@ -65,6 +70,12 @@ test-wasm:
test-slt:
$(CARGO) run -p sqllogictest-test -- --path '$(SQLLOGIC_PATH)'

.PHONY: test-slt-sqlite

## Run the external SQLite corpus (select1–5 excluded unless --include-select is passed).
test-slt-sqlite:
$(CARGO) run --release -p sqllogictest-test --bin sqlite -- --path '$(SQLITE_LOGIC_PATH)' $(SQLITE_LOGIC_ARGS)

## Convenience target to run every suite in sequence.
test-all: test test-wasm test-slt test-python

Expand Down Expand Up @@ -103,6 +114,9 @@ fuzz:
echo "fuzz: $(FUZZ_TARGET) failed (exit $$status), see fuzz/artifacts/$(FUZZ_TARGET)/"; exit $$status; \
fi

miri:
$(CARGO) +$(MIRI_TOOLCHAIN) miri test --lib --features '$(MIRI_FEATURES)' -- $(MIRI_TESTS)

## Run formatting (check mode) across the workspace.
fmt:
$(CARGO) fmt --all -- --check
Expand Down
11 changes: 5 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<p align="center">
<a href="https://github.com/KipData/KiteSQL/actions/workflows/ci.yml"><img src="https://github.com/KipData/KiteSQL/actions/workflows/ci.yml/badge.svg" alt="CI"></img></a>
<a href="https://codecov.io/github/KipData/KiteSQL"><img src="https://codecov.io/github/KipData/KiteSQL/branch/main/graph/badge.svg" alt="Codecov"></img></a>
<a href="https://deepwiki.com/KipData/KiteSQL"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></img></a>
<a href="https://deepwiki.com/KipData/KiteSQL"><img src="https://img.shields.io/badge/DeepWiki-Ask_AI-1f6feb" alt="Ask DeepWiki"></img></a>
<a href="https://discord.gg/dU8eVGpJ8h"><img src="https://img.shields.io/badge/Discord-Join_us-5865F2?logo=discord&logoColor=white" alt="Discord"></a>
<a href="https://crates.io/crates/kite_sql/"><img src="https://img.shields.io/crates/v/kite_sql.svg"></a>
<a href="https://github.com/KipData/KiteSQL" target="_blank">
Expand Down Expand Up @@ -131,14 +131,13 @@ print(list(db.run("select * from demo")))
## TPC-C
`make tpcc` runs the benchmark (`--backend rocksdb|lmdb`); `make tpcc-dual` cross-checks every statement against SQLite.

720-second single-thread run on an i9-13900HX (32 GB, KIOXIA EXCERIA PLUS G3), every backend pinned to the same P-core. Latencies are p90 in µs, including commit.
720-second single-thread run on an i9-13900HX (32 GB, KIOXIA EXCERIA PLUS G3), every backend pinned to the same P-core and run without fsync on commit. Latencies are p90 in µs, including commit.

| Backend | TpmC | New-Order | Payment | Order-Status | Delivery | Stock-Level |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| KiteSQL LMDB | 159616 | 315 | 81 | 44 | 435 | 332 |
| KiteSQL RocksDB | 48035 | 459 | 258 | 200 | 11055 | 704 |
| SQLite balanced | 67102 | 283 | 67 | 48 | 338 | 473 |
| SQLite practical | 67153 | 336 | 66 | 41 | 427 | 339 |
| KiteSQL LMDB | 165956 | 303 | 75 | 43 | 436 | 318 |
| KiteSQL RocksDB | 50739 | 392 | 188 | 198 | 11743 | 812 |
| SQLite (WAL, `synchronous=OFF`) | 191484 | 274 | 41 | 33 | 343 | 268 |

👉 [Details and how to reproduce](tpcc/README.md)

Expand Down
19 changes: 5 additions & 14 deletions examples/transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
mod app {
use kite_sql::db::DataBaseBuilder;
use kite_sql::errors::DatabaseError;
use kite_sql::types::tuple::Tuple;
use kite_sql::types::value::DataValue;
use std::fs;
use std::io::ErrorKind;
Expand All @@ -43,7 +42,7 @@ mod app {
// Optimistic transactions are currently backed by RocksDB.
let mut database = DataBaseBuilder::path(EXAMPLE_DB_PATH).build_optimistic()?;
database.ddl("create table if not exists t1 (c1 int primary key, c2 int)")?;
let mut transaction = database.new_transaction()?;
let mut transaction = database.new_transaction(false)?;

transaction
.run("insert into t1 values(0, 0), (1, 1)")?
Expand All @@ -57,29 +56,21 @@ mod app {

let mut iter = database.run("select * from t1")?;
iter.next_tuple(|_, tuple| {
assert_eq!(
tuple,
&Tuple::new(None, vec![DataValue::Int32(0), DataValue::Int32(0)])
);
assert_eq!(*tuple, vec![DataValue::Int32(0), DataValue::Int32(0)]);
})?
.unwrap();
iter.next_tuple(|_, tuple| {
assert_eq!(
tuple,
&Tuple::new(None, vec![DataValue::Int32(1), DataValue::Int32(1)])
);
assert_eq!(*tuple, vec![DataValue::Int32(1), DataValue::Int32(1)]);
})?
.unwrap();
assert!(iter.next_tuple(|_, _| ())?.is_none());
iter.done()?;

let mut tx2 = database.new_transaction()?;
let mut tx2 = database.new_transaction(false)?;
tx2.run("update t1 set c2 = 99 where c1 = 0")?.done()?;
let mut c2_iter = database.run("select c2 from t1 where c1 = 0")?;
assert_eq!(
c2_iter
.next_tuple(|_, tuple| tuple.values[0].i32())?
.unwrap(),
c2_iter.next_tuple(|_, tuple| tuple[0].i32())?.unwrap(),
Some(0)
);
c2_iter.done()?;
Expand Down
4 changes: 2 additions & 2 deletions fuzz/fuzz_targets/sql_exec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ fn reset(db: &mut Database<LmdbStorage>) {
let mut names = Vec::new();
if let Ok(mut iter) = db.run(show) {
while let Ok(Some(())) = iter.next_tuple(|_, tuple| {
if let Some(DataValue::Utf8 { value, .. }) = tuple.values.first() {
if let Some(DataValue::Utf8 { value, .. }) = tuple.get(0) {
names.push(value.clone());
}
}) {}
Expand Down Expand Up @@ -165,7 +165,7 @@ fn run_one(db: &mut Database<LmdbStorage>, sql: &str) {
// Drain and render every value, like the sqllogictest harness does.
loop {
match iter.next_tuple(|_, tuple| {
for value in tuple.values.iter() {
for value in tuple.iter() {
let _ = value.to_string();
}
}) {
Expand Down
16 changes: 12 additions & 4 deletions fuzz/fuzz_targets/sql_gen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
use kite_sql::db::{DataBaseBuilder, Database};
use kite_sql::errors::DatabaseError;
use kite_sql::storage::lmdb::LmdbStorage;
use kite_sql::types::tuple::TupleImpl;
use kite_sql::types::value::DataValue;
use libfuzzer_sys::arbitrary::{self, Unstructured};
use libfuzzer_sys::fuzz_target;
Expand Down Expand Up @@ -735,7 +736,11 @@ fn open_db() -> Database<LmdbStorage> {
fn check_tlp(db: &Database<LmdbStorage>, select: &Select, predicate: &str) {
let base_sql = select.render(false, false);
let mut base = Vec::new();
if for_each_row(db, &base_sql, |row| base.push(row.to_vec())).is_err() {
if for_each_row(db, &base_sql, |row| {
base.push(row.iter().cloned().collect())
})
.is_err()
{
return;
}
let order_by = select.order_by.map(|(column, _)| column);
Expand Down Expand Up @@ -778,8 +783,11 @@ fn rows_match(
}
let mut matched = true;
let mut i = offset;
let mut key = Vec::new();
let rows = for_each_row(db, sql, |row| {
let in_base = match remaining.get_mut(row) {
key.clear();
key.extend(row.iter().cloned());
let in_base = match remaining.get_mut(key.as_slice()) {
Some(count) if *count > 0 => {
*count -= 1;
true
Expand Down Expand Up @@ -807,15 +815,15 @@ fn run(db: &Database<LmdbStorage>, sql: &str) -> Result<usize, DatabaseError> {
fn for_each_row(
db: &Database<LmdbStorage>,
sql: &str,
mut f: impl FnMut(&[DataValue]),
mut f: impl FnMut(&TupleImpl),
) -> Result<usize, DatabaseError> {
// Printed before running so a crashing statement is still visible.
if debug() {
eprintln!("{sql};");
}
let mut iter = db.run(sql)?;
let mut rows = 0;
while iter.next_tuple(|_, tuple| f(&tuple.values))?.is_some() {
while iter.next_tuple(|_, tuple| f(tuple))?.is_some() {
rows += 1;
}
iter.done()?;
Expand Down
2 changes: 1 addition & 1 deletion kite_sql_serde_macros/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "kite_sql_serde_macros"
version = "0.2.4"
version = "0.2.5"
edition = "2021"
description = "Derive macros for KiteSQL"
documentation = "https://docs.rs/kite_sql_serde_macros/latest/kite_sql_serde_macros/"
Expand Down
2 changes: 1 addition & 1 deletion kite_sql_serde_macros/src/orm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,7 @@ pub(crate) fn handle(ast: DeriveInput) -> Result<TokenStream, Error> {
{
fn from_query_row(
schema: &::kite_sql::types::tuple::SchemaView<'_, '_>,
tuple: &mut ::kite_sql::types::tuple::Tuple,
tuple: &mut ::kite_sql::types::tuple::TupleImpl,
) -> ::std::result::Result<Self, ::kite_sql::errors::DatabaseError> {
let mut __kite_orm_found_fields = 0usize;
#(#field_index_declarations)*
Expand Down
4 changes: 2 additions & 2 deletions kite_sql_serde_macros/src/projection.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ pub(crate) fn handle(ast: DeriveInput) -> Result<TokenStream, Error> {
relation: &str,
) -> ::std::result::Result<::std::vec::Vec<::kite_sql::planner::ExprRef>, ::kite_sql::errors::DatabaseError>
where
T: ::kite_sql::storage::Transaction,
T: ::kite_sql::storage::StorageTransaction,
A: AsRef<[(usize, ::kite_sql::types::LogicalType)]>,
{
Ok(::std::vec![
Expand All @@ -121,7 +121,7 @@ pub(crate) fn handle(ast: DeriveInput) -> Result<TokenStream, Error> {
{
fn from_query_row(
schema: &::kite_sql::types::tuple::SchemaView<'_, '_>,
tuple: &mut ::kite_sql::types::tuple::Tuple,
tuple: &mut ::kite_sql::types::tuple::TupleImpl,
) -> ::std::result::Result<Self, ::kite_sql::errors::DatabaseError> {
let mut __kite_orm_found_fields = 0usize;
#(#field_index_declarations)*
Expand Down
4 changes: 2 additions & 2 deletions kite_sql_serde_macros/src/reference_serialization.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ pub(crate) fn handle(ast: DeriveInput) -> Result<TokenStream, Error> {
Ok(())
}

fn decode<Tx: crate::storage::Transaction, R: std::io::Read, A: crate::planner::MetaArena + ?Sized>(
fn decode<Tx: crate::storage::StorageTransaction, R: std::io::Read, A: crate::planner::MetaArena + ?Sized>(
reader: &mut R,
drive: Option<&crate::serdes::ReferenceDecodeContext<'_, Tx>>,
reference_tables: &crate::serdes::ReferenceTables,
Expand Down Expand Up @@ -229,7 +229,7 @@ pub(crate) fn handle(ast: DeriveInput) -> Result<TokenStream, Error> {
Ok(())
}

fn decode<Tx: crate::storage::Transaction, R: std::io::Read, A: crate::planner::MetaArena + ?Sized>(
fn decode<Tx: crate::storage::StorageTransaction, R: std::io::Read, A: crate::planner::MetaArena + ?Sized>(
reader: &mut R,
drive: Option<&crate::serdes::ReferenceDecodeContext<'_, Tx>>,
reference_tables: &crate::serdes::ReferenceTables,
Expand Down
Loading
Loading