github dolthub/dolt v2.4.1
2.4.1

3 hours ago

Merged PRs

dolt

  • 12016: /{go,integration-tests}: use a more specific cache key
    Use the local database cache root, remote URL, and effective Git ref as the cache key so databases and custom refs cannot incorrectly share a remote handle. The SQL provider and Git remote factory share key construction, and remote opens and cache lookups share parameter construction.
    Validated with all eight SQL Git-remote integration tests and targeted remote configuration, factory, and database provider Go tests.
    Fixes #12011.
  • 12002: Fix CREATE TABLE rejected on the target branch of a nonlocal table rule
    • Add checkNonlocalTableName for Database.CreateTable and Database.CreateIndexedTable to allow a table name where the nonlocal rule resolves it locally.
      Fix #11995
  • 11993: /go/{cmd,libraries,store}: allow configuring git remotes
    Add git-remote.max-history-commits and git-remote.reset-history-on-prune settings so users can trade disk usage for faster incremental transfers. Support local/global dolt config, environment overrides, and typed options for embedders.
    Defaults remain unchanged. A history limit of 0 means unlimited; disabling prune-triggered resets allows obsolete data to remain reachable until the history limit is reached.
  • 11991: /go/store/blobstore: use fetch anchor ref
    Preserve a persistent Git fetch anchor during teardown so subsequent pulls can negotiate incremental transfers instead of re-downloading the database. Compare-and-swap protects the anchor from overlapping sessions while allowing private refs to be cleaned up.
  • 11990: significantly faster implementation of dolt log
    With these optimizations, dolt log is now an O(N) operation rather than an O(N^2).
    Optimizations:
    • Only query dolt_branches, dolt_tags, dolt_log() once instead of for every commit
    • CommitInfo is passed as a pointer
      Potential improvements:
    • There are places where we can now add concurrency for long running queryist calls
    • Pagination can now be properly implemented, but it is left as a TODO
      Before:
    james@macbook beads_sample % time dolt log -n 5000 > out.txt
    dolt log -n 5000 > out.txt  97.62s user 2.81s system 157% cpu 1:03.60 total
    
    After:
    james@macbook beads_sample % time dolt log -n 5000 > out.txt
    dolt log -n 5000 > out.txt  0.09s user 0.13s system 15% cpu 1.422 total
    
    About a 1000x improvement, which scales exponentially as number of commits increase.
    Fixes: #9315
  • 11989: /go/store/nbs: cover missing spooling paths
    Newly persisted Git-backed tables and conjoin input reads bypassed NBS spooling, causing redundant Git reads and decompression. This change spools persisted tables from bytes already in memory and makes conjoin reuse existing source readers.
    Adds regression coverage for chunk correctness, blob read counts, and spool cleanup. Full NBS tests and focused race tests pass.
    Fixes #11916.
  • 11985: Fix License Link
  • 11980: Test update triggers during CSV imports
    Adds CSV import regression coverage for update triggers alongside dolthub/go-mysql-server#3947 and dolthub/doltgresql#3469.
    Fixes #5925
  • 11756: Bump google.golang.org/grpc from 1.83.1 to 1.83.2 in /go
    Bumps google.golang.org/grpc from 1.83.1 to 1.83.2.
    Release notes

    Sourced from google.golang.org/grpc's releases.

    Release 1.83.2

    Security

    • server: Reject requests missing both :authority and Host headers with HTTP 400 and status Internal. (grpc/grpc-go#9365)
    Commits

go-mysql-server

  • 3979: Preserve decimal precision in GREATEST and LEAST
    Preserves exact decimal values and result types in GREATEST and LEAST.
    Fixes #10567
  • 3976: Test EXISTS and NOT EXISTS with window functions
    Adds regression coverage for NOT EXISTS and multiple window functions inside EXISTS subqueries.
    Fixes #11421
  • 3975: Test EXISTS over empty scalar aggregate inputs
    Adds regression coverage for EXISTS and NOT EXISTS over scalar SUM aggregates with empty inputs and grouped controls.
    Fixes #11489
  • 3974: Test listener shutdown with pending connections
    Adds regression coverage for TCP and Unix listener shutdown races and Accept after Close.
  • 3973: Preserve literal defaults during ALTER table rewrites
    ALTER rewrites starting from persisted schema could reclassify literal defaults as expressions, causing datetime COLUMN_DEFAULT values to gain quotes after subsequent column changes. Resolve defaults in the current schema before rewriting, preserving literal metadata and existing multi-column ALTER behavior.
    Adds shared engine coverage for metadata, SHOW CREATE, and default insertion. All 50 Dolt default-value BATS cases, Dolt MODIFY tests, and relevant GMS suites pass; expectations were checked against MySQL 8.4.11.
    Addresses the Lambda BATS failure in Dolt #11994.
  • 3970: Support PostgreSQL UPDATE row counts
    Add an engine override to support PostgreSQL UPDATE row count behavior, where all matched rows are counted. Also simplifies INSERT ON DUPLICATE UPDATE handling.
    Addresses dolthub/doltgresql#3113.
    Doltgres PR: dolthub/doltgresql#3468.
  • 3967: IN expr: compare every element of the right tuple
    this changes the previous assumption of all tuple elements being of the same type.
    Fixes: #11968
  • 3965: Reject out-of-range INET_NTOA arguments
    Returns NULL with a warning for INET_NTOA arguments outside the IPv4 range.
    Fixes #11510
  • 3964: Validate twelve-hour STR_TO_DATE inputs
    Validates twelve-hour STR_TO_DATE inputs and normalizes midnight and noon consistently with MySQL.
    Fixes #11544
  • 3963: Reset regular expressions between window partitions
    Reinitializes disposed regular expressions when they are reused across window partitions.
    Fixes #11550
  • 3962: Clamp unsigned MEDIUMINT serialization to its maximum value
    Clamps unsigned MEDIUMINT serialization to 16777215.
  • 3961: Store binary collation metadata explicitly
    Stores binary collation metadata explicitly instead of deriving it from collation names.
    Fixes dolthub/go-mysql-server#3838
  • 3960: Preserve NULL semantics for indexed NOT IN subqueries
    Avoids lookup and merge joins that discard NULL semantics in nullable NOT IN subqueries.
  • 3959: Recompute stored generated columns after definition changes
    Recomputes stored generated columns and their dependents when MODIFY or CHANGE alters their definitions.
    Fixes #11781
  • 3958: Reject malformed UTF-8 in CONVERT USING utf8mb4
    Returns NULL with a warning when CONVERT USING utf8mb4 receives malformed UTF-8.
    Fixes dolthub/go-mysql-server#3837
  • 3957: Preserve unsigned bits when casting to SIGNED
    Reinterprets BIGINT UNSIGNED values as signed integers when evaluating CAST AS SIGNED.
    Fixes #11906
  • 3956: Preserve NOT IN predicates that cannot be unnested
    Preserves negation on residual NOT IN predicates when sibling subqueries become anti joins.
    Fixes #11913
  • 3955: Convert STR_TO_DATE arguments to strings
    Accepts binary and numeric arguments to STR_TO_DATE using MySQL-compatible string conversion.
    Fixes #11919
  • 3954: Respect context cancellation errors during group by aggregation
    Cancels blocked grouping producers when the grouping consumer returns an error.
  • 3953: Allow grouped expressions without column dependencies
    Allows column-free expressions and correlated subqueries that reference only grouped columns under ONLY_FULL_GROUP_BY.
  • 3952: Account for COUNT DISTINCT memory usage
    Tracks COUNT DISTINCT allocations through the session memory manager after the grouping cancellation fix in #3954.
  • 3951: Validate temporal cast precision
    Validates temporal cast precision before constructing the target type.
  • 3950: Fix correlated subquery dependencies in grouped joins
    Preserves correlated subquery column dependencies when grouping over joins.
  • 3949: Fix column statistics queries without initialized privileges
    Returns an empty iterator when column statistics are queried without initialized session privileges.
  • 3948: Implement numeric converts to TIME with precision
    Implement conversion for numeric types to TIME including precision parameters.
    Also includes conversion logic for boolean types and small fixes for string conversions.
  • 3947: Execute duplicate-key update triggers
    Executes duplicate-key update triggers, with import regression coverage in #11980 and DoltgreSQL compatibility changes in dolthub/doltgresql#3469.
    Fixes #5925
  • 3941: Resolved table and CTE authorization
    Fixes a bug where subqueries could bypass permissions in some instances (test cases are now returning errors), and also adds an interface for:
  • 3940: Require UPDATE privileges for duplicate-key inserts
    INSERT ... ON DUPLICATE KEY UPDATE could rewrite rows without UPDATE privileges. Require UPDATE authorization and return the MySQL-compatible error code when access is denied.
  • 3918: Support escaped LIKE wildcard in analyzer prefix extraction and pattern matching
    Fix #11903
    Fix #11910
    Blocked by dolthub/vitess#497
    Block #11937
    Close dolthub/go-mysql-server#3972

vitess

  • 498: Removed parse-time CTE authorization
    CTEs are properly handled in GMS now, so this removes the check. Is a dependency of:
  • 494: Support Dolt executable SQL comments
    Parses DOLT executable comments for the SQL integration in #11851.
    Fixes #3096

Closed Issues

  • 11911: ONLY_FULL_GROUP_BY: uncorrelated scalar subqueries in grouped SELECT lists — intended behavior or oversight?
  • 11995: Creating a table that matches a dolt_nonlocal_tables rule fails on the rule's target branch, depending on how the primary key is declared
  • 12011: sql-server: git remotes with the same URL but different --ref share one ref — a push from one database overwrites another database's data
  • 11558: Dolt ignores default backslash escaping for wildcard characters in a window child
  • 11907: IN predicate ignores utf8mb4_unicode_ci for accent-insensitive comparisons
  • 5925: Update triggers do not fire on INSERT INTO...ON DUPLICATE KEY UPDATE...
  • 11968: WHERE returns a row for an IN predicate that evaluates to FALSE
  • 10567: GREATEST and LEAST functions should return decimal type when args are decimal types
  • 8961: Generated Columns deleted the VECTOR index.
  • 11949: git remote: since v2.1.2 a pull can re-download the whole database, because each process deletes its fetch ref
  • 11910: LIKE does not honor MySQL's default backslash escape
  • 11903: String literals drop the backslash in % and _, so LIKE '%_%' matches every row (differs from MySQL)
  • 9315: dolt log takes really long time.
  • 11916: GitBlobstore: every ranged read re-inflates the git object from byte 0 — pulls from git remotes are O(reads × part size) (40 min → 2 min with an OID cache)
  • 11781: ALTER TABLE MODIFY COLUMN does not recompute a STORED generated column, leaving rows and indexes stale
  • 11984: License link is broken
  • 11550: Dolt returns a wrong result for REGEXP_LIKE across partitions
  • 11913: Planner drops the NOT from the first of two ANDed NOT IN (subquery) predicates when its subquery is a UNION — query returns exactly the excluded rows
  • 11919: STR_TO_DATE() with BLOB argument errors with "invalid type: []uint8"
  • 11906: Incorrect CAST from BIGINT UNSIGNED to SIGNED
  • 8657: Vector index lookup errors when index is non-covering.
  • 3838: Add explicit metadata flag on Collation for binary collations
  • 3837: Emit ER_INVALID_CHARACTER_STRING on malformed multi-byte character strings instead of returning ErrCollationMalformedString

Don't miss a new dolt release

NewReleases is sending notifications on new releases.