Skip to content

Commit 5277926

Browse files
committed
fix: reader float parser
1 parent 37c057b commit 5277926

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

internal/proto/reader.go

+22-6
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,11 @@ func (r *Reader) ReadReply() (interface{}, error) {
163163
case RespInt:
164164
return util.ParseInt(line[1:], 10, 64)
165165
case RespFloat:
166-
return r.readFloat(line)
166+
f, err := r.readFloat(line)
167+
if f == nil {
168+
return string(line[1:]), err
169+
}
170+
return *f, err
167171
case RespBool:
168172
return r.readBool(line)
169173
case RespBigInt:
@@ -182,15 +186,23 @@ func (r *Reader) ReadReply() (interface{}, error) {
182186
return nil, fmt.Errorf("redis: can't parse %.100q", line)
183187
}
184188

185-
func (r *Reader) readFloat(line []byte) (float64, error) {
189+
func (r *Reader) readFloat(line []byte) (*float64, error) {
190+
toPtr := func(f float64) *float64 {
191+
return &f
192+
}
193+
186194
v := string(line[1:])
187195
switch string(line[1:]) {
188196
case "inf":
189-
return math.Inf(1), nil
197+
return toPtr(math.Inf(1)), nil
190198
case "-inf":
191-
return math.Inf(-1), nil
199+
return toPtr(math.Inf(-1)), nil
200+
case "nan", "-nan":
201+
return nil, nil
192202
}
193-
return strconv.ParseFloat(v, 64)
203+
204+
f, err := strconv.ParseFloat(v, 64)
205+
return &f, err
194206
}
195207

196208
func (r *Reader) readBool(line []byte) (bool, error) {
@@ -353,7 +365,11 @@ func (r *Reader) ReadFloat() (float64, error) {
353365
}
354366
switch line[0] {
355367
case RespFloat:
356-
return r.readFloat(line)
368+
f, err := r.readFloat(line)
369+
if f == nil {
370+
return 0, err
371+
}
372+
return *f, err
357373
case RespStatus:
358374
return strconv.ParseFloat(string(line[1:]), 64)
359375
case RespString:

0 commit comments

Comments
 (0)