Merged PRs
dolt
- 7778: Bump mysql2 from 3.9.4 to 3.9.7 in /integration-tests/mysql-client-tests/node
Bumps mysql2 from 3.9.4 to 3.9.7. - 7775: Allow updating conflict table even if the underlying table schema changed.
This is an old check from before we had schema merge. I'm convinced that it was never actually needed. This PR has the necessary changes in order to remove it.
It's important that the user is able to resolve data conflicts even if the table schema has changed, because otherwise it is not possible to manually resolve data conflicts after a schema merge.
This PR also contains some additional tests, some of which are currently disabled because of #7767 and #7762 - 7771: Don't generate new tags for column type changes
Currently, when a column's type changes to a new type family (e.g. changing fromvarchar
toint
), we assign a new column tag. This prevents us from easily identifying the column across type changes. For example:- If column X is renamed and then its type is later changed, we can't track it across the rename or type change anymore. This usage pattern removes the value that column tags were intended to provide.
- If column X changes its type, we can't easily differentiate between column X being dropped and a new column X being added. Heuristically, we can look at all the data in the table if it's all exactly identical, then we know it's a rename, but this is a somewhat hacky heuristic that can become ambiguous in more nuanced cases. This currently causes us to generate incorrect SQL patch statements that drops the renamed column and adds a new column. If customers were to apply these incorrect patch statements, it would drop all the data from their existing column, instead of converting it to the new type. This affects
dolt_patch()
anddolt diff -r sql
and also prevents us from generating correct DDL statements for binlog replication.
This PR changes schema alterations so that columns now retain their original column tag across type changes, which fixes the issues above.
A side effect of this change is that if a customer is working on a branch, creates a column, and changes its type, the tag won't match if the schema on another branch is updated to the final type change (i.e. without going through the initial/intermediary type). Code was originally added for this case (see: #3950), however, since then, we have added support for schema merging and this isn't an issue anymore. I've confirmed that we can successfully merge non-matching column tags, from both directions, and added a test for this case, too.
Longer-term, I agree we should continue exploring removing tags completely, but in the short-term, this fixes a correctness problem with SQL patch statement generation that binlog support needs.
Related to: #6710 (comment)
- 7769:
AUTO_INCREMENT
columns haveNOT NULL
constraint
companion pr: dolthub/go-mysql-server#2467 - 7768: fix: fix function name
- 7731: [nbs] getMany read planning and parallelize
Add read planning for journal getMany so instead of doing randIO we get seqIO. SeqIO has a large effect for disk storage systems. Also parallelize getMany calls. The biggest change here is the semantics around how reading locks the journal file. Reads hold the journal lock for longer, which could lower write throughput in some cases. If we see evidence of this, we can do more work to limit the amount of time batch reads can interruptibly holding the journal lock.
go-mysql-server
- 2468: Remove session mutex, status variables atomic inc
Avoid concurrent ctx use in doQuery. I standardized the session status variables to uint64 to make it easier to have them be atomics. The return types for these variables in MySQL seem to be strings, so switching them from int640->uint64 seems OK. We could always change the presentation layer later. Removing the session mutex appears to be safe after these changes. - 2467: improve
DESCRIBE
columns and auto_increment bugs
This PR makes it so our DESCRIBE statement is more correct when there are unique keys.
There's an edge case we miss:In MySQL,create table t (i int not null, j int not null, unique key (j), unique key (i)); describe t;
UNIQUE KEY j
is created beforeUNIQUE KEY i
, so describe makesj
asPRI
.
In Dolt, we store indexes in a map and return them in order of index name, so we marki
asPRI
.
There are skipped tests for this
Additionally, this adds theNOT NULL
constraint to columns that are markedAUTO_INCREMENT
.
partially addresses: #2289 - 2465: projection schema finds default values
fixes: #6016 - 2464: skipping auto_increment on error tests
I was wrong, this is very broken in dolt.
Could not find a quick fix, so skipping tests to unblock auto-bumps.
reopens: #3157
vitess
- 340: improving partition parsing
partially addresses: dolthub/go-mysql-server#2472 - 337: Consistently using pointer to AliasedValues in InsertRows interface, never values.
Once again, golang reminds me that a value type implementing an interface forces the pointer type to also implement the interface, and mixing the two messes up our runtime type reflection.
I changed all uses of the AliasedValues in InsertRows interface to be pointers so that we can interact with them consistently on the GMS side.
Closed Issues
- 3129:
dolt login
works with DoltHub, but not a DoltLab instance
Performance
Read Tests | MySQL | Dolt | Multiple |
---|---|---|---|
covering_index_scan | 2.11 | 3.02 | 1.4 |
groupby_scan | 13.22 | 17.63 | 1.3 |
index_join | 1.34 | 5.18 | 3.9 |
index_join_scan | 1.27 | 2.26 | 1.8 |
index_scan | 33.72 | 53.85 | 1.6 |
oltp_point_select | 0.17 | 0.52 | 3.1 |
oltp_read_only | 3.36 | 8.58 | 2.6 |
select_random_points | 0.33 | 0.83 | 2.5 |
select_random_ranges | 0.39 | 0.99 | 2.5 |
table_scan | 34.33 | 54.83 | 1.6 |
types_table_scan | 75.82 | 161.51 | 2.1 |
reads_mean_multiplier | 2.2 |
Write Tests | MySQL | Dolt | Multiple |
---|---|---|---|
oltp_delete_insert | 7.84 | 6.79 | 0.9 |
oltp_insert | 3.75 | 3.36 | 0.9 |
oltp_read_write | 8.28 | 16.41 | 2.0 |
oltp_update_index | 3.82 | 3.49 | 0.9 |
oltp_update_non_index | 3.82 | 3.43 | 0.9 |
oltp_write_only | 5.28 | 7.84 | 1.5 |
types_delete_insert | 7.56 | 7.56 | 1.0 |
writes_mean_multiplier | 1.2 |
TPC-C TPS Tests | MySQL | Dolt | Multiple |
---|---|---|---|
tpcc-scale-factor-1 | 101.85 | 2.36 | 3.7 |
tpcc_tps_multiplier | 3.7 |
Overall Mean Multiple | 2.37 |
---|