@@ -163,7 +163,11 @@ func (r *Reader) ReadReply() (interface{}, error) {
163
163
case RespInt :
164
164
return util .ParseInt (line [1 :], 10 , 64 )
165
165
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
167
171
case RespBool :
168
172
return r .readBool (line )
169
173
case RespBigInt :
@@ -182,15 +186,23 @@ func (r *Reader) ReadReply() (interface{}, error) {
182
186
return nil , fmt .Errorf ("redis: can't parse %.100q" , line )
183
187
}
184
188
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
+
186
194
v := string (line [1 :])
187
195
switch string (line [1 :]) {
188
196
case "inf" :
189
- return math .Inf (1 ), nil
197
+ return toPtr ( math .Inf (1 ) ), nil
190
198
case "-inf" :
191
- return math .Inf (- 1 ), nil
199
+ return toPtr (math .Inf (- 1 )), nil
200
+ case "nan" , "-nan" :
201
+ return nil , nil
192
202
}
193
- return strconv .ParseFloat (v , 64 )
203
+
204
+ f , err := strconv .ParseFloat (v , 64 )
205
+ return & f , err
194
206
}
195
207
196
208
func (r * Reader ) readBool (line []byte ) (bool , error ) {
@@ -353,7 +365,11 @@ func (r *Reader) ReadFloat() (float64, error) {
353
365
}
354
366
switch line [0 ] {
355
367
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
357
373
case RespStatus :
358
374
return strconv .ParseFloat (string (line [1 :]), 64 )
359
375
case RespString :
0 commit comments