Merged PRs
dolt
- 8174: check for
pg_catalog
table when resolving a table
Fixes:
dolthub/doltgresql#442
dolthub/doltgresql#513 - 8172: Reveal dolt archive command
Move thedolt admin archive
command todolt archive
- 8164: archive guard rails
Add features to ensure that archive files are not used when running a remotesrv or when pushing backups.
Also provide the--revert
flag which can return a database back to the classic format. - 8137: Dolt index searchable, lookup caching
Two main changes- cache schema hashes on root values, so that we don't have to a table lookup to get a schema hash
- Implement
sql.IndexSearchable
in a way that we cache strict key lookups for a given table schema. The lifecycle for these objects is the span between ALTER TABLE statements
go-mysql-server
- 2610: use datetime precision in information_schema.columns.datetime_precision
When determining if a schema change occurred, one of the tables Prisma looks at is theinformation_schema.columns
.
Here, we incorrectly mark alldatetime
andtimestamp
columns as with a precision of 6.
If a table has typeDATETIME(3)
, Prisma would think there was a schema change, and perform a migration when one isn't needed.
This PR addresses this issue by having theinformation_schema.columns
table accurately reflect the datetime preicision of the columns,
fixes: #8173 - 2604: Index searchable edits
We previously added support for integrators choosing their own indexes with ansql.IndexSearchable
interface. This was for a customer use case. This PR expands the interface to let Dolt cache information about strict key lookups.
The motivation is that (1) strict key lookups will always be the best-case scenario result of index costing, (2) caching this information in-between ALTER statements is usually a long enough lifecycle for the overhead to be worth it.
I added a streamlined range builder as part of this optimization that only accepts literal values in the order expected by the target lookup. The user of this range builder takes responsibility for feeding the values in the correct order. As a result, we sidestep expensive string formatting, map creating, and map lookups during range building.
Follow-on fixes to functional dependencies permuted plans a bit more. Inner joins are chosen more frequently in some of our test plans now that we're reflecting strict key max-1-row cardinalities.
vitess
- 360: Bug fix: Preserve sign for integers in prepared statements
Bound integer values for prepared statements are parsed from the wire and packaged intoint64
values that are then passed to the SQL engine to execute with the prepared statement. Forint8
,int16
,int24
, andint32
types those bytes from the wire weren't getting cast to the correct type first, before they were cast toint64
, which meant if the signed bit was set, the value was interpreted incorrectly.
Customer issue: #8085 - 359: fix detection of multi-statements in
ComPrepare
Currently, preparing multi-statements is not supported; so we can't prepare a query likeselect ?; select ?;
.
However, the check for this condition just looked for any characters after the first;
, which meant that queries likeselect ?; \n
would incorrectly throw an error.
This was made apparent using the Prisma ORM, which runs the query:The above query ends in a newline character.SELECT TABLE_NAME AS view_name, VIEW_DEFINITION AS view_sql FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = ?;
The fix is to useSplitStatementToPieces()
, which trims these white space characters, and check if there's exactly one piece; this was taken from the vitessio repo: https://github.com/vitessio/vitess/blob/main/go/mysql/conn.go#L1204
fixes #8157
Closed Issues
- 4127: Support for date and time literals
- 8173: prisma migrate dev, generating changes to columns of the date type in loop
- 7200: Weird behavior for datetime literal syntax.
- 8157: Error when using Prisma ORM: "Error: unknown error: can not prepare multiple statements"
Performance
Read Tests | MySQL | Dolt | Multiple |
---|---|---|---|
covering_index_scan | 2.11 | 3.02 | 1.4 |
groupby_scan | 13.22 | 17.01 | 1.3 |
index_join | 1.34 | 2.81 | 2.1 |
index_join_scan | 1.27 | 2.22 | 1.7 |
index_scan | 38.25 | 54.83 | 1.4 |
oltp_point_select | 0.18 | 0.44 | 2.4 |
oltp_read_only | 3.49 | 7.56 | 2.2 |
select_random_points | 0.34 | 0.78 | 2.3 |
select_random_ranges | 0.39 | 0.92 | 2.4 |
table_scan | 38.94 | 55.82 | 1.4 |
types_table_scan | 80.03 | 144.97 | 1.8 |
reads_mean_multiplier | 1.9 |
Write Tests | MySQL | Dolt | Multiple |
---|---|---|---|
oltp_delete_insert | 8.13 | 6.09 | 0.7 |
oltp_insert | 3.82 | 3.02 | 0.8 |
oltp_read_write | 8.58 | 13.7 | 1.6 |
oltp_update_index | 3.89 | 3.07 | 0.8 |
oltp_update_non_index | 3.89 | 3.02 | 0.8 |
oltp_write_only | 5.47 | 6.32 | 1.2 |
types_delete_insert | 7.7 | 6.67 | 0.9 |
writes_mean_multiplier | 1.0 |
TPC-C TPS Tests | MySQL | Dolt | Multiple |
---|---|---|---|
tpcc-scale-factor-1 | 99.65 | 36.43 | 2.7 |
tpcc_tps_multiplier | 2.7 |
Overall Mean Multiple | 1.87 |
---|