func TestSelect_ColumnNames(t *testing.T) { for i, tt := range []struct { stmt *influxql.SelectStatement columns []string }{ { stmt: &influxql.SelectStatement{ Fields: influxql.Fields([]*influxql.Field{ {Expr: &influxql.VarRef{Val: "value"}}, }), }, columns: []string{"time", "value"}, }, { stmt: &influxql.SelectStatement{ Fields: influxql.Fields([]*influxql.Field{ {Expr: &influxql.VarRef{Val: "value"}}, {Expr: &influxql.VarRef{Val: "value"}}, {Expr: &influxql.VarRef{Val: "value_1"}}, }), }, columns: []string{"time", "value", "value_1", "value_1_1"}, }, { stmt: &influxql.SelectStatement{ Fields: influxql.Fields([]*influxql.Field{ {Expr: &influxql.VarRef{Val: "value"}}, {Expr: &influxql.VarRef{Val: "value_1"}}, {Expr: &influxql.VarRef{Val: "value"}}, }), }, columns: []string{"time", "value", "value_1", "value_2"}, }, { stmt: &influxql.SelectStatement{ Fields: influxql.Fields([]*influxql.Field{ {Expr: &influxql.VarRef{Val: "value"}}, {Expr: &influxql.VarRef{Val: "total"}, Alias: "value"}, {Expr: &influxql.VarRef{Val: "value"}}, }), }, columns: []string{"time", "value_1", "value", "value_2"}, }, { stmt: &influxql.SelectStatement{ Fields: influxql.Fields([]*influxql.Field{ {Expr: &influxql.VarRef{Val: "value"}}, }), TimeAlias: "timestamp", }, columns: []string{"timestamp", "value"}, }, } { columns := tt.stmt.ColumnNames() if !reflect.DeepEqual(columns, tt.columns) { t.Errorf("%d. expected %s, got %s", i, tt.columns, columns) } } }
// planShowMeasurements converts the statement to a SELECT and executes it. func (q *QueryExecutor) planShowMeasurements(stmt *influxql.ShowMeasurementsStatement, database string, chunkSize int) (Executor, error) { // Check for time in WHERE clause (not supported). if influxql.HasTimeExpr(stmt.Condition) { return nil, errors.New("SHOW MEASUREMENTS doesn't support time in WHERE clause") } condition := stmt.Condition if source, ok := stmt.Source.(*influxql.Measurement); ok { var expr influxql.Expr if source.Regex != nil { expr = &influxql.BinaryExpr{ Op: influxql.EQREGEX, LHS: &influxql.VarRef{Val: "name"}, RHS: &influxql.RegexLiteral{Val: source.Regex.Val}, } } else if source.Name != "" { expr = &influxql.BinaryExpr{ Op: influxql.EQ, LHS: &influxql.VarRef{Val: "name"}, RHS: &influxql.StringLiteral{Val: source.Name}, } } // Set condition or "AND" together. if condition == nil { condition = expr } else { condition = &influxql.BinaryExpr{Op: influxql.AND, LHS: expr, RHS: condition} } } ss := &influxql.SelectStatement{ Fields: influxql.Fields([]*influxql.Field{ {Expr: &influxql.VarRef{Val: "name"}}, }), Sources: influxql.Sources([]influxql.Source{ &influxql.Measurement{Name: "_measurements"}, }), Condition: condition, Offset: stmt.Offset, Limit: stmt.Limit, SortFields: stmt.SortFields, OmitTime: true, Dedupe: true, } // Normalize the statement. if err := q.normalizeStatement(ss, database); err != nil { return nil, err } return q.PlanSelect(ss, chunkSize) }