@@ -129,6 +129,24 @@ func (t SetType) Compare(ctx context.Context, a interface{}, b interface{}) (int
129
129
au := ai .(uint64 )
130
130
bu := bi .(uint64 )
131
131
132
+ // If there's an empty string in the set, empty strings should match both 0 and an empty string bit field
133
+ if emptyStringBitField , ok := t .emptyStringBitField (); ok {
134
+ aIsEmptyString := isEmptyString (a )
135
+ bIsEmptyString := isEmptyString (b )
136
+ if aIsEmptyString {
137
+ if bu == 0 || bu == emptyStringBitField {
138
+ return 0 , nil
139
+ }
140
+ return - 1 , nil
141
+ }
142
+ if bIsEmptyString {
143
+ if au == 0 || au == emptyStringBitField {
144
+ return 0 , nil
145
+ }
146
+ return 1 , nil
147
+ }
148
+ }
149
+
132
150
if au < bu {
133
151
return - 1 , nil
134
152
} else if au > bu {
@@ -180,7 +198,7 @@ func (t SetType) Convert(ctx context.Context, v interface{}) (interface{}, sql.C
180
198
return t .Convert (ctx , value .Decimal .BigInt ().Uint64 ())
181
199
case string :
182
200
ret , err := t .convertStringToBitField (value )
183
- return ret , sql . InRange , err
201
+ return ret , err == nil , err
184
202
case []byte :
185
203
return t .Convert (ctx , string (value ))
186
204
}
@@ -364,7 +382,7 @@ func (t SetType) convertStringToBitField(str string) (uint64, error) {
364
382
return 0 , nil
365
383
}
366
384
var bitField uint64
367
- _ , allowEmptyString := t .valToBit [ "" ]
385
+ _ , allowEmptyString := t .emptyStringBitField ()
368
386
lastI := 0
369
387
var val string
370
388
for i := 0 ; i < len (str )+ 1 ; i ++ {
@@ -410,3 +428,16 @@ func (t SetType) convertStringToBitField(str string) (uint64, error) {
410
428
}
411
429
return bitField , nil
412
430
}
431
+
432
+ func (t SetType ) emptyStringBitField () (bitField uint64 , ok bool ) {
433
+ bitField , ok = t .valToBit ["" ]
434
+ return bitField , ok
435
+ }
436
+
437
+ func isEmptyString (val interface {}) bool {
438
+ switch v := val .(type ) {
439
+ case string :
440
+ return v == ""
441
+ }
442
+ return false
443
+ }
0 commit comments