diff --git a/influxql/ast.go b/influxql/ast.go index b013e8f383..08ec2f1aad 100644 --- a/influxql/ast.go +++ b/influxql/ast.go @@ -944,7 +944,7 @@ func (s *SelectStatement) RewriteWildcards(ic IteratorCreator) (*SelectStatement return s, nil } - // Retrieve a list of unqiue field and dimensions. + // Retrieve a list of unique field and dimensions. fieldSet, dimensionSet, err := ic.FieldDimensions(s.Sources) if err != nil { return s, err @@ -952,6 +952,16 @@ func (s *SelectStatement) RewriteWildcards(ic IteratorCreator) (*SelectStatement // If there are no dimension wildcards then merge dimensions to fields. if !hasDimensionWildcard { + // Remove the dimensions present in the group by so they don't get added as fields. + for _, d := range s.Dimensions { + switch expr := d.Expr.(type) { + case *VarRef: + if _, ok := dimensionSet[expr.Val]; ok { + delete(dimensionSet, expr.Val) + } + } + } + for k := range dimensionSet { fieldSet[k] = struct{}{} } diff --git a/influxql/ast_test.go b/influxql/ast_test.go index 178e161671..91b8ef6260 100644 --- a/influxql/ast_test.go +++ b/influxql/ast_test.go @@ -356,16 +356,22 @@ func TestSelectStatement_RewriteWildcards(t *testing.T) { // Parser fundamentally prohibits multiple query sources // Query wildcard with explicit - // { - // stmt: `SELECT *,value1 FROM cpu`, - // rewrite: `SELECT value1, value2, value1 FROM cpu`, - // }, + { + stmt: `SELECT *,value1 FROM cpu`, + rewrite: `SELECT host, region, value1, value2, value1 FROM cpu`, + }, // Query multiple wildcards - // { - // stmt: `SELECT *,* FROM cpu`, - // rewrite: `SELECT value1,value2,value1,value2 FROM cpu`, - // }, + { + stmt: `SELECT *,* FROM cpu`, + rewrite: `SELECT host, region, value1, value2, host, region, value1, value2 FROM cpu`, + }, + + // Query wildcards with group by + { + stmt: `SELECT * FROM cpu GROUP BY host`, + rewrite: `SELECT region, value1, value2 FROM cpu GROUP BY host`, + }, // No GROUP BY wildcards {