@@ -16,7 +16,7 @@ package expression
1616
1717import (
1818 "fmt"
19-
19+ "github.com/dolthub/vitess/go/mysql"
2020 errors "gopkg.in/src-d/go-errors.v1"
2121
2222 "github.com/dolthub/go-mysql-server/sql"
@@ -172,135 +172,161 @@ func (c *comparison) evalLeftAndRight(ctx *sql.Context, row sql.Row) (interface{
172172}
173173
174174func (c * comparison ) CastLeftAndRight (ctx * sql.Context , left , right interface {}) (interface {}, interface {}, sql.Type , error ) {
175- leftType := c .Left ().Type ()
176- rightType := c .Right ().Type ()
177-
178- leftIsEnumOrSet := types .IsEnum (leftType ) || types .IsSet (leftType )
179- rightIsEnumOrSet := types .IsEnum (rightType ) || types .IsSet (rightType )
180- // Only convert if same Enum or Set
181- if leftIsEnumOrSet && rightIsEnumOrSet {
182- if types .TypesEqual (leftType , rightType ) {
183- return left , right , leftType , nil
184- }
185- } else {
186- // If right side is convertible to enum/set, convert. Otherwise, convert left side
187- if leftIsEnumOrSet && (types .IsText (rightType ) || types .IsNumber (rightType )) {
188- if r , inRange , err := leftType .Convert (ctx , right ); inRange && err == nil {
189- return left , r , leftType , nil
190- } else {
191- l , _ , err := types .TypeAwareConversion (ctx , left , leftType , rightType , false )
192- if err != nil {
193- return nil , nil , nil , err
194- }
195- return l , right , rightType , nil
196- }
197- }
198- // If left side is convertible to enum/set, convert. Otherwise, convert right side
199- if rightIsEnumOrSet && (types .IsText (leftType ) || types .IsNumber (leftType )) {
200- if l , inRange , err := rightType .Convert (ctx , left ); inRange && err == nil {
201- return l , right , rightType , nil
202- } else {
203- r , _ , err := types .TypeAwareConversion (ctx , right , rightType , leftType , false )
204- if err != nil {
205- return nil , nil , nil , err
206- }
207- return left , r , leftType , nil
208- }
209- }
210- }
211-
212- if types .IsTimespan (leftType ) || types .IsTimespan (rightType ) {
213- if l , err := types .Time .ConvertToTimespan (left ); err == nil {
214- if r , err := types .Time .ConvertToTimespan (right ); err == nil {
215- return l , r , types .Time , nil
216- }
217- }
218- }
219-
220- if types .IsTuple (leftType ) && types .IsTuple (rightType ) {
221- return left , right , c .Left ().Type (), nil
222- }
223-
224- if types .IsTime (leftType ) || types .IsTime (rightType ) {
225- l , r , err := convertLeftAndRight (ctx , left , right , ConvertToDatetime )
226- if err != nil {
227- return nil , nil , nil , err
228- }
229-
230- return l , r , types .DatetimeMaxPrecision , nil
231- }
232-
233- // Rely on types.JSON.Compare to handle JSON comparisons
234- if types .IsJSON (leftType ) || types .IsJSON (rightType ) {
235- return left , right , types .JSON , nil
236- }
237-
238- if types .IsBinaryType (leftType ) || types .IsBinaryType (rightType ) {
239- l , r , err := convertLeftAndRight (ctx , left , right , ConvertToBinary )
240- if err != nil {
241- return nil , nil , nil , err
242- }
243- return l , r , types .LongBlob , nil
244- }
245-
246- if types .IsNumber (leftType ) || types .IsNumber (rightType ) {
247- if types .IsDecimal (leftType ) || types .IsDecimal (rightType ) {
248- //TODO: We need to set to the actual DECIMAL type
249- l , r , err := convertLeftAndRight (ctx , left , right , ConvertToDecimal )
250- if err != nil {
251- return nil , nil , nil , err
252- }
253-
254- if types .IsDecimal (leftType ) {
255- return l , r , leftType , nil
256- } else {
257- return l , r , rightType , nil
258- }
259- }
260-
261- if types .IsFloat (leftType ) || types .IsFloat (rightType ) {
262- l , r , err := convertLeftAndRight (ctx , left , right , ConvertToDouble )
263- if err != nil {
264- return nil , nil , nil , err
265- }
266-
267- return l , r , types .Float64 , nil
268- }
269-
270- if types .IsSigned (leftType ) && types .IsSigned (rightType ) {
271- l , r , err := convertLeftAndRight (ctx , left , right , ConvertToSigned )
272- if err != nil {
273- return nil , nil , nil , err
274- }
275-
276- return l , r , types .Int64 , nil
277- }
278-
279- if types .IsUnsigned (leftType ) && types .IsUnsigned (rightType ) {
280- l , r , err := convertLeftAndRight (ctx , left , right , ConvertToUnsigned )
281- if err != nil {
282- return nil , nil , nil , err
283- }
284-
285- return l , r , types .Uint64 , nil
286- }
287-
288- l , r , err := convertLeftAndRight (ctx , left , right , ConvertToDouble )
289- if err != nil {
290- return nil , nil , nil , err
175+ //leftType := c.Left().Type()
176+ //rightType := c.Right().Type()
177+ //
178+ //leftIsEnumOrSet := types.IsEnum(leftType) || types.IsSet(leftType)
179+ //rightIsEnumOrSet := types.IsEnum(rightType) || types.IsSet(rightType)
180+ //// Only convert if same Enum or Set
181+ //if leftIsEnumOrSet && rightIsEnumOrSet {
182+ // if types.TypesEqual(leftType, rightType) {
183+ // return left, right, leftType, nil
184+ // }
185+ //} else {
186+ // // If right side is convertible to enum/set, convert. Otherwise, convert left side
187+ // if leftIsEnumOrSet && (types.IsText(rightType) || types.IsNumber(rightType)) {
188+ // if r, inRange, err := leftType.Convert(ctx, right); inRange && err == nil {
189+ // return left, r, leftType, nil
190+ // } else {
191+ // l, _, err := types.TypeAwareConversion(ctx, left, leftType, rightType, false)
192+ // if err != nil {
193+ // return nil, nil, nil, err
194+ // }
195+ // return l, right, rightType, nil
196+ // }
197+ // }
198+ // // If left side is convertible to enum/set, convert. Otherwise, convert right side
199+ // if rightIsEnumOrSet && (types.IsText(leftType) || types.IsNumber(leftType)) {
200+ // if l, inRange, err := rightType.Convert(ctx, left); inRange && err == nil {
201+ // return l, right, rightType, nil
202+ // } else {
203+ // r, _, err := types.TypeAwareConversion(ctx, right, rightType, leftType, false)
204+ // if err != nil {
205+ // return nil, nil, nil, err
206+ // }
207+ // return left, r, leftType, nil
208+ // }
209+ // }
210+ //}
211+ //
212+ //if types.IsTimespan(leftType) || types.IsTimespan(rightType) {
213+ // if l, err := types.Time.ConvertToTimespan(left); err == nil {
214+ // if r, err := types.Time.ConvertToTimespan(right); err == nil {
215+ // return l, r, types.Time, nil
216+ // }
217+ // }
218+ //}
219+ //
220+ //if types.IsTuple(leftType) && types.IsTuple(rightType) {
221+ // return left, right, c.Left().Type(), nil
222+ //}
223+ //
224+ //if types.IsTime(leftType) || types.IsTime(rightType) {
225+ // l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDatetime)
226+ // if err != nil {
227+ // return nil, nil, nil, err
228+ // }
229+ //
230+ // return l, r, types.DatetimeMaxPrecision, nil
231+ //}
232+ //
233+ //// Rely on types.JSON.Compare to handle JSON comparisons
234+ //if types.IsJSON(leftType) || types.IsJSON(rightType) {
235+ // return left, right, types.JSON, nil
236+ //}
237+ //
238+ //if types.IsBinaryType(leftType) || types.IsBinaryType(rightType) {
239+ // l, r, err := convertLeftAndRight(ctx, left, right, ConvertToBinary)
240+ // if err != nil {
241+ // return nil, nil, nil, err
242+ // }
243+ // return l, r, types.LongBlob, nil
244+ //}
245+ //
246+ //if types.IsNumber(leftType) || types.IsNumber(rightType) {
247+ // if types.IsDecimal(leftType) || types.IsDecimal(rightType) {
248+ // //TODO: We need to set to the actual DECIMAL type
249+ // l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDecimal)
250+ // if err != nil {
251+ // return nil, nil, nil, err
252+ // }
253+ //
254+ // if types.IsDecimal(leftType) {
255+ // return l, r, leftType, nil
256+ // } else {
257+ // return l, r, rightType, nil
258+ // }
259+ // }
260+ //
261+ // if types.IsFloat(leftType) || types.IsFloat(rightType) {
262+ // l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDouble)
263+ // if err != nil {
264+ // return nil, nil, nil, err
265+ // }
266+ //
267+ // return l, r, types.Float64, nil
268+ // }
269+ //
270+ // if types.IsSigned(leftType) && types.IsSigned(rightType) {
271+ // l, r, err := convertLeftAndRight(ctx, left, right, ConvertToSigned)
272+ // if err != nil {
273+ // return nil, nil, nil, err
274+ // }
275+ //
276+ // return l, r, types.Int64, nil
277+ // }
278+ //
279+ // if types.IsUnsigned(leftType) && types.IsUnsigned(rightType) {
280+ // l, r, err := convertLeftAndRight(ctx, left, right, ConvertToUnsigned)
281+ // if err != nil {
282+ // return nil, nil, nil, err
283+ // }
284+ //
285+ // return l, r, types.Uint64, nil
286+ // }
287+ //
288+ // l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDouble)
289+ // if err != nil {
290+ // return nil, nil, nil, err
291+ // }
292+ //
293+ // return l, r, types.Float64, nil
294+ //}
295+ //
296+ //left, right, err := convertLeftAndRight(ctx, left, right, ConvertToChar)
297+ //if err != nil {
298+ // return nil, nil, nil, err
299+ //}
300+ //
301+ //return left, right, types.LongText, nil
302+
303+ lType := c .Left ().Type ()
304+ rType := c .Right ().Type ()
305+ compType := types .GetCompareType (lType , rType )
306+
307+ // Special case for JSON types
308+ if types .IsJSON (compType ) {
309+ return left , right , compType , nil
310+ }
311+
312+ l , _ , err := types .TypeAwareConversion (ctx , left , lType , compType , false )
313+ if err != nil {
314+ if sql .ErrTruncatedIncorrect .Is (err ) {
315+ ctx .Warn (mysql .ERTruncatedWrongValue , "%s" , err .Error ())
291316 }
292-
293- return l , r , types .Float64 , nil
317+ // TODO: ignore all other errors?
294318 }
295-
296- left , right , err := convertLeftAndRight (ctx , left , right , ConvertToChar )
319+ r , _ , err := types .TypeAwareConversion (ctx , right , rType , compType , false )
297320 if err != nil {
298- return nil , nil , nil , err
321+ if sql .ErrTruncatedIncorrect .Is (err ) {
322+ ctx .Warn (mysql .ERTruncatedWrongValue , "%s" , err .Error ())
323+ }
324+ // TODO: ignore all other errors?
299325 }
300-
301- return left , right , types .LongText , nil
326+ return l , r , compType , nil
302327}
303328
329+ // TODO: delete if everything else works out
304330func convertLeftAndRight (ctx * sql.Context , left , right interface {}, convertTo string ) (interface {}, interface {}, error ) {
305331 l , err := convertValue (ctx , left , convertTo , nil , 0 , 0 )
306332 if err != nil {
0 commit comments