Skip to content

Expand Windows CI coverage#1664

Merged
timsehn merged 2 commits into
masterfrom
ci/expand-windows-surface
Jul 17, 2026
Merged

Expand Windows CI coverage#1664
timsehn merged 2 commits into
masterfrom
ci/expand-windows-surface

Conversation

@timsehn

@timsehn timsehn commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • add a Windows path smoke test for temp paths, paths with spaces, and MSYS Windows-style paths
  • run the plaintext HTTP remotesrv suite on Windows, including the amalgamation HTTP remote test
  • run the native C regression harness on Windows by adding the needed Windows link libraries
  • raise the build/test job timeout so the expanded Windows surface can complete

Validation

  • bash -n test/windows_path_smoke.sh test/run_doltlite_regression_case.sh test/amalgamation_http_remote_test.sh test/http_remote_content_length_test.sh test/remotesrv_http_test.sh test/remotesrv_http_concurrency_test.sh test/remotesrv_http_partial_failure_test.sh test/remotesrv_http_force_push_test.sh
  • bash test/windows_path_smoke.sh build/doltlite
  • bash test/run_doltlite_regression_case.sh chunk_store_full_pathname
  • bash test/run_doltlite_regression_case.sh all
  • cd build && bash ../test/http_remote_content_length_test.sh ./doltlite ./doltlite-remotesrv && bash ../test/remotesrv_http_test.sh ./doltlite ./doltlite-remotesrv && bash ../test/remotesrv_http_concurrency_test.sh ./doltlite ./doltlite-remotesrv && bash ../test/remotesrv_http_partial_failure_test.sh ./doltlite ./doltlite-remotesrv && bash ../test/remotesrv_http_force_push_test.sh ./doltlite ./doltlite-remotesrv
  • cd build && make DOLTLITE_PROLLY=1 DOLTLITE_PROLLY_CHECK=1 sqlite3.c sqlite3.h && REMOTESRV=./doltlite-remotesrv bash ../test/amalgamation_http_remote_test.sh .
  • git diff --check

@github-actions

Copy link
Copy Markdown

Version-Control Performance Ceilings

Runs: median of 3 executions per benchmark, excluding fixture setup. The
working-set fixtures use 800 committed tables with 125 rows each
(100000 rows total); data-dirty cases update 1 row in 40
tables, and schema-dirty cases update 1 row plus add a column in 20 tables.
Branch tests use 300 branches, checkout uses a clean 400-table
branch switch over 100000 rows, and merge
tests use 100000-row tables with 2000 changed or conflicting
rows per side.

Benchmark Median ms Ceiling ms Result
status_clean_many_tables 84 200 PASS
status_dirty_many_tables 88 200 PASS
diff_regular_working_one_table 80 150 PASS
diff_regular_working_many_tables 93 200 PASS
diff_stat_working_many_tables 92 200 PASS
diff_schema_working_many_tables 93 200 PASS
branch_list_many_branches 23 100 PASS
branch_create_delete 26 100 PASS
checkout_branch_clean 58 200 PASS
merge_data_no_conflicts 31 150 PASS
merge_schema_no_conflicts 24 100 PASS
merge_data_conflicts 128 250 PASS
merge_data_conflicts_with_resolve 128 250 PASS

@github-actions

Copy link
Copy Markdown

Sysbench-Style Benchmark (BLOB PK): Doltlite vs SQLite

Companion to the classic Sysbench-Style Benchmark. Every workload here
runs against tables with a 16-byte big-endian BLOB PRIMARY KEY.

Individual ratios gated at 2.5×; section averages gated at 2×. Autocommit writes use 6× / 5×.

In-Memory

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 31,434 37,008 1.18
oltp_range_select 13,566 14,271 1.05
oltp_sum_range 12,390 14,078 1.14
oltp_order_range 2,932 3,155 1.08
oltp_distinct_range 3,924 4,233 1.08
oltp_index_scan 4,448 6,071 1.36
select_random_points 18,502 20,346 1.10
select_random_ranges 4,004 5,158 1.29
covering_index_scan 4,317 4,489 1.04
groupby_scan 31,429 35,094 1.12
index_join 6,688 8,881 1.33
index_join_scan 4,154 5,243 1.26
types_table_scan 1,040,201 1,222,841 1.18
table_scan 1,191,377 1,316,887 1.11
oltp_read_only 118,123 136,931 1.16
Average 1.16

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 242,102 357,255 1.48
oltp_insert 19,796 39,062 1.97
oltp_update_index 68,620 129,385 1.89
oltp_update_non_index 49,096 84,926 1.73
oltp_delete_insert 49,845 102,149 2.05
oltp_write_only 28,179 61,338 2.18
types_delete_insert 33,616 54,240 1.61
oltp_read_write 88,860 138,827 1.56
Average 1.81

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 100,637 61,664 0.61
oltp_range_select 21,457 16,742 0.78
oltp_sum_range 20,453 16,601 0.81
oltp_order_range 3,706 3,452 0.93
oltp_distinct_range 4,777 4,729 0.99
oltp_index_scan 11,845 8,815 0.74
select_random_points 26,910 23,973 0.89
select_random_ranges 11,253 7,643 0.68
covering_index_scan 12,293 7,226 0.59
groupby_scan 32,785 35,554 1.08
index_join 11,276 11,154 0.99
index_join_scan 5,206 5,726 1.10
types_table_scan 1,038,715 1,220,078 1.17
table_scan 1,199,663 1,317,437 1.10
oltp_read_only 223,693 174,031 0.78
Average 0.88

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 255,083 381,380 1.50
oltp_insert 32,100 51,562 1.61
oltp_update_index 100,701 160,323 1.59
oltp_update_non_index 78,882 106,348 1.35
oltp_delete_insert 79,541 129,653 1.63
oltp_write_only 55,486 82,597 1.49
types_delete_insert 52,513 71,808 1.37
oltp_read_write 115,429 158,682 1.37
Average 1.49

File-Backed (autocommit)

Each statement runs as its own transaction — exposes per-commit
fixed costs that the wrapped-in-BEGIN/COMMIT tests amortize away.
SQLite uses WAL mode with synchronous=FULL in this section so
the comparison uses SQLite's durable WAL autocommit path.

Reads

Reads have no commit cost; these are the same SQL files as the
File-Backed Reads section, included here for symmetry and to
catch any per-statement overhead doltlite pays on the read path.

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 54,602 61,184 1.12
oltp_range_select 16,277 16,939 1.04
oltp_sum_range 15,231 16,912 1.11
oltp_order_range 3,212 3,505 1.09
oltp_distinct_range 4,332 4,692 1.08
oltp_index_scan 6,980 8,827 1.26
select_random_points 22,208 24,107 1.09
select_random_ranges 6,666 7,712 1.16
covering_index_scan 7,087 7,194 1.02
groupby_scan 32,031 35,406 1.11
index_join 8,485 11,119 1.31
index_join_scan 4,807 5,740 1.19
types_table_scan 1,035,322 1,216,658 1.18
table_scan 1,210,181 1,311,364 1.08
oltp_read_only 155,425 172,504 1.11
Average 1.13

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 21,682 77,484 3.57
oltp_insert_ac 23,969 99,035 4.13
oltp_update_index_ac 25,813 108,931 4.22
oltp_update_non_index_ac 22,502 89,131 3.96
oltp_delete_insert_ac 23,682 102,164 4.31
oltp_write_only_ac 23,868 100,191 4.20
types_delete_insert_ac 20,698 89,404 4.32
oltp_read_write_ac 30,932 110,834 3.58
Average 4.04

100000 rows, median of 5 invocations per test; autocommit writes use 9, workload-only timing via host monotonic clock when available.

Performance Ceiling Check (2.5x individual, 2x average; autocommit writes: 6x / 5x)

All tests within ceilings.

@github-actions

Copy link
Copy Markdown

Sysbench-Style Benchmark (composite PK): Doltlite vs SQLite

Companion to the classic Sysbench-Style Benchmark. Every workload here
runs against tables with a 2-column INTEGER PRIMARY KEY(a, b) WITHOUT ROWID.

Individual ratios gated at 2.5×; section averages gated at 2×. Autocommit writes use 6× / 5×.

In-Memory

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 35,649 41,774 1.17
oltp_range_select 19,282 22,242 1.15
oltp_sum_range 18,420 21,821 1.18
oltp_order_range 3,610 3,942 1.09
oltp_distinct_range 4,662 5,109 1.10
oltp_index_scan 4,825 6,612 1.37
select_random_points 28,983 33,092 1.14
select_random_ranges 7,831 9,265 1.18
covering_index_scan 4,346 4,692 1.08
groupby_scan 36,656 40,982 1.12
index_join 8,263 11,372 1.38
index_join_scan 4,249 5,777 1.36
types_table_scan 1,149,293 1,268,314 1.10
table_scan 1,385,790 1,366,640 0.99
oltp_read_only 155,647 175,597 1.13
Average 1.17

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 246,288 364,526 1.48
oltp_insert 19,174 37,273 1.94
oltp_update_index 70,649 121,020 1.71
oltp_update_non_index 51,783 85,388 1.65
oltp_delete_insert 51,764 98,426 1.90
oltp_write_only 28,301 60,139 2.12
types_delete_insert 32,879 55,734 1.70
oltp_read_write 109,802 161,006 1.47
Average 1.75

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 105,395 66,259 0.63
oltp_range_select 27,195 25,056 0.92
oltp_sum_range 25,935 24,422 0.94
oltp_order_range 4,400 4,296 0.98
oltp_distinct_range 5,464 5,512 1.01
oltp_index_scan 11,757 9,085 0.77
select_random_points 37,307 36,444 0.98
select_random_ranges 15,417 12,038 0.78
covering_index_scan 11,482 7,230 0.63
groupby_scan 36,771 41,229 1.12
index_join 12,305 13,149 1.07
index_join_scan 5,219 6,109 1.17
types_table_scan 1,063,584 1,244,936 1.17
table_scan 1,331,605 1,346,079 1.01
oltp_read_only 255,621 213,360 0.83
Average 0.93

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 259,787 381,888 1.47
oltp_insert 26,342 47,270 1.79
oltp_update_index 99,253 144,920 1.46
oltp_update_non_index 80,481 106,479 1.32
oltp_delete_insert 77,836 120,918 1.55
oltp_write_only 52,194 78,389 1.50
types_delete_insert 49,818 71,262 1.43
oltp_read_write 129,346 177,578 1.37
Average 1.49

File-Backed (autocommit)

Each statement runs as its own transaction — exposes per-commit
fixed costs that the wrapped-in-BEGIN/COMMIT tests amortize away.
SQLite uses WAL mode with synchronous=FULL in this section so
the comparison uses SQLite's durable WAL autocommit path.

Reads

Reads have no commit cost; these are the same SQL files as the
File-Backed Reads section, included here for symmetry and to
catch any per-statement overhead doltlite pays on the read path.

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 56,426 65,066 1.15
oltp_range_select 21,670 24,836 1.15
oltp_sum_range 20,945 24,386 1.16
oltp_order_range 3,973 4,333 1.09
oltp_distinct_range 4,959 5,426 1.09
oltp_index_scan 7,341 9,227 1.26
select_random_points 31,741 36,783 1.16
select_random_ranges 10,461 11,925 1.14
covering_index_scan 6,953 7,175 1.03
groupby_scan 35,769 41,147 1.15
index_join 9,904 13,027 1.32
index_join_scan 4,606 5,850 1.27
types_table_scan 1,062,709 1,237,273 1.16
table_scan 1,252,422 1,334,073 1.07
oltp_read_only 188,773 212,505 1.13
Average 1.16

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 22,081 85,791 3.89
oltp_insert_ac 27,743 105,101 3.79
oltp_update_index_ac 26,848 116,864 4.35
oltp_update_non_index_ac 23,584 93,996 3.99
oltp_delete_insert_ac 24,697 103,860 4.21
oltp_write_only_ac 24,560 105,848 4.31
types_delete_insert_ac 22,737 97,292 4.28
oltp_read_write_ac 32,586 115,446 3.54
Average 4.04

100000 rows, median of 5 invocations per test; autocommit writes use 9, workload-only timing via host monotonic clock when available.

Performance Ceiling Check (2.5x individual, 2x average; autocommit writes: 6x / 5x)

All tests within ceilings.

@github-actions

github-actions Bot commented Jul 17, 2026

Copy link
Copy Markdown

Sysbench-Style Benchmark: Doltlite vs SQLite

In-Memory

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 25,903 27,868 1.08
oltp_range_select 11,525 12,250 1.06
oltp_sum_range 10,022 11,857 1.18
oltp_order_range 2,689 3,037 1.13
oltp_distinct_range 3,701 4,122 1.11
oltp_index_scan 3,972 5,263 1.33
select_random_points 11,203 11,696 1.04
select_random_ranges 3,169 4,058 1.28
covering_index_scan 4,322 4,325 1.00
groupby_scan 31,904 36,620 1.15
index_join 5,968 8,232 1.38
index_join_scan 3,550 4,885 1.38
types_table_scan 1,132,641 1,261,144 1.11
table_scan 1,322,119 1,396,299 1.06
oltp_read_only 109,087 121,480 1.11
Average 1.16

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 181,496 252,557 1.39
oltp_insert 15,887 28,710 1.81
oltp_update_index 52,392 92,299 1.76
oltp_update_non_index 36,691 60,127 1.64
oltp_delete_insert 45,811 71,461 1.56
oltp_write_only 22,681 47,952 2.11
types_delete_insert 25,752 41,259 1.60
oltp_read_write 69,711 108,823 1.56
Average 1.68

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 105,879 56,478 0.53
oltp_range_select 19,955 15,092 0.76
oltp_sum_range 18,414 14,866 0.81
oltp_order_range 3,602 3,368 0.94
oltp_distinct_range 4,587 4,551 0.99
oltp_index_scan 12,695 8,411 0.66
select_random_points 20,221 14,798 0.73
select_random_ranges 11,490 6,985 0.61
covering_index_scan 13,004 7,442 0.57
groupby_scan 33,147 37,091 1.12
index_join 10,707 10,286 0.96
index_join_scan 4,678 5,407 1.16
types_table_scan 1,184,554 1,278,523 1.08
table_scan 1,418,337 1,397,702 0.99
oltp_read_only 225,963 161,165 0.71
Average 0.84

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 197,255 271,416 1.38
oltp_insert 21,727 36,434 1.68
oltp_update_index 79,203 119,060 1.50
oltp_update_non_index 59,431 84,366 1.42
oltp_delete_insert 68,243 95,517 1.40
oltp_write_only 43,427 66,332 1.53
types_delete_insert 40,752 54,185 1.33
oltp_read_write 88,445 124,946 1.41
Average 1.46

File-Backed (autocommit)

Each statement runs as its own transaction — exposes per-commit
fixed costs that the wrapped-in-BEGIN/COMMIT tests amortize away.
SQLite uses WAL mode with synchronous=FULL in this section so
the comparison uses SQLite's durable WAL autocommit path.

Reads

Reads have no commit cost; these are the same SQL files as the
File-Backed Reads section, included here for symmetry and to
catch any per-statement overhead doltlite pays on the read path.

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 52,171 56,676 1.09
oltp_range_select 14,305 14,978 1.05
oltp_sum_range 12,988 14,726 1.13
oltp_order_range 3,133 3,337 1.07
oltp_distinct_range 4,091 4,456 1.09
oltp_index_scan 6,909 8,190 1.19
select_random_points 14,327 14,243 0.99
select_random_ranges 5,938 6,934 1.17
covering_index_scan 7,317 7,389 1.01
groupby_scan 32,247 36,813 1.14
index_join 7,554 10,069 1.33
index_join_scan 3,935 5,295 1.35
types_table_scan 1,134,443 1,276,258 1.13
table_scan 1,421,889 1,405,111 0.99
oltp_read_only 150,440 163,493 1.09
Average 1.12

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 16,518 63,975 3.87
oltp_insert_ac 18,658 91,243 4.89
oltp_update_index_ac 20,859 104,539 5.01
oltp_update_non_index_ac 17,588 73,276 4.17
oltp_delete_insert_ac 18,620 89,075 4.78
oltp_write_only_ac 18,620 88,067 4.73
types_delete_insert_ac 17,368 80,792 4.65
oltp_read_write_ac 24,398 97,210 3.98
Average 4.51

100000 rows, median of 5 invocations per test; autocommit writes use 9, workload-only timing via host monotonic clock when available.

Performance Ceiling Check (2.5x individual, 2x average; autocommit writes: 6x / 5x)

All tests within ceilings.

@github-actions

Copy link
Copy Markdown

Sysbench-Style Benchmark (TEXT PK): Doltlite vs SQLite

Companion to the classic Sysbench-Style Benchmark. Every workload here
runs against tables with a 32-char hex TEXT PRIMARY KEY (UUID-shaped).

Individual ratios gated at 2.5×; section averages gated at 2×. Autocommit writes use 6× / 5×.

In-Memory

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 25,189 29,182 1.16
oltp_range_select 11,533 12,381 1.07
oltp_sum_range 10,933 11,835 1.08
oltp_order_range 2,721 2,883 1.06
oltp_distinct_range 3,604 3,833 1.06
oltp_index_scan 3,863 5,039 1.30
select_random_points 15,886 18,980 1.19
select_random_ranges 3,323 4,532 1.36
covering_index_scan 3,694 3,565 0.97
groupby_scan 30,737 31,955 1.04
index_join 6,546 8,181 1.25
index_join_scan 4,132 5,214 1.26
types_table_scan 1,013,427 1,124,411 1.11
table_scan 1,200,644 1,229,660 1.02
oltp_read_only 100,634 115,210 1.14
Average 1.14

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 176,511 269,027 1.52
oltp_insert 17,552 30,795 1.75
oltp_update_index 60,035 110,142 1.83
oltp_update_non_index 39,975 70,583 1.77
oltp_delete_insert 42,670 84,242 1.97
oltp_write_only 24,128 49,266 2.04
types_delete_insert 26,467 43,670 1.65
oltp_read_write 68,552 108,877 1.59
Average 1.77

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 53,229 39,333 0.74
oltp_range_select 15,456 13,638 0.88
oltp_sum_range 14,567 13,173 0.90
oltp_order_range 3,222 3,112 0.97
oltp_distinct_range 4,139 4,177 1.01
oltp_index_scan 7,181 6,355 0.88
select_random_points 19,576 20,660 1.06
select_random_ranges 6,431 5,571 0.87
covering_index_scan 7,779 5,162 0.66
groupby_scan 30,980 32,133 1.04
index_join 8,382 9,670 1.15
index_join_scan 4,737 5,525 1.17
types_table_scan 1,040,981 1,150,369 1.11
table_scan 1,204,168 1,248,437 1.04
oltp_read_only 149,812 131,630 0.88
Average 0.96

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 250,975 411,923 1.64
oltp_insert 99,746 75,705 0.76
oltp_update_index 219,428 213,986 0.98
oltp_update_non_index 160,983 135,604 0.84
oltp_delete_insert 231,701 164,151 0.71
oltp_write_only 193,284 134,410 0.70
types_delete_insert 221,117 100,104 0.45
oltp_read_write 168,409 269,486 1.60
Average 0.96

File-Backed (autocommit)

Each statement runs as its own transaction — exposes per-commit
fixed costs that the wrapped-in-BEGIN/COMMIT tests amortize away.
SQLite uses WAL mode with synchronous=FULL in this section so
the comparison uses SQLite's durable WAL autocommit path.

Reads

Reads have no commit cost; these are the same SQL files as the
File-Backed Reads section, included here for symmetry and to
catch any per-statement overhead doltlite pays on the read path.

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 34,583 40,102 1.16
oltp_range_select 13,506 14,239 1.05
oltp_sum_range 13,226 13,417 1.01
oltp_order_range 3,084 3,214 1.04
oltp_distinct_range 4,008 4,163 1.04
oltp_index_scan 5,729 6,760 1.18
select_random_points 18,484 20,893 1.13
select_random_ranges 4,643 5,796 1.25
covering_index_scan 5,730 5,295 0.92
groupby_scan 31,833 32,271 1.01
index_join 7,984 9,935 1.24
index_join_scan 4,623 5,575 1.21
types_table_scan 1,048,751 1,146,585 1.09
table_scan 1,235,289 1,261,611 1.02
oltp_read_only 121,740 132,557 1.09
Average 1.10

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 670,957 439,594 0.66
oltp_insert_ac 112,369 241,553 2.15
oltp_update_index_ac 359,755 321,627 0.89
oltp_update_non_index_ac 242,391 327,446 1.35
oltp_delete_insert_ac 262,053 438,349 1.67
oltp_write_only_ac 50,098 260,063 5.19
types_delete_insert_ac 457,129 271,109 0.59
oltp_read_write_ac 235,941 463,547 1.96
Average 1.81

100000 rows, median of 5 invocations per test; autocommit writes use 9, workload-only timing via host monotonic clock when available.

Performance Ceiling Check (2.5x individual, 2x average; autocommit writes: 6x / 5x)

All tests within ceilings.

@timsehn
timsehn merged commit ccbfc6f into master Jul 17, 2026
31 of 32 checks passed
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