@@ -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}
0 commit comments