From 0873caea36409c4779346debb1fd6bb011aa717f Mon Sep 17 00:00:00 2001 From: James Cor Date: Wed, 10 Dec 2025 15:47:04 -0800 Subject: [PATCH] [no-release-notes] Handle new `sql.ConvertInRange` values (#10189) --- go/go.mod | 2 +- go/go.sum | 4 +- .../doltcore/merge/merge_prolly_rows.go | 2 +- .../doltcore/merge/schema_merge_test.go | 4 +- .../doltcore/sqle/dtables/prolly_row_conv.go | 2 +- .../doltcore/sqle/index/dolt_index.go | 5 +- go/libraries/doltcore/sqle/tables.go | 76 +++++++++---------- go/store/prolly/tree/json_diff_test.go | 4 +- .../prolly/tree/json_indexed_document_test.go | 2 +- 9 files changed, 51 insertions(+), 50 deletions(-) diff --git a/go/go.mod b/go/go.mod index 4526bd484f..810ce41e19 100644 --- a/go/go.mod +++ b/go/go.mod @@ -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 diff --git a/go/go.sum b/go/go.sum index 54e9d30e5f..f694f23ca5 100644 --- a/go/go.sum +++ b/go/go.sum @@ -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= diff --git a/go/libraries/doltcore/merge/merge_prolly_rows.go b/go/libraries/doltcore/merge/merge_prolly_rows.go index 9c39954d34..3ea2286ba4 100644 --- a/go/libraries/doltcore/merge/merge_prolly_rows.go +++ b/go/libraries/doltcore/merge/merge_prolly_rows.go @@ -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 diff --git a/go/libraries/doltcore/merge/schema_merge_test.go b/go/libraries/doltcore/merge/schema_merge_test.go index 2ea418158a..02c7023068 100644 --- a/go/libraries/doltcore/merge/schema_merge_test.go +++ b/go/libraries/doltcore/merge/schema_merge_test.go @@ -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) diff --git a/go/libraries/doltcore/sqle/dtables/prolly_row_conv.go b/go/libraries/doltcore/sqle/dtables/prolly_row_conv.go index 52a9ededc1..307a0331d7 100644 --- a/go/libraries/doltcore/sqle/dtables/prolly_row_conv.go +++ b/go/libraries/doltcore/sqle/dtables/prolly_row_conv.go @@ -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 { diff --git a/go/libraries/doltcore/sqle/index/dolt_index.go b/go/libraries/doltcore/sqle/index/dolt_index.go index fc992af1e5..1c2548696d 100644 --- a/go/libraries/doltcore/sqle/index/dolt_index.go +++ b/go/libraries/doltcore/sqle/index/dolt_index.go @@ -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 diff --git a/go/libraries/doltcore/sqle/tables.go b/go/libraries/doltcore/sqle/tables.go index d94dac5cf1..f97e792bc1 100644 --- a/go/libraries/doltcore/sqle/tables.go +++ b/go/libraries/doltcore/sqle/tables.go @@ -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 diff --git a/go/store/prolly/tree/json_diff_test.go b/go/store/prolly/tree/json_diff_test.go index d1a1428560..c3f2ebb90e 100644 --- a/go/store/prolly/tree/json_diff_test.go +++ b/go/store/prolly/tree/json_diff_test.go @@ -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) diff --git a/go/store/prolly/tree/json_indexed_document_test.go b/go/store/prolly/tree/json_indexed_document_test.go index b3cb238878..1474cc44e1 100644 --- a/go/store/prolly/tree/json_indexed_document_test.go +++ b/go/store/prolly/tree/json_indexed_document_test.go @@ -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}