@@ -174,21 +174,44 @@ func (c *comparison) castLeftAndRight(ctx *sql.Context, left, right interface{})
174174
175175 leftIsEnumOrSet := types .IsEnum (leftType ) || types .IsSet (leftType )
176176 rightIsEnumOrSet := types .IsEnum (rightType ) || types .IsSet (rightType )
177- leftIsText := types .IsTextOnly (leftType )
178- rightIsText := types .IsTextOnly (rightType )
179- if (leftIsEnumOrSet && rightIsText ) || (rightIsEnumOrSet && ! leftIsText ) {
180- l , err := types .TypeAwareConversion (ctx , left , leftType , rightType )
181- if err != nil {
182- return nil , nil , nil , err
177+ // Only convert if same Enum or Set
178+ if leftIsEnumOrSet && rightIsEnumOrSet {
179+ if types .TypesEqual (leftType , rightType ) {
180+ return left , right , leftType , nil
181+ }
182+ } else {
183+ // If right side is convertible to enum/set, convert. Otherwise, convert left side
184+ if leftIsEnumOrSet && (types .IsText (rightType ) || types .IsNumber (rightType )) {
185+ if r , inRange , err := leftType .Convert (ctx , right ); inRange && err == nil {
186+ return left , r , leftType , nil
187+ } else {
188+ l , err := types .TypeAwareConversion (ctx , left , leftType , rightType )
189+ if err != nil {
190+ return nil , nil , nil , err
191+ }
192+ return l , right , rightType , nil
193+ }
194+ }
195+ // If left side is convertible to enum/set, convert. Otherwise, convert right side
196+ if rightIsEnumOrSet && (types .IsText (leftType ) || types .IsNumber (leftType )) {
197+ if l , inRange , err := rightType .Convert (ctx , left ); inRange && err == nil {
198+ return l , right , rightType , nil
199+ } else {
200+ r , err := types .TypeAwareConversion (ctx , right , rightType , leftType )
201+ if err != nil {
202+ return nil , nil , nil , err
203+ }
204+ return left , r , leftType , nil
205+ }
183206 }
184- return l , right , rightType , nil
185207 }
186- if (rightIsEnumOrSet && leftIsText ) || (leftIsEnumOrSet && ! rightIsText ) {
187- r , err := types .TypeAwareConversion (ctx , right , rightType , leftType )
188- if err != nil {
189- return nil , nil , nil , err
208+
209+ if types .IsTimespan (leftType ) || types .IsTimespan (rightType ) {
210+ if l , err := types .Time .ConvertToTimespan (left ); err == nil {
211+ if r , err := types .Time .ConvertToTimespan (right ); err == nil {
212+ return l , r , types .Time , nil
213+ }
190214 }
191- return left , r , leftType , nil
192215 }
193216
194217 if types .IsTuple (leftType ) && types .IsTuple (rightType ) {
0 commit comments