Changelog History
Page 1
-
v2.1.4 Changes
June 05, 2026๐ Merged PRs
dolt
- 11178: Mark
dolt_diff_$TABLENAMEto_commitandfrom_commitindexes as non-unique
Thedolt_diff_$TABLENAMEsystem table marked itsto_commitandfrom_commitindexes as unique. A single commit changes many rows, so each commit hash maps to many diff rows and these indexes are not unique.
๐ Fix #11159 - 11177: Bug fix: don't rebuild fulltext indexes unnecessarily
โก๏ธ When two sessions are making changes to a table with afulltextindex, the index was unnecessarily getting rebuilt, even when the indexed column wasn't changing in the updates. This change limits when the index is rebuilt to avoid unnecessary rebuilds.
Closed Issues
- 11159:
dolt_diff_$TABLENAME: markto_commitandfrom_commitindexes as non-unique
- 11178: Mark
-
v2.1.3 Changes
June 05, 2026๐ Merged PRs
dolt
- 11176: go/store/{val,prolly/tree}: Implement ValueContext for the places where we need a Context.
dolthub/driver directly consumes these values and has the abilityt to pass the correct Context instance. - 11172: bug fix for race condition in acquiring auto increment locks
๐ The global auto increment tracker had a race condition in Next(). In interleaved mode (the default), a necessary table-level lock was not being taken, leading to a non-atomic get-increment-set race between two concurrent sessions. This was due to the lock mode being stored in the struct itself and only set during some code paths. The fix sets the lock mode value at startup.
โ The new test reliably reproduced the race condition before this patch. 11170: fix: persist table comment on indexed table creation
SeparatePRIMARY KEYclause routes creation throughCreateIndexedTablewhich never sets schema comment.โ 11168: add test for
ALTER TABLEcomment on primary key table
๐ Fix #11164๐ 11155: support NOT VALID for foreign key and check constraints
Depends on dolthub/vitess#471 and dolthub/go-mysql-server#357311149: Implement
IndexNameGeneratorinterface
Depends on: dolthub/go-mysql-server#3571๐ 11110: go/go.mod: Bump fslock, adopt fallible fslock.New() and the requirement to Close() the *Lock instance.
11001: Store adaptive-encoded values in lexical order
In Dolt, all adaptive-encoded values are stored in an arbitrary order according to their raw bytes.funccompareAdaptiveValue(l,rAdaptiveValue)int{returnbytes.Compare(l,r) }
This isn't a problem for Dolt, because keys on columns that will be adaptively encoded post 2.0 (TEXT, BLOB) all require a key prefix length, which is used by the secondary index to order the keys correctly.
๐ But for Doltgres, it's possible to create indexes on TEXT and VARCHAR (no length) columns without a key prefix length. This means that adaptive-encoded values must be stored in a canonical order independent of whether the value is stored inline or out-of-band. Otherwise, various SQL engine optimizations, like removing the Sort operation on an index range scan, would not yield correct results in Doltgres. There are also many other known and unknown assumptions in Dolt and go-mysql-server that break if values in indexed columns are not stored in a consistent order. Additionally, enforcing a canonical order for such columns makes it possible to bring these enhancements to Dolt in the future (by relaxing MySQL's constraints on key lengths), or in new products we might build.
This PR sorts adaptive encoded values by adding a ValueStore param to theCompare()interface. It is unused except when comparing adaptive values.
๐ The downside to this change is that we must perform 1 or 2 additional disk reads for each comparison of out-of-band values. This is a large performance penalty but is unavoidable, and should (we think) happen in a small minority of cases.go-mysql-server
- 3579: make hashjoin compatible with doltgres
doltgres has different equality expressions, which prevented hashjoins from getting considered during join planning. 3578: fix: retain table comment when primary key is a separate clause
CREATE TABLE ... COMMENT='c'dropped the comment whenPRIMARY KEYwas given as a separate clause.- Add a
commentparameter toIndexedTableCreator.CreateIndexedTableand thread it through the executor.
Block #11170
- Add a
3577: fix: return ok result schema for
ALTER TABLEcomment
AlterTableCommentyields anOkResultrow but reported the table schema, so schema-driven renderers (i.e. Dolt) formatted theOkResultagainst the first column and failed.
Block #11168
๐ Fix #111643575: decompose tuple inequalities
This PR extends the tuple in filter decomposition logic to cover tuples in equallities and inequalities.3574: Ensure SchemaObjectNameValidator is used when a table is renamed
๐ 3573: support NOT VALID on foreign key and check constraints
Depends on dolthub/vitess#4713571: Add
IndexNameGeneratorinterface
๐ NewIndexNameGeneratorinterface allows databases to customize the logic that generates index names when they aren't explicitly specified.3570: improvements to time to wire format
Should useapd.Decimal.Append()and faster way to append time strings.
Benchmarks: #11130 (comment)3568: bug fix for non-found search paths
3563: Introduce
SchemaObjectNameValidatorinterface
๐ To support custom Postgresql logic for Doltgres, a new interface calledRelationNameValidatoris added.
vitess
- 471: add not valid on fkey and check constraints
- 0๏ธโฃ 470: Expand the set of function call expressions that can be used as a column default value without requiring parentheses.
๐ These forms are not valid MySQL but are accepted by MariaDB. We should also accept them in order to have better compatibility with schemas created for MariaDB.
Closed Issues
- 11176: go/store/{val,prolly/tree}: Implement ValueContext for the places where we need a Context.
-
v2.1.2 Changes
June 02, 2026๐ Merged PRs
dolt
- 11150: fix(git-remote-cache): ensure remote cache compaction and pruning occurs via new
Teardownlifecycle method
โ Adds a newTeardownlifecycle method toChunkStore(plusDoltDBandDoltDatabaseProvider) for Git remotes.Teardowndrives the expensive end-of-process cleanup โgit gcand deletion of per-sessionUUIDrefs โ that previously fired implicitly insideCloseand was therefore lost when the provider-level cache was removed.
Closeremains the cheap, deferrable per-operation hook; for the shared Git remoteNomsBlockStoreit is suppressed by a thin shim so caller defers don't tear down the shared instance. Also readds a provider-layer cache (Git remotes only) so aDoltDBis opened once per remote URL per process and reused across operations. At engine shutdown, the provider callsTeardownonce, which drains both caches, runs the GC + ref cleanup, then force-closes each shared store. 11148: Fix
dolt statusto reportAUTO_INCREMENTvalue changes
โก๏ธALTER TABLE foo AUTO_CINREMENT = Nupdated the table butdolt statuscontinued to report "nothing to commit".HasChangesIgnoringColumnTagsnow comparesGetAutoIncrementValuebetween from and to tables.
๐ Fix #11145
๐ 11147: dump-docs: emit a description: field in the generated cli.md frontmatter
๐ The dolt docs site (dolthub/docs-2) now readsdescription:from each page's frontmatter โ it powers the per-entry summary inllms.txt(the agent-readable docs index) and is wired up for OG/Twitter cards.
๐cli.mdis generated bydolt dump-docs, so anydescription:added by hand to the docs repo gets overwritten on the next regeneration. Baking it into the constant header so it survives every regen.11146: dolt status doesn't require both --use-db and --branch
โ There was a gap in testing for the status command when you specify only --use-db, but no --branch name. This resulted in getting the error "could not find current branch commit"
๐ Fixes: #11137
Closed Issues
- 11145:
dolt statusdoes not surface anauto_incrementchange - 11137:
statusrequires both--use-dband--brancharguments - ๐ 11142: Error: The current API does not support the selected model gpt-5.5
๐ Performance
โ | Read Tests | MySQL | Dolt | Multiple | | --- | --- | --- | --- | | covering_index_scan | 17.32 | 2.3 | 0.13 | | groupby_scan | 142.39 | 132.49 | 0.93 | | index_join | 3.49 | 1.93 | 0.55 | | index_join_scan | 4.25 | 1.34 | 0.32 | | index_scan | 350.33 | 211.6 | 0.6 | | oltp_point_select | 0.2 | 0.26 | 1.3 | | oltp_read_only | 3.82 | 5.09 | 1.33 | | select_random_points | 0.37 | 0.55 | 1.49 | | select_random_ranges | 0.39 | 0.64 | 1.64 | | table_scan | 350.33 | 204.11 | 0.58 | | types_table_scan | 759.88 | 458.96 | 0.6 | | reads_mean_multiplier | | | 0.86 |
โ | Write Tests | MySQL | Dolt | Multiple | | --- | --- | --- | --- | โ | oltp_delete_insert | 8.43 | 6.32 | 0.75 | | oltp_insert | 4.18 | 3.19 | 0.76 | | oltp_read_write | 9.22 | 11.45 | 1.24 | โก๏ธ | oltp_update_index | 4.41 | 3.36 | 0.76 | โก๏ธ | oltp_update_non_index | 4.18 | 3.07 | 0.73 | | oltp_write_only | 5.28 | 6.32 | 1.2 | โ | types_delete_insert | 8.58 | 6.79 | 0.79 | | writes_mean_multiplier | | | 0.89 |
โ | TPC-C TPS Tests | MySQL | Dolt | Multiple | | --- | --- | --- | --- | | tpcc-scale-factor-1 | 94.1 | 52.69 | 1.79 | | tpcc_tps_multiplier | | | 1.79 |
Overall Mean Multiple 1.18 - 11150: fix(git-remote-cache): ensure remote cache compaction and pruning occurs via new
-
v2.1.1 Changes
June 02, 2026๐ Merged PRs
dolt
- 11136: Populate
dolt_workspaceschema with current table schema when deltas are nil
๐ fixes #11127 - 11111: New
ProviderFactoryinterface
Introduces a newProviderFactoryinterface that allows Doltgres to extend database behavior.
Depends on: dolthub/go-mysql-server#3563
go-mysql-server
- 3563: Introduce
SchemaObjectNameValidatorinterface
๐ To support custom Postgresql logic for Doltgres, a new interface calledRelationNameValidatoris added. - 3562: pass schema name when retreiving function
Closed Issues
- 11127: Deieting from dolt_workspace_TABLE fails (only) when no rows exist in it with missing column error
- 10727: dolt push fails with 'uncommitted changes' when remote has ignored tables in working set
- 11131: Dolt 2.0.8: adaptive out-of-line TEXT written via migration is unreadable โ "invalid hash length: 19" on read (regression vs 2.0.4)
- 11136: Populate
-
v2.1.0 Changes
May 31, 2026๐ This is a minor version release to correct a bug discovered with
TEXTandBLOBcolumns. CertainALTER TABLEstatements run on columns created by a 1.x release could result in the data in that column becoming unreadable after the statement. Example:-- In Dolt 1.xCREATETABLEt1( idINTPRIMARY KEY, bodyTEXT);-- insert data into table-- in Dolt 2.x:ALTERTABLEt1 MODIFY body LONGTEXT;After this
ALTER TABLEstatement, the data in thebodycolumn becomes is inaccessible because of a mismatch in encoding between what's recorded in the schema and the table rows themselves. No data is lost or corrupted, but it becomes inaccessible to queries.This bug impacted
TEXTandBLOBtypes (and types in the same family, e.g.TINYTEXT). OnlyALTER TABLEstatements were impacted, and only if they usedMODIFY COLUMNorDROP COLUMN.๐ For more details, see this bug report:
๐ Releases between 2.0 and this release should be considered unsafe to use for customers with data written by any 1.x release. If you are using a previous 2.x release with data written by a 1.x release, please update to this release before running any
ALTER TABLEstatements.๐ Merged PRs
dolt
- 11132: bug fix for adaptive encoding during ALTER TABLE
ALTER TABLE statements that change a columns type to e.g. widen it from TEXT to LONGTEXT have a bug: if the column was created pre-2.0, the ALTER TABLE statement will use an adaptive encoding for the modified column without rewriting the table row data. This results in unreadable data.
To fix this, we preserve the encoding for columns during ALTER TABLE operations. - 11125: go/{store/nbs,dbfactory,env}: Add functionality to fast-fail fslock, instead of serially waiting 100ms per DB load, when we already have some ReadOnly databases in the MultiRepoEnv.
- 11109: pass schema name for function
Depends on: dolthub/go-mysql-server#3562
go-mysql-server
3567: fix for division on decimals
BenchmarkPlusHighScaleDecimals:before (decimal.Decimal) 2505679 460.8 ns/op after (apd.Decimal) 3746318 304.5 ns/op
BenchmarkMinusHighScaleDecimals:
before (decimal.Decimal) 2619691 449.0 ns/op after (apd.Decimal) 3723363 312.1 ns/opBenchmarkMultHighScaleDecimals:
before (decimal.Decimal) 2537882 454.6 ns/op after (apd.Decimal) 3608662 321.3 ns/opBenchmarkDivHighScaleDecimals:
before (decimal.Decimal) 793515 1414 ns/op before fix (apd.Decimal) 367 3112350 ns/op after fix (apd.Decimal) 946606 1246 ns/opBenchmarkDivManyDecimals:
before (decimal.Decimal) 130582 7691 ns/op before fix (apd.Decimal) 54 21534736 ns/op after fix (apd.Decimal) 110416 9347 ns/op- 3562: pass schema name when retreiving function
Closed Issues
- 11132: bug fix for adaptive encoding during ALTER TABLE
-
v2.0.8 Changes
May 29, 2026๐ Merged PRs
dolt
- 11124: integration-tests/go-sql-server-driver: no_table_files_read_test.go: Add test cases for multi-database usage.
- 11119: Do not make
dolt_difftable indexes on nil schemas
CallingMakeDiffTableIndexon a nil schema was causing a panic. This would happen if a table existed on one branch but not on the other. - 11118: enforce foreign keys when DELETING through dolt_workspace_TABLE
โก๏ธ Workspace table deletes were previously using a simple tableWriter, which went around the FK checks we make during typical updates.
Depends On: dolthub/go-mysql-server#3566
๐ Fixes: #11112 - 11117: go/store/nbs: Lazily load chunk journal database resources when constructing a NomsBlockStore.
Most Dolt commands currently construct a MultiRepoEnv and then call
into the SQL layer to perform the actual work. In turn, the SQL layer
has some logic which looks at the state of the loaded databases and
๐ sees whether the process has ended up loading some of them in ReadOnly
mode. If it has, then in some cases the Dolt process will attempt to
connect to a runningdolt sql-serverinstead of doing the work
against the database files itself.
This PR makes is to that the application code paths which inspect
๐ฆ AccessMode == ReadOnly can get that signal and make the attempt to
reach out to the server before all of the database state has to be
๐ loaded from disk. This greatly improves the performance of running
doltCLI commands against a runningdolt sql-server, from the same
directory as the server data-dir. - 11101: go/store/nbs: Clean up some manifest access patterns.
โ Removes unnecessary manifestManager and its global cache and in-process locks. - 11100: handle extended types during prollyRange construction
benchmarks: dolthub/doltgresql#2758 (comment) - 11085: add where predicate feature to index (partial index)
go-mysql-server
3567: fix for division on decimals
BenchmarkPlusHighScaleDecimals:before (decimal.Decimal) 2505679 460.8 ns/op after (apd.Decimal) 3746318 304.5 ns/op
BenchmarkMinusHighScaleDecimals:
before (decimal.Decimal) 2619691 449.0 ns/op after (apd.Decimal) 3723363 312.1 ns/opBenchmarkMultHighScaleDecimals:
before (decimal.Decimal) 2537882 454.6 ns/op after (apd.Decimal) 3608662 321.3 ns/opBenchmarkDivHighScaleDecimals:
before (decimal.Decimal) 793515 1414 ns/op before fix (apd.Decimal) 367 3112350 ns/op after fix (apd.Decimal) 946606 1246 ns/opBenchmarkDivManyDecimals:
before (decimal.Decimal) 130582 7691 ns/op before fix (apd.Decimal) 54 21534736 ns/op after fix (apd.Decimal) 110416 9347 ns/op- ๐ 3566: analyzer: export BuildForeignKeyEditor for callers outside DML analysis
Refactors the internal FK-editor builder chain (getForeignKeyEditor, getForeignKeyReferences, getForeignKeyRefActions, cache.GetUpdater, getForeignKeyHandlerFromUpdateTarget) to take *Catalog instead of *Analyzer since only a.Catalog was ever used. Adds an exported BuildForeignKeyEditor entry point so integrators can wrap a writer in a ForeignKeyEditor when their write path doesn't go through the analyzer (e.g. dolt's workspace tables). - 0๏ธโฃ 3565: Allow unparenthesized function expressions in column defaults.
0๏ธโฃ MariaDB allows the use of a function expression as a column default expressions without requiring it to be wrapped in parentheses. MySQL does not allow this.
0๏ธโฃ In order to parse scripts created for MariaDB, we should also accept unwrapped function expressions as column defaults. However, in order to ensure that dumps created by Dolt are compatible with MySQL, we normalize these expressions by wrapping them in parentheses internally. - 3561: fix(rowexec): dispose CachedResults child when closing hashLookupGeneratingIter (#3560)
## Summary
hashLookupGeneratingIter.Closereturnednilwithout closing the child iter chain or disposing the wrapped*plan.CachedResultsnode. Every executed hash join over aCachedResultssubtree could therefore leak one entry intoAnalyzer.CachedResultsManager.cachedResultsCaches, freed only by process restart.
This PR makesClose:- Dispose the
CachedResultschild if present (releases the global Manager entry). - Propagate
Closedown the rest of the child iter chain.
- Dispose the
๐ Fix
func (h *hashLookupGeneratingIter) Close(c *sql.Context) error {- return nil+ if cr, ok := h.n.Child.(\*plan.CachedResults); ok {+ cr.Dispose(c)+ }+ return h.childIter.Close(c)}Why
Full RCA, reproducer, and pprof evidence are in #3560. Headline numbers from the 3-minute, ~30 req/sec workload reported there (Dolt 2.0.6 sql-server vendoring this commit):
Metric Vanilla ฮ Patched ฮ Improvement RSS +5069 MB +44 MB ~115ร HeapAlloc (live) +4.3 GB +82 MB ~52ร HeapObjects (live) +90 million +1.5 million ~60ร Mallocs - Frees(net live)+204 million +4 million ~50ร ๐ Allocation rate is unchanged (~1.1B mallocs in 3 min both runs); the patched build services the same workload but Freeskeeps up withMallocs.โ Tests
โ
go test ./sql/rowexec/...passes locally with the patch applied.
โ I did not include a unit-level regression test in this PR. In a minimalengine.QueryโRowIterToRowstest,TrackedRowIter.Close โ done โ disposeNodealready walks the plan tree and disposes theCachedResultsviasql.Dispose(ctx, node), so the leak doesn't reproduce that way; faithfully exercising the production path (Dolt sql-server, prepared statements via the MySQL wire protocol) needs significantly more harness scaffolding. Happy to add a test if maintainers can point me at the right entry point.
Closes #3560- 3553: add partial index on WHERE predicate
- 3537: sql: opt-in SQL trace redaction
## Summary
โ Adds an opt-in redaction layer for the SQL text and identifiers that get attached to OpenTelemetry span attributes โ the planbuilder parse-span
queryattribute and the rowexectable/left/right/indexattributes. When enabled via a newsql.Contextoption, identifiers and literal values are rewritten into stable, low-entropy tokens (n1,n2, ...,v1,v2, ...) that repeat across queries of the same shape so trace storage compresses well.
๐ Use case: multi-tenant SQL servers (Dolt is one, our own dsabstraction layer is another) where tracing data flows to shared long-term storage. Operators want privacy regulation compliance and tenant isolation without giving up trace visibility entirely.
0๏ธโฃ Default off to preserve backward compatibility โ existing trace consumers readingquery,table,left,right, etc. verbatim see no change. Callers opt in withsql.WithTraceRedaction(true). ## How it works Two passes over the same SQL, deliberately combined:- Parse to AST , walk it to collect every
TableIdentandColIdentstring. The grammar is the authority on which lexemes are identifiers โ necessary because vitess treats hundreds of words (NAME,USER,DATA,STATUS, ...) as non-reserved keywords: the lexer emits a keyword token type for them, but real queries use them as bare column / table names. - Lex the SQL and emit token-by-token. Literal token types (
STRING,INTEGRAL,FLOAT,HEX,HEXNUM,BIT_LITERAL) redact as values.IDtokens redact as identifiers.COMMENTtokens drop.VALUE_ARG/LIST_ARGpass through. Any other token (keyword, punctuation, multi-char operator) emits structurally โ unless itsvalis in the identifier set from step 1, in which case it redacts as an identifier (this catches the non-reserved-keyword-as-column-name case).
Coverage is bounded by the grammar's notion of identifier (TableIdent+ColIdent) and the lexer's fixed set of literal token types โ not by an evolving list of AST node fields. Future grammar / AST shape changes are covered automatically as long as they go throughWalkand produce the same lexer token classes.
๐ This is deliberately distinct fromsqlparser.Normalize/RedactSQLQuery, which is a plan-cache primitive that parameterizes literals only, dedupes only inside SELECT, and skips long values for CPU. The redactor here treats traces as a privacy boundary: every high-cardinality token is rewritten, always dedupes, drops comments, and falls back to<unparseable>on parse failure rather than risk a partial redaction.
- Parse to AST , walk it to collect every
Examples
Before: SELECT * FROM t WHERE c1 = 'could_be_sensitive' After: SELECT * FROM `n1` WHERE `n2` = 'v1' Before: SELECT u.name, u.email FROM users AS u After: SELECT `n1` . `n2` , `n1` . `n3` FROM `n4` AS `n1`nameis a non-reserved keyword in the vitess grammar โ lexed with a keyword token type, notID. A pure lexer-driven redactor would leak it. The hybrid grammar+lex approach catches it.Before: WITH x (renamed_col) AS (SELECT a FROM t) SELEC... -
v2.0.7 Changes
May 26, 2026๐ Merged PRs
dolt
- 11097: go/go.mod: Bump fslock to pick up recent minor cleanup.
go-mysql-server
- 3561: fix(rowexec): dispose CachedResults child when closing hashLookupGeneratingIter (#3560)
## Summary
hashLookupGeneratingIter.Closereturnednilwithout closing the child iter chain or disposing the wrapped*plan.CachedResultsnode. Every executed hash join over aCachedResultssubtree could therefore leak one entry intoAnalyzer.CachedResultsManager.cachedResultsCaches, freed only by process restart.
This PR makesClose:- Dispose the
CachedResultschild if present (releases the global Manager entry). - Propagate
Closedown the rest of the child iter chain.
- Dispose the
๐ Fix
func (h *hashLookupGeneratingIter) Close(c *sql.Context) error {- return nil+ if cr, ok := h.n.Child.(\*plan.CachedResults); ok {+ cr.Dispose(c)+ }+ return h.childIter.Close(c)}Why
Full RCA, reproducer, and pprof evidence are in #3560. Headline numbers from the 3-minute, ~30 req/sec workload reported there (Dolt 2.0.6 sql-server vendoring this commit):
Metric Vanilla ฮ Patched ฮ Improvement RSS +5069 MB +44 MB ~115ร HeapAlloc (live) +4.3 GB +82 MB ~52ร HeapObjects (live) +90 million +1.5 million ~60ร Mallocs - Frees(net live)+204 million +4 million ~50ร ๐ Allocation rate is unchanged (~1.1B mallocs in 3 min both runs); the patched build services the same workload but Freeskeeps up withMallocs.โ Tests
โ
go test ./sql/rowexec/...passes locally with the patch applied.
โ I did not include a unit-level regression test in this PR. In a minimalengine.QueryโRowIterToRowstest,TrackedRowIter.Close โ done โ disposeNodealready walks the plan tree and disposes theCachedResultsviasql.Dispose(ctx, node), so the leak doesn't reproduce that way; faithfully exercising the production path (Dolt sql-server, prepared statements via the MySQL wire protocol) needs significantly more harness scaffolding. Happy to add a test if maintainers can point me at the right entry point.
Closes #3560- 3558: Unwrap wrapped strings before casting to string during
RegexpReplace.Eval
๐ Fixes #11095
๐REGEXP_REPLACEqueries onLONGTEXTtype columns were panicking because we were casting values to strings without unwrapping them. Note that this doesn't happen with tables created in Dolt 2.0 due to the recent changes to adaptive encoding, but we still need to support tables before then.
๐ฆ Also movedmockStringWrapperto a sharedtestutil package so it can be used in various tests.
Closed Issues
- 3560: CachedResults / HashLookup chain leaks rows-cache for every hash join until process restart
-
v2.0.6 Changes
May 23, 2026๐ Merged PRs
dolt
- โก๏ธ 11081: Update docs URLs from docs.dolthub.com to dolthub.com/docs
โก๏ธ Update references fromdocs.dolthub.comtodolthub.com/docsacross READMEs and CLI help text. - 11060: more cleanup for
prollyWriteSession
โก๏ธ This PR moves logic for updating the branch state fromprollyTableWritertoprollyWriteSession.
โ Additionally, it completely removes the mutex "protecting"prollyWriteSession.workingSetbecause it is unnecessary; there's no way the sameprollyWriteSessionis accessed by multiple threads.
go-mysql-server
- 3558: Unwrap wrapped strings before casting to string during
RegexpReplace.Eval
๐ Fixes #11095
๐REGEXP_REPLACEqueries onLONGTEXTtype columns were panicking because we were casting values to strings without unwrapping them. Note that this doesn't happen with tables created in Dolt 2.0 due to the recent changes to adaptive encoding, but we still need to support tables before then.
๐ฆ Also movedmockStringWrapperto a sharedtestutil package so it can be used in various tests. - 3557: Include
CHARandVARCHARinINexpression optimization
๐ A few months ago, I added an optimization to avoid building expensive RangeTrees.
dolthub/go-mysql-server#3330
This expands that optimization to includeCHARandVARCHARcolumn types.
BINARY,VARBINARY,JSON,GEOMETRY, etc. could be included as well with some more effort.
Internally, these types are represented as[]byte, whileCHARandVARCHARarestring, so they are not of typecmp.Orderedand need a different sorting/comparison function (binary.Compare).
๐ Locally, this seems to give 8-10% improvement onselect ... from ... in (<str1>, <str2>, ...)queries - 3556: Fix
CHAR_LENGTHandLIKEfailing on the replacement character
The replacement character (UnicodeU+FFFD, shown when text gets garbled during encoding conversion) is a normal, valid character. ButCHAR_LENGTHwould error on it instead of counting it. The fix adds that size check, so the valid character (3 bytes) is accepted while genuinely broken input (1 byte) is still rejected.
๐ Fix #11088 - 3555: Lookup table when not specified in
DROP INDEXstatements
๐ฆ MySQL requires the owning table for an index be explicitly mentioned when dropping an index, but Postgres does not. This change looks up the owning table for an index when it is not specified. Because MySQL requires the table name to be specified, tests for this functionality are in the Doltgres package (PR dolthub/doltgresql#2747). - 3552: Do not allow
CASCADEandSET NULLforeign keys on columns that are referenced bySTOREDgenerated column expressions
๐ fixes #11065
๐ According to the MySQL docs:
โก๏ธ > A foreign key constraint on the base column of a stored generated column cannot use
CASCADE,SET NULL, orSET DEFAULTasON UPDATEorON DELETEreferential actions.
0๏ธโฃ > (This is actually not totally true because I was able to create a such foreign key constraint with aSET DEFAULTreferential action in MySQL)
0๏ธโฃ > This PR prevents adding such foreign key constraints (with the exception ofSET DEFAULT) duringCREATE TABLEandALTER TABLE. Note that in MySQL, the error messages for creating a new table with an invalid foreign key and adding an invalid foreign key to an existing table are different (Cannot add foreign key constraintvsCannot add foreign key on the base column of stored column.), but I've decided to use the same error message for both cases (Cannot add foreign key on the base column of a stored generated column.).
๐ >CreateTable.CreateForeignKeyswas removed and replaced withBaseBuilder.buildCreateTableForeignKeysto avoid a cyclical import.- 3550: modify CompareJSON to use sorted object keys
- 3543: Improve costed index scans for tuples by destructuring tuple operations when possible.
This is an alternative to dolthub/go-mysql-server#3541. It's a simpler and more targeted change.
In theory, dolthub/go-mysql-server#3541 lays the groundwork for more general-purpose analysis, since it could be used when tuples are used in additional operators (like inequalities), but it also adds additional complexity.
๐ I'm not sure which approach is better.
vitess
Closed Issues
- 11095: REGEXP_REPLACE panics on TextStorage values: 'interface conversion: interface {} is *val.TextStorage, not string'
- 11088: CHAR_LENGTH fails with malformed string on valid UTF-8 replacement character (0xEFBFBD)
- โก๏ธ 11065: Stored generated column stays stale after ON UPDATE CASCADE updates its base column
- 11070: CALL dolt_gc() left manifest referencing a chunk address not present on disk, rendering DB unopenable (v2.0.3)
- 11068: conjoin ENOSPC: panic + leftover partial nbs_table_* files cause unrecoverable disk-fill loop under supervised dolt-server
- โก๏ธ 11081: Update docs URLs from docs.dolthub.com to dolthub.com/docs
-
v2.0.5 Changes
May 20, 2026๐ Merged PRs
dolt
- ๐ 11076: More revert dirty-set rules to sync with git
โช Git will rejectrevertwhen there is anything staged, regardless of conflicts or not in the changed. This change makes dolt follow the same pattern.
Related: #11073 - 11074: go/store/nbs: journal.go: Fix a bug which could result in broken databases after a process crash.
If Dolt crashed immediately after creating an empty journal file, and before it wrote the initial set-root record to it, then the next time Dolt ran it would treat the root of the database as0000....
This could also happen for certain observed filesystem states after an operating system crash. - 11072: go/store/nbs: Delete the in-flight table file in (*fileTablePersister).writeAndProtect when we experience an error on the write.
Leaving it behind needlessly wastes disk space. It will never be usable and is in an indeterminate state.
This is currently relevant even when FatalBehaviorFatal, because Conjoin's write is currently allowed to fail before we take the hard dependency on it. There are still some I/O errors which leave the file behind, including a failure at ftp.Open(). - โ
11063: Tests for IndexedJsonDocument.Compare
โ When an IndexedJsonDocument compares a sql.JsonDocument of a different type, it falls back to using Json.Compare. This PR adds tests to ensure that the two implementations match. - ๐ 10775: Fix open Dependabot security alerts
๐ Upgrade golang.org/x/image v0.18.0 -> v0.38.0 to address CVE for out-of-memory via crafted TIFF file. Upgrade @mikro-orm/core and @mikro-orm/mysql from v5 to v6.6.10+ to address critical SQL injection and high-severity prototype pollution vulnerabilities.
go-mysql-server
Closed Issues
- ๐ 11076: More revert dirty-set rules to sync with git
-
v2.0.4 Changes
May 19, 2026๐ Merged PRs
dolt
โช 11073: dolt revert to more closely match git
11067: proto,go/serial: Bump some bazel version, some module versions.
โก๏ธ 11059: Fix SchemaTable.Updater panic on direct UPDATE dolt_schemas
โก๏ธ A direct UPDATE dolt_schemas reached SchemaTable.Updater, which panicked with "should never be called" โ an unprivileged user could crash the SQL server with it. dolt_schemas is not directly modifiable via SQL, so this returns a clean error unconditionally instead of panicking; adds a regression test.11058: go: sqle: Fix a dolt_branch_control bypass involving the session table cache.
On a new connection, a SELECT against information_schema.tables or information_schema.columns would populate the session's table cache is a Table value that embedded a revision-less Database value. An incoming write request against the cached table would run its permissions check against the revision-less database, instead of the revisioned database which correctly encoded the branch the write was running against. This allowed connections to bypass dolt_branch_control, elevating towritepermissions on all branches.โ 11057: Branch_control regression tests for more user-table write shapes
โ Adds branch_control regression tests for the user-table write shapes that TestBranchControlBlocks wasn't already pinning; all were already correctly gated, so this is pure regression coverage with no behavior change.11050: Gate branch_control on writable dolt system tables
๐ Most writable dolt system tables had no branch_control check, so a read- or merge-permission user could write to them; this gates the user-space tables (dolt_docs/ignore/query_catalog/nonlocal/tests via the shared createWriteableSystemTable helper), dolt_constraint_violations_, dolt_workspace_, and ConflictRootObjectTable with Permissions_Write. dolt_branches/dolt_remotes (already read-only), dolt_branch_control/namespace (own admin gating), and dolt_conflicts_ (already gated) are left as-is; tests cover every writer factory and pin the read-only behavior.โ 11049: Audit and test branch control coverage for dolt procedures
Survey ofdprocedures/dolt_*.goturned up four procedures with nobranch_controlcheck that mutate branch or working-set state. Three of them belong underPermissions_Write:11047: Gate
DOLT_CHECKOUT('<table>')with branch_control Write permission
๐dolt_checkout(<table>)was previously ungated, so a user with areadormergepermission on a branch could clear working set changes. This gatesdolt_checkout(<table>)while leavingdolt_checkout(<branch>)ungated
go-mysql-server
- 3551: star expression used in function
3546: Cache context to use for
String()methods
This is a replacement for:- dolthub/go-mysql-server#3525
This accomplishes the same effective goal of passing context in the areas that we previously were not (primarily theString()function, which is load-bearing). The above PR changed the interfaces such that nodes and expressions no longer respected thefmt.Stringerinterface. This PR instead caches the context inside of all nodes that need a context in theirString()function by providing that context at node creation time. This was a tactic that we were already using before my original context threading PR: - dolthub/go-mysql-server#3513
...and should therefore be no worse than we were before I embarked on this journey.
It's worth noting that theinformation_schematables do not have a proper context inside of theirString()function, as those tables are created when the engine is created, and SQL contexts only exist inside of connections/sessions. For now this doesn't impact anything as theSchema(ctx)methods (which use the context fromString()) return a precomputed schema, however there are comments in place that warn about thenilcontext if those methods are ever modified.
- dolthub/go-mysql-server#3525
3532: replace all
decimal.Decimalwith*apd.Decimal
Closed Issues