From 9e98a8f3d34a7edd9acc864740942f6733c038b5 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin <valyala@gmail.com> Date: Wed, 2 Dec 2020 20:15:29 +0200 Subject: [PATCH] app/vmselect/promql: return `nan` from `minute(m)` when `m` equals to `nan` This aligns VictoriaMetrics behaviour with Prometheus behaviour. The issue has been spotted in https://promlabs.com/promql-compliance-test-results/2020-12-01/victoriametrics/ --- app/vmselect/promql/exec_test.go | 11 +++++++++++ app/vmselect/promql/transform.go | 3 +++ docs/CHANGELOG.md | 4 +++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/vmselect/promql/exec_test.go b/app/vmselect/promql/exec_test.go index d0cccb5ecc..7ef610e5fb 100644 --- a/app/vmselect/promql/exec_test.go +++ b/app/vmselect/promql/exec_test.go @@ -536,6 +536,17 @@ func TestExecSuccess(t *testing.T) { resultExpected := []netstorage.Result{r} f(q, resultExpected) }) + t.Run(`minute(series_with_NaNs)`, func(t *testing.T) { + t.Parallel() + q := `minute(time() <= 1200 or time() > 1600)` + r := netstorage.Result{ + MetricName: metricNameExpected, + Values: []float64{16, 20, nan, nan, 30, 33}, + Timestamps: timestampsExpected, + } + resultExpected := []netstorage.Result{r} + f(q, resultExpected) + }) t.Run("rate({})", func(t *testing.T) { t.Parallel() q := `rate({})` diff --git a/app/vmselect/promql/transform.go b/app/vmselect/promql/transform.go index 660f8bb8e9..8d350dc296 100644 --- a/app/vmselect/promql/transform.go +++ b/app/vmselect/promql/transform.go @@ -265,6 +265,9 @@ func newTransformFuncDateTime(f func(t time.Time) int) transformFunc { } tf := func(values []float64) { for i, v := range values { + if math.IsNaN(v) { + continue + } t := time.Unix(int64(v), 0).UTC() values[i] = float64(f(t)) } diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index fc9d2b3aef..43c291865c 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -7,7 +7,9 @@ * BUGFIX: return `nan` for `a >bool b` query when `a` equals to `nan` like Prometheus does. Previously `0` was returned in this case. This applies to any comparison operation with `bool` modifier. See [these docs](https://prometheus.io/docs/prometheus/latest/querying/operators/#comparison-binary-operators) for details. * BUGFIX: properly parse hex numbers in MetricsQL. Previously hex numbers with non-decimal digits such as `0x3b` couldn't be parsed. -* BUGFIX: Handle `time() cmp_op metric` like Prometheus does - i.e. return `metric` value if `cmp_op` comparison is true. Previously `time()` value was returned. +* BUGFIX: handle `time() cmp_op metric` like Prometheus does - i.e. return `metric` value if `cmp_op` comparison is true. Previously `time()` value was returned. +* BUGFIX: return `nan` for `minute(m)` query when `m` equals to `nan` like Prometheus does. This applies to all the time-related functions such as `day_of_month`, `day_of_week`, + `days_in_month`, `hour`, `month` and `year`. # [v1.48.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.48.0)