This release contains backwards incompatible changes:
- Geometry Address Encoding – Previously, Geometry Types were stored inline, which subjected them to a 65K size limit. To support larger Geometries, we now store them as
BLOB
s. This required an entirely new encoding as well as storage layer changes. As a result, we have bumped the feature version. For now, newer versions of the dolt client can still read the inline geometries, but older dolt clients will not be able to read newer databases. Eventually, we will deprecate the old geometry encoding entirely so we recommend doing adolt dump
and import if you have any tables with spatial types.
Per Dolt’s versioning policy, this is a minor version bump because these changes may impact existing applications. Please reach out to us on GitHub or Discord if you have questions or need help with any of these changes.
Merged PRs
dolt
- 6978: Change to use a crash resistant, atomic file update protocol for a number of file writes.
Makes updates to branch_control, repo_state.json and some persisted config files atomic and crash resistant. - 6976: go/store/nbs: file_table_persister: fsync whole table file writes.
Dolt sometimes persists whole table files, instead of appending blocks to the chunk journal. In order to be as crash resistent as the chunk journal, we should fsync the writes before we add the new table file to the database.
Cases which use this code path and could have seen reduced durability across crashes include: dolt_fetch, dolt_pull, dolt_clone, dolt_gc, and dolt_push/dolt_backup to a file remote. - 6973: make
GeomAddrEnc
known as an address encoding
The addition of the newGeomAddrEnc
needs to be explicitly known as an address type, so thatdolt gc
doesn't delete the chunks created.
fixes #6969 - 6942: indexing refactor bump
go-mysql-server
- 2140: Respect
character_set_results
when emitting field metadata
For non-binary types, we need to respect the value for thecharacter_set_results
session var (when notNULL
) and use that for the field metadata returned in the MySQL wire protocol.
The unexpected charset/collation metadata is causing DataGrip to be unable to work with some types in the table editor ( see #6970 for more details).
I've validated this behavior with MySQL by inspecting packets with Wireshark. For testing, we were already testing the behavior ofcharacter_set_results
and the charset translation, but we weren't testing the field metadata. I added support to check against the expect charset field metadata, but had to use reflection to get that data from the MySQL driver, since it's not exposed through the standard golang sql database APIs. - 2138: Fixed SET working for invalid charsets/collations
Fices #6972 - 2137: fix nested subquery filter in
exists
We do not explore the children ofsubquery
when attempting to decorrelate filters forexists
queries; we now do this through the use ofsubquery.Correlated()
.
We should also avoid using uncacheable subqueries as keys forIndexLookups
.
fixes #6898 - 2136: Fix nil range correctness bug
We accidentally treated an OR conjunction that contributes no index filters as equivalent to an empty range. As a result, we were dropping ranges in index scans.
For example, this is the flattened version of the test query added:
Filters 3 and 4 are supported by the chosen index. We want to exclude 9. We build the range collection ORs before leaves, so we attempt to collect 4->9->3. So when we convert 9 to a range collection, we expect nil, but need that nil to not zero out the 3 ranges we have already accumulated.(1: and (3: tab3.col0 > 80) (4: or (5: and (6: tab3.col0 >= 87) (7: tab3.col0 <= 9)) (8: tab3.col0 IS NULL)) (9: or (10: tab3.col1 >= 71.7) (11: and (12: tab3.col0 >= 94) (13: or (15: tab3.col0 < 66) (16: and (17: tab3.col0 = 85) (18: tab3.col1 <= 42.15)) (19: tab3.col0 = 30)))))
- 2134: Costed index scan framework
This is the accumulation of the following PRs:
dolthub/go-mysql-server#2093
dolthub/go-mysql-server#2104
dolthub/go-mysql-server#2112
dolthub/go-mysql-server#2124 - 2131: Fixed Full-Text defaults
Fixes #6941
Full-Text schema validation also considered the default expressions, which do not matter for the pseudo-index tables. The default expression evaluation occurs before the table editors are involved, so they're always receiving fully-realized rows. This means that we can skip the default check, since it doesn't matter whether the tables have default expressions or not.
The root cause for the bug was due to comparing pointers. Same contents for the expressions, but different pointers to different objects, so defaults would always cause failure. - 2126: fix inner join filter pushdown, and alias matching
This PR fixes an issue we have with InnerJoins where the filter condition uses a function and references columns from both tables. We need to properly search the expressions in aSubqueryExpression
.
Additionally, addresses an getIdx bug involving unqualifying aliases.
partially fixes #6898
vitess
- 289: add partial support for ':=' assignment operator
This PR adds support for set expressions and assignment expressions.
Does not include support for select expressions, as it's deprecated on MySQL - 288: allow unquoted non reserved keywords for drop and rename column ddl
fixes #6950
Closed Issues
- 6969: Upload to dolthub won't work for new
GEOMETRY
columns - 6972: Panic caused by invalid result character set
- 6927: "value exceeded max field size of 65kb" when inserting large geometry
Latency
Read Tests | MySQL | Dolt | Multiple |
---|---|---|---|
covering_index_scan | 2.11 | 2.76 | 1.3 |
groupby_scan | 13.7 | 17.32 | 1.3 |
index_join | 1.34 | 5.0 | 3.7 |
index_join_scan | 1.25 | 2.18 | 1.7 |
index_scan | 34.33 | 54.83 | 1.6 |
oltp_point_select | 0.17 | 0.43 | 2.5 |
oltp_read_only | 3.3 | 7.56 | 2.3 |
select_random_points | 0.32 | 0.72 | 2.2 |
select_random_ranges | 0.38 | 0.86 | 2.3 |
table_scan | 34.33 | 54.83 | 1.6 |
types_table_scan | 74.46 | 155.8 | 2.1 |
reads_mean_multiplier | 2.1 |
Write Tests | MySQL | Dolt | Multiple |
---|---|---|---|
oltp_delete_insert | 7.98 | 6.79 | 0.9 |
oltp_insert | 3.75 | 3.36 | 0.9 |
oltp_read_write | 8.28 | 15.0 | 1.8 |
oltp_update_index | 3.82 | 3.36 | 0.9 |
oltp_update_non_index | 3.82 | 3.3 | 0.9 |
oltp_write_only | 5.28 | 7.56 | 1.4 |
types_delete_insert | 7.56 | 7.43 | 1.0 |
writes_mean_multiplier | 1.1 |
Overall Mean Multiple | 1.6 |
---|