diff --git a/CHANGELOG.md b/CHANGELOG.md index 28640840540..2ed3440c2e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ With this release InfluxDB is moving to Go 1.5. - [#3978](https://github.com/influxdb/influxdb/issues/3978): [0.9.3] (regression) cannot use GROUP BY * with more than a single field in SELECT clause - [#4058](https://github.com/influxdb/influxdb/pull/4058): Disable bz1 recompression - [#3902](https://github.com/influxdb/influxdb/issues/3902): [0.9.3] DB should not crash when using invalid expression "GROUP BY time" +- [#3718](https://github.com/influxdb/influxdb/issues/3718): Derivative query with group by time but no aggregate function should fail parse ## v0.9.3 [2015-08-26] diff --git a/influxql/ast.go b/influxql/ast.go index 3f8c5f24c4a..56eb8683e34 100644 --- a/influxql/ast.go +++ b/influxql/ast.go @@ -1136,6 +1136,13 @@ func (s *SelectStatement) validateAggregates(tr targetRequirement) error { if min, max, got := 1, 2, len(expr.Args); got > max || got < min { return fmt.Errorf("invalid number of arguments for %s, expected at least %d but no more than %d, got %d", expr.Name, min, max, got) } + // Validate that if they have a time dimension, they need a sub-call like min/max, etc. + if s.hasTimeDimensions(s.Condition) { + if _, ok := expr.Args[0].(*Call); !ok { + return fmt.Errorf("aggregate function required inside the call to %s", expr.Name) + } + } + case "percentile": if err := s.validSelectWithAggregate(numAggregates); err != nil { return err diff --git a/influxql/parser_test.go b/influxql/parser_test.go index b6776dea809..942a45972f2 100644 --- a/influxql/parser_test.go +++ b/influxql/parser_test.go @@ -1395,9 +1395,11 @@ func TestParser_ParseStatement(t *testing.T) { {s: `SELECT derivative(), field1 FROM myseries`, err: `mixing aggregate and non-aggregate queries is not supported`}, {s: `select derivative() from myseries`, err: `invalid number of arguments for derivative, expected at least 1 but no more than 2, got 0`}, {s: `select derivative(mean(value), 1h, 3) from myseries`, err: `invalid number of arguments for derivative, expected at least 1 but no more than 2, got 3`}, + {s: `SELECT derivative(value) FROM myseries where time < now() and time > now() - 1d`, err: `aggregate function required inside the call to derivative`}, {s: `SELECT non_negative_derivative(), field1 FROM myseries`, err: `mixing aggregate and non-aggregate queries is not supported`}, {s: `select non_negative_derivative() from myseries`, err: `invalid number of arguments for non_negative_derivative, expected at least 1 but no more than 2, got 0`}, {s: `select non_negative_derivative(mean(value), 1h, 3) from myseries`, err: `invalid number of arguments for non_negative_derivative, expected at least 1 but no more than 2, got 3`}, + {s: `SELECT non_negative_derivative(value) FROM myseries where time < now() and time > now() - 1d`, err: `aggregate function required inside the call to non_negative_derivative`}, {s: `SELECT field1 from myseries WHERE host =~ 'asd' LIMIT 1`, err: `found asd, expected regex at line 1, char 42`}, {s: `SELECT value > 2 FROM cpu`, err: `invalid operator > in SELECT clause at line 1, char 8; operator is intended for WHERE clause`}, {s: `SELECT value = 2 FROM cpu`, err: `invalid operator = in SELECT clause at line 1, char 8; operator is intended for WHERE clause`},