• Stable

    aronwk released this 2025-09-03 17:35:21 -05:00 | 1022 commits to main since this release

    Merged PRs

    dolt

    • 9783: Bug fix: allow aborting a merge when there is a table rename
      When a merge halts due to a conflict, the merge can be aborted by calling dolt_merge('--abort');, however a bug caused this to error if the merge included a table rename. The root cause of the bug was how we restore the tables to their previous values and work around ignored tables. This change alters how we restore tables – now we restore all versioned tables by reusing the pre-merge root and then applying any ignored tables.

    Closed Issues

    • 9782: Incorrect Left/Right Join with subquery an empty table
    • 9777: Incorrect Hash Join on condition with '%'
    Downloads
  • Stable

    aronwk released this 2025-09-03 15:49:01 -05:00 | 1025 commits to main since this release

    Backwards Incompatible Changes

    There are no incompatible changes in this version.

    Merged PRs

    dolt

    • 9758: Add support for VECTOR column type
      This PR implements the changes required for Dolt to support VECTOR column types (implemented in GMS in https://github.com/dolthub/go-mysql-server/pull/3162)
      Actually managing storage read/writes was the easy part and pretty much worked out of the box.
      The most extensive changes are to the algorithm for creating vector indexes, which previously assumed that every vector was represented as a 20-byte Hash and represented paths through the tree as multiple 20-byte hashes concatenated to each other. Since VECTOR columns are stored using adaptive encoding, they may be a hash but may also be a variable-length byte buffer. Thus, the index builder needed to be smarter and represent these paths as a proper tuple. Doing it this way also allowed me to clean up the index building code in a way that is hopefully both more readable and eliminates some unnecessary memory copies. I added some clarifying comments, but it could potentially benefit from even more comments.
      The other big change was to the test suites. The vector index tests had some hardcoded assumptions about the representation of vectors that needed to be fixed, so I used this as an opportunity to clean that up to.

    go-mysql-server

    • 3187: Allow aggregate/window functions with match expressions
      fixes dolthub/dolt#6556
      Seems like the scoping issue has already been fixed.
    • 3167: Bump go-sql-driver/mysql
      The current version of go-sql-driver/mysql that we depend on doesn't support the type tag for vector types. Bumping this dependency allows us to send and receive vector types along the wire.
    • 3162: Add support for VECTOR type
      This PR adds a VECTOR type to GMS. Vectors are arrays of 32-bit floats.
      It also adds several functions that take vectors as arguments, including converting vectors to and from strings, and functions for computing distances between vectors.
      Finally, it ensures that vector types work correctly when passed to existing functions (such as BIT_LENGTH, MD5, etc.)

    vitess

    • 431: /go.mod: bump go to 1.24.6
    • 426: Length-encode vector values when sent on the wire.
      GMS uses Vitess code to encode responses into the MySQL wire format.
      Testing for this change is in the corresponding GMS PR.

    Closed Issues

    • 9762: dolt_log is "not supported while in a detached head state"
    Downloads
  • Stable

    aronwk released this 2025-09-02 19:54:27 -05:00 | 1050 commits to main since this release

    Merged PRs

    dolt

    • 9773: Make sure dolt_tests system table changes show up in dolt diff by default
      Addresses: #9771
    • 9770: dolthub/dolt#9762 - Add fix for detached head err on dolt_log(tag)
      Fixes dolthub/dolt#9762
    • 9768: Replace Dolt CI testing references in AGENT.md with reference to dolt_tests
    • 9757: Cache materialized commits on doltdb
      Changes:
      • store a cache of all resolved commit hashes on doltdb
        This results in another ~2.3x speed up, so ~4.7x in total.

    Closed Issues

    • 9743: dolt log is slow to respond without a small -n limit and no other params on a small database (7000 commits)
    • 9771: dolt_tests system table does not show in dolt diff
    • 9762: dolt_log is "not supported while in a detached head state"

    Performance

    Read Tests MySQL Dolt Multiple
    covering_index_scan 1.86 0.67 0.36
    groupby_scan 13.95 18.61 1.33
    index_join 1.5 2.48 1.65
    index_join_scan 1.47 1.39 0.95
    index_scan 34.33 30.26 0.88
    oltp_point_select 0.21 0.28 1.33
    oltp_read_only 3.82 5.37 1.41
    select_random_points 0.36 0.58 1.61
    select_random_ranges 0.39 0.62 1.59
    table_scan 34.95 32.53 0.93
    types_table_scan 74.46 127.81 1.72
    reads_mean_multiplier 1.25
    Write Tests MySQL Dolt Multiple
    oltp_delete_insert 8.43 6.67 0.79
    oltp_insert 4.18 3.25 0.78
    oltp_read_write 9.22 11.87 1.29
    oltp_update_index 4.25 3.3 0.78
    oltp_update_non_index 4.25 3.25 0.76
    oltp_write_only 5.28 6.55 1.24
    types_delete_insert 8.58 7.04 0.82
    writes_mean_multiplier 0.92
    TPC-C TPS Tests MySQL Dolt Multiple
    tpcc-scale-factor-1 93.73 39.61 2.37
    tpcc_tps_multiplier 2.37
    Overall Mean Multiple 1.51
    Downloads
  • Stable

    aronwk released this 2025-09-02 16:34:27 -05:00 | 1064 commits to main since this release

    Merged PRs

    dolt

    • 9753: Fixes for dolt_tests
      Couple of fixes for dolt_tests:
      1. Allow comparison of int64 values, which enables running aggregate queries like sum and avg, for instance.
      2. Can check if values are/are not null
      3. Fixed a bug where NULL test_group_name values would break the function.
    • 9751: Optimize commit iterator
      Changes:
      • use the commitMetadata and commitHeight (if available) in iterator
      • reduce string and regex operations when resolving a known hash commit spec
      • directly access parent rather than allocating slice
        The result of these changes is roughly 1.7x speed up in select * from dolt_log() queries.
        Addresses: https://github.com/dolthub/dolt/issues/9743
    • 9749: support mcp_server in the the dolt sql-server configuration file
      This PR is part two of supporting mcp directly in Dolt. This one adds the mcp_server key to the dolt sql-server config.yaml, allowing users to start/configure the http dolt-mcp server here, instead of only with cli arguments. If both the config file defines mcp_server and mcp related cli arguments are supplied, the cli args take precendence over the config file definitions.
    • 9740: Add support for excluding databases from binlog replication
      MySQL allows databases to be excluded from binlog replication through the --replicate-ignore-db command line parameter. Instead of exposing this as a CLI parameter, Dolt exposes a @@binlog_ignore_dbs system variable where users can list one or more comma-separated database names to have those databases excluded from binlog replication.
    • 9737: add DOLT_PAGER to override default pager
      Fixes: https://github.com/dolthub/dolt/issues/9736
    • 9727: dolt_test_run table function
      Adds dolt_test_run:
      Takes in one of the 3 following argument formats:
      1. test [test name] to run a specific test
      2. group [group name] to run a group of tests
      3. * as a wildcard to run all tests
    • 9726: go: cmd/dolt: sql.go: Enable Auto GC when running dolt sql.
      During something like an mysqldump import, Dolt disk utilization can be unexpectedly high if we do run GC. This change enables Auto GC by default when running dolt sql in local mode.
      Auto GC can be optionally disabled by passing the --disable-auto-gc flag to the dolt sql invocation.
      Auto GC behavior for dolt sql-server is not changed. It is still enabled through the config.yaml file, and is off by default.
    • 9716: add option to start an http mcp server when dolt sql-server is running
      This PR adds arguments to the dolt sql-server command that allow users to start a dolt-mcp http server with a single command. The dolt-mcp server connects directly to the started sql-server on its sql port.
      Additionally, the specified log-level is respected by the dolt-mcp server, and it's logs are written to the same log stream as the sql-server, prefixed with "dolt-mcp".
      This is the first of two PRs, where this one supports running the MCP server via command line flag arguments, and the second PR (not implemented) will support MCP server configuration via Dolt's config.yaml.
    • 9708: field align a few packages
      companion pr: https://github.com/dolthub/go-mysql-server/pull/3168
    • 9682: aws archive conjoin support

    go-mysql-server

    • 3187: Allow aggregate/window functions with match expressions
      fixes dolthub/dolt#6556
      Seems like the scoping issue has already been fixed.
    • 3186: /go.mod: bump go
    • 3180: dolthub/dolt#9738 - Add CREATE VIEW parentheses tests for MySQL compatibility
      Fixes dolthub/dolt#9738
      Companion dolthub/vitess#429
    • 3178: Do not materialize any output for WindowPartitionIter if input is empty
      Fixes dolthub/dolt#6899
      The comment about count doesn't seem to apply since count is an aggregation and not a window function.
      Also fixes bug in Dolt where dense_rank was not working because text storage objects were not being compared properly.
    • 3176: Trim strings to number prefix when cast
      fixes dolthub/dolt#9733
      adds tests for dolthub/dolt#9735 and dolthub/dolt#9739
    • 3175: Support filtering by comment in show table status
      fixes dolthub/dolt#6894
      • update "Comments" to "Comment" in show table status schema
      • include table comment in table status row
    • 3168: align struct fields to reduce memory usage
      Golang does not automatically arrange the fields of a struct to reduce memory usage.
      I used fieldalignment to rearrange the member variables of all the structs in GMS so they are more compact. The result should be a lower memory footprint and slightly better performance.
      I avoided making changes to the test files as they do not impact our performance.
      TODO:
      • field align spatial types package
      • field align collations
    • 2991: test: optimize database connection test logic
      • Add a 1-second wait time before each test to ensure the database has started
      • Update error assertions to match more specific error messages
      • Adjust the test order: first test the case where the user does not exist, then test the case where the password is incorrect

    vitess

    • 431: /go.mod: bump go to 1.24.6
    • 430: Walk OptSelect in DDL node to capture select expressions
      fixes dolthub/dolt#6670
      captureSelectExpressions was not getting called on DDL.OptSelect because it was not being walked
    • 429: dolthub/dolt#9738 - Support parentheses around SELECT in CREATE VIEW for MySQL compatibility
      Fixes dolthub/dolt#9738
    • 427: field align sqlparser
      This PR runs the fieldalignment tool over parts of the sqlparser.
    • 425: Add parsing of VECTOR type
      This adds parsing and sqlType info for a VECTOR type, matching MySQL's behvaior.

    Closed Issues

    • 6556: Aggregate/Window mixing with MATCH expressions not yet supported
    • 9759: KEY in 'create table' error
    • 6670: Dolt generates different column name for aggregate function expressions.
    • 9738: CREATE VIEW should support parentheses around the SELECT statement for MySQL compatibility
    • 6899: lateral join with aggregation returns wrong results
    • 9736: Option to turn autopaging off
    • 9725: AUTO_INCREMENT not synced after primary/standby failover, causing duplicate key errors
    Downloads
  • Stable

    aronwk released this 2025-08-26 11:42:54 -05:00 | 1172 commits to main since this release

    Merged PRs

    dolt

    • 9730: Fix dolt_conflicts_resolve for doltgres
    • 9728: dolthub/dolt#9725 - Fix AUTO_INCREMENT reuse after HA failover by refreshing trackers
      Fixes #9725
      Newly promoted primary could reuse AUTO_INCREMENT values due to a stale in-memory tracker. On promotion, we now synchronously refresh AUTO_INCREMENT trackers for databases already loaded in the session, aligning sequences with the current working sets so the first post-promotion inserts do not reuse existing IDs.
    • 9721: disable only_full_group_by in sysbench
      Since our group validation much more closely aligns with MySQL, we discovered that sysbench script groupby_scan.lua is not valid in MySQL without disabling ONLY_FULL_GROUP_BY in sql_mode. This PR fixes the local test scripts and the benchmark runners to accept a config.yaml with the sql_mode set.
    • 9719: Drop old event messages
      Changes the event collector/emitter to drop old events and not grow unbounded when events can't be delivered.
      The event collector already batched 64 events per request when LogEvent messages were being sent successfully. However, when there are issues sending LogEvent messages, the events queue up, with no upper bound, and each LogEvent request gets larger and larger. This change limits the tracked "unsent" events to that existing 64 event batch size.
    • 9710: Fixes for Doltgres-related procedure calling
      This contains some fixes related to calling Dolt functions in Doltgres.
      Required by:
    • 9702: go: cmd/dolt: cli_context: Slightly rework CliContext and LateBinderyQueryist lifecycle.
      Rework CliContext and LateBinderyQueryist lifecycle so that CliContext itself is Closed when we are done with it. If it instantiated the LateBinderQueryist, it closes it at that time.
      Previously LateBinderQueryist was responsible for returning a closer(), which a caller of CliContext.QueryEngine could see as non-nil and call at the end of its work. This works well when a QueryEngine is used exactly one time or when QueryEngine usage is completely nested, as is the case with the backslash command implementations called from dolt sql. But in tests, we sometimes use command instances back-to-back, on the same CliContext instance, where it results in using the Queryist after it has already been closed.
      This PR also reworks result types so that callers of QueryEngine can know if they are connected locally or remotely and if the QueryEngine interaction they are making is the first one in the session. Some callers need to inspect that state to implement helpful error checks and guard rails, and they were previously using things like a non-nil closer and interface casts to concrete types to implement these checks.
    • 9678: dolt_tests system table
      Adds dolt_tests system table. The table currently has no functionality, but behaves similarly to the other writable system tables like dolt_ignore and dolt_query_catalog.

    go-mysql-server

    • 3175: Support filtering by comment in show table status
      fixes dolthub/dolt#6894
      • update "Comments" to "Comment" in show table status schema
      • include table comment in table status row
    • 3174: Make SHOW VARIABLES display boolean values as ON/OFF to match MySQL
      Changes the output of SHOW VARIABLES to match MySQL's output, where boolean values are shown as ON or OFF. Also adds definitions for two replication related system variables.
    • 3173: Mask column names from non-triggered tables in UpdateJoins
      fixes dolthub/dolt#9403
    • 3172: Add correlated columns from subqueries to GroupBy select dependencies
      fixes dolthub/dolt#9699
    • 3169: go.mod: Bump go-icu-regex. Picks up a wazero bump which improves amd64 behavior on builds with go 1.24.0+.
    • 3166: Unskip GroupBy validation on Project, Having, and Sort nodes
      Fixes dolthub/dolt#4998
      Still need to allow group by unique non-nullable columns (dolthub/dolt#9700)
      Query plans needed to be updated because Subquery.String and GroupBy.String changed. The latter was due to SelectedExprs being renamed to SelectDeps.
      Dolt bump: dolthub/dolt#9704

    Closed Issues

    • 9725: AUTO_INCREMENT not synced after primary/standby failover, causing duplicate key errors
    • 6894: show table status "Comments" column does not match MySQL "Comment" column
    • 9403: Triggers are unable to get the right column when joined tables share a column name
    • 9699: GroupBy nodes for aggregate columns need to include select dependencies from subqueries
    • 4736: migrate: column type cannot be auto-incremented
    • 4998: GroupBy validation not running on nodes wrapped in Having, Project, or Sort (validation is also way too strict when it does run)

    Performance

    Read Tests MySQL Dolt Multiple
    covering_index_scan 1.86 0.68 0.37
    groupby_scan 13.22 21.11 1.6
    index_join 1.47 2.61 1.78
    index_join_scan 1.44 1.44 1.0
    index_scan 34.33 32.53 0.95
    oltp_point_select 0.2 0.29 1.45
    oltp_read_only 3.75 5.37 1.43
    select_random_points 0.35 0.61 1.74
    select_random_ranges 0.38 0.64 1.68
    table_scan 34.33 32.53 0.95
    types_table_scan 74.46 127.81 1.72
    reads_mean_multiplier 1.33
    Write Tests MySQL Dolt Multiple
    oltp_delete_insert 8.43 6.55 0.78
    oltp_insert 4.18 3.25 0.78
    oltp_read_write 9.06 11.87 1.31
    oltp_update_index 4.18 3.3 0.79
    oltp_update_non_index 4.18 3.25 0.78
    oltp_write_only 5.28 6.55 1.24
    types_delete_insert 8.43 6.91 0.82
    writes_mean_multiplier 0.93
    TPC-C TPS Tests MySQL Dolt Multiple
    tpcc-scale-factor-1 94.92 39.42 2.41
    tpcc_tps_multiplier 2.41
    Overall Mean Multiple 1.56
    Downloads
  • Stable

    aronwk released this 2025-08-20 13:56:20 -05:00 | 1235 commits to main since this release

    Merged PRs

    dolt

    go-mysql-server

    • 3169: go.mod: Bump go-icu-regex. Picks up a wazero bump which improves amd64 behavior on builds with go 1.24.0+.
    • 3158: cache sql.Schema in plan.Project and plan.TableAlias
      Changes:
      • plan.Project.Schema() and plan.TableAlias.Schema() create a new sql.Schema every time they are called, which can be a lot during analysis. So, the results are cached.
      • sql.Index.Expressions() retrieves a new []string, so we should cache that as well. Additionally, many times we unqualify the results, so I added a UnqualifiedExpressions() to avoid doing this extra processing every time.
      • changes idxExprsColumns to avoid using strings.Split to avoid extra allocations

    Closed Issues

    • 9641: 48 is beyond the maximum value that can be held by 1 bits
    Downloads
  • Stable

    aronwk released this 2025-08-19 14:08:27 -05:00 | 1239 commits to main since this release

    Merged PRs

    dolt

    • 9701: go: SysbenchDockerfile: Mirror the download tarball for sqlite.
      Fixes broken Github actions based on recently implemented robot checks on the sqlite server.
    • 9697: dolthub/dolt#9641 - Fix CSV export for bit union generalization
      Fixes dolthub/dolt#9641
      Add normalization in CSV string export conversion to detect non-canonical types.
    • 9693: Ensure that errors are displayed in interactive mode
      Due to an accidental variable shadowing, error messages that occurred when iterating over query results wouldn't be displayed if the user runs dolt sql in interactive mode.
      Prior behavior:
      db/main*> SELECT JSON_PRETTY("not valid json");
      db/main*>
      
      Fixed behavior:
      db/main*> SELECT JSON_PRETTY("not valid json");
      Invalid JSON text in argument 1 to function json_pretty: "not valid json"
      db/main*>
      
    • 9681: reduce creation of new strings and []string
      Changes:
    • 9680: @@port returns correct port
      Fixes: https://github.com/dolthub/dolt/issues/5898
    • 9674: Remove references to branch wildcards in Dolt CI YAML in AGENT.md
      Dolt CI does not support wildcards in branch specs.
    • 9672: Add support for altering table comments
      fixes dolthub/dolt#9279
      relies on dolthub/go-mysql-server#3156
    • 9670: Unskip the LOAD DATA with NULLs and defaults BATS fixed by corresponding GMS changes
      Companion fix is here: https://github.com/dolthub/go-mysql-server/pull/3155
    • 9663: avoid using sql.Row.Append()
      Companion PR: https://github.com/dolthub/go-mysql-server/pull/3154

    go-mysql-server

    • 3164: handle RowIter as result from Eval function in TableFunctionWrapper
    • 3161: Allow hash functions to work on BINARY columns when the binary is not valid UTF8
      Previous, as part of computing hashes for MySQL's hash functions (MD5, SHA1, etc), we could convert the input into a text type. But this would cause errors in strict mode of the input was a binary value that was not valid utf8.
      By converting the input into a binary type, we keep all the same behavior, except that binary inputs now work correctly.
    • 3158: cache sql.Schema in plan.Project and plan.TableAlias
      Changes:
      • plan.Project.Schema() and plan.TableAlias.Schema() create a new sql.Schema every time they are called, which can be a lot during analysis. So, the results are cached.
      • sql.Index.Expressions() retrieves a new []string, so we should cache that as well. Additionally, many times we unqualify the results, so I added a UnqualifiedExpressions() to avoid doing this extra processing every time.
      • changes idxExprsColumns to avoid using strings.Split to avoid extra allocations
    • 3156: Add support for altering table comments
      part of dolthub/dolt#9279
      relies on dolthub/vitess#424
      dolt changes made in dolthub/dolt#9672
    • 3155: Made LOAD DATA handle NULL values and defaults correctly
    • 3154: avoid using sql.Row.Append()
      sql.Row.Append() will always make a deep copy of the row, so we should avoid it.
      Instead we have copies to cached sql.Rows or reuse the backing array through append() (sometimes golang's runtime will allocate a new one anyway).
    • 3152: Validate trigger name length is not over 96 chars
      We weren't enforcing any name length constraints on triggers, and when customers created triggers with very long names (i.e. over 64 characters, the MySQL limit), they could encounter problems with table schemas that don't support longer lengths.
      In this change, we apply a max trigger name length of 96 characters and reject CREATE TRIGGER statements that create triggers with names longer than that limit. We chose 96 characters for the limit, instead of copying MySQL's 64 character limit, so that this change would not break existing applications that are creating trigger names slightly longer than MySQL's 64 character limit.
    • 3148: dolthub/dolt#9641 - Fix BIT Overflow
      Fixes dolthub/dolt#9641
      Fixed Max1Row optimization being incorrectly applied to UNION subqueries. Also fixed UNION schema type reconciliation using GeneralizeTypes().
    • 3073: Allow select aliases to be in group by/having
      fixes dolthub/dolt#7095
    • 3005: Added support for @@port, @@hostname, and other system variables
      fixes dolthub/dolt#5898
      related to dolthub/dolt#6037
      MySQL docs

    vitess

    Closed Issues

    • 9641: 48 is beyond the maximum value that can be held by 1 bits
    • 7095: References in GROUP BY / HAVING should be allowed to match SELECT aliases.
    • 5898: @@port is hard-coded to 3306
    • 9279: Add support for altering table comments
    Downloads
  • Stable

    aronwk released this 2025-08-12 16:18:34 -05:00 | 1312 commits to main since this release

    Merged PRs

    dolt

    • 9668: Initialize a branch's working set when referenced as a branch-revision database
      When a new branch is pushed to a SQL server through the RemotesAPI, that branch will not have its working set initialized yet. If a customer accesses that branch as a branch-revision database (e.g. mydb/my_new_branch) and performs a write operation, the lack of a working set will cause an error. This change fixes that case by initializing a branch-revision database's working set if it has not been created yet.
    • 9667: Fix another primary key ordering test
    • 9665: A Primary Key BATS test to unskip.
      Found testing Cursor Agent with GPT-5
    • 9655: Skip flaky 'archive: too few chunks' test in Lambda environment
    • 9649: Removed root object presence from some locations
      Root objects occupy the same namespace as tables, however they shouldn't be returned in places that expect to see only tables. This PR allows for a distinction when querying for names, so that locations that only work with tables (such as some system tables) no longer receive root object names.
      Required for:
    • 9648: Bug fix: ensure dolt_checkout() initializes a branch's working set
      dolt_checkout() already had logic to initialize a branch's working set if one was not available, but the error it expected to see to trigger that logic was not being returned by the functions it called. This changes the checkoutExistingBranch() function so that it also resolves the working set for that branch and returns a doltdb.ErrWorkingSetNotFound error if the working set is not available.
    • 9647: Refactor SetSystemVar and GetRowsForSql
    • 9646: Add UUID key recommendation to default AGENT.md
      I notice that Claude Code likes auto_increment primary keys but Dolt likes UUID keys better. So, I added a section to AGENT.md.
    • 9642: Fix table usage during merge
      We would always assume that tables are used in certain situations (rather than root objects), which would lead to a panic.
    • 9639: Small fixes to ci, --help & valid branch names
      Two small changes to CI:
      1. dolt ci import now requires that the branches you list under on.action, on.pull_request are valid branch names. This also blocks off attempting to use the * wildcard identifier, which we do not support.
      2. I also expanded the dolt ci import --help page to include the specification for the workflow yaml files.
    • 9638: cache keys in iters to reduce gc
      Companion PR: https://github.com/dolthub/go-mysql-server/pull/3146
    • 9637: dolthub/dolt#9582 - Fix cherry-pick timestamp preservation
      Fixes dolthub/dolt#9582
      Cherry-pick now preserves original commit timestamp during operations.
    • 9635: Stop processing earlier when dolt_pull() is a no-op
      User demonstrated that a no-op pull was taking far too long. Turns out we should be stopping processing but instead do a lot of unnecessary status printing computation only to throw it away. This change just short circuits any work if the current branch is already up-to-date.

    go-mysql-server

    • 3152: Validate trigger name length is not over 96 chars
      We weren't enforcing any name length constraints on triggers, and when customers created triggers with very long names (i.e. over 64 characters, the MySQL limit), they could encounter problems with table schemas that don't support longer lengths.
      In this change, we apply a max trigger name length of 96 characters and reject CREATE TRIGGER statements that create triggers with names longer than that limit. We chose 96 characters for the limit, instead of copying MySQL's 64 character limit, so that this change would not break existing applications that are creating trigger names slightly longer than MySQL's 64 character limit.
    • 3150: Misc code clean up
    • 3147: dolthub/go-mysql-server#3144 - Fix parseErr tracing to show error messages instead of memory addresses
      Fixes dolthub/go-mysql-server#3144
      Add Error() method to parseErr struct so tracing systems show actual error messages instead of memory addresses like "{0xc006f85d80}".
    • 3146: allocate fewer sql.Rows
      This PR removes extra sql.Row allocations where it has no impact on logic.
      Doltgres error: https://github.com/dolthub/doltgresql/pull/1735
    • 3145: fix panic over SetOps with joins and subqueries
      The analyzer rule assignExecIndexes will apply a StripRowNode over any joins within a subquery.
      The analyzer rule finalizeUnions recursively calls the analyzer (calling assignExecIndexes), resulting in StripRowNodes getting applied twice.
      The double stripping results in rows that are too short and panics.
      This PR tells the finalizeUnions selector to skip assignExecIndexes, preventing the nested StripRowNodes.
      Also has some small formatting and naming clean up.
      fixes: https://github.com/dolthub/dolt/issues/9631
    • 3142: Add support for DELETE ... RETURNING
      Adds support for the RETURNING clause in DELETE statements. This syntax is supported in Postgres/Doltgres, but not in Dolt/GMS/MySQL.
      Tests for this functionality are in the associated Doltgres PR: https://github.com/dolthub/doltgresql/pull/1712
    • 3139: Remove the go-kit dependency
      This library depends on https://github.com/go-kit/kit.
      It looks to only use this for this single package: https://github.com/go-kit/kit/blob/master/metrics/discard/discard.go
      Although the usage of this package is safe, the go-kit library hasn't been maintained since 2023 - and is throwing some warnings in our security scanning.
      Can we look at removing usage of this external library?
      The proposed PR replaces it with an internal interface - but also allows configuration via a config options.
      Alternatively it could maybe be dropped completely? It's only a no-op.

    Closed Issues

    • 9509: Add agent.md to dolt_docs populated on init
    • 9631: handler caught panic: runtime error: slice bounds out of range on SELECT...EXCEPT query
    • 9628: In the result of the following query, the dashboard_id field appears to be incorrect — it returns the value of entity_id instead of the actual dashboard_id.
    • 3144: Planbuilder: Traces do not record parse exceptions correctly

    Performance

    Read Tests MySQL Dolt Multiple
    covering_index_scan 1.89 0.68 0.36
    groupby_scan 13.22 19.29 1.46
    index_join 1.47 2.52 1.71
    index_join_scan 1.44 1.44 1.0
    index_scan 34.33 31.37 0.91
    oltp_point_select 0.2 0.29 1.45
    oltp_read_only 3.75 5.37 1.43
    select_random_points 0.35 0.61 1.74
    select_random_ranges 0.38 0.64 1.68
    table_scan 34.95 32.53 0.93
    types_table_scan 75.82 132.49 1.75
    reads_mean_multiplier 1.31
    Write Tests MySQL Dolt Multiple
    oltp_delete_insert 8.43 6.55 0.78
    oltp_insert 4.18 3.25 0.78
    oltp_read_write 9.06 11.87 1.31
    oltp_update_index 4.25 3.3 0.78
    oltp_update_non_index 4.18 3.25 0.78
    oltp_write_only 5.28 6.55 1.24
    types_delete_insert 8.43 6.91 0.82
    writes_mean_multiplier 0.93
    TPC-C TPS Tests MySQL Dolt Multiple
    tpcc-scale-factor-1 94.91 38.61 2.46
    tpcc_tps_multiplier 2.46
    Overall Mean Multiple 1.57
    Downloads
  • Stable

    aronwk released this 2025-08-06 16:36:20 -05:00 | 1355 commits to main since this release

    Merged PRs

    dolt

    go-mysql-server

    • 3145: fix panic over SetOps with joins and subqueries
      The analyzer rule assignExecIndexes will apply a StripRowNode over any joins within a subquery.
      The analyzer rule finalizeUnions recursively calls the analyzer (calling assignExecIndexes), resulting in StripRowNodes getting applied twice.
      The double stripping results in rows that are too short and panics.
      This PR tells the finalizeUnions selector to skip assignExecIndexes, preventing the nested StripRowNodes.
      Also has some small formatting and naming clean up.
      fixes: https://github.com/dolthub/dolt/issues/9631
    • 3141: dolthub/dolt#9628 - Fix UNION column mapping bug in nested multi-way operations
      Fixes dolthub/dolt#9628
      Fixed column scrambling in UNION queries with 3+ branches. The bug caused duplicate rows with wrong column positions when processing nested UNION operations like (A UNION B) UNION C.
      SetOp nodes now preserve schema order by recursing to left child instead of using sorted column set.

    Closed Issues

    • 9628: In the result of the following query, the dashboard_id field appears to be incorrect — it returns the value of entity_id instead of the actual dashboard_id.

    Performance

    Read Tests MySQL Dolt Multiple
    covering_index_scan 1.89 0.68 0.36
    groupby_scan 13.22 20.0 1.51
    index_join 1.47 2.52 1.71
    index_join_scan 1.44 1.47 1.02
    index_scan 34.33 31.37 0.91
    oltp_point_select 0.2 0.29 1.45
    oltp_read_only 3.75 5.37 1.43
    select_random_points 0.35 0.62 1.77
    select_random_ranges 0.38 0.64 1.68
    table_scan 34.95 32.53 0.93
    types_table_scan 77.19 127.81 1.66
    reads_mean_multiplier 1.31
    Write Tests MySQL Dolt Multiple
    oltp_delete_insert 8.43 6.67 0.79
    oltp_insert 4.18 3.25 0.78
    oltp_read_write 9.06 11.87 1.31
    oltp_update_index 4.25 3.36 0.79
    oltp_update_non_index 4.18 3.25 0.78
    oltp_write_only 5.28 6.55 1.24
    types_delete_insert 8.43 7.04 0.84
    writes_mean_multiplier 0.93
    TPC-C TPS Tests MySQL Dolt Multiple
    tpcc-scale-factor-1 94.61 38.76 2.44
    tpcc_tps_multiplier 2.44
    Overall Mean Multiple 1.56
    Downloads
  • Stable

    aronwk released this 2025-08-06 15:55:44 -05:00 | 1357 commits to main since this release

    Merged PRs

    dolt

    • 9579: Add option to memory-map archive file indexes
      This PR adds a configuration option to use mmap to access archive indexes instead of holding them entirely in process memory.
      The main benefits of this configuration are:
      • Faster startup times for CLI commands
      • Less memory usage for CLI commands that only need to access a small part of the storage layer
        It also comes with some downsides:
      • mmap doesn't play well with Go's process scheduler (https://valyala.medium.com/mmap-in-go-considered-harmful-d92a25cb161d). Threads that are blocked on a page fault can't do something else while the page is being swapped in. This can cause performance issues in some cases.
      • additional complexity: the code is different for unix vs windows, and this is the first time that a configuration setting can impact how the DB is loaded.
        We have several ways to configure Dolt, and I opted to add this as a dolt config setting. Potentially a better solution would be something that lets users configure it separately for running a SQL server vs other commands, but that was outside the scope of the PR.
        I'm not really happy with how I ended up having to add an extra boolean parameter to a bunch of DB loading functions. If there was a DbConfig struct or similar it would have ended up there, but I don't think there is.

      Testing

      Testing presents a challenge because this only effects loading archive files from disc, not archive files loaded over the network or created in memory. So the go unit tests (which use in-memory db files) can't test this.
      I added a bats test that asserts that chunk lookups still resolve when the config option is set, and asserts that an in-memory index is not used. I don't think we currently run bats tests for windows though, so the windows implementation may not be tested.
    • 9522: Root Object Conflicts & Merging
      This adds a new root object type, Conflict, which is specially handled by Dolt to represent conflicts between root objects. As Doltgres does not have to worry about the CLI (only Dolt functions and system tables), the implementation surface area is a bit smaller, and this is specifically designed for conflict resolution via those methods.
      Prerequisite for:

    go-mysql-server

    • 3143: Add stack trace in error from panic handler
    • 3141: dolthub/dolt#9628 - Fix UNION column mapping bug in nested multi-way operations
      Fixes dolthub/dolt#9628
      Fixed column scrambling in UNION queries with 3+ branches. The bug caused duplicate rows with wrong column positions when processing nested UNION operations like (A UNION B) UNION C.
      SetOp nodes now preserve schema order by recursing to left child instead of using sorted column set.
    • 3137: Bug fix: ordered aggregates in triggers
      Fixes a customer-reported issue using group_concat() in a trigger (https://github.com/dolthub/dolt/issues/9616). Also changes OrderedAggregation logic to account for one output scope field per-OrderedAggregation expression.

    Closed Issues

    • 9631: handler caught panic: runtime error: slice bounds out of range on SELECT...EXCEPT query
    • 9628: In the result of the following query, the dashboard_id field appears to be incorrect — it returns the value of entity_id instead of the actual dashboard_id.
    • 9616: Error using group_concat() function in a trigger
    Downloads