app/vmselect/promql: allow nested parens

This commit is contained in:
Aliaksandr Valialkin 2019-11-25 16:13:13 +02:00
parent d2619d6dce
commit f7da9b2db2
3 changed files with 37 additions and 2 deletions

View File

@ -4204,6 +4204,35 @@ func TestExecSuccess(t *testing.T) {
resultExpected := []netstorage.Result{r1, r2}
f(q, resultExpected)
})
t.Run(`((1),(2,3))`, func(t *testing.T) {
t.Parallel()
q := `((
alias(1, "x1"),
),(
alias(2, "x2"),
alias(3, "x3"),
))`
r1 := netstorage.Result{
MetricName: metricNameExpected,
Values: []float64{1, 1, 1, 1, 1, 1},
Timestamps: timestampsExpected,
}
r1.MetricName.MetricGroup = []byte("x1")
r2 := netstorage.Result{
MetricName: metricNameExpected,
Values: []float64{2, 2, 2, 2, 2, 2},
Timestamps: timestampsExpected,
}
r2.MetricName.MetricGroup = []byte("x2")
r3 := netstorage.Result{
MetricName: metricNameExpected,
Values: []float64{3, 3, 3, 3, 3, 3},
Timestamps: timestampsExpected,
}
r3.MetricName.MetricGroup = []byte("x3")
resultExpected := []netstorage.Result{r1, r2, r3}
f(q, resultExpected)
})
t.Run(`union(more-than-two)`, func(t *testing.T) {
t.Parallel()
q := `union(

View File

@ -116,13 +116,17 @@ func removeParensExpr(e expr) expr {
return fe
}
if pe, ok := e.(*parensExpr); ok {
args := *pe
for i, arg := range args {
args[i] = removeParensExpr(arg)
}
if len(*pe) == 1 {
return removeParensExpr((*pe)[0])
return args[0]
}
// Treat parensExpr as a function with empty name, i.e. union()
fe := &funcExpr{
Name: "",
Args: *pe,
Args: args,
}
return fe
}

View File

@ -252,6 +252,8 @@ func TestParsePromQLSuccess(t *testing.T) {
another(`(-foo + ((bar) / (baz))) + ((23))`, `((0 - foo) + (bar / baz)) + 23`)
another(`(FOO + ((Bar) / (baZ))) + ((23))`, `(FOO + (Bar / baZ)) + 23`)
same(`(foo, bar)`)
another(`((foo, bar),(baz))`, `((foo, bar), baz)`)
same(`(foo, (bar, baz), ((x, y), (z, y), xx))`)
another(`1+(foo, bar,)`, `1 + (foo, bar)`)
another(`((foo(bar,baz)), (1+(2)+(3,4)+()))`, `(foo(bar, baz), (3 + (3, 4)) + ())`)
same(`()`)