[no-release-notes] Handle new sql.ConvertInRange values (#10189)

This commit is contained in:
James Cor
2025-12-10 15:47:04 -08:00
committed by GitHub
parent 839a62d04f
commit 0873caea36
9 changed files with 51 additions and 50 deletions

View File

@@ -61,7 +61,7 @@ require (
github.com/dolthub/dolt-mcp v0.2.2
github.com/dolthub/eventsapi_schema v0.0.0-20250915094920-eadfd39051ca
github.com/dolthub/flatbuffers/v23 v23.3.3-dh.2
github.com/dolthub/go-mysql-server v0.20.1-0.20251210203732-73e40081ee14
github.com/dolthub/go-mysql-server v0.20.1-0.20251210220151-1979d2474d7d
github.com/dolthub/gozstd v0.0.0-20240423170813-23a2903bca63
github.com/edsrzf/mmap-go v1.2.0
github.com/esote/minmaxheap v1.0.0

View File

@@ -195,8 +195,8 @@ github.com/dolthub/fslock v0.0.3 h1:iLMpUIvJKMKm92+N1fmHVdxJP5NdyDK5bK7z7Ba2s2U=
github.com/dolthub/fslock v0.0.3/go.mod h1:QWql+P17oAAMLnL4HGB5tiovtDuAjdDTPbuqx7bYfa0=
github.com/dolthub/go-icu-regex v0.0.0-20250916051405-78a38d478790 h1:zxMsH7RLiG+dlZ/y0LgJHTV26XoiSJcuWq+em6t6VVc=
github.com/dolthub/go-icu-regex v0.0.0-20250916051405-78a38d478790/go.mod h1:F3cnm+vMRK1HaU6+rNqQrOCyR03HHhR1GWG2gnPOqaE=
github.com/dolthub/go-mysql-server v0.20.1-0.20251210203732-73e40081ee14 h1:LTysfefg3bPyJ1klzIrq/kkiwGfLPhlN/38ZCIg3Kxo=
github.com/dolthub/go-mysql-server v0.20.1-0.20251210203732-73e40081ee14/go.mod h1:NjewWKoa5bVSLdKwL7fg7eAfrcIxDybWUKoWEHWRTw4=
github.com/dolthub/go-mysql-server v0.20.1-0.20251210220151-1979d2474d7d h1:PO6Nwm6RRc9+tPbV0mDf1uN3SWaLA0XkD8lNSvXUbFY=
github.com/dolthub/go-mysql-server v0.20.1-0.20251210220151-1979d2474d7d/go.mod h1:NjewWKoa5bVSLdKwL7fg7eAfrcIxDybWUKoWEHWRTw4=
github.com/dolthub/gozstd v0.0.0-20240423170813-23a2903bca63 h1:OAsXLAPL4du6tfbBgK0xXHZkOlos63RdKYS3Sgw/dfI=
github.com/dolthub/gozstd v0.0.0-20240423170813-23a2903bca63/go.mod h1:lV7lUeuDhH5thVGDCKXbatwKy2KW80L4rMT46n+Y2/Q=
github.com/dolthub/ishell v0.0.0-20240701202509-2b217167d718 h1:lT7hE5k+0nkBdj/1UOSFwjWpNxf+LCApbRHgnCA17XE=

View File

@@ -1747,7 +1747,7 @@ func convertValueToNewType(ctx *sql.Context, value interface{}, newTypeInfo type
if err != nil {
return nil, err
}
if !inRange {
if inRange != sql.InRange {
return nil, fmt.Errorf("out of range conversion for value %v to type %s", value, newTypeInfo.String())
}
return newValue, nil

View File

@@ -1442,7 +1442,7 @@ func jsonMergeLargeDocumentTests(t *testing.T) []schemaMergeTest {
insert := func(document sqltypes.MutableJSON, path string, val interface{}) sqltypes.MutableJSON {
jsonVal, inRange, err := sqltypes.JSON.Convert(ctx, val)
require.NoError(t, err)
require.True(t, (bool)(inRange))
require.True(t, inRange == sql.InRange)
newDoc, changed, err := document.Insert(ctx, path, jsonVal.(sql.JSONWrapper))
require.NoError(t, err)
require.True(t, changed)
@@ -1452,7 +1452,7 @@ func jsonMergeLargeDocumentTests(t *testing.T) []schemaMergeTest {
set := func(document sqltypes.MutableJSON, path string, val interface{}) sqltypes.MutableJSON {
jsonVal, inRange, err := sqltypes.JSON.Convert(ctx, val)
require.NoError(t, err)
require.True(t, (bool)(inRange))
require.True(t, inRange == sql.InRange)
newDoc, changed, err := document.Replace(ctx, path, jsonVal.(sql.JSONWrapper))
require.NoError(t, err)
require.True(t, changed)

View File

@@ -139,7 +139,7 @@ func (c ProllyRowConverter) putFields(ctx context.Context, tup val.Tuple, proj v
c.warnFn(rowconv.DatatypeCoercionFailureWarningCode, rowconv.DatatypeCoercionFailureWarning, col.Name)
dstRow[j] = nil
err = nil
} else if !inRange {
} else if inRange != sql.InRange && c.warnFn != nil {
c.warnFn(rowconv.TruncatedOutOfRangeValueWarningCode, rowconv.TruncatedOutOfRangeValueWarning, t, f)
dstRow[j] = nil
} else if err != nil {

View File

@@ -1407,8 +1407,9 @@ func getRangeCutValue(ctx context.Context, cut sql.MySQLRangeCut, typ sql.Type)
if _, ok := cut.(sql.AboveNull); ok {
return nil, nil
}
ret, oob, err := typ.Convert(ctx, sql.GetMySQLRangeCutKey(cut))
if oob == sql.OutOfRange {
ret, inRange, err := typ.Convert(ctx, sql.GetMySQLRangeCutKey(cut))
// TODO: seems like we should check for error before inRange, but certain tests fail
if inRange != sql.InRange {
return ret, nil
}
return ret, err

View File

@@ -169,46 +169,46 @@ func (t *DoltTable) LookupForExpressions(ctx *sql.Context, exprs ...sql.Expressi
dbState.SessionCache().CacheStrictLookup(schKey, lookups)
}
cols := schCols.GetColumns()
for _, lookup := range lookups {
if lookup.Cols.Intersection(colset).Len() == lookup.Cols.Len() {
// (1) assign lookup columns to range expressions in the appropriate
// order for the given lookup.
// (2) aggregate the unused expressions into the return filter.
rb := sql.NewEqualityIndexBuilder(lookup.Idx)
for _, c2 := range lookupCols {
var matched bool
var matchIdx int
for i, ord := range lookup.Ordinals {
// the ordinals redirection accounts for index
// columns not in schema order
idx := ord - 1
c := schCols.GetColumns()[idx]
if strings.EqualFold(c2.Col, c.Name) {
matched = true
matchIdx = i
break
}
}
if matched {
if err := rb.AddEquality(ctx, matchIdx, c2.Lit.Value()); err != nil {
return sql.IndexLookup{}, nil, nil, false, nil
}
}
if !matched || !expression.PreciseComparison(c2.Eq) {
if leftoverExpr == nil {
leftoverExpr = c2.Eq
} else {
leftoverExpr = expression.NewAnd(leftoverExpr, c2.Eq)
}
}
}
ret, err := rb.Build(ctx)
if err != nil {
return sql.IndexLookup{}, nil, nil, false, err
}
return ret, lookup.Fds, leftoverExpr, true, nil
// Every column must be specified in search
if lookup.Cols.Intersection(colset).Len() != lookup.Cols.Len() {
continue
}
// (1) assign lookup columns to range expressions in the appropriate order for the given lookup.
// (2) aggregate the unused expressions into the return filter.
rb := sql.NewEqualityIndexBuilder(lookup.Idx)
for _, c2 := range lookupCols {
matchIdx := -1
for i, ord := range lookup.Ordinals {
// the ordinals redirection accounts for index
// columns not in schema order
idx := ord - 1
c := cols[idx]
if strings.EqualFold(c2.Col, c.Name) {
matchIdx = i
break
}
}
if matchIdx != -1 {
if err = rb.AddEquality(ctx, matchIdx, c2.Lit.Value()); err != nil {
return sql.IndexLookup{}, nil, nil, false, nil
}
continue
}
if leftoverExpr == nil {
leftoverExpr = c2.Eq
} else {
leftoverExpr = expression.NewAnd(leftoverExpr, c2.Eq)
}
}
var ret sql.IndexLookup
ret, err = rb.Build(ctx)
if err != nil {
return sql.IndexLookup{}, nil, nil, false, err
}
return ret, lookup.Fds, leftoverExpr, true, nil
}
return sql.IndexLookup{}, nil, nil, false, nil

View File

@@ -39,7 +39,7 @@ func largeJsonDiffTests(t *testing.T) []JsonDiffTest {
insert := func(document types.MutableJSON, path string, val interface{}) types.MutableJSON {
jsonVal, inRange, err := types.JSON.Convert(ctx, val)
require.NoError(t, err)
require.True(t, (bool)(inRange))
require.True(t, inRange == sql.InRange)
document = document.Clone(ctx).(types.MutableJSON)
newDoc, changed, err := document.Insert(ctx, path, jsonVal.(sql.JSONWrapper))
require.NoError(t, err)
@@ -50,7 +50,7 @@ func largeJsonDiffTests(t *testing.T) []JsonDiffTest {
set := func(document types.MutableJSON, path string, val interface{}) types.MutableJSON {
jsonVal, inRange, err := types.JSON.Convert(ctx, val)
require.NoError(t, err)
require.True(t, (bool)(inRange))
require.True(t, inRange == sql.InRange)
newDoc, changed, err := document.Replace(ctx, path, jsonVal.(sql.JSONWrapper))
require.NoError(t, err)
require.True(t, changed)

View File

@@ -322,7 +322,7 @@ func TestJsonCompare(t *testing.T) {
if right != nil {
rightJSON, inRange, err := types.JSON.Convert(ctx, right)
require.NoError(t, err)
require.True(t, bool(inRange))
require.True(t, inRange == sql.InRange)
rightInterface, err := rightJSON.(sql.JSONWrapper).ToInterface(ctx)
require.NoError(t, err)
right = types.JSONDocument{Val: rightInterface}