Skip to content

Commit 7cb7571

Browse files
committed
trying to pass tests; need to handle empty strings in comparisons
1 parent c723c94 commit 7cb7571

File tree

3 files changed

+44
-13
lines changed

3 files changed

+44
-13
lines changed

sql/expression/comparison.go

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {

sql/types/enum.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ func (t EnumType) Convert(ctx context.Context, v interface{}) (interface{}, sql.
218218
return t.Convert(ctx, string(value))
219219
}
220220

221-
return nil, sql.InRange, ErrConvertingToEnum.New(v)
221+
return nil, sql.OutOfRange, ErrConvertingToEnum.New(v)
222222
}
223223

224224
// Equals implements the Type interface.

sql/types/set.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@ func (t SetType) Compare(ctx context.Context, a interface{}, b interface{}) (int
129129
au := ai.(uint64)
130130
bu := bi.(uint64)
131131

132+
if t.isEmptyString(au) && t.isEmptyString(bu) {
133+
return 0, nil
134+
}
132135
if au < bu {
133136
return -1, nil
134137
} else if au > bu {
@@ -358,6 +361,11 @@ func (t SetType) convertBitFieldToString(bitField uint64) (string, error) {
358361
return strBuilder.String(), nil
359362
}
360363

364+
func (t SetType) isEmptyString(bitField uint64) bool {
365+
emptyStringBit, ok := t.valToBit[""]
366+
return bitField == 0 || (ok && bitField == emptyStringBit)
367+
}
368+
361369
// convertStringToBitField converts the given string into a bit field.
362370
func (t SetType) convertStringToBitField(str string) (uint64, error) {
363371
if str == "" {

0 commit comments

Comments
 (0)