Skip to content

Show view and trigger schema changes in dolt_status#1653

Merged
timsehn merged 1 commit into
masterfrom
bug/status-view-trigger-1651
Jul 16, 2026
Merged

Show view and trigger schema changes in dolt_status#1653
timsehn merged 1 commit into
masterfrom
bug/status-view-trigger-1651

Conversation

@timsehn

@timsehn timsehn commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

Fixes #1651

This updates dolt_status to report dolt_schemas when view or trigger schema rows change without a corresponding table catalog entry. It handles unstaged and staged changes, create/modify/drop transitions, and filtered scans against dolt_schemas.

Tests:

  • make -C build -j$(sysctl -n hw.ncpu 2>/dev/null || nproc) DOLTLITE_PROLLY_CHECK=1 doltlite
  • bash test/vc_oracle_status_test.sh build/doltlite dolt
  • bash test/vc_oracle_schemas_test.sh build/doltlite dolt
  • bash test/vc_oracle_commit_test.sh build/doltlite dolt
  • bash test/vc_oracle_diff_test.sh build/doltlite dolt

@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 90 200 PASS
status_dirty_many_tables 93 200 PASS
diff_regular_working_one_table 86 150 PASS
diff_regular_working_many_tables 92 200 PASS
diff_stat_working_many_tables 93 200 PASS
diff_schema_working_many_tables 94 200 PASS
branch_list_many_branches 25 100 PASS
branch_create_delete 27 100 PASS
checkout_branch_clean 59 200 PASS
merge_data_no_conflicts 32 150 PASS
merge_schema_no_conflicts 23 100 PASS
merge_data_conflicts 130 250 PASS
merge_data_conflicts_with_resolve 127 250 PASS

@github-actions

Copy link
Copy Markdown

Sysbench-Style Benchmark: Doltlite vs SQLite

In-Memory

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 25,347 28,436 1.12
oltp_range_select 11,573 12,232 1.06
oltp_sum_range 10,162 11,644 1.15
oltp_order_range 2,710 2,957 1.09
oltp_distinct_range 3,748 3,962 1.06
oltp_index_scan 3,941 5,031 1.28
select_random_points 10,639 11,224 1.05
select_random_ranges 3,074 4,016 1.31
covering_index_scan 4,233 3,989 0.94
groupby_scan 31,848 34,382 1.08
index_join 5,915 7,649 1.29
index_join_scan 3,362 4,731 1.41
types_table_scan 1,108,238 1,277,695 1.15
table_scan 1,256,195 1,401,670 1.12
oltp_read_only 103,125 113,943 1.10
Average 1.15

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 184,208 244,325 1.33
oltp_insert 15,806 27,865 1.76
oltp_update_index 50,894 87,578 1.72
oltp_update_non_index 35,960 59,292 1.65
oltp_delete_insert 45,831 69,233 1.51
oltp_write_only 22,160 45,079 2.03
types_delete_insert 24,816 39,688 1.60
oltp_read_write 64,947 101,819 1.57
Average 1.65

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 106,626 55,565 0.52
oltp_range_select 19,041 14,606 0.77
oltp_sum_range 17,747 14,064 0.79
oltp_order_range 3,507 3,251 0.93
oltp_distinct_range 4,555 4,247 0.93
oltp_index_scan 12,247 8,315 0.68
select_random_points 18,970 14,435 0.76
select_random_ranges 11,335 6,920 0.61
covering_index_scan 12,881 7,417 0.58
groupby_scan 32,570 34,702 1.07
index_join 10,280 9,785 0.95
index_join_scan 4,322 5,053 1.17
types_table_scan 1,100,717 1,236,512 1.12
table_scan 1,264,211 1,562,613 1.24
oltp_read_only 220,028 155,194 0.71
Average 0.85

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 196,771 262,398 1.33
oltp_insert 22,220 35,904 1.62
oltp_update_index 77,150 115,855 1.50
oltp_update_non_index 59,314 82,697 1.39
oltp_delete_insert 68,149 92,472 1.36
oltp_write_only 42,433 64,652 1.52
types_delete_insert 39,314 53,464 1.36
oltp_read_write 85,912 122,255 1.42
Average 1.44

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 51,102 55,772 1.09
oltp_range_select 14,057 14,662 1.04
oltp_sum_range 12,672 14,268 1.13
oltp_order_range 3,037 3,282 1.08
oltp_distinct_range 4,118 4,296 1.04
oltp_index_scan 7,173 8,425 1.17
select_random_points 14,279 14,985 1.05
select_random_ranges 6,092 6,934 1.14
covering_index_scan 7,362 7,309 0.99
groupby_scan 32,263 34,745 1.08
index_join 7,545 10,287 1.36
index_join_scan 3,865 5,123 1.33
types_table_scan 1,122,368 1,239,555 1.10
table_scan 1,262,924 1,362,475 1.08
oltp_read_only 141,688 155,693 1.10
Average 1.12

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 16,122 63,839 3.96
oltp_insert_ac 18,155 81,950 4.51
oltp_update_index_ac 19,309 95,188 4.93
oltp_update_non_index_ac 17,919 72,951 4.07
oltp_delete_insert_ac 19,965 88,588 4.44
oltp_write_only_ac 19,416 82,221 4.23
types_delete_insert_ac 17,315 73,444 4.24
oltp_read_write_ac 23,175 91,278 3.94
Average 4.29

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 30,802 39,106 1.27
oltp_range_select 13,877 15,241 1.10
oltp_sum_range 13,175 14,684 1.11
oltp_order_range 3,046 3,215 1.06
oltp_distinct_range 4,052 4,272 1.05
oltp_index_scan 4,797 6,612 1.38
select_random_points 19,860 21,816 1.10
select_random_ranges 4,265 5,329 1.25
covering_index_scan 4,810 4,802 1.00
groupby_scan 32,186 34,052 1.06
index_join 7,152 9,568 1.34
index_join_scan 4,674 5,484 1.17
types_table_scan 1,181,717 1,355,962 1.15
table_scan 1,443,457 1,500,962 1.04
oltp_read_only 120,797 139,790 1.16
Average 1.15

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 232,698 357,792 1.54
oltp_insert 21,647 40,074 1.85
oltp_update_index 74,741 138,170 1.85
oltp_update_non_index 49,645 89,049 1.79
oltp_delete_insert 54,567 108,401 1.99
oltp_write_only 30,777 64,408 2.09
types_delete_insert 33,964 56,524 1.66
oltp_read_write 98,562 143,406 1.45
Average 1.78

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 99,600 63,039 0.63
oltp_range_select 23,185 17,797 0.77
oltp_sum_range 21,274 17,521 0.82
oltp_order_range 3,971 3,577 0.90
oltp_distinct_range 4,887 4,624 0.95
oltp_index_scan 12,131 9,060 0.75
select_random_points 27,996 25,543 0.91
select_random_ranges 11,300 7,745 0.69
covering_index_scan 12,613 7,332 0.58
groupby_scan 33,967 34,594 1.02
index_join 12,004 11,462 0.95
index_join_scan 5,902 6,169 1.05
types_table_scan 1,171,504 1,379,695 1.18
table_scan 1,459,716 1,513,981 1.04
oltp_read_only 235,093 178,489 0.76
Average 0.87

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 248,629 391,337 1.57
oltp_insert 48,099 52,994 1.10
oltp_update_index 121,767 171,322 1.41
oltp_update_non_index 96,461 114,340 1.19
oltp_delete_insert 90,020 135,044 1.50
oltp_write_only 100,337 86,820 0.87
types_delete_insert 55,054 76,319 1.39
oltp_read_write 162,836 167,981 1.03
Average 1.26

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,550 62,341 1.14
oltp_range_select 17,536 18,050 1.03
oltp_sum_range 15,582 17,550 1.13
oltp_order_range 3,486 3,578 1.03
oltp_distinct_range 4,454 4,647 1.04
oltp_index_scan 7,408 9,075 1.23
select_random_points 22,501 24,687 1.10
select_random_ranges 6,669 7,718 1.16
covering_index_scan 8,090 7,331 0.91
groupby_scan 32,725 34,310 1.05
index_join 10,075 11,315 1.12
index_join_scan 5,568 5,993 1.08
types_table_scan 1,166,373 1,361,929 1.17
table_scan 1,416,600 1,619,465 1.14
oltp_read_only 167,077 179,064 1.07
Average 1.09

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 23,129 82,326 3.56
oltp_insert_ac 28,639 99,075 3.46
oltp_update_index_ac 31,146 117,074 3.76
oltp_update_non_index_ac 22,862 94,525 4.13
oltp_delete_insert_ac 27,270 111,659 4.09
oltp_write_only_ac 26,335 107,720 4.09
types_delete_insert_ac 24,687 93,912 3.80
oltp_read_write_ac 33,070 117,239 3.55
Average 3.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.

@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 32,787 38,527 1.18
oltp_range_select 14,071 15,294 1.09
oltp_sum_range 12,681 14,600 1.15
oltp_order_range 3,011 3,237 1.08
oltp_distinct_range 4,062 4,297 1.06
oltp_index_scan 4,699 6,717 1.43
select_random_points 19,505 21,793 1.12
select_random_ranges 4,500 5,327 1.18
covering_index_scan 4,902 4,941 1.01
groupby_scan 32,319 34,119 1.06
index_join 7,286 10,077 1.38
index_join_scan 4,227 5,782 1.37
types_table_scan 1,203,098 1,379,878 1.15
table_scan 1,450,233 1,626,221 1.12
oltp_read_only 129,852 142,264 1.10
Average 1.16

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 243,174 358,413 1.47
oltp_insert 20,882 39,310 1.88
oltp_update_index 74,993 134,433 1.79
oltp_update_non_index 50,804 85,895 1.69
oltp_delete_insert 55,135 108,427 1.97
oltp_write_only 30,725 64,405 2.10
types_delete_insert 35,406 56,772 1.60
oltp_read_write 94,403 148,001 1.57
Average 1.76

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 102,558 62,846 0.61
oltp_range_select 21,488 17,701 0.82
oltp_sum_range 19,940 17,255 0.87
oltp_order_range 3,801 3,594 0.95
oltp_distinct_range 4,949 4,616 0.93
oltp_index_scan 12,118 8,965 0.74
select_random_points 26,718 25,236 0.94
select_random_ranges 11,443 7,725 0.68
covering_index_scan 12,384 7,316 0.59
groupby_scan 33,075 34,262 1.04
index_join 11,049 11,682 1.06
index_join_scan 5,235 6,189 1.18
types_table_scan 1,201,445 1,377,015 1.15
table_scan 1,440,598 1,503,871 1.04
oltp_read_only 233,229 182,240 0.78
Average 0.89

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 260,887 379,922 1.46
oltp_insert 37,357 51,708 1.38
oltp_update_index 108,204 166,442 1.54
oltp_update_non_index 86,199 109,230 1.27
oltp_delete_insert 87,823 132,342 1.51
oltp_write_only 64,996 85,572 1.32
types_delete_insert 54,600 74,071 1.36
oltp_read_write 132,057 166,583 1.26
Average 1.39

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 55,376 62,918 1.14
oltp_range_select 16,329 17,695 1.08
oltp_sum_range 15,226 17,066 1.12
oltp_order_range 3,481 3,691 1.06
oltp_distinct_range 4,448 4,697 1.06
oltp_index_scan 7,528 9,241 1.23
select_random_points 21,883 25,408 1.16
select_random_ranges 6,846 7,924 1.16
covering_index_scan 7,792 7,405 0.95
groupby_scan 32,213 34,279 1.06
index_join 8,881 11,561 1.30
index_join_scan 4,731 5,989 1.27
types_table_scan 1,149,135 1,357,105 1.18
table_scan 1,354,169 1,478,744 1.09
oltp_read_only 160,586 178,077 1.11
Average 1.13

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 35,381 120,790 3.41
oltp_insert_ac 36,686 134,141 3.66
oltp_update_index_ac 39,994 156,441 3.91
oltp_update_non_index_ac 39,202 118,478 3.02
oltp_delete_insert_ac 34,952 134,341 3.84
oltp_write_only_ac 37,699 137,225 3.64
types_delete_insert_ac 35,336 135,163 3.83
oltp_read_write_ac 42,647 137,313 3.22
Average 3.57

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 34,340 40,524 1.18
oltp_range_select 19,471 22,180 1.14
oltp_sum_range 18,033 21,238 1.18
oltp_order_range 3,530 3,919 1.11
oltp_distinct_range 4,590 4,981 1.09
oltp_index_scan 4,731 6,087 1.29
select_random_points 28,265 32,279 1.14
select_random_ranges 7,707 9,140 1.19
covering_index_scan 4,187 4,391 1.05
groupby_scan 36,056 38,969 1.08
index_join 8,147 11,016 1.35
index_join_scan 4,143 5,709 1.38
types_table_scan 1,108,899 1,340,763 1.21
table_scan 1,323,906 1,497,328 1.13
oltp_read_only 152,338 171,820 1.13
Average 1.18

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 245,569 358,226 1.46
oltp_insert 19,206 36,771 1.91
oltp_update_index 69,600 119,839 1.72
oltp_update_non_index 52,288 83,874 1.60
oltp_delete_insert 50,730 97,268 1.92
oltp_write_only 27,902 58,914 2.11
types_delete_insert 33,164 55,554 1.68
oltp_read_write 104,984 158,102 1.51
Average 1.74

File-Backed

Reads

Test SQLite (us) Doltlite (us) Multiplier
oltp_point_select 103,521 65,769 0.64
oltp_range_select 27,007 24,503 0.91
oltp_sum_range 25,198 24,149 0.96
oltp_order_range 4,360 4,361 1.00
oltp_distinct_range 5,470 5,414 0.99
oltp_index_scan 11,753 9,150 0.78
select_random_points 38,042 36,454 0.96
select_random_ranges 15,058 11,854 0.79
covering_index_scan 11,180 7,146 0.64
groupby_scan 36,809 39,549 1.07
index_join 12,424 13,186 1.06
index_join_scan 5,086 6,089 1.20
types_table_scan 1,103,264 1,357,128 1.23
table_scan 1,360,309 1,512,298 1.11
oltp_read_only 258,549 213,265 0.82
Average 0.94

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert 258,516 381,308 1.47
oltp_insert 26,861 46,570 1.73
oltp_update_index 99,203 148,948 1.50
oltp_update_non_index 76,959 105,534 1.37
oltp_delete_insert 75,612 123,022 1.63
oltp_write_only 51,451 79,066 1.54
types_delete_insert 50,304 71,319 1.42
oltp_read_write 130,122 177,917 1.37
Average 1.50

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 57,778 65,545 1.13
oltp_range_select 22,070 24,691 1.12
oltp_sum_range 20,958 24,328 1.16
oltp_order_range 4,008 4,284 1.07
oltp_distinct_range 5,004 5,450 1.09
oltp_index_scan 7,385 9,153 1.24
select_random_points 31,082 35,600 1.15
select_random_ranges 10,349 11,881 1.15
covering_index_scan 6,745 7,049 1.05
groupby_scan 35,899 39,332 1.10
index_join 9,829 12,913 1.31
index_join_scan 4,597 6,054 1.32
types_table_scan 1,063,764 1,342,291 1.26
table_scan 1,232,471 1,473,084 1.20
oltp_read_only 182,522 208,699 1.14
Average 1.17

Writes

Test SQLite (us) Doltlite (us) Multiplier
oltp_bulk_insert_ac 22,066 79,046 3.58
oltp_insert_ac 25,405 99,948 3.93
oltp_update_index_ac 28,153 115,678 4.11
oltp_update_non_index_ac 22,833 93,472 4.09
oltp_delete_insert_ac 25,566 102,241 4.00
oltp_write_only_ac 25,996 99,750 3.84
types_delete_insert_ac 20,952 89,059 4.25
oltp_read_write_ac 32,663 107,137 3.28
Average 3.89

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 9c85bc2 into master Jul 16, 2026
27 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.

dolt_status is blind to view and trigger changes

1 participant