Skip to content

Commit 6060c04

Browse files
author
James Cor
committed
more test fixes
1 parent dbea7ec commit 6060c04

File tree

3 files changed

+144
-237
lines changed

3 files changed

+144
-237
lines changed

sql/expression/comparison.go

Lines changed: 7 additions & 187 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,7 @@ func (c *comparison) Compare(ctx *sql.Context, row sql.Row) (int, error) {
142142
return c.Left().Type().Compare(ctx, left, right)
143143
}
144144

145-
l, r, compareType, err := c.CastLeftAndRight(ctx, left, right)
146-
if err != nil {
147-
return 0, err
148-
}
145+
l, r, compareType := c.castLeftAndRight(ctx, left, right)
149146

150147
// Set comparison relies on empty strings not being converted yet
151148
if types.IsSet(compareType) {
@@ -172,200 +169,31 @@ func (c *comparison) evalLeftAndRight(ctx *sql.Context, row sql.Row) (interface{
172169
return left, right, nil
173170
}
174171

175-
func (c *comparison) CastLeftAndRight(ctx *sql.Context, left, right interface{}) (interface{}, interface{}, sql.Type, error) {
176-
//leftType := c.Left().Type()
177-
//rightType := c.Right().Type()
178-
//
179-
//leftIsEnumOrSet := types.IsEnum(leftType) || types.IsSet(leftType)
180-
//rightIsEnumOrSet := types.IsEnum(rightType) || types.IsSet(rightType)
181-
//// Only convert if same Enum or Set
182-
//if leftIsEnumOrSet && rightIsEnumOrSet {
183-
// if types.TypesEqual(leftType, rightType) {
184-
// return left, right, leftType, nil
185-
// }
186-
//} else {
187-
// // If right side is convertible to enum/set, convert. Otherwise, convert left side
188-
// if leftIsEnumOrSet && (types.IsText(rightType) || types.IsNumber(rightType)) {
189-
// if r, inRange, err := leftType.Convert(ctx, right); inRange && err == nil {
190-
// return left, r, leftType, nil
191-
// } else {
192-
// l, _, err := types.TypeAwareConversion(ctx, left, leftType, rightType, false)
193-
// if err != nil {
194-
// return nil, nil, nil, err
195-
// }
196-
// return l, right, rightType, nil
197-
// }
198-
// }
199-
// // If left side is convertible to enum/set, convert. Otherwise, convert right side
200-
// if rightIsEnumOrSet && (types.IsText(leftType) || types.IsNumber(leftType)) {
201-
// if l, inRange, err := rightType.Convert(ctx, left); inRange && err == nil {
202-
// return l, right, rightType, nil
203-
// } else {
204-
// r, _, err := types.TypeAwareConversion(ctx, right, rightType, leftType, false)
205-
// if err != nil {
206-
// return nil, nil, nil, err
207-
// }
208-
// return left, r, leftType, nil
209-
// }
210-
// }
211-
//}
212-
//
213-
//if types.IsTimespan(leftType) || types.IsTimespan(rightType) {
214-
// if l, err := types.Time.ConvertToTimespan(left); err == nil {
215-
// if r, err := types.Time.ConvertToTimespan(right); err == nil {
216-
// return l, r, types.Time, nil
217-
// }
218-
// }
219-
//}
220-
//
221-
//if types.IsTuple(leftType) && types.IsTuple(rightType) {
222-
// return left, right, c.Left().Type(), nil
223-
//}
224-
//
225-
//if types.IsTime(leftType) || types.IsTime(rightType) {
226-
// l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDatetime)
227-
// if err != nil {
228-
// return nil, nil, nil, err
229-
// }
230-
//
231-
// return l, r, types.DatetimeMaxPrecision, nil
232-
//}
233-
//
234-
//// Rely on types.JSON.Compare to handle JSON comparisons
235-
//if types.IsJSON(leftType) || types.IsJSON(rightType) {
236-
// return left, right, types.JSON, nil
237-
//}
238-
//
239-
//if types.IsBinaryType(leftType) || types.IsBinaryType(rightType) {
240-
// l, r, err := convertLeftAndRight(ctx, left, right, ConvertToBinary)
241-
// if err != nil {
242-
// return nil, nil, nil, err
243-
// }
244-
// return l, r, types.LongBlob, nil
245-
//}
246-
//
247-
//if types.IsNumber(leftType) || types.IsNumber(rightType) {
248-
// if types.IsDecimal(leftType) || types.IsDecimal(rightType) {
249-
// //TODO: We need to set to the actual DECIMAL type
250-
// l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDecimal)
251-
// if err != nil {
252-
// return nil, nil, nil, err
253-
// }
254-
//
255-
// if types.IsDecimal(leftType) {
256-
// return l, r, leftType, nil
257-
// } else {
258-
// return l, r, rightType, nil
259-
// }
260-
// }
261-
//
262-
// if types.IsFloat(leftType) || types.IsFloat(rightType) {
263-
// l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDouble)
264-
// if err != nil {
265-
// return nil, nil, nil, err
266-
// }
267-
//
268-
// return l, r, types.Float64, nil
269-
// }
270-
//
271-
// if types.IsSigned(leftType) && types.IsSigned(rightType) {
272-
// l, r, err := convertLeftAndRight(ctx, left, right, ConvertToSigned)
273-
// if err != nil {
274-
// return nil, nil, nil, err
275-
// }
276-
//
277-
// return l, r, types.Int64, nil
278-
// }
279-
//
280-
// if types.IsUnsigned(leftType) && types.IsUnsigned(rightType) {
281-
// l, r, err := convertLeftAndRight(ctx, left, right, ConvertToUnsigned)
282-
// if err != nil {
283-
// return nil, nil, nil, err
284-
// }
285-
//
286-
// return l, r, types.Uint64, nil
287-
// }
288-
//
289-
// l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDouble)
290-
// if err != nil {
291-
// return nil, nil, nil, err
292-
// }
293-
//
294-
// return l, r, types.Float64, nil
295-
//}
296-
//
297-
//left, right, err := convertLeftAndRight(ctx, left, right, ConvertToChar)
298-
//if err != nil {
299-
// return nil, nil, nil, err
300-
//}
301-
//
302-
//return left, right, types.LongText, nil
303-
172+
// castLeftAndRight will find the appropriate type to cast both left and right to for comparison.
173+
// All errors are ignored, except for warnings about truncation.
174+
func (c *comparison) castLeftAndRight(ctx *sql.Context, left, right interface{}) (interface{}, interface{}, sql.Type) {
304175
lType := c.Left().Type()
305176
rType := c.Right().Type()
306-
307-
//lIsEnumOrSet := types.IsEnum(lType) || types.IsSet(lType)
308-
//rIsEnumOrSet := types.IsEnum(rType) || types.IsSet(rType)
309-
//// If right side is convertible to enum/set, convert. Otherwise, convert left side
310-
//if lIsEnumOrSet && (types.IsText(rType) || types.IsNumber(rType)) {
311-
// if r, inRange, err := lType.Convert(ctx, right); inRange && err == nil {
312-
// return left, r, lType, nil
313-
// }
314-
// l, _, err := types.TypeAwareConversion(ctx, left, lType, rType, false)
315-
// if err != nil {
316-
// return nil, nil, nil, err
317-
// }
318-
// return l, right, rType, nil
319-
//}
320-
//// If left side is convertible to enum/set, convert. Otherwise, convert right side
321-
//if rIsEnumOrSet && (types.IsText(lType) || types.IsNumber(lType)) {
322-
// if l, inRange, err := rType.Convert(ctx, left); inRange && err == nil {
323-
// return l, right, rType, nil
324-
// }
325-
// r, _, err := types.TypeAwareConversion(ctx, right, rType, lType, false)
326-
// if err != nil {
327-
// return nil, nil, nil, err
328-
// }
329-
// return left, r, lType, nil
330-
//}
331-
332177
compType := types.GetCompareType(lType, rType)
333178

334179
// Special case for JSON types
335180
if types.IsJSON(compType) {
336-
return left, right, compType, nil
181+
return left, right, compType
337182
}
338183

339184
l, _, err := types.TypeAwareConversion(ctx, left, lType, compType, false)
340185
if err != nil {
341186
if sql.ErrTruncatedIncorrect.Is(err) {
342187
ctx.Warn(mysql.ERTruncatedWrongValue, "%s", err.Error())
343188
}
344-
// TODO: ignore all other errors?
345189
}
346190
r, _, err := types.TypeAwareConversion(ctx, right, rType, compType, false)
347191
if err != nil {
348192
if sql.ErrTruncatedIncorrect.Is(err) {
349193
ctx.Warn(mysql.ERTruncatedWrongValue, "%s", err.Error())
350194
}
351-
// TODO: ignore all other errors?
352195
}
353-
return l, r, compType, nil
354-
}
355-
356-
// TODO: delete if everything else works out
357-
func convertLeftAndRight(ctx *sql.Context, left, right interface{}, convertTo string) (interface{}, interface{}, error) {
358-
l, err := convertValue(ctx, left, convertTo, nil, 0, 0)
359-
if err != nil {
360-
return nil, nil, err
361-
}
362-
363-
r, err := convertValue(ctx, right, convertTo, nil, 0, 0)
364-
if err != nil {
365-
return nil, nil, err
366-
}
367-
368-
return l, r, nil
196+
return l, r, compType
369197
}
370198

371199
// Type implements the Expression interface.
@@ -500,15 +328,7 @@ func (e *NullSafeEquals) Compare(ctx *sql.Context, row sql.Row) (int, error) {
500328
return -1, nil
501329
}
502330

503-
if types.TypesEqual(e.Left().Type(), e.Right().Type()) {
504-
return e.Left().Type().Compare(ctx, left, right)
505-
}
506-
507-
var compareType sql.Type
508-
left, right, compareType, err = e.CastLeftAndRight(ctx, left, right)
509-
if err != nil {
510-
return 0, err
511-
}
331+
left, right, compareType := e.castLeftAndRight(ctx, left, right)
512332

513333
return compareType.Compare(ctx, left, right)
514334
}

sql/rowexec/insert.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,6 @@ func (i *insertIter) Next(ctx *sql.Context) (returnRow sql.Row, returnErr error)
125125
var converted any
126126
var inRange sql.ConvertInRange
127127
var cErr error
128-
// TODO: AAAAHHH
129-
// Hex strings shouldn't make it this far
130-
//val, cErr = types.ConvertHexBlobToUint(row[idx], col.Type)
131-
//if cErr != nil {
132-
// return nil, i.ignoreOrClose(ctx, origRow, cErr)
133-
//}
134128
if typ, ok := col.Type.(sql.RoundingNumberType); ok {
135129
converted, inRange, cErr = typ.ConvertRound(ctx, val)
136130
} else {

0 commit comments

Comments
 (0)