From 1641c2547982d8f4a94bacf5c1f487a1a3f6678e Mon Sep 17 00:00:00 2001 From: Jason Wilder Date: Fri, 10 Jul 2015 14:18:51 -0600 Subject: [PATCH] Fix panic parsing floats without decimal Fixes #3289 --- CHANGELOG.md | 1 + tsdb/points.go | 2 +- tsdb/points_test.go | 10 ++++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f592d4beea..fef7497e475 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ - [#3245](https://github.com/influxdb/influxdb/issues/3245): Error using graphite plugin with multiple filters - [#3223](https://github.com/influxdb/influxdb/issues/323): default graphite template cannot have extra tags - [#3255](https://github.com/influxdb/influxdb/pull/3255): Flush WAL on start-up as soon as possible. +- [#3289](https://github.com/influxdb/influxdb/issues/3289): InfluxDB crashes on floats without decimal ## v0.9.1 [2015-07-02] diff --git a/tsdb/points.go b/tsdb/points.go index 8d32caadcad..f3125a15af9 100644 --- a/tsdb/points.go +++ b/tsdb/points.go @@ -997,7 +997,7 @@ type Fields map[string]interface{} func parseNumber(val []byte) (interface{}, error) { for i := 0; i < len(val); i++ { // If there is a decimal or an N (NaN), I (Inf), parse as float - if val[i] == '.' || val[i] == 'N' || val[i] == 'n' || val[i] == 'I' || val[i] == 'i' { + if val[i] == '.' || val[i] == 'N' || val[i] == 'n' || val[i] == 'I' || val[i] == 'i' || val[i] == 'e' { return strconv.ParseFloat(string(val), 64) } if val[i] < '0' && val[i] > '9' { diff --git a/tsdb/points_test.go b/tsdb/points_test.go index 12eef9edf73..9fa2af3180c 100644 --- a/tsdb/points_test.go +++ b/tsdb/points_test.go @@ -412,6 +412,16 @@ func TestParsePointFloatScientific(t *testing.T) { if err != nil { t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=1.0e4`, err) } + + pts, err := ParsePointsString(`cpu,host=serverA,region=us-west value=1e4`) + if err != nil { + t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=1.0e4`, err) + } + + if pts[0].Fields()["value"] != 1e4 { + t.Errorf(`ParsePoints("%s") mismatch. got %v, exp nil`, `cpu,host=serverA,region=us-west value=1e4`, err) + } + } func TestParsePointFloatScientificDecimal(t *testing.T) {