Skip to content

Add doltlite-go: a database/sql driver with the engine vendored - #2531

Closed
timsehn wants to merge 1 commit into
masterfrom
packaging/go-driver
Closed

Add doltlite-go: a database/sql driver with the engine vendored#2531
timsehn wants to merge 1 commit into
masterfrom
packaging/go-driver

Conversation

@timsehn

@timsehn timsehn commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Go bindings as a database/sql driver — sql.Open("doltlite", path) — over cgo, with the amalgamation vendored into the package so there's no system library to install.

Why a Go binding, given embedded Dolt exists

I argued earlier in this repo's history that Go didn't need one, because github.com/dolthub/driver embeds Dolt in pure Go with no cgo. That reasoning holds for new programs wanting versioned SQL — but it doesn't cover the case that motivated this: embedded Dolt speaks Dolt's on-disk format and cannot open a DoltLite database, which is a single-file chunk store. Anything that has to read DoltLite files from Go — the DoltHub API, for instance — needs a real binding.

The README states this plainly and sends new Go programs to embedded Dolt instead, so the packages don't compete for the same use case.

Shape

  • Full driver set: Driver, Conn, Stmt, Rows, Tx, Result — so database/sql and everything layered on it works unchanged.
  • Version control is plain SQL on the connection; no binding-specific API.
  • Binds text and blobs with SQLITE_TRANSIENT, which cgo requires (C must not retain Go memory past the call), and reads text by length rather than as a C string so embedded NULs survive.
  • Empty strings and empty blobs bind through a valid pointer rather than nil.

Tests

test-package.sh stages the module and builds the smoke test against the staged copy via a replace directive, so a missing vendored amalgamation fails the test instead of shipping. 22 checks pass locally: every value type (UTF-8 text, blobs with embedded NULs, null, int64, real, empty string), ErrNoRows, column names, error paths, commit/rollback transactions, and a commit → branch → checkout → merge → dolt_log round trip. gofmt and go vet clean.

Build-Test runs it on ubuntu and macos. Windows is excluded and documented, same as the Rust crate: the build links the platform's zlib, which MSVC doesn't provide.

Distribution needs a repo

Go modules resolve from a VCS path, so publishing needs a dolthub/doltlite-go repository (same pattern as doltlite-php) that release wiring pushes the staged module and a matching tag into. Could you create it when convenient? I'll wire release-go once it exists.

Until then this is usable directly with a replace directive pointing at packaging/go, which is what the DoltHub API side could do immediately if it's in a hurry.

🤖 Generated with Claude Code

Go's sql.Open("doltlite", path) over cgo, with the amalgamation vendored
into the package so no system library is needed. Implements the full
driver set -- Conn, Stmt, Rows, Tx, Result -- so database/sql, and
anything built on it, works unchanged. Version control is plain SQL on
the connection, needing no binding surface of its own.

Why a Go binding at all, given github.com/dolthub/driver embeds Dolt
itself in pure Go: that driver speaks Dolt's on-disk format and cannot
open a DoltLite database, which is a single-file chunk store. Anything
that has to read DoltLite files from Go needs this. The README says so
plainly and points new Go programs at embedded Dolt instead.

Binds text and blobs with SQLITE_TRANSIENT, which cgo requires -- C must
not retain Go memory past the call -- and reads text by length rather
than as a C string, so embedded NULs survive.

test-package.sh stages the module and builds the smoke test against the
staged copy through a replace directive, so a missing vendored
amalgamation fails the test rather than shipping. Build-Test runs it on
ubuntu and macos; Windows is excluded and documented, as for the crate,
since the build links the platform zlib that MSVC lacks.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@timsehn

timsehn commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator Author

Closing: speculative. dolthub/doltlite-go already exists and covers the actual need — a pure-Go implementation of the HTTP sync protocol (prollyhash, remoteproto, litestore, remote, litehttp), deliberately without cgo, which is what hosting DoltLite repos calls for.

This PR was a different capability: executing SQL against a DoltLite file from Go through the C engine. Nothing needs that today, and the module path here collides with the existing repo's. Recoverable from the packaging/go-driver branch if a Go consumer ever needs to run queries rather than move chunks.

@timsehn timsehn closed this Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

DoltLite source coverage

Metric Covered Total Coverage
Lines 53586 62989 85.07%
Branches 24785 36570 67.77%
Functions 2508 2720 92.21%

Merged 201 pooled raw profiles from the distributed Linux correctness jobs.

Per-file coverage (98 files)
File Lines Branches Functions
src/btree_orig_api.c 87.91% 77.27% 89.53%
src/chunk_file.c 100.00% 100.00% 100.00%
src/chunk_index.c 84.27% 66.78% 100.00%
src/chunk_refs.c 84.99% 69.17% 79.37%
src/chunk_staging.c 93.75% 80.33% 100.00%
src/chunk_store.c 90.81% 74.91% 100.00%
src/chunk_store_commit.c 86.75% 67.23% 100.00%
src/chunk_store_lock.c 88.69% 71.00% 100.00%
src/chunk_store_refs_api.c 91.17% 76.75% 100.00%
src/chunk_wal.c 82.30% 58.24% 87.50%
src/doltlite.c 100.00% 100.00% 100.00%
src/doltlite_add.c 85.95% 69.53% 100.00%
src/doltlite_ancestor.c 89.19% 68.92% 100.00%
src/doltlite_at.c 83.39% 64.20% 100.00%
src/doltlite_blame.c 80.86% 61.14% 96.43%
src/doltlite_branch.c 88.30% 80.66% 100.00%
src/doltlite_branches.c 93.75% 75.93% 93.75%
src/doltlite_checkout.c 77.57% 63.06% 96.43%
src/doltlite_cherry_pick.c 79.00% 59.57% 71.43%
src/doltlite_chunk_walk.c 92.23% 66.22% 100.00%
src/doltlite_clean.c 94.23% 68.10% 100.00%
src/doltlite_cmd.c 81.09% 75.19% 100.00%
src/doltlite_commit.c 94.41% 76.87% 100.00%
src/doltlite_commit_ancestors.c 92.09% 72.83% 92.31%
src/doltlite_commit_cmd.c 78.08% 67.50% 100.00%
src/doltlite_config.c 80.47% 71.74% 100.00%
src/doltlite_conflicts.c 84.27% 62.50% 93.75%
src/doltlite_constraint_violations.c 82.46% 57.54% 91.11%
src/doltlite_core.c 91.34% 70.81% 100.00%
src/doltlite_creds.c 84.09% 53.78% 92.00%
src/doltlite_dbpage.c 93.45% 78.33% 91.67%
src/doltlite_diff.c 88.56% 68.99% 96.55%
src/doltlite_diff_stat.c 94.17% 76.01% 95.65%
src/doltlite_diff_table.c 94.18% 70.74% 97.06%
src/doltlite_docs.c 83.94% 71.43% 94.74%
src/doltlite_gc.c 78.48% 58.10% 96.55%
src/doltlite_hashof.c 79.79% 70.05% 100.00%
src/doltlite_history.c 86.93% 76.40% 100.00%
src/doltlite_http_remote.c 82.22% 57.34% 92.31%
src/doltlite_ignore.c 77.57% 62.25% 82.14%
src/doltlite_log.c 96.81% 73.24% 92.86%
src/doltlite_merge.c 95.93% 70.46% 100.00%
src/doltlite_merge_cmd.c 87.19% 72.12% 100.00%
src/doltlite_merge_constraints.c 86.15% 63.64% 95.00%
src/doltlite_merge_constraints_check.c 86.81% 67.79% 100.00%
src/doltlite_merge_constraints_fk.c 78.00% 56.64% 100.00%
src/doltlite_merge_constraints_notnull.c 80.45% 67.92% 100.00%
src/doltlite_merge_constraints_strict.c 77.35% 63.04% 100.00%
src/doltlite_merge_constraints_unique.c 85.99% 62.82% 100.00%
src/doltlite_merge_pass1.c 92.94% 74.16% 100.00%
src/doltlite_merge_pass2.c 83.59% 67.46% 100.00%
src/doltlite_merge_predetect.c 86.38% 71.15% 95.45%
src/doltlite_merge_rebuild.c 99.15% 78.91% 100.00%
src/doltlite_merge_rows.c 82.93% 64.74% 100.00%
src/doltlite_merge_schema.c 90.95% 71.94% 97.06%
src/doltlite_merge_status.c 91.98% 73.53% 92.31%
src/doltlite_patch.c 94.36% 70.71% 98.15%
src/doltlite_rebase.c 85.42% 59.55% 100.00%
src/doltlite_record.c 78.67% 59.36% 95.24%
src/doltlite_ref.c 95.52% 75.36% 100.00%
src/doltlite_remote.c 85.61% 66.89% 96.00%
src/doltlite_remote_sql.c 66.60% 60.73% 93.55%
src/doltlite_remotesrv.c 75.76% 63.77% 90.77%
src/doltlite_reset.c 87.48% 72.76% 100.00%
src/doltlite_revert.c 80.51% 69.44% 100.00%
src/doltlite_schema_diff.c 94.42% 71.13% 96.97%
src/doltlite_schemas.c 70.86% 48.75% 90.91%
src/doltlite_status.c 91.49% 72.78% 97.56%
src/doltlite_tag.c 86.84% 70.31% 94.12%
src/doltlite_tests.c 84.22% 69.61% 91.11%
src/doltlite_tls.c 85.04% 62.73% 92.31%
src/doltlite_verify_constraints.c 79.15% 66.44% 100.00%
src/doltlite_workspace.c 91.84% 70.27% 100.00%
src/pager_shim.c 58.87% 67.46% 34.29%
src/prolly_btree.c 86.00% 66.45% 90.70%
src/prolly_btree_catalog.c 83.10% 69.11% 97.22%
src/prolly_btree_cursor.c 84.15% 62.09% 96.00%
src/prolly_btree_cursor_count.c 80.05% 56.74% 100.00%
src/prolly_btree_cursor_payload.c 75.69% 54.48% 95.65%
src/prolly_btree_cursor_seek.c 76.68% 66.20% 82.35%
src/prolly_btree_mutation.c 87.89% 68.20% 97.83%
src/prolly_btree_orig.c 93.75% 71.43% 93.15%
src/prolly_btree_state.c 93.51% 66.38% 100.00%
src/prolly_btree_txn.c 81.84% 69.30% 98.08%
src/prolly_cache.c 93.27% 69.12% 100.00%
src/prolly_check.c 60.36% 62.96% 100.00%
src/prolly_chunker.c 94.04% 78.38% 100.00%
src/prolly_cursor.c 89.67% 80.47% 100.00%
src/prolly_diff.c 59.59% 46.05% 71.43%
src/prolly_hash.c 93.33% 80.00% 100.00%
src/prolly_hashset.c 90.48% 80.56% 100.00%
src/prolly_mutate.c 80.78% 69.11% 100.00%
src/prolly_mutmap.c 93.87% 80.52% 100.00%
src/prolly_node.c 88.91% 73.81% 100.00%
src/prolly_three_way_diff.c 95.79% 85.37% 100.00%
src/prolly_three_way_merge.c 81.92% 67.41% 91.67%
src/prolly_xxhash.c 100.00% 100.00% 100.00%
src/sortkey.c 93.16% 81.51% 100.00%

Download HTML and LCOV artifacts from this workflow run.

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

DoltLite performance vs PR base

  • Baseline: 5824327f91f4e6e2cc05a375b034b2bb8e432e40
  • Candidate: 7db02a3c973d89b97909d612b39c4fae04d32761
  • Overall ratio: 1.001x
  • Gate result: PASS
  • Gates: individual > 1.50x with more than 10.00ms regression; section, suite, or overall > 1.25x with the same minimum delta
  • vc individual gate: > 2.00x with more than 50.00ms regression
  • Confirmed failed gates: none
  • Automatic retries: none
Suite Workloads Baseline total Candidate total Ratio Result
blobpk 69 15.22s 15.24s 1.001x PASS
compositepk 69 11.57s 11.57s 1.000x PASS
int 69 10.05s 10.10s 1.005x PASS
textpk 69 11.09s 11.08s 0.999x PASS
vc 13 752.37ms 752.68ms 1.000x PASS
blobpk details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 23.06ms 22.64ms -417us 0.982x PASS
mem_reads oltp_range_select 8.91ms 9.01ms +107us 1.012x PASS
mem_reads oltp_sum_range 8.89ms 8.96ms +68us 1.008x PASS
mem_reads oltp_order_range 2.15ms 2.11ms -35us 0.984x PASS
mem_reads oltp_distinct_range 2.96ms 2.86ms -98us 0.967x PASS
mem_reads oltp_index_scan 3.85ms 3.86ms +15us 1.004x PASS
mem_reads select_random_points 15.50ms 15.49ms -3us 1.000x PASS
mem_reads select_random_ranges 3.43ms 3.34ms -85us 0.975x PASS
mem_reads covering_index_scan 2.85ms 2.88ms +34us 1.012x PASS
mem_reads groupby_scan 24.15ms 24.18ms +31us 1.001x PASS
mem_reads index_join 6.69ms 7.25ms +561us 1.084x PASS
mem_reads index_join_scan 4.83ms 4.78ms -44us 0.991x PASS
mem_reads types_table_scan 822.32ms 824.70ms +2.38ms 1.003x PASS
mem_reads table_scan 940.58ms 917.68ms -22.90ms 0.976x PASS
mem_reads oltp_read_only 91.99ms 92.52ms +529us 1.006x PASS
mem_writes oltp_bulk_insert 200.36ms 200.10ms -259us 0.999x PASS
mem_writes oltp_insert 24.67ms 23.79ms -881us 0.964x PASS
mem_writes oltp_update_index 98.35ms 99.88ms +1.53ms 1.016x PASS
mem_writes oltp_update_non_index 51.84ms 52.22ms +384us 1.007x PASS
mem_writes oltp_delete_insert 71.44ms 69.72ms -1.73ms 0.976x PASS
mem_writes oltp_write_only 40.57ms 39.89ms -677us 0.983x PASS
mem_writes types_delete_insert 33.66ms 33.62ms -44us 0.999x PASS
mem_writes oltp_read_write 97.48ms 92.80ms -4.68ms 0.952x PASS
file_reads oltp_point_select 28.74ms 29.50ms +759us 1.026x PASS
file_reads oltp_range_select 10.27ms 10.18ms -98us 0.990x PASS
file_reads oltp_sum_range 10.01ms 9.96ms -42us 0.996x PASS
file_reads oltp_order_range 2.25ms 2.29ms +35us 1.016x PASS
file_reads oltp_distinct_range 3.03ms 3.06ms +32us 1.011x PASS
file_reads oltp_index_scan 5.80ms 5.57ms -229us 0.960x PASS
file_reads select_random_points 19.90ms 18.53ms -1.38ms 0.931x PASS
file_reads select_random_ranges 4.16ms 4.24ms +85us 1.020x PASS
file_reads covering_index_scan 3.81ms 3.77ms -33us 0.991x PASS
file_reads groupby_scan 24.10ms 24.23ms +132us 1.005x PASS
file_reads index_join 8.01ms 8.22ms +212us 1.026x PASS
file_reads index_join_scan 5.06ms 5.04ms -27us 0.995x PASS
file_reads types_table_scan 836.51ms 853.59ms +17.08ms 1.020x PASS
file_reads table_scan 942.06ms 931.26ms -10.80ms 0.989x PASS
file_reads oltp_read_only 94.45ms 94.36ms -90us 0.999x PASS
file_writes oltp_bulk_insert 267.16ms 262.71ms -4.45ms 0.983x PASS
file_writes oltp_insert 107.06ms 74.52ms -32.54ms 0.696x PASS
file_writes oltp_update_index 163.93ms 160.79ms -3.13ms 0.981x PASS
file_writes oltp_update_non_index 121.41ms 121.12ms -295us 0.998x PASS
file_writes oltp_delete_insert 160.19ms 138.46ms -21.73ms 0.864x PASS
file_writes oltp_write_only 152.16ms 148.15ms -4.01ms 0.974x PASS
file_writes types_delete_insert 86.46ms 97.97ms +11.51ms 1.133x PASS
file_writes oltp_read_write 181.25ms 144.70ms -36.54ms 0.798x PASS
ac_reads oltp_point_select 29.95ms 30.59ms +641us 1.021x PASS
ac_reads oltp_range_select 10.03ms 10.06ms +26us 1.003x PASS
ac_reads oltp_sum_range 9.95ms 9.80ms -148us 0.985x PASS
ac_reads oltp_order_range 2.29ms 2.32ms +22us 1.010x PASS
ac_reads oltp_distinct_range 3.09ms 3.04ms -48us 0.984x PASS
ac_reads oltp_index_scan 5.04ms 5.37ms +331us 1.066x PASS
ac_reads select_random_points 16.95ms 17.17ms +218us 1.013x PASS
ac_reads select_random_ranges 4.21ms 4.10ms -106us 0.975x PASS
ac_reads covering_index_scan 3.99ms 3.83ms -167us 0.958x PASS
ac_reads groupby_scan 24.14ms 24.19ms +46us 1.002x PASS
ac_reads index_join 8.07ms 7.74ms -333us 0.959x PASS
ac_reads index_join_scan 5.01ms 5.01ms -1us 1.000x PASS
ac_reads types_table_scan 827.73ms 827.48ms -251us 1.000x PASS
ac_reads table_scan 918.31ms 919.10ms +787us 1.001x PASS
ac_reads oltp_read_only 95.60ms 94.65ms -947us 0.990x PASS
ac_writes oltp_bulk_insert_ac 1.25s 1.10s -156.13ms 0.875x PASS
ac_writes oltp_insert_ac 915.81ms 986.64ms +70.84ms 1.077x PASS
ac_writes oltp_update_index_ac 741.30ms 949.54ms +208.23ms 1.281x PASS
ac_writes oltp_update_non_index_ac 785.41ms 1.12s +339.02ms 1.432x PASS
ac_writes oltp_delete_insert_ac 850.85ms 1.19s +338.95ms 1.398x PASS
ac_writes oltp_write_only_ac 820.12ms 655.81ms -164.32ms 0.800x PASS
ac_writes types_delete_insert_ac 904.95ms 729.43ms -175.52ms 0.806x PASS
ac_writes oltp_read_write_ac 1.17s 835.68ms -333.09ms 0.715x PASS
compositepk details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 37.46ms 37.42ms -47us 0.999x PASS
mem_reads oltp_range_select 20.51ms 20.40ms -113us 0.994x PASS
mem_reads oltp_sum_range 19.55ms 19.63ms +78us 1.004x PASS
mem_reads oltp_order_range 3.84ms 3.84ms -5us 0.999x PASS
mem_reads oltp_distinct_range 4.97ms 4.98ms +2us 1.000x PASS
mem_reads oltp_index_scan 5.81ms 5.61ms -197us 0.966x PASS
mem_reads select_random_points 30.44ms 30.32ms -128us 0.996x PASS
mem_reads select_random_ranges 8.20ms 8.17ms -31us 0.996x PASS
mem_reads covering_index_scan 4.38ms 4.18ms -194us 0.956x PASS
mem_reads groupby_scan 41.11ms 41.05ms -53us 0.999x PASS
mem_reads index_join 10.12ms 9.78ms -338us 0.967x PASS
mem_reads index_join_scan 5.52ms 5.54ms +20us 1.004x PASS
mem_reads types_table_scan 1.24s 1.24s -1.15ms 0.999x PASS
mem_reads table_scan 1.37s 1.38s +6.98ms 1.005x PASS
mem_reads oltp_read_only 164.43ms 160.90ms -3.53ms 0.979x PASS
mem_writes oltp_bulk_insert 338.24ms 336.57ms -1.67ms 0.995x PASS
mem_writes oltp_insert 35.11ms 35.17ms +55us 1.002x PASS
mem_writes oltp_update_index 122.33ms 124.94ms +2.61ms 1.021x PASS
mem_writes oltp_update_non_index 77.07ms 76.31ms -769us 0.990x PASS
mem_writes oltp_delete_insert 96.71ms 96.95ms +237us 1.002x PASS
mem_writes oltp_write_only 59.22ms 57.89ms -1.33ms 0.978x PASS
mem_writes types_delete_insert 52.81ms 51.90ms -905us 0.983x PASS
mem_writes oltp_read_write 154.47ms 152.83ms -1.64ms 0.989x PASS
file_reads oltp_point_select 60.06ms 59.40ms -663us 0.989x PASS
file_reads oltp_range_select 22.80ms 22.58ms -213us 0.991x PASS
file_reads oltp_sum_range 21.81ms 21.93ms +119us 1.005x PASS
file_reads oltp_order_range 4.13ms 4.11ms -21us 0.995x PASS
file_reads oltp_distinct_range 5.33ms 5.26ms -66us 0.988x PASS
file_reads oltp_index_scan 8.40ms 8.31ms -86us 0.990x PASS
file_reads select_random_points 33.08ms 33.12ms +47us 1.001x PASS
file_reads select_random_ranges 10.61ms 10.54ms -70us 0.993x PASS
file_reads covering_index_scan 6.57ms 6.58ms +12us 1.002x PASS
file_reads groupby_scan 41.33ms 41.29ms -36us 0.999x PASS
file_reads index_join 11.75ms 11.69ms -62us 0.995x PASS
file_reads index_join_scan 5.93ms 5.89ms -39us 0.993x PASS
file_reads types_table_scan 1.23s 1.24s +9.75ms 1.008x PASS
file_reads table_scan 1.38s 1.38s +3.19ms 1.002x PASS
file_reads oltp_read_only 196.19ms 192.98ms -3.22ms 0.984x PASS
file_writes oltp_bulk_insert 347.52ms 346.95ms -570us 0.998x PASS
file_writes oltp_insert 40.04ms 40.86ms +815us 1.020x PASS
file_writes oltp_update_index 137.45ms 135.31ms -2.14ms 0.984x PASS
file_writes oltp_update_non_index 90.75ms 89.94ms -815us 0.991x PASS
file_writes oltp_delete_insert 107.95ms 109.27ms +1.32ms 1.012x PASS
file_writes oltp_write_only 68.32ms 68.14ms -184us 0.997x PASS
file_writes types_delete_insert 58.20ms 57.31ms -889us 0.985x PASS
file_writes oltp_read_write 164.25ms 160.88ms -3.37ms 0.979x PASS
ac_reads oltp_point_select 60.54ms 58.99ms -1.56ms 0.974x PASS
ac_reads oltp_range_select 22.73ms 22.59ms -142us 0.994x PASS
ac_reads oltp_sum_range 21.93ms 21.69ms -242us 0.989x PASS
ac_reads oltp_order_range 4.14ms 4.13ms -10us 0.998x PASS
ac_reads oltp_distinct_range 5.38ms 5.26ms -122us 0.977x PASS
ac_reads oltp_index_scan 8.26ms 8.33ms +70us 1.008x PASS
ac_reads select_random_points 32.93ms 33.07ms +138us 1.004x PASS
ac_reads select_random_ranges 10.62ms 10.61ms -14us 0.999x PASS
ac_reads covering_index_scan 6.85ms 6.73ms -125us 0.982x PASS
ac_reads groupby_scan 41.41ms 41.36ms -53us 0.999x PASS
ac_reads index_join 11.99ms 11.98ms -9us 0.999x PASS
ac_reads index_join_scan 5.92ms 5.98ms +60us 1.010x PASS
ac_reads types_table_scan 1.23s 1.23s +2.96ms 1.002x PASS
ac_reads table_scan 1.37s 1.38s +2.43ms 1.002x PASS
ac_reads oltp_read_only 195.19ms 193.81ms -1.38ms 0.993x PASS
ac_writes oltp_bulk_insert_ac 55.98ms 54.89ms -1.08ms 0.981x PASS
ac_writes oltp_insert_ac 74.53ms 73.92ms -615us 0.992x PASS
ac_writes oltp_update_index_ac 84.22ms 84.48ms +264us 1.003x PASS
ac_writes oltp_update_non_index_ac 65.66ms 65.33ms -332us 0.995x PASS
ac_writes oltp_delete_insert_ac 76.23ms 74.49ms -1.75ms 0.977x PASS
ac_writes oltp_write_only_ac 75.35ms 76.45ms +1.10ms 1.015x PASS
ac_writes types_delete_insert_ac 63.67ms 64.11ms +434us 1.007x PASS
ac_writes oltp_read_write_ac 82.48ms 83.21ms +730us 1.009x PASS
int details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 29.11ms 29.07ms -43us 0.999x PASS
mem_reads oltp_range_select 10.84ms 10.75ms -87us 0.992x PASS
mem_reads oltp_sum_range 10.78ms 10.79ms +13us 1.001x PASS
mem_reads oltp_order_range 2.79ms 2.86ms +73us 1.026x PASS
mem_reads oltp_distinct_range 4.02ms 3.90ms -123us 0.969x PASS
mem_reads oltp_index_scan 5.17ms 5.23ms +64us 1.012x PASS
mem_reads select_random_points 10.86ms 10.88ms +23us 1.002x PASS
mem_reads select_random_ranges 3.93ms 3.96ms +33us 1.008x PASS
mem_reads covering_index_scan 4.32ms 4.32ms -3us 0.999x PASS
mem_reads groupby_scan 33.01ms 34.42ms +1.41ms 1.043x PASS
mem_reads index_join 8.02ms 7.96ms -64us 0.992x PASS
mem_reads index_join_scan 4.42ms 4.41ms -10us 0.998x PASS
mem_reads types_table_scan 1.12s 1.13s +2.14ms 1.002x PASS
mem_reads table_scan 1.24s 1.25s +9.55ms 1.008x PASS
mem_reads oltp_read_only 118.81ms 121.47ms +2.66ms 1.022x PASS
mem_writes oltp_bulk_insert 247.64ms 252.37ms +4.73ms 1.019x PASS
mem_writes oltp_insert 27.48ms 27.55ms +73us 1.003x PASS
mem_writes oltp_update_index 94.39ms 96.66ms +2.27ms 1.024x PASS
mem_writes oltp_update_non_index 55.77ms 55.01ms -760us 0.986x PASS
mem_writes oltp_delete_insert 76.80ms 76.55ms -252us 0.997x PASS
mem_writes oltp_write_only 46.73ms 47.88ms +1.15ms 1.025x PASS
mem_writes types_delete_insert 36.77ms 37.56ms +794us 1.022x PASS
mem_writes oltp_read_write 111.71ms 112.48ms +767us 1.007x PASS
file_reads oltp_point_select 48.77ms 48.62ms -145us 0.997x PASS
file_reads oltp_range_select 12.96ms 12.96ms -4us 1.000x PASS
file_reads oltp_sum_range 13.15ms 12.97ms -179us 0.986x PASS
file_reads oltp_order_range 3.06ms 3.08ms +28us 1.009x PASS
file_reads oltp_distinct_range 4.16ms 4.18ms +22us 1.005x PASS
file_reads oltp_index_scan 7.43ms 7.34ms -90us 0.988x PASS
file_reads select_random_points 13.14ms 12.93ms -206us 0.984x PASS
file_reads select_random_ranges 5.81ms 5.95ms +136us 1.023x PASS
file_reads covering_index_scan 6.47ms 6.48ms +12us 1.002x PASS
file_reads groupby_scan 32.60ms 33.19ms +588us 1.018x PASS
file_reads index_join 9.44ms 9.59ms +157us 1.017x PASS
file_reads index_join_scan 4.71ms 4.70ms -15us 0.997x PASS
file_reads types_table_scan 1.12s 1.12s +6.41ms 1.006x PASS
file_reads table_scan 1.24s 1.24s +7.41ms 1.006x PASS
file_reads oltp_read_only 142.78ms 143.64ms +865us 1.006x PASS
file_writes oltp_bulk_insert 255.78ms 257.10ms +1.32ms 1.005x PASS
file_writes oltp_insert 30.19ms 30.73ms +541us 1.018x PASS
file_writes oltp_update_index 97.64ms 99.71ms +2.07ms 1.021x PASS
file_writes oltp_update_non_index 63.85ms 65.33ms +1.49ms 1.023x PASS
file_writes oltp_delete_insert 81.30ms 80.35ms -948us 0.988x PASS
file_writes oltp_write_only 52.56ms 51.98ms -577us 0.989x PASS
file_writes types_delete_insert 42.22ms 41.84ms -372us 0.991x PASS
file_writes oltp_read_write 115.94ms 116.25ms +311us 1.003x PASS
ac_reads oltp_point_select 47.48ms 47.13ms -357us 0.992x PASS
ac_reads oltp_range_select 12.76ms 12.97ms +203us 1.016x PASS
ac_reads oltp_sum_range 12.99ms 12.78ms -210us 0.984x PASS
ac_reads oltp_order_range 3.10ms 3.04ms -58us 0.981x PASS
ac_reads oltp_distinct_range 4.14ms 4.26ms +125us 1.030x PASS
ac_reads oltp_index_scan 7.24ms 7.15ms -91us 0.987x PASS
ac_reads select_random_points 12.79ms 13.13ms +339us 1.027x PASS
ac_reads select_random_ranges 5.88ms 5.87ms -5us 0.999x PASS
ac_reads covering_index_scan 6.23ms 6.32ms +86us 1.014x PASS
ac_reads groupby_scan 33.01ms 32.86ms -148us 0.996x PASS
ac_reads index_join 9.23ms 9.36ms +132us 1.014x PASS
ac_reads index_join_scan 4.71ms 4.70ms -8us 0.998x PASS
ac_reads types_table_scan 1.11s 1.11s +3.62ms 1.003x PASS
ac_reads table_scan 1.22s 1.22s +1.38ms 1.001x PASS
ac_reads oltp_read_only 142.91ms 142.36ms -545us 0.996x PASS
ac_writes oltp_bulk_insert_ac 76.28ms 76.33ms +52us 1.001x PASS
ac_writes oltp_insert_ac 87.02ms 92.70ms +5.68ms 1.065x PASS
ac_writes oltp_update_index_ac 102.09ms 101.22ms -867us 0.992x PASS
ac_writes oltp_update_non_index_ac 86.34ms 85.61ms -733us 0.992x PASS
ac_writes oltp_delete_insert_ac 94.90ms 93.58ms -1.31ms 0.986x PASS
ac_writes oltp_write_only_ac 92.97ms 94.46ms +1.50ms 1.016x PASS
ac_writes types_delete_insert_ac 82.83ms 85.10ms +2.27ms 1.027x PASS
ac_writes oltp_read_write_ac 99.47ms 99.04ms -433us 0.996x PASS
textpk details
Section Test Baseline Candidate Delta Ratio Result
mem_reads oltp_point_select 36.95ms 37.14ms +189us 1.005x PASS
mem_reads oltp_range_select 13.45ms 13.54ms +86us 1.006x PASS
mem_reads oltp_sum_range 13.56ms 13.53ms -31us 0.998x PASS
mem_reads oltp_order_range 3.33ms 3.19ms -133us 0.960x PASS
mem_reads oltp_distinct_range 4.28ms 4.35ms +73us 1.017x PASS
mem_reads oltp_index_scan 5.89ms 5.90ms +11us 1.002x PASS
mem_reads select_random_points 20.77ms 20.61ms -159us 0.992x PASS
mem_reads select_random_ranges 5.13ms 5.21ms +75us 1.015x PASS
mem_reads covering_index_scan 4.43ms 4.45ms +23us 1.005x PASS
mem_reads groupby_scan 35.74ms 35.61ms -127us 0.996x PASS
mem_reads index_join 8.88ms 8.79ms -85us 0.990x PASS
mem_reads index_join_scan 5.24ms 5.16ms -75us 0.986x PASS
mem_reads types_table_scan 1.17s 1.17s -2.25ms 0.998x PASS
mem_reads table_scan 1.27s 1.27s +4.24ms 1.003x PASS
mem_reads oltp_read_only 136.88ms 135.40ms -1.49ms 0.989x PASS
mem_writes oltp_bulk_insert 362.16ms 363.93ms +1.77ms 1.005x PASS
mem_writes oltp_insert 38.45ms 38.34ms -112us 0.997x PASS
mem_writes oltp_update_index 133.86ms 133.32ms -536us 0.996x PASS
mem_writes oltp_update_non_index 78.39ms 78.26ms -133us 0.998x PASS
mem_writes oltp_delete_insert 103.09ms 103.58ms +493us 1.005x PASS
mem_writes oltp_write_only 59.63ms 59.76ms +121us 1.002x PASS
mem_writes types_delete_insert 53.50ms 52.97ms -536us 0.990x PASS
mem_writes oltp_read_write 140.92ms 143.04ms +2.12ms 1.015x PASS
file_reads oltp_point_select 56.48ms 56.95ms +469us 1.008x PASS
file_reads oltp_range_select 15.58ms 15.74ms +161us 1.010x PASS
file_reads oltp_sum_range 15.77ms 15.83ms +57us 1.004x PASS
file_reads oltp_order_range 3.64ms 3.61ms -28us 0.992x PASS
file_reads oltp_distinct_range 4.65ms 4.67ms +16us 1.003x PASS
file_reads oltp_index_scan 8.36ms 8.27ms -94us 0.989x PASS
file_reads select_random_points 23.92ms 23.36ms -555us 0.977x PASS
file_reads select_random_ranges 7.23ms 7.29ms +67us 1.009x PASS
file_reads covering_index_scan 6.82ms 6.74ms -74us 0.989x PASS
file_reads groupby_scan 34.72ms 34.74ms +28us 1.001x PASS
file_reads index_join 10.75ms 10.56ms -196us 0.982x PASS
file_reads index_join_scan 5.70ms 5.58ms -120us 0.979x PASS
file_reads types_table_scan 1.17s 1.16s -4.74ms 0.996x PASS
file_reads table_scan 1.28s 1.27s -4.27ms 0.997x PASS
file_reads oltp_read_only 166.10ms 164.84ms -1.26ms 0.992x PASS
file_writes oltp_bulk_insert 379.29ms 377.22ms -2.06ms 0.995x PASS
file_writes oltp_insert 46.24ms 45.67ms -570us 0.988x PASS
file_writes oltp_update_index 153.28ms 152.18ms -1.10ms 0.993x PASS
file_writes oltp_update_non_index 93.34ms 92.97ms -371us 0.996x PASS
file_writes oltp_delete_insert 118.21ms 117.76ms -453us 0.996x PASS
file_writes oltp_write_only 71.30ms 71.28ms -20us 1.000x PASS
file_writes types_delete_insert 62.37ms 61.51ms -860us 0.986x PASS
file_writes oltp_read_write 152.75ms 152.48ms -271us 0.998x PASS
ac_reads oltp_point_select 57.12ms 57.30ms +187us 1.003x PASS
ac_reads oltp_range_select 15.60ms 15.49ms -111us 0.993x PASS
ac_reads oltp_sum_range 16.13ms 15.66ms -466us 0.971x PASS
ac_reads oltp_order_range 3.53ms 3.47ms -65us 0.982x PASS
ac_reads oltp_distinct_range 4.62ms 4.62ms -4us 0.999x PASS
ac_reads oltp_index_scan 8.30ms 8.18ms -121us 0.985x PASS
ac_reads select_random_points 23.99ms 23.88ms -110us 0.995x PASS
ac_reads select_random_ranges 7.30ms 7.20ms -98us 0.987x PASS
ac_reads covering_index_scan 6.75ms 6.65ms -99us 0.985x PASS
ac_reads groupby_scan 36.68ms 34.83ms -1.86ms 0.949x PASS
ac_reads index_join 11.26ms 10.67ms -593us 0.947x PASS
ac_reads index_join_scan 5.95ms 5.62ms -329us 0.945x PASS
ac_reads types_table_scan 1.16s 1.16s -461us 1.000x PASS
ac_reads table_scan 1.27s 1.27s -1.55ms 0.999x PASS
ac_reads oltp_read_only 165.88ms 165.73ms -149us 0.999x PASS
ac_writes oltp_bulk_insert_ac 78.10ms 77.97ms -125us 0.998x PASS
ac_writes oltp_insert_ac 88.81ms 85.47ms -3.35ms 0.962x PASS
ac_writes oltp_update_index_ac 98.94ms 102.37ms +3.42ms 1.035x PASS
ac_writes oltp_update_non_index_ac 82.94ms 82.32ms -617us 0.993x PASS
ac_writes oltp_delete_insert_ac 91.34ms 91.22ms -129us 0.999x PASS
ac_writes oltp_write_only_ac 92.05ms 93.63ms +1.58ms 1.017x PASS
ac_writes types_delete_insert_ac 83.70ms 84.46ms +757us 1.009x PASS
ac_writes oltp_read_write_ac 96.05ms 100.03ms +3.98ms 1.041x PASS
vc details
Section Test Baseline Candidate Delta Ratio Result
vc status_clean_many_tables 85.02ms 85.43ms +415us 1.005x PASS
vc status_dirty_many_tables 87.79ms 87.88ms +86us 1.001x PASS
vc diff_regular_working_one_table 79.38ms 79.45ms +73us 1.001x PASS
vc diff_regular_working_many_tables 93.07ms 93.34ms +270us 1.003x PASS
vc diff_stat_working_many_tables 91.96ms 92.44ms +473us 1.005x PASS
vc diff_schema_working_many_tables 92.64ms 92.27ms -368us 0.996x PASS
vc branch_list_many_branches 22.50ms 22.28ms -220us 0.990x PASS
vc branch_create_delete 25.17ms 25.42ms +251us 1.010x PASS
vc checkout_branch_clean 57.20ms 57.27ms +66us 1.001x PASS
vc merge_data_no_conflicts 29.51ms 29.15ms -357us 0.988x PASS
vc merge_schema_no_conflicts 22.20ms 21.89ms -317us 0.986x PASS
vc merge_data_conflicts 32.68ms 32.62ms -60us 0.998x PASS
vc merge_data_conflicts_with_resolve 33.25ms 33.25ms +6us 1.000x PASS

All relative performance gates passed.

@itoqa

itoqa Bot commented Sep 1, 2026

Copy link
Copy Markdown

Ito QA test results
Commit: 5e66010: 19 test cases ran, 19 passed ✅.

Summary

Coverage spans core database lifecycle and transaction flows, external package use, version-control operations, concurrent access, data type and binary-content handling, cleanup after errors, and fail-safe behavior for invalid inputs or incomplete packaging. Overall health is strong across normal workflows, edge cases, concurrency, recovery, and adversarial inputs.

Safe to merge — the run found no PR-attributable regressions or failures, and the exercised database, packaging, concurrency, transaction, and input-validation behaviors remain healthy. No merge blocker is indicated; any environment-limited checks are flag-for-later observations rather than evidence of a product defect.

Tests run by Ito

View full run

Result Severity Type Description
General Eight invalid-then-valid database attempts succeeded. Each valid attempt created a table, wrote and read one row, and closed cleanly.
General A failed insert did not block the next valid insert. The valid row was added once, and the statement could be closed cleanly.
General After a staged header was removed, rebuilding restored the complete package and the external consumer passed all smoke checks.
General Binary and text values keep their original bytes, including empty values and embedded zero bytes, when they are written and read through the Go database driver.
General Malformed SQL returned an error, missing rows returned the expected empty result, and later database queries still worked.
General Concurrent calls on one database connection are serialized, so one call cannot replace another call's parameters while it is running. The Go test could not run because the required Go toolchain was unavailable, but source review found the needed protection.
General Repeated scans returned all 500 rows while another query used the same connection. The scans ended without errors, and later queries still worked.
Driver The Go package registered the database driver, opened a temporary database, created a table, and closed cleanly.
Driver Opening a path inside a missing directory returned a clear DoltLite error, and closing the database handle completed successfully.
Lifecycle The Go database driver created a table, inserted and read a row, returned the expected column information, and closed its handles cleanly.
Package The package was assembled with all expected files, and an isolated external consumer compiled and passed the full smoke test against that staged copy.
Package Assembly rejected the missing engine files before changing the output folder, and the existing sentinel file stayed intact.
Platform The build workflow runs the Go package smoke test on Linux and macOS, skips it on Windows, and the staged consumer smoke test passes.
Rev The package was assembled with all required files, and a separate consumer built and ran successfully without downloading modules. The earlier failure was caused by a missing Go toolchain in the test environment, not by the package.
Rev An invalid branch request returned a clear error and a nonzero result. The full staged smoke test also passed its branch, checkout, commit, merge, and history checks.
Transaction A Go consumer saved committed data, discarded rolled-back data, and completed the version-control checks successfully.
Values The driver has explicit support for NULL, numbers, booleans, text, blobs, and empty values. The live Go checks could not start because the required Go toolchain and generated engine files were unavailable, so this pass is based on the source review.
Values Text and binary values keep the bytes that come after an embedded zero byte when they are saved and read back. Source review supports the expected behavior, although the Go assertions could not run in the local environment.
Values The driver rejects a value type it does not support before sending the statement to the database, so an invalid value cannot create a row.

Tip

Reply with @itoqa to send us feedback on this test run.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant