@@ -174,21 +174,44 @@ func (c *comparison) castLeftAndRight(ctx *sql.Context, left, right interface{})
174
174
175
175
leftIsEnumOrSet := types .IsEnum (leftType ) || types .IsSet (leftType )
176
176
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
+ }
183
206
}
184
- return l , right , rightType , nil
185
207
}
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
+ }
190
214
}
191
- return left , r , leftType , nil
192
215
}
193
216
194
217
if types .IsTuple (leftType ) && types .IsTuple (rightType ) {
0 commit comments