diff --git a/promql/parser/prettier.go b/promql/parser/prettier.go index a0ab9e1219..c521b8190c 100644 --- a/promql/parser/prettier.go +++ b/promql/parser/prettier.go @@ -75,7 +75,7 @@ func (e *BinaryExpr) Pretty(level int) string { returnBool = " bool" } - matching := e.getMatchingStr() + matching := e.GetMatchingStr() return fmt.Sprintf("%s\n%s%s%s%s\n%s", e.LHS.Pretty(level+1), indent(level), e.Op, returnBool, matching, e.RHS.Pretty(level+1)) } diff --git a/promql/parser/printer.go b/promql/parser/printer.go index 44ca15e532..cc356a0455 100644 --- a/promql/parser/printer.go +++ b/promql/parser/printer.go @@ -137,15 +137,15 @@ func (node *BinaryExpr) returnBool() string { } func (node *BinaryExpr) String() string { - matching := node.getMatchingStr() + matching := node.GetMatchingStr() return node.LHS.String() + " " + node.Op.String() + node.returnBool() + matching + " " + node.RHS.String() } func (node *BinaryExpr) ShortString() string { - return node.Op.String() + node.returnBool() + node.getMatchingStr() + return node.Op.String() + node.returnBool() + node.GetMatchingStr() } -func (node *BinaryExpr) getMatchingStr() string { +func (node *BinaryExpr) GetMatchingStr() string { matching := "" var b bytes.Buffer vm := node.VectorMatching diff --git a/promql/pipe.go b/promql/pipe.go new file mode 100644 index 0000000000..bb110b75de --- /dev/null +++ b/promql/pipe.go @@ -0,0 +1,223 @@ +// Copyright 2025 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License + +package promql + +import ( + "bytes" + "fmt" + "maps" + "slices" + "strconv" + "strings" + + "github.com/prometheus/common/model" + + "github.com/prometheus/prometheus/promql/parser" +) + +func addVar(vars map[string]string, value string) (varName string) { + // TODO: Naive, fix. + if strings.HasPrefix(value, "(") { + value = strings.TrimPrefix(strings.TrimSuffix(value, ")"), "(") + } + + // TODO: This is naive. We can do more with partial searches and "compacting" of variables + // e.g. when adding looping_time{group_name="realtime",location="us-east1"}[2m] + // to a vars with looping_time{group_name="realtime",location="us-east1"}[2m] | rate | sum | histogram_sum + // we could have simpler variables. + for k, v := range vars { + if value == v { + return k + } + } + + varName = fmt.Sprintf("x%d", len(vars)+1) + vars[varName] = value + return varName +} + +// ToPiped transforms a standard PromQL query string into the piped syntax. +func ToPiped(query string) (string, error) { + expr, err := parser.ParseExpr(query) + if err != nil { + return "", err + } + + vars := map[string]string{} + ret := bytes.NewBuffer(nil) + printPipedWithVars(expr, ret, vars) + + if len(vars) == 0 { + return ret.String(), nil + } + + b := bytes.NewBuffer(nil) + b.WriteString("let\n") + for _, k := range slices.Sorted(maps.Keys(vars)) { + b.WriteString(" ") + b.WriteString(k) + b.WriteString(" = ") + b.WriteString(vars[k]) + b.WriteString("\n") + } + b.WriteString("in ") + b.WriteString(ret.String()) + return b.String(), nil +} + +func stringPipedWithVars(node parser.Node, vars map[string]string) string { + b := bytes.NewBuffer(nil) + printPipedWithVars(node, b, vars) + return b.String() +} + +func writeLabels(b *bytes.Buffer, ss []string) { + for i, s := range ss { + if i > 0 { + b.WriteString(", ") + } + if !model.LegacyValidation.IsValidMetricName(s) { + b.Write(strconv.AppendQuote(b.AvailableBuffer(), s)) + } else { + b.WriteString(s) + } + } +} + +func printPipedWithVars(node parser.Node, b *bytes.Buffer, vars map[string]string) { + switch n := node.(type) { + case *parser.EvalStmt: + printPipedWithVars(n.Expr, b, vars) + case parser.Expressions: + for _, e := range n { + printPipedWithVars(e, b, vars) + } + case *parser.AggregateExpr: + b.WriteString(stringPipedWithVars(n.Expr, vars)) + b.WriteString(" | ") + b.WriteString(n.Op.String()) + if n.Op.IsAggregatorWithParam() { + b.WriteString("(") + b.WriteString(n.Param.String()) + b.WriteString(")") + } + switch { + case n.Without: + b.WriteString(" without (") + writeLabels(b, n.Grouping) + b.WriteString(") ") + case len(n.Grouping) > 0: + b.WriteString(" by (") + writeLabels(b, n.Grouping) + b.WriteString(") ") + } + case *parser.BinaryExpr: + var lhs, rhs string + switch { + case n.LHS.Type() == parser.ValueTypeScalar && n.RHS.Type() == parser.ValueTypeScalar: + // Two scalars. + lhs = n.LHS.String() + rhs = n.RHS.String() + case n.LHS.Type() != parser.ValueTypeScalar && n.RHS.Type() != parser.ValueTypeScalar: + pre := len(vars) + lhs = stringPipedWithVars(n.LHS, vars) + diff := len(vars) - pre + + // This is hacky, might be not very true for nested things. + if diff == 0 { + lhs = addVar(vars, lhs) + } + + pre = len(vars) + rhs = stringPipedWithVars(n.RHS, vars) + diff = len(vars) - pre + + // This is hacky, might be not very true for nested things. + if diff == 0 { + rhs = addVar(vars, rhs) + } + + case n.LHS.Type() == parser.ValueTypeScalar: + // With pipe syntax we organize simpler form to the right. + lhs = stringPipedWithVars(n.RHS, vars) + rhs = n.LHS.String() + case n.RHS.Type() == parser.ValueTypeScalar: + // With pipe syntax we organize simpler form to the right. + lhs = stringPipedWithVars(n.LHS, vars) + rhs = n.RHS.String() + } + + b.WriteString(lhs) + b.WriteString(" ") + b.WriteString(n.Op.String()) + if n.ReturnBool { + b.WriteString(" bool") + } + b.WriteString(n.GetMatchingStr()) + b.WriteString(" ") + b.WriteString(rhs) + case *parser.Call: + var ( + args = bytes.NewBuffer(nil) + lhs string + ) + if len(n.Args) > 0 { + for _, e := range n.Args { + if e.Type() == parser.ValueTypeScalar || e.Type() == parser.ValueTypeString { + if args.Len() > 0 { + args.WriteString(", ") + } + args.WriteString(e.String()) + continue + } + if lhs != "" { + // More than one complex arg (e.g. info function). + // TODO: This is YOLO, one could think if there's a more readable way.. + if args.Len() > 0 { + args.WriteString(", ") + } + args.WriteString(addVar(vars, lhs)) + } + lhs = stringPipedWithVars(e, vars) + } + } + if lhs != "" { + b.WriteString(lhs) + b.WriteString(" | ") + } + b.WriteString(n.Func.Name) + if args.Len() > 0 { + b.WriteString("(") + b.WriteString(args.String()) + b.WriteString(")") + } + + case *parser.SubqueryExpr: + b.WriteString(stringPipedWithVars(n.Expr, vars)) + case *parser.ParenExpr: + b.WriteString("(") + b.WriteString(stringPipedWithVars(n.Expr, vars)) + b.WriteString(")") + case *parser.UnaryExpr: + b.WriteString(n.String()) + case *parser.MatrixSelector: + b.WriteString(n.String()) + case *parser.StepInvariantExpr: + b.WriteString(n.String()) + case *parser.NumberLiteral, *parser.StringLiteral, *parser.VectorSelector: + b.WriteString(n.String()) + default: + panic(fmt.Errorf("promql.printPiped: unhandled node type %T", node)) + } +} diff --git a/promql/pipe_cases_test.gen.go b/promql/pipe_cases_test.gen.go new file mode 100644 index 0000000000..098a2c277f --- /dev/null +++ b/promql/pipe_cases_test.gen.go @@ -0,0 +1,136 @@ +// Copyright 2025 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build ignore + +package main + +import ( + "bytes" + "embed" + "go/format" + "io/fs" + "iter" + "log" + "maps" + "os" + "regexp" + "slices" + "strings" + "text/template" + + "github.com/prometheus/prometheus/promql" + "github.com/prometheus/prometheus/promql/parser" +) + +//go:embed promqltest/testdata +var testsFs embed.FS + +// querySeq returns an iterator that yields all query strings found in the test file content. +func findQueries(testFile string) iter.Seq[string] { + evalRegex := regexp.MustCompile(`^(\s*eval\s+(?:instant at \d+m?|range from \d+m? to \d+m? step \d+m?) )(.*)$`) + return func(yield func(string) bool) { + lines := strings.Split(testFile, "\n") + for _, line := range lines { + matches := evalRegex.FindStringSubmatch(line) + // Group 2 is the query part + if len(matches) == 3 { + if !yield(matches[2]) { + return + } + } + } + } +} + +type queryCase struct { + Source, Query, Piped, SinglePiped string +} + +func main() { + parser.EnableExperimentalFunctions = true + parser.ExperimentalDurationExpr = true + parser.EnableExtendedRangeSelectors = true + + files, err := fs.Glob(testsFs, "promqltest/testdata/*.test") + if err != nil { + log.Fatal(err) + } + + queries := map[string]queryCase{} + for _, fn := range files { + content, err := fs.ReadFile(testsFs, fn) + if err != nil { + log.Fatal(err) + } + + for query := range findQueries(string(content)) { + piped, err := promql.ToPiped(query) + if err != nil { + // Best effort, caller will fix it. + piped = err.Error() + } + queries[query] = queryCase{Source: fn, Query: query, Piped: piped} + } + } + + sortedQueries := slices.SortedFunc(maps.Values(queries), func(a, b queryCase) int { + cmp := strings.Compare(a.Source, b.Source) + if cmp == 0 { + return strings.Compare(a.Query, b.Query) + } + return cmp + }) + + // Generate code. + var buf bytes.Buffer + err = testFile.Execute(&buf, struct { + Queries []queryCase + }{ + Queries: sortedQueries, + }) + if err != nil { + log.Fatalf("executing template: %v", err) + } + + // Format it. + result, err := format.Source(buf.Bytes()) + if err != nil { + log.Fatalf("formating code: %v", err) + } + + // Write it to a file. + if err := os.WriteFile("pipe_cases_test.go", result, 0o644); err != nil { + log.Fatalf("writing file: %v", err) + } +} + +var testFile = template.Must(template.New("testFile").Parse(`// Code generated by pipe_cases_test.gen.go; DO NOT EDIT. +//go:generate go run pipe_cases_test.gen.go + +package promql_test + +type pipedCase struct { + query, piped string +} + +var pipedCases = []pipedCase{ +{{ range .Queries -}} + { + // Source: {{ .Source }} + query: ` + "`" + `{{ .Query }}` + "`" + `, + piped: ` + "`" + `{{ .Piped }}` + "`" + `, + }, +{{end}} +} +`)) diff --git a/promql/pipe_cases_test.go b/promql/pipe_cases_test.go new file mode 100644 index 0000000000..15afd82e69 --- /dev/null +++ b/promql/pipe_cases_test.go @@ -0,0 +1,6545 @@ +// Code generated by pipe_cases_test.gen.go; DO NOT EDIT. +//go:generate go run pipe_cases_test.gen.go + +package promql_test + +type pipedCase struct { + query, piped string +} + +var pipedCases = []pipedCase{ + { + // Source: promqltest/testdata/aggregators.test + query: `AVG(http_requests) BY (job)`, + piped: `http_requests | avg by (job) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `COUNT(http_requests) BY (job)`, + piped: `http_requests | count by (job) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `MAX(http_requests) BY (job)`, + piped: `http_requests | max by (job) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `MIN(http_requests) BY (job)`, + piped: `http_requests | min by (job) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `SUM BY (group) (((http_requests{job="api-server"})))`, + piped: `((http_requests{job="api-server"})) | sum by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `SUM BY (group) (http_requests{job="api-server"})`, + piped: `http_requests{job="api-server"} | sum by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `SUM(http_requests)`, + piped: `http_requests | sum`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `SUM(http_requests) BY (job)`, + piped: `http_requests | sum by (job) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `SUM(http_requests) BY (job, group)`, + piped: `http_requests | sum by (job, group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `SUM(http_requests) BY (job, nonexistent)`, + piped: `http_requests | sum by (job, nonexistent) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `SUM(http_requests{instance="0"}) BY(job)`, + piped: `http_requests{instance="0"} | sum by (job) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `abs(-1 * http_requests{group="production",job="api-server"})`, + piped: `http_requests{group="production",job="api-server"} * -1 | abs`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg by (group) (data{test="nan"})`, + piped: `data{test="nan"} | avg by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg by (group) (data{test="neg_inf"})`, + piped: `data{test="neg_inf"} | avg by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg by (group) (data{test="pos_inf"})`, + piped: `data{test="pos_inf"} | avg by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg by (group) (http_requests{job="api-server"})`, + piped: `http_requests{job="api-server"} | avg by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(data)`, + piped: `data | avg`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(data{test="-big"})`, + piped: `data{test="-big"} | avg`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(data{test="-inf"})`, + piped: `data{test="-inf"} | avg`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(data{test="-inf2"})`, + piped: `data{test="-inf2"} | avg`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(data{test="-inf3"})`, + piped: `data{test="-inf3"} | avg`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(data{test="big"})`, + piped: `data{test="big"} | avg`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(data{test="bigzero"})`, + piped: `data{test="bigzero"} | avg`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(data{test="inf"})`, + piped: `data{test="inf"} | avg`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(data{test="inf2"})`, + piped: `data{test="inf2"} | avg`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(data{test="inf3"})`, + piped: `data{test="inf3"} | avg`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(data{test="inf_inf"})`, + piped: `data{test="inf_inf"} | avg`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(data{test="nan"})`, + piped: `data{test="nan"} | avg`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(data{test="ten"})`, + piped: `data{test="ten"} | avg`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(foo) - 52`, + piped: `foo | avg - 52`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(foo) == 52`, + piped: `foo | avg == 52`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(topk(10, foo)) - 52`, + piped: `foo | topk(10) | avg - 52`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(topk(10, foo)) == 52`, + piped: `foo | topk(10) | avg == 52`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(topk(11, foo)) - 52`, + piped: `foo | topk(11) | avg - 52`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(topk(11, foo)) == 52`, + piped: `foo | topk(11) | avg == 52`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(topk(8, foo)) - 52`, + piped: `foo | topk(8) | avg - 52`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(topk(8, foo)) == 52`, + piped: `foo | topk(8) | avg == 52`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(topk(9, foo)) - 52`, + piped: `foo | topk(9) | avg - 52`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `avg(topk(9, foo)) == 52`, + piped: `foo | topk(9) | avg == 52`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `bottomk by (group) (2, http_requests)`, + piped: `http_requests | bottomk(2) by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `bottomk by (group) (2, http_requests{group="production"})`, + piped: `http_requests{group="production"} | bottomk(2) by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `bottomk by (instance) (1, {__name__=~"http_requests(_histogram)?"})`, + piped: `{__name__=~"http_requests(_histogram)?"} | bottomk(1) by (instance) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `bottomk(1, {__name__=~"http_requests(_histogram)?"})`, + piped: `{__name__=~"http_requests(_histogram)?"} | bottomk(1)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `bottomk(100, http_requests_histogram)`, + piped: `http_requests_histogram | bottomk(100)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `bottomk(3, http_requests)`, + piped: `http_requests | bottomk(3)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `bottomk(3, http_requests{job="api-server",group="production"})`, + piped: `http_requests{group="production",job="api-server"} | bottomk(3)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `bottomk(5, http_requests{group="canary",job="app-server"})`, + piped: `http_requests{group="canary",job="app-server"} | bottomk(5)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `bottomk(9999999999, http_requests{job="app-server",group="canary"})`, + piped: `http_requests{group="canary",job="app-server"} | bottomk(9999999999)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `ceil(0.004 * http_requests{group="production",job="api-server"})`, + piped: `http_requests{group="production",job="api-server"} * 0.004 | ceil`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `count by (group) (http_requests{job="api-server"})`, + piped: `http_requests{job="api-server"} | count by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `count(bottomk(1000, {__name__=~"http_requests(_histogram)?"}))`, + piped: `{__name__=~"http_requests(_histogram)?"} | bottomk(1000) | count`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `count(bottomk(scalar(foo), http_requests))`, + piped: `http_requests | bottomk(scalar(foo)) | count`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `count(topk(1000, {__name__=~"http_requests(_histogram)?"}))`, + piped: `{__name__=~"http_requests(_histogram)?"} | topk(1000) | count`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `count(topk(scalar(foo), http_requests))`, + piped: `http_requests | topk(scalar(foo)) | count`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `count_values by (job, group)("job", version)`, + piped: `version | count_values("job") by (job, group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `count_values without (instance)("job", version)`, + piped: `version | count_values("job") without (instance) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `count_values without (instance)("version", version)`, + piped: `version | count_values("version") without (instance) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `count_values("a\xc5z", version)`, + piped: `version | count_values("a\xc5z")`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `count_values("version", version)`, + piped: `version | count_values("version")`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `count_values(((("version"))), version)`, + piped: `version | count_values(((("version"))))`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `floor(0.004 * http_requests{group="production",job="api-server"})`, + piped: `http_requests{group="production",job="api-server"} * 0.004 | floor`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `group without(point)(data)`, + piped: `data | group without (point) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `group(foo)`, + piped: `foo | group`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `limit_ratio(NaN, non_existent)`, + piped: `non_existent | limit_ratio(NaN)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `limitk(NaN, non_existent)`, + piped: `non_existent | limitk(NaN)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `max by (group) (http_requests)`, + piped: `http_requests | max by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `max(http_requests)`, + piped: `http_requests | max`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `max(http_requests_histogram)`, + piped: `http_requests_histogram | max`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `max({job="api-server"})`, + piped: `{job="api-server"} | max`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `min by (group) (http_requests)`, + piped: `http_requests | min by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `min(http_requests)`, + piped: `http_requests | min`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `min(http_requests_histogram)`, + piped: `http_requests_histogram | min`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `min({job="api-server"})`, + piped: `{job="api-server"} | min`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `quantile without(point)((scalar(foo)), data)`, + piped: `data | quantile((scalar(foo))) without (point) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `quantile without(point)(0.2, data)`, + piped: `data | quantile(0.2) without (point) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `quantile without(point)(0.8, data)`, + piped: `data | quantile(0.8) without (point) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `quantile without(point)(0.8, {__name__=~"data(_histogram)?"})`, + piped: `{__name__=~"data(_histogram)?"} | quantile(0.8) without (point) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `quantile without(point)(NaN, data)`, + piped: `data | quantile(NaN) without (point) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `quantile without(point)(scalar(foo), data)`, + piped: `data | quantile(scalar(foo)) without (point) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `quantile(0.8, data_histogram)`, + piped: `data_histogram | quantile(0.8)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `round(-1 * (0.004 * http_requests{group="production",job="api-server"}))`, + piped: `(http_requests{group="production",job="api-server"} * 0.004) * -1 | round`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `round(-1 * (0.005 * http_requests{group="production",job="api-server"}))`, + piped: `(http_requests{group="production",job="api-server"} * 0.005) * -1 | round`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `round(-1 * (1 + 0.005 * http_requests{group="production",job="api-server"}))`, + piped: `(http_requests{group="production",job="api-server"} * 0.005 + 1) * -1 | round`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `round(-1 * (5.2 + 0.0005 * http_requests{group="production",job="api-server"}), 0.1)`, + piped: `(http_requests{group="production",job="api-server"} * 0.0005 + 5.2) * -1 | round(0.1)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `round(0.0005 * http_requests{group="production",job="api-server"}, 0.1)`, + piped: `http_requests{group="production",job="api-server"} * 0.0005 | round(0.1)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `round(0.004 * http_requests{group="production",job="api-server"})`, + piped: `http_requests{group="production",job="api-server"} * 0.004 | round`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `round(0.005 * http_requests{group="production",job="api-server"})`, + piped: `http_requests{group="production",job="api-server"} * 0.005 | round`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `round(0.025 * http_requests{group="production",job="api-server"}, 5)`, + piped: `http_requests{group="production",job="api-server"} * 0.025 | round(5)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `round(0.045 * http_requests{group="production",job="api-server"}, 5)`, + piped: `http_requests{group="production",job="api-server"} * 0.045 | round(5)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `round(1 + 0.005 * http_requests{group="production",job="api-server"})`, + piped: `http_requests{group="production",job="api-server"} * 0.005 + 1 | round`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `round(2.1 + 0.0005 * http_requests{group="production",job="api-server"}, 0.1)`, + piped: `http_requests{group="production",job="api-server"} * 0.0005 + 2.1 | round(0.1)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `round(5.2 + 0.0005 * http_requests{group="production",job="api-server"}, 0.1)`, + piped: `http_requests{group="production",job="api-server"} * 0.0005 + 5.2 | round(0.1)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `stddev (series)`, + piped: `series | stddev`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `stddev by (instance)(http_requests)`, + piped: `http_requests | stddev by (instance) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `stddev by (label) (series)`, + piped: `series | stddev by (label) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `stddev(http_requests)`, + piped: `http_requests | stddev`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `stddev(series)`, + piped: `series | stddev`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `stddev({label="c"})`, + piped: `{label="c"} | stddev`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `stdvar (series)`, + piped: `series | stdvar`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `stdvar by (instance)(http_requests)`, + piped: `http_requests | stdvar by (instance) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `stdvar by (label) (series)`, + piped: `series | stdvar by (label) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `stdvar(http_requests)`, + piped: `http_requests | stdvar`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `stdvar(series)`, + piped: `series | stdvar`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `stdvar({label="c"})`, + piped: `{label="c"} | stdvar`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `sum by () (http_requests{job="api-server"})`, + piped: `http_requests{job="api-server"} | sum`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `sum by (group) (data{test="nan"})`, + piped: `data{test="nan"} | sum by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `sum by (group) (data{test="neg_inf"})`, + piped: `data{test="neg_inf"} | sum by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `sum by (group) (data{test="pos_inf"})`, + piped: `data{test="pos_inf"} | sum by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `sum by (group) (http_requests{job="api-server"})`, + piped: `http_requests{job="api-server"} | sum by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `sum without () (http_requests{job="api-server",group="production"})`, + piped: `http_requests{group="production",job="api-server"} | sum without () `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `sum without (instance) (http_requests{job="api-server"} or foo)`, + piped: `let + x1 = http_requests{job="api-server"} + x2 = foo +in x1 or x2 | sum without (instance) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `sum without (instance) (http_requests{job="api-server"})`, + piped: `http_requests{job="api-server"} | sum without (instance) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `sum(data{test="inf_inf"})`, + piped: `data{test="inf_inf"} | sum`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `sum(data{test="ten"})`, + piped: `data{test="ten"} | sum`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `sum(http_requests) by (job) + min(http_requests) by (job) + max(http_requests) by (job) + avg(http_requests) by (job)`, + piped: `let + x1 = http_requests | sum by (job) + x2 = http_requests | min by (job) + x3 = http_requests | max by (job) + x4 = http_requests | avg by (job) +in x1 + x2 + x3 + x4`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `sum(http_requests{job="api-server"})`, + piped: `http_requests{job="api-server"} | sum`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `sum(label_grouping_test) by (a, b)`, + piped: `label_grouping_test | sum by (a, b) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `sum(sum by (group) (http_requests{job="api-server"})) by (job)`, + piped: `http_requests{job="api-server"} | sum by (group) | sum by (job) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `topk by (group) (1, http_requests)`, + piped: `http_requests | topk(1) by (group) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `topk by (instance) (1, {__name__=~"http_requests(_histogram)?"})`, + piped: `{__name__=~"http_requests(_histogram)?"} | topk(1) by (instance) `, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `topk((3), (http_requests))`, + piped: `(http_requests) | topk((3))`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `topk(1, {__name__=~"http_requests(_histogram)?"})`, + piped: `{__name__=~"http_requests(_histogram)?"} | topk(1)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `topk(100, http_requests_histogram)`, + piped: `http_requests_histogram | topk(100)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `topk(3, http_requests)`, + piped: `http_requests | topk(3)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `topk(3, http_requests{job="api-server",group="production"})`, + piped: `http_requests{group="production",job="api-server"} | topk(3)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `topk(5, http_requests{group="canary",job="app-server"})`, + piped: `http_requests{group="canary",job="app-server"} | topk(5)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `topk(9999999999, http_requests{job="api-server",group="production"})`, + piped: `http_requests{group="production",job="api-server"} | topk(9999999999)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `topk(NaN, non_existent)`, + piped: `non_existent | topk(NaN)`, + }, + { + // Source: promqltest/testdata/aggregators.test + query: `topk(scalar(foo), http_requests)`, + piped: `http_requests | topk(scalar(foo))`, + }, + { + // Source: promqltest/testdata/at_modifier.test + query: `timestamp(metric{job="1"} @ 10)`, + piped: `metric{job="1"} @ 10.000 | timestamp`, + }, + { + // Source: promqltest/testdata/at_modifier.test + query: `timestamp(timestamp(metric{job="1"} @ 10))`, + piped: `metric{job="1"} @ 10.000 | timestamp | timestamp`, + }, + { + // Source: promqltest/testdata/collision.test + query: `ceil({__name__=~'testmetric1|testmetric2'})`, + piped: `{__name__=~"testmetric1|testmetric2"} | ceil`, + }, + { + // Source: promqltest/testdata/duration_expression.test + query: `changes(http_requests[(9m30s+30s)*3])`, + piped: `http_requests[(9m30s + 30s) * 3] | changes`, + }, + { + // Source: promqltest/testdata/duration_expression.test + query: `changes(http_requests[-5m+35m])`, + piped: `http_requests[-5m + 35m] | changes`, + }, + { + // Source: promqltest/testdata/duration_expression.test + query: `changes(http_requests[1800])`, + piped: `http_requests[30m] | changes`, + }, + { + // Source: promqltest/testdata/duration_expression.test + query: `changes(http_requests[1h/2])`, + piped: `http_requests[1h / 2] | changes`, + }, + { + // Source: promqltest/testdata/duration_expression.test + query: `changes(http_requests[1h30m % 1h])`, + piped: `http_requests[1h30m % 1h] | changes`, + }, + { + // Source: promqltest/testdata/duration_expression.test + query: `changes(http_requests[24m+((1.5*2m)+2m)])`, + piped: `http_requests[24m + ((1.5 * 2m) + 2m)] | changes`, + }, + { + // Source: promqltest/testdata/duration_expression.test + query: `changes(http_requests[26m+4m])`, + piped: `http_requests[26m + 4m] | changes`, + }, + { + // Source: promqltest/testdata/duration_expression.test + query: `changes(http_requests[29m+60s])`, + piped: `http_requests[29m + 1m] | changes`, + }, + { + // Source: promqltest/testdata/duration_expression.test + query: `changes(http_requests[2m*(10+5)])`, + piped: `http_requests[2m * (10 + 5)] | changes`, + }, + { + // Source: promqltest/testdata/duration_expression.test + query: `changes(http_requests[2m*15])`, + piped: `http_requests[2m * 15] | changes`, + }, + { + // Source: promqltest/testdata/duration_expression.test + query: `changes(http_requests[30m+0s])`, + piped: `http_requests[30m + 0s] | changes`, + }, + { + // Source: promqltest/testdata/duration_expression.test + query: `changes(http_requests[30m1s-30m1s % 1m])`, + piped: `http_requests[30m1s - 30m1s % 1m] | changes`, + }, + { + // Source: promqltest/testdata/duration_expression.test + query: `changes(http_requests[60*30])`, + piped: `http_requests[60 * 30] | changes`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `changes(foo[3m] anchored)`, + piped: `foo[3m] anchored | changes`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `changes(foo[3m] smoothed)`, + piped: `foo[3m] smoothed | changes`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `changes(metric[1m1ms] anchored)`, + piped: `metric[1m1ms] anchored | changes`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `changes(metric[1m] anchored)`, + piped: `metric[1m] anchored | changes`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `changes(metric[1m])`, + piped: `metric[1m] | changes`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `changes(metric[5m] anchored)`, + piped: `metric[5m] anchored | changes`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `changes(metric[5m])`, + piped: `metric[5m] | changes`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `deriv(foo[3m] anchored)`, + piped: `foo[3m] anchored | deriv`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `deriv(foo[3m] smoothed)`, + piped: `foo[3m] smoothed | deriv`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `increase(metric[1m] anchored)`, + piped: `metric[1m] anchored | increase`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `increase(metric[1m] smoothed)`, + piped: `metric[1m] smoothed | increase`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `increase(metric[5m] anchored)`, + piped: `metric[5m] anchored | increase`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `increase(metric[5m] smoothed)`, + piped: `metric[5m] smoothed | increase`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `increase(metric[5m])`, + piped: `metric[5m] | increase`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `max_over_time(foo[3m] anchored)`, + piped: `foo[3m] anchored | max_over_time`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `max_over_time(foo[3m] smoothed)`, + piped: `foo[3m] smoothed | max_over_time`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `predict_linear(foo[3m] anchored, 4)`, + piped: `foo[3m] anchored | predict_linear(4)`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `predict_linear(foo[3m] smoothed, 4)`, + piped: `foo[3m] smoothed | predict_linear(4)`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `resets(foo[3m] anchored)`, + piped: `foo[3m] anchored | resets`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `resets(foo[3m] smoothed)`, + piped: `foo[3m] smoothed | resets`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `resets(metric[1m1ms] anchored)`, + piped: `metric[1m1ms] anchored | resets`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `resets(metric[1m] anchored)`, + piped: `metric[1m] anchored | resets`, + }, + { + // Source: promqltest/testdata/extended_vectors.test + query: `resets(metric[1m])`, + piped: `metric[1m] | resets`, + }, + { + // Source: promqltest/testdata/functions.test + query: `(quantile_over_time(2, (data[2m])))`, + piped: `((data[2m]) | quantile_over_time(2))`, + }, + { + // Source: promqltest/testdata/functions.test + query: `abs(data)`, + piped: `data | abs`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(a + b)`, + piped: `let + x1 = a + x2 = b +in x1 + x2 | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(a and b)`, + piped: `let + x1 = a + x2 = b +in x1 and x2 | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(http_requests)`, + piped: `http_requests | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(http_requests_histogram)`, + piped: `http_requests_histogram | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(max(nonexistent))`, + piped: `nonexistent | max | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(nonexistent > 1)`, + piped: `nonexistent > 1 | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(nonexistent)`, + piped: `nonexistent | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(nonexistent{job="testjob", instance="testinstance", method=~".x"})`, + piped: `nonexistent{instance="testinstance",job="testjob",method=~".x"} | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(nonexistent{job="testjob",job="testjob2",foo="bar"})`, + piped: `nonexistent{foo="bar",job="testjob",job="testjob2"} | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(nonexistent{job="testjob",job="testjob2",job="three",foo="bar"})`, + piped: `nonexistent{foo="bar",job="testjob",job="testjob2",job="three"} | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(nonexistent{job="testjob",job=~"testjob2",foo="bar"})`, + piped: `nonexistent{foo="bar",job="testjob",job=~"testjob2"} | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(rate(nonexistent[5m]))`, + piped: `nonexistent[5m] | rate | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(sum(http_requests))`, + piped: `http_requests | sum | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(sum(http_requests_histogram))`, + piped: `http_requests_histogram | sum | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent(sum(nonexistent{job="testjob", instance="testinstance"}))`, + piped: `nonexistent{instance="testinstance",job="testjob"} | sum | absent`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(http_requests_histogram[5m])`, + piped: `http_requests_histogram[5m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(http_requests_total[10m])`, + piped: `http_requests_total[10m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(http_requests_total[16m])`, + piped: `http_requests_total[16m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(http_requests_total[5m])`, + piped: `http_requests_total[5m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(http_requests_total[6m])`, + piped: `http_requests_total[6m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(http_requests_total{handler!="/foo"}[5m])`, + piped: `http_requests_total{handler!="/foo"}[5m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(http_requests_total{handler="/foo", handler="/bar", handler="/foobar"}[5m])`, + piped: `http_requests_total{handler="/bar",handler="/foo",handler="/foobar"}[5m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(http_requests_total{handler="/foo", handler="/bar", instance="127.0.0.1"}[5m])`, + piped: `http_requests_total{handler="/bar",handler="/foo",instance="127.0.0.1"}[5m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(http_requests_total{handler="/foo"}[5m])`, + piped: `http_requests_total{handler="/foo"}[5m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(httpd_handshake_failures_total[1m])`, + piped: `httpd_handshake_failures_total[1m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(httpd_handshake_failures_total[2m])`, + piped: `httpd_handshake_failures_total[2m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(httpd_log_lines_total[30s])`, + piped: `httpd_log_lines_total[30s] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(rate(http_requests_histogram[5m])[5m:1m])`, + piped: `http_requests_histogram[5m] | rate | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(rate(http_requests_total[5m])[5m:1m])`, + piped: `http_requests_total[5m] | rate | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time(rate(nonexistent[5m])[5m:])`, + piped: `nonexistent[5m] | rate | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time({instance="127.0.0.1"}[20m])`, + piped: `{instance="127.0.0.1"}[20m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time({instance="127.0.0.1"}[5m:5s])`, + piped: `{instance="127.0.0.1"} | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time({instance="127.0.0.1"}[5m])`, + piped: `{instance="127.0.0.1"}[5m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time({job="grok"}[20m])`, + piped: `{job="grok"}[20m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `absent_over_time({job="ingress"}[4m])`, + piped: `{job="ingress"}[4m] | absent_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `avg_over_time(foo[100s]) - 52`, + piped: `foo[1m40s] | avg_over_time - 52`, + }, + { + // Source: promqltest/testdata/functions.test + query: `avg_over_time(foo[100s]) == 52`, + piped: `foo[1m40s] | avg_over_time == 52`, + }, + { + // Source: promqltest/testdata/functions.test + query: `avg_over_time(foo[110s]) - 52`, + piped: `foo[1m50s] | avg_over_time - 52`, + }, + { + // Source: promqltest/testdata/functions.test + query: `avg_over_time(foo[110s]) == 52`, + piped: `foo[1m50s] | avg_over_time == 52`, + }, + { + // Source: promqltest/testdata/functions.test + query: `avg_over_time(foo[120s]) - 52`, + piped: `foo[2m] | avg_over_time - 52`, + }, + { + // Source: promqltest/testdata/functions.test + query: `avg_over_time(foo[120s]) == 52`, + piped: `foo[2m] | avg_over_time == 52`, + }, + { + // Source: promqltest/testdata/functions.test + query: `avg_over_time(foo[130s]) - 52`, + piped: `foo[2m10s] | avg_over_time - 52`, + }, + { + // Source: promqltest/testdata/functions.test + query: `avg_over_time(foo[130s]) == 52`, + piped: `foo[2m10s] | avg_over_time == 52`, + }, + { + // Source: promqltest/testdata/functions.test + query: `avg_over_time(metric[2m])`, + piped: `metric[2m] | avg_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `ceil(data)`, + piped: `data | ceil`, + }, + { + // Source: promqltest/testdata/functions.test + query: `changes((http_requests[50m]))`, + piped: `(http_requests[50m]) | changes`, + }, + { + // Source: promqltest/testdata/functions.test + query: `changes(http_requests[20m])`, + piped: `http_requests[20m] | changes`, + }, + { + // Source: promqltest/testdata/functions.test + query: `changes(http_requests[30m])`, + piped: `http_requests[30m] | changes`, + }, + { + // Source: promqltest/testdata/functions.test + query: `changes(http_requests[50m])`, + piped: `http_requests[50m] | changes`, + }, + { + // Source: promqltest/testdata/functions.test + query: `changes(http_requests[5m])`, + piped: `http_requests[5m] | changes`, + }, + { + // Source: promqltest/testdata/functions.test + query: `changes(http_requests[6m])`, + piped: `http_requests[6m] | changes`, + }, + { + // Source: promqltest/testdata/functions.test + query: `changes(http_requests_histogram[5m])`, + piped: `http_requests_histogram[5m] | changes`, + }, + { + // Source: promqltest/testdata/functions.test + query: `changes(http_requests_histogram[60m])`, + piped: `http_requests_histogram[1h] | changes`, + }, + { + // Source: promqltest/testdata/functions.test + query: `changes(http_requests_histogram[6m])`, + piped: `http_requests_histogram[6m] | changes`, + }, + { + // Source: promqltest/testdata/functions.test + query: `changes(nonexistent_metric[50m])`, + piped: `nonexistent_metric[50m] | changes`, + }, + { + // Source: promqltest/testdata/functions.test + query: `changes(x[20m])`, + piped: `x[20m] | changes`, + }, + { + // Source: promqltest/testdata/functions.test + query: `changes({__name__=~'testmetric1|testmetric2'}[5m])`, + piped: `{__name__=~"testmetric1|testmetric2"}[5m] | changes`, + }, + { + // Source: promqltest/testdata/functions.test + query: `clamp(mixed_metric, 2, 5)`, + piped: `mixed_metric | clamp(2, 5)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `clamp(test_clamp, -25, 75)`, + piped: `test_clamp | clamp(-25, 75)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `clamp(test_clamp, 0, NaN)`, + piped: `test_clamp | clamp(0, NaN)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `clamp(test_clamp, 5, -5)`, + piped: `test_clamp | clamp(5, -5)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `clamp(test_clamp, NaN, 0)`, + piped: `test_clamp | clamp(NaN, 0)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `clamp_max((clamp_min(test_clamp, (-20))), (70))`, + piped: `(test_clamp | clamp_min((-20))) | clamp_max((70))`, + }, + { + // Source: promqltest/testdata/functions.test + query: `clamp_max(clamp_min(test_clamp, -20), 70)`, + piped: `test_clamp | clamp_min(-20) | clamp_max(70)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `clamp_max(mixed_metric, 2)`, + piped: `mixed_metric | clamp_max(2)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `clamp_max(test_clamp, 75)`, + piped: `test_clamp | clamp_max(75)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `clamp_min(mixed_metric, 2)`, + piped: `mixed_metric | clamp_min(2)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `clamp_min(test_clamp, -25)`, + piped: `test_clamp | clamp_min(-25)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `count_over_time({__name__=~"data(_histogram|_sparse|_empty)?"}[2m])`, + piped: `{__name__=~"data(_histogram|_sparse|_empty)?"}[2m] | count_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `day_of_month()`, + piped: `day_of_month`, + }, + { + // Source: promqltest/testdata/functions.test + query: `day_of_month(histogram_sample)`, + piped: `histogram_sample | day_of_month`, + }, + { + // Source: promqltest/testdata/functions.test + query: `day_of_month(vector(1136239445))`, + piped: `vector(1136239445) | day_of_month`, + }, + { + // Source: promqltest/testdata/functions.test + query: `day_of_week()`, + piped: `day_of_week`, + }, + { + // Source: promqltest/testdata/functions.test + query: `day_of_week(histogram_sample)`, + piped: `histogram_sample | day_of_week`, + }, + { + // Source: promqltest/testdata/functions.test + query: `day_of_week(vector(1136239445))`, + piped: `vector(1136239445) | day_of_week`, + }, + { + // Source: promqltest/testdata/functions.test + query: `day_of_year()`, + piped: `day_of_year`, + }, + { + // Source: promqltest/testdata/functions.test + query: `day_of_year(histogram_sample)`, + piped: `histogram_sample | day_of_year`, + }, + { + // Source: promqltest/testdata/functions.test + query: `day_of_year(vector(1136239445))`, + piped: `vector(1136239445) | day_of_year`, + }, + { + // Source: promqltest/testdata/functions.test + query: `day_of_year(vector(1483191420))`, + piped: `vector(1483191420) | day_of_year`, + }, + { + // Source: promqltest/testdata/functions.test + query: `day_of_year(vector(1672493820))`, + piped: `vector(1672493820) | day_of_year`, + }, + { + // Source: promqltest/testdata/functions.test + query: `days_in_month(histogram_sample)`, + piped: `histogram_sample | days_in_month`, + }, + { + // Source: promqltest/testdata/functions.test + query: `days_in_month(vector(1454284800))`, + piped: `vector(1454284800) | days_in_month`, + }, + { + // Source: promqltest/testdata/functions.test + query: `days_in_month(vector(1485907200))`, + piped: `vector(1485907200) | days_in_month`, + }, + { + // Source: promqltest/testdata/functions.test + query: `delta(http_requests[20m])`, + piped: `http_requests[20m] | delta`, + }, + { + // Source: promqltest/testdata/functions.test + query: `delta(http_requests_counter[20m])`, + piped: `http_requests_counter[20m] | delta`, + }, + { + // Source: promqltest/testdata/functions.test + query: `delta(http_requests_gauge[20m])`, + piped: `http_requests_gauge[20m] | delta`, + }, + { + // Source: promqltest/testdata/functions.test + query: `delta(http_requests_mix[20m])`, + piped: `http_requests_mix[20m] | delta`, + }, + { + // Source: promqltest/testdata/functions.test + query: `deriv(http_requests_histogram[60m])`, + piped: `http_requests_histogram[1h] | deriv`, + }, + { + // Source: promqltest/testdata/functions.test + query: `deriv(http_requests_inf[100m])`, + piped: `http_requests_inf[1h40m] | deriv`, + }, + { + // Source: promqltest/testdata/functions.test + query: `deriv(http_requests_mix{group="canary", instance="1", job="app-server"}[110m])`, + piped: `http_requests_mix{group="canary",instance="1",job="app-server"}[1h50m] | deriv`, + }, + { + // Source: promqltest/testdata/functions.test + query: `deriv(http_requests_total{group="canary", instance="1", job="app-server"}[50m])`, + piped: `http_requests_total{group="canary",instance="1",job="app-server"}[50m] | deriv`, + }, + { + // Source: promqltest/testdata/functions.test + query: `deriv(testcounter_reset_middle_mix[110m])`, + piped: `testcounter_reset_middle_mix[1h50m] | deriv`, + }, + { + // Source: promqltest/testdata/functions.test + query: `deriv(testcounter_reset_middle_total[100m])`, + piped: `testcounter_reset_middle_total[1h40m] | deriv`, + }, + { + // Source: promqltest/testdata/functions.test + query: `exp(exp_root_log - 10)`, + piped: `exp_root_log - 10 | exp`, + }, + { + // Source: promqltest/testdata/functions.test + query: `exp(exp_root_log - 20)`, + piped: `exp_root_log - 20 | exp`, + }, + { + // Source: promqltest/testdata/functions.test + query: `exp(exp_root_log)`, + piped: `exp_root_log | exp`, + }, + { + // Source: promqltest/testdata/functions.test + query: `exp(ln(exp_root_log))`, + piped: `exp_root_log | ln | exp`, + }, + { + // Source: promqltest/testdata/functions.test + query: `exp(ln({__name__=~"exp_root_log(_h)?"}))`, + piped: `{__name__=~"exp_root_log(_h)?"} | ln | exp`, + }, + { + // Source: promqltest/testdata/functions.test + query: `exp({__name__=~"exp_root_log(_h)?"})`, + piped: `{__name__=~"exp_root_log(_h)?"} | exp`, + }, + { + // Source: promqltest/testdata/functions.test + query: `first_over_time({__name__=~"data(_histogram|_sparse|_empty)?"}[2m])`, + piped: `{__name__=~"data(_histogram|_sparse|_empty)?"}[2m] | first_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `floor(data)`, + piped: `data | floor`, + }, + { + // Source: promqltest/testdata/functions.test + query: `hour()`, + piped: `hour`, + }, + { + // Source: promqltest/testdata/functions.test + query: `hour(histogram_sample)`, + piped: `histogram_sample | hour`, + }, + { + // Source: promqltest/testdata/functions.test + query: `hour(vector(1136239445))`, + piped: `vector(1136239445) | hour`, + }, + { + // Source: promqltest/testdata/functions.test + query: `idelta(http_requests[20m])`, + piped: `http_requests[20m] | idelta`, + }, + { + // Source: promqltest/testdata/functions.test + query: `idelta(http_requests_histogram{path="/a"}[20m])`, + piped: `http_requests_histogram{path="/a"}[20m] | idelta`, + }, + { + // Source: promqltest/testdata/functions.test + query: `idelta(http_requests_histogram{path="/b"}[20m])`, + piped: `http_requests_histogram{path="/b"}[20m] | idelta`, + }, + { + // Source: promqltest/testdata/functions.test + query: `idelta(http_requests_histogram{path="/b"}[6m])`, + piped: `http_requests_histogram{path="/b"}[6m] | idelta`, + }, + { + // Source: promqltest/testdata/functions.test + query: `idelta(http_requests_histogram{path="/c"}[20m])`, + piped: `http_requests_histogram{path="/c"}[20m] | idelta`, + }, + { + // Source: promqltest/testdata/functions.test + query: `idelta(http_requests_histogram{path="/d"}[20m])`, + piped: `http_requests_histogram{path="/d"}[20m] | idelta`, + }, + { + // Source: promqltest/testdata/functions.test + query: `idelta(http_requests_histogram{path="/e"}[20m])`, + piped: `http_requests_histogram{path="/e"}[20m] | idelta`, + }, + { + // Source: promqltest/testdata/functions.test + query: `idelta(http_requests_histogram{path="/f"}[20m])`, + piped: `http_requests_histogram{path="/f"}[20m] | idelta`, + }, + { + // Source: promqltest/testdata/functions.test + query: `idelta(http_requests_histogram{path="/g"}[20m])`, + piped: `http_requests_histogram{path="/g"}[20m] | idelta`, + }, + { + // Source: promqltest/testdata/functions.test + query: `idelta(http_requests_nan[15m1s])`, + piped: `http_requests_nan[15m1s] | idelta`, + }, + { + // Source: promqltest/testdata/functions.test + query: `increase(http_requests_total[100m])`, + piped: `http_requests_total[1h40m] | increase`, + }, + { + // Source: promqltest/testdata/functions.test + query: `increase(http_requests_total[30m])`, + piped: `http_requests_total[30m] | increase`, + }, + { + // Source: promqltest/testdata/functions.test + query: `increase(http_requests_total[50m])`, + piped: `http_requests_total[50m] | increase`, + }, + { + // Source: promqltest/testdata/functions.test + query: `irate(http_requests_histogram{path="/a"}[20m])`, + piped: `http_requests_histogram{path="/a"}[20m] | irate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `irate(http_requests_histogram{path="/b"}[20m])`, + piped: `http_requests_histogram{path="/b"}[20m] | irate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `irate(http_requests_histogram{path="/b"}[6m])`, + piped: `http_requests_histogram{path="/b"}[6m] | irate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `irate(http_requests_histogram{path="/c"}[20m])`, + piped: `http_requests_histogram{path="/c"}[20m] | irate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `irate(http_requests_histogram{path="/d"}[20m])`, + piped: `http_requests_histogram{path="/d"}[20m] | irate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `irate(http_requests_histogram{path="/e"}[20m])`, + piped: `http_requests_histogram{path="/e"}[20m] | irate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `irate(http_requests_histogram{path="/f"}[20m])`, + piped: `http_requests_histogram{path="/f"}[20m] | irate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `irate(http_requests_histogram{path="/g"}[20m])`, + piped: `http_requests_histogram{path="/g"}[20m] | irate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `irate(http_requests_nan[15m1s])`, + piped: `http_requests_nan[15m1s] | irate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `irate(http_requests_total[50m])`, + piped: `http_requests_total[50m] | irate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_join(dup, "label", "", "this")`, + piped: `dup | label_join("label", "", "this")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_join(testmetric, "dst", "", "emptysrc", "emptysrc1", "emptysrc2")`, + piped: `testmetric | label_join("dst", "", "emptysrc", "emptysrc1", "emptysrc2")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_join(testmetric, "dst", ", ")`, + piped: `testmetric | label_join("dst", ", ")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_join(testmetric, "dst", "-", "src", "src1", "src2")`, + piped: `testmetric | label_join("dst", "-", "src", "src1", "src2")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_join(testmetric, "dst", "-", "src", "src3", "src1")`, + piped: `testmetric | label_join("dst", "-", "src", "src3", "src1")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_join(testmetric1, "dst", ", ", "src", "src1", "src2")`, + piped: `testmetric1 | label_join("dst", ", ", "src", "src1", "src2")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_replace((((testmetric))), (("dst")), (("value-$1")), (("src")), (("non-matching-regex")))`, + piped: `(((testmetric))) | label_replace((("dst")), (("value-$1")), (("src")), (("non-matching-regex")))`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_replace(testmetric, "\xff", "", "src", "(.*)")`, + piped: `testmetric | label_replace("\xff", "", "src", "(.*)")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_replace(testmetric, "dst", "", "dst", ".*")`, + piped: `testmetric | label_replace("dst", "", "dst", ".*")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_replace(testmetric, "dst", "$1-value-$2", "src", "(.*)-value-(.*)")`, + piped: `testmetric | label_replace("dst", "$1-value-$2", "src", "(.*)-value-(.*)")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_replace(testmetric, "dst", "destination-value-$1", "src", "source-value-(.*)")`, + piped: `testmetric | label_replace("dst", "destination-value-$1", "src", "source-value-(.*)")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_replace(testmetric, "dst", "destination-value-$1", "src", "value-(.*)")`, + piped: `testmetric | label_replace("dst", "destination-value-$1", "src", "value-(.*)")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_replace(testmetric, "dst", "value-$1", "nonexistent-src", "(.*)")`, + piped: `testmetric | label_replace("dst", "value-$1", "nonexistent-src", "(.*)")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_replace(testmetric, "dst", "value-$1", "nonexistent-src", "source-value-(.*)")`, + piped: `testmetric | label_replace("dst", "value-$1", "nonexistent-src", "source-value-(.*)")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_replace(testmetric, "dst", "value-$1", "src", "(.*")`, + piped: `testmetric | label_replace("dst", "value-$1", "src", "(.*")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_replace(testmetric, "dst", "value-$1", "src", "non-matching-regex")`, + piped: `testmetric | label_replace("dst", "value-$1", "src", "non-matching-regex")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `label_replace(testmetric, "src", "", "", "")`, + piped: `testmetric | label_replace("src", "", "", "")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `last_over_time({__name__=~"data(_histogram|_sparse|_empty)?"}[2m])`, + piped: `{__name__=~"data(_histogram|_sparse|_empty)?"}[2m] | last_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `ln(exp_root_log - 10)`, + piped: `exp_root_log - 10 | ln`, + }, + { + // Source: promqltest/testdata/functions.test + query: `ln(exp_root_log - 20)`, + piped: `exp_root_log - 20 | ln`, + }, + { + // Source: promqltest/testdata/functions.test + query: `ln(exp_root_log)`, + piped: `exp_root_log | ln`, + }, + { + // Source: promqltest/testdata/functions.test + query: `ln({__name__=~"exp_root_log(_h)?"})`, + piped: `{__name__=~"exp_root_log(_h)?"} | ln`, + }, + { + // Source: promqltest/testdata/functions.test + query: `log10(exp_root_log - 10)`, + piped: `exp_root_log - 10 | log10`, + }, + { + // Source: promqltest/testdata/functions.test + query: `log10(exp_root_log - 20)`, + piped: `exp_root_log - 20 | log10`, + }, + { + // Source: promqltest/testdata/functions.test + query: `log10(exp_root_log)`, + piped: `exp_root_log | log10`, + }, + { + // Source: promqltest/testdata/functions.test + query: `log10({__name__=~"exp_root_log(_h)?"})`, + piped: `{__name__=~"exp_root_log(_h)?"} | log10`, + }, + { + // Source: promqltest/testdata/functions.test + query: `log2(exp_root_log - 10)`, + piped: `exp_root_log - 10 | log2`, + }, + { + // Source: promqltest/testdata/functions.test + query: `log2(exp_root_log - 20)`, + piped: `exp_root_log - 20 | log2`, + }, + { + // Source: promqltest/testdata/functions.test + query: `log2(exp_root_log)`, + piped: `exp_root_log | log2`, + }, + { + // Source: promqltest/testdata/functions.test + query: `log2({__name__=~"exp_root_log(_h)?"})`, + piped: `{__name__=~"exp_root_log(_h)?"} | log2`, + }, + { + // Source: promqltest/testdata/functions.test + query: `max_over_time(data[2m])`, + piped: `data[2m] | max_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `max_over_time(data_histogram{type="only_histogram"}[2m])`, + piped: `data_histogram{type="only_histogram"}[2m] | max_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `max_over_time(data_histogram{type=~"mix_samples.*"}[2m])`, + piped: `data_histogram{type=~"mix_samples.*"}[2m] | max_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `max_over_time(data_sparse[2m])`, + piped: `data_sparse[2m] | max_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `min_over_time(data[2m])`, + piped: `data[2m] | min_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `min_over_time(data_histogram{type="only_histogram"}[2m])`, + piped: `data_histogram{type="only_histogram"}[2m] | min_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `min_over_time(data_histogram{type=~"mix_samples.*"}[2m])`, + piped: `data_histogram{type=~"mix_samples.*"}[2m] | min_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `min_over_time(data_sparse[2m])`, + piped: `data_sparse[2m] | min_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `minute()`, + piped: `minute`, + }, + { + // Source: promqltest/testdata/functions.test + query: `minute(histogram_sample)`, + piped: `histogram_sample | minute`, + }, + { + // Source: promqltest/testdata/functions.test + query: `minute(vector(1136239445))`, + piped: `vector(1136239445) | minute`, + }, + { + // Source: promqltest/testdata/functions.test + query: `month()`, + piped: `month`, + }, + { + // Source: promqltest/testdata/functions.test + query: `month(histogram_sample)`, + piped: `histogram_sample | month`, + }, + { + // Source: promqltest/testdata/functions.test + query: `month(vector(1136239445))`, + piped: `vector(1136239445) | month`, + }, + { + // Source: promqltest/testdata/functions.test + query: `month(vector(1456790399)) + day_of_month(vector(1456790399)) / 100`, + piped: `let + x1 = vector(1456790399) | month + x2 = vector(1456790399) | day_of_month / 100 +in x1 + x2`, + }, + { + // Source: promqltest/testdata/functions.test + query: `month(vector(1456790400)) + day_of_month(vector(1456790400)) / 100`, + piped: `let + x1 = vector(1456790400) | month + x2 = vector(1456790400) | day_of_month / 100 +in x1 + x2`, + }, + { + // Source: promqltest/testdata/functions.test + query: `predict_linear(http_requests_histogram[60m], 50m)`, + piped: `http_requests_histogram[1h] | predict_linear(50m)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `predict_linear(http_requests_inf[100m], 6000)`, + piped: `http_requests_inf[1h40m] | predict_linear(6000)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `predict_linear(http_requests_total[50m], 3600) - (http_requests_total + deriv(http_requests_total[50m]) * 3600)`, + piped: `let + x1 = http_requests_total[50m] | predict_linear(3600) + x2 = http_requests_total + x3 = http_requests_total[50m] | deriv * 3600 +in x1 - (x2 + x3)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `predict_linear(testcounter_reset_middle_mix[60m], 3000)`, + piped: `testcounter_reset_middle_mix[1h] | predict_linear(3000)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `predict_linear(testcounter_reset_middle_mix[60m], 50m)`, + piped: `testcounter_reset_middle_mix[1h] | predict_linear(50m)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `predict_linear(testcounter_reset_middle_total[50m], 1h)`, + piped: `testcounter_reset_middle_total[50m] | predict_linear(1h)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `predict_linear(testcounter_reset_middle_total[50m], 3600)`, + piped: `testcounter_reset_middle_total[50m] | predict_linear(3600)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `predict_linear(testcounter_reset_middle_total[55m] @ 3000, 1h)`, + piped: `testcounter_reset_middle_total[55m] @ 3000.000 | predict_linear(1h)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `predict_linear(testcounter_reset_middle_total[55m] @ 3000, 3600)`, + piped: `testcounter_reset_middle_total[55m] @ 3000.000 | predict_linear(3600)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time(http_requests_total[10m])`, + piped: `http_requests_total[10m] | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time(http_requests_total[16m])`, + piped: `http_requests_total[16m] | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time(http_requests_total[5m])`, + piped: `http_requests_total[5m] | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time(http_requests_total[6m])`, + piped: `http_requests_total[6m] | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time(http_requests_total{handler!="/foo"}[5m])`, + piped: `http_requests_total{handler!="/foo"}[5m] | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time(http_requests_total{handler="/foo", handler="/bar", handler="/foobar"}[5m])`, + piped: `http_requests_total{handler="/bar",handler="/foo",handler="/foobar"}[5m] | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time(http_requests_total{handler="/foo", handler="/bar", instance="127.0.0.1"}[5m])`, + piped: `http_requests_total{handler="/bar",handler="/foo",instance="127.0.0.1"}[5m] | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time(http_requests_total{handler="/foo"}[5m])`, + piped: `http_requests_total{handler="/foo"}[5m] | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time(httpd_handshake_failures_total[1m])`, + piped: `httpd_handshake_failures_total[1m] | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time(httpd_log_lines_total[30s])`, + piped: `httpd_log_lines_total[30s] | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time(rate(http_requests_total[5m])[5m:1m])`, + piped: `http_requests_total[5m] | rate | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time(rate(nonexistent[5m])[5m:])`, + piped: `nonexistent[5m] | rate | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time({instance="127.0.0.1"}[5m:5s])`, + piped: `{instance="127.0.0.1"} | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time({instance="127.0.0.1"}[5m])`, + piped: `{instance="127.0.0.1"}[5m] | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time({job="grok"}[20m])`, + piped: `{job="grok"}[20m] | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `present_over_time({job="ingress"}[4m])`, + piped: `{job="ingress"}[4m] | present_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `quantile_over_time(-1, data[2m])`, + piped: `data[2m] | quantile_over_time(-1)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `quantile_over_time(0, data[2m])`, + piped: `data[2m] | quantile_over_time(0)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `quantile_over_time(0.5, data[2m])`, + piped: `data[2m] | quantile_over_time(0.5)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `quantile_over_time(0.5, data_histogram{test="mix samples"}[2m])`, + piped: `data_histogram{test="mix samples"}[2m] | quantile_over_time(0.5)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `quantile_over_time(0.5, data_histogram{test="only histogram samples"}[2m])`, + piped: `data_histogram{test="only histogram samples"}[2m] | quantile_over_time(0.5)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `quantile_over_time(0.75, data[2m])`, + piped: `data[2m] | quantile_over_time(0.75)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `quantile_over_time(0.8, data[2m])`, + piped: `data[2m] | quantile_over_time(0.8)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `quantile_over_time(1, data[2m])`, + piped: `data[2m] | quantile_over_time(1)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `quantile_over_time(2, data[2m])`, + piped: `data[2m] | quantile_over_time(2)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `rate(calculate_rate_offset_total[10m] offset 5m)`, + piped: `calculate_rate_offset_total[10m] offset 5m | rate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `rate(calculate_rate_window_total[50m])`, + piped: `calculate_rate_window_total[50m] | rate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `rate(http_requests_total{group="canary", instance="1", job="app-server"}[50m])`, + piped: `http_requests_total{group="canary",instance="1",job="app-server"}[50m] | rate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `rate(testcounter_reset_end_total[5m])`, + piped: `testcounter_reset_end_total[5m] | rate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `rate(testcounter_reset_end_total[6m])`, + piped: `testcounter_reset_end_total[6m] | rate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `rate(testcounter_reset_middle_total[50m])`, + piped: `testcounter_reset_middle_total[50m] | rate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `rate(testcounter_zero_cutoff_total[20m])`, + piped: `testcounter_zero_cutoff_total[20m] | rate`, + }, + { + // Source: promqltest/testdata/functions.test + query: `resets(http_requests[10m])`, + piped: `http_requests[10m] | resets`, + }, + { + // Source: promqltest/testdata/functions.test + query: `resets(http_requests[20m])`, + piped: `http_requests[20m] | resets`, + }, + { + // Source: promqltest/testdata/functions.test + query: `resets(http_requests[30m])`, + piped: `http_requests[30m] | resets`, + }, + { + // Source: promqltest/testdata/functions.test + query: `resets(http_requests[32m])`, + piped: `http_requests[32m] | resets`, + }, + { + // Source: promqltest/testdata/functions.test + query: `resets(http_requests[50m])`, + piped: `http_requests[50m] | resets`, + }, + { + // Source: promqltest/testdata/functions.test + query: `resets(http_requests[5m])`, + piped: `http_requests[5m] | resets`, + }, + { + // Source: promqltest/testdata/functions.test + query: `resets(http_requests[600])`, + piped: `http_requests[10m] | resets`, + }, + { + // Source: promqltest/testdata/functions.test + query: `resets(http_requests_histogram[60m])`, + piped: `http_requests_histogram[1h] | resets`, + }, + { + // Source: promqltest/testdata/functions.test + query: `resets(http_requests_histogram[6m])`, + piped: `http_requests_histogram[6m] | resets`, + }, + { + // Source: promqltest/testdata/functions.test + query: `resets(nonexistent_metric[50m])`, + piped: `nonexistent_metric[50m] | resets`, + }, + { + // Source: promqltest/testdata/functions.test + query: `round(data)`, + piped: `data | round`, + }, + { + // Source: promqltest/testdata/functions.test + query: `round(mixed_metric)`, + piped: `mixed_metric | round`, + }, + { + // Source: promqltest/testdata/functions.test + query: `scalar(metric)`, + piped: `metric | scalar`, + }, + { + // Source: promqltest/testdata/functions.test + query: `scalar({l="x"})`, + piped: `{l="x"} | scalar`, + }, + { + // Source: promqltest/testdata/functions.test + query: `scalar({type="histogram"})`, + piped: `{type="histogram"} | scalar`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sgn(test_sgn)`, + piped: `test_sgn | sgn`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sort(http_requests)`, + piped: `http_requests | sort`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sort_by_label(cpu_time_total, "cpu")`, + piped: `cpu_time_total | sort_by_label("cpu")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sort_by_label(http_requests, "group", "instance", "job")`, + piped: `http_requests | sort_by_label("group", "instance", "job")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sort_by_label(http_requests, "instance")`, + piped: `http_requests | sort_by_label("instance")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sort_by_label(http_requests, "instance", "group")`, + piped: `http_requests | sort_by_label("instance", "group")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sort_by_label(http_requests, "job", "instance", "group")`, + piped: `http_requests | sort_by_label("job", "instance", "group")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sort_by_label(node_uname_info, "instance")`, + piped: `node_uname_info | sort_by_label("instance")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sort_by_label(node_uname_info, "release")`, + piped: `node_uname_info | sort_by_label("release")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sort_by_label_desc(http_requests, "instance")`, + piped: `http_requests | sort_by_label_desc("instance")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sort_by_label_desc(http_requests, "instance", "group")`, + piped: `http_requests | sort_by_label_desc("instance", "group")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sort_by_label_desc(http_requests, "instance", "group", "job")`, + piped: `http_requests | sort_by_label_desc("instance", "group", "job")`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sort_desc(http_requests)`, + piped: `http_requests | sort_desc`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sqrt(exp_root_log)`, + piped: `exp_root_log | sqrt`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sqrt({__name__=~"exp_root_log(_h)?"})`, + piped: `{__name__=~"exp_root_log(_h)?"} | sqrt`, + }, + { + // Source: promqltest/testdata/functions.test + query: `stddev_over_time((metric[2m]))`, + piped: `(metric[2m]) | stddev_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `stddev_over_time(metric[2m])`, + piped: `metric[2m] | stddev_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `stddev_over_time(metric_histogram{type="mix"}[2m])`, + piped: `metric_histogram{type="mix"}[2m] | stddev_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `stddev_over_time(metric_histogram{type="only_histogram"}[2m])`, + piped: `metric_histogram{type="only_histogram"}[2m] | stddev_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `stdvar_over_time(metric[2m])`, + piped: `metric[2m] | stdvar_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `stdvar_over_time(metric_histogram{type="mix"}[2m])`, + piped: `metric_histogram{type="mix"}[2m] | stdvar_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `stdvar_over_time(metric_histogram{type="only_histogram"}[2m])`, + piped: `metric_histogram{type="only_histogram"}[2m] | stdvar_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `sum_over_time(metric[2m])`, + piped: `metric[2m] | sum_over_time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `time()`, + piped: `time`, + }, + { + // Source: promqltest/testdata/functions.test + query: `vector(1)`, + piped: `vector(1)`, + }, + { + // Source: promqltest/testdata/functions.test + query: `vector(time())`, + piped: `vector(time())`, + }, + { + // Source: promqltest/testdata/functions.test + query: `year()`, + piped: `year`, + }, + { + // Source: promqltest/testdata/functions.test + query: `year(histogram_sample)`, + piped: `histogram_sample | year`, + }, + { + // Source: promqltest/testdata/functions.test + query: `year(vector(1136239445))`, + piped: `vector(1136239445) | year`, + }, + { + // Source: promqltest/testdata/functions.test + query: `year(vector(1230767999))`, + piped: `vector(1230767999) | year`, + }, + { + // Source: promqltest/testdata/functions.test + query: `year(vector(1230768000))`, + piped: `vector(1230768000) | year`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `avg (request_duration_seconds_bucket{le="+Inf"}) - avg (request_duration_seconds_bucket{le="0.2"})`, + piped: `let + x1 = request_duration_seconds_bucket{le="+Inf"} | avg + x2 = request_duration_seconds_bucket{le="0.2"} | avg +in x1 - x2`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `avg (request_duration_seconds_bucket{le="0.1"})`, + piped: `request_duration_seconds_bucket{le="0.1"} | avg`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `avg (request_duration_seconds_bucket{le="0.2"}) - avg (request_duration_seconds_bucket{le="0.1"})`, + piped: `let + x1 = request_duration_seconds_bucket{le="0.2"} | avg + x2 = request_duration_seconds_bucket{le="0.1"} | avg +in x1 - x2`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `avg(request_duration_seconds)`, + piped: `request_duration_seconds | avg`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `avg_over_time(histogram_over_time[4m:1m])`, + piped: `histogram_over_time | avg_over_time`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `count(request_duration_seconds)`, + piped: `request_duration_seconds | count`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_avg(testhistogram3)`, + piped: `testhistogram3 | histogram_avg`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_count(increase(histogram_with_reset[15m]))`, + piped: `histogram_with_reset[15m] | increase | histogram_count`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_count(testhistogram3)`, + piped: `testhistogram3 | histogram_count`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_fraction(-Inf, 1, series)`, + piped: `series | histogram_fraction(-Inf, 1)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_fraction(0, 0.2, rate(testhistogram3[10m]))`, + piped: `testhistogram3[10m] | rate | histogram_fraction(0, 0.2)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_fraction(0, 0.2, rate(testhistogram3_bucket[10m]))`, + piped: `testhistogram3_bucket[10m] | rate | histogram_fraction(0, 0.2)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_fraction(0, 0.2, testhistogram3)`, + piped: `testhistogram3 | histogram_fraction(0, 0.2)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_fraction(0, 0.2, testhistogram3_bucket)`, + piped: `testhistogram3_bucket | histogram_fraction(0, 0.2)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_fraction(0, 3.5, testhistogram2)`, + piped: `testhistogram2 | histogram_fraction(0, 3.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_fraction(0, 3.5, testhistogram2_bucket)`, + piped: `testhistogram2_bucket | histogram_fraction(0, 3.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_fraction(0, 4, testhistogram2)`, + piped: `testhistogram2 | histogram_fraction(0, 4)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_fraction(0, 4, testhistogram2_bucket)`, + piped: `testhistogram2_bucket | histogram_fraction(0, 4)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_fraction(0, 6, testhistogram2)`, + piped: `testhistogram2 | histogram_fraction(0, 6)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_fraction(0, 6, testhistogram2_bucket)`, + piped: `testhistogram2_bucket | histogram_fraction(0, 6)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(-0.1, testhistogram)`, + piped: `testhistogram | histogram_quantile(-0.1)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(-0.1, testhistogram_bucket)`, + piped: `testhistogram_bucket | histogram_quantile(-0.1)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0, testhistogram)`, + piped: `testhistogram | histogram_quantile(0)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0, testhistogram3)`, + piped: `testhistogram3 | histogram_quantile(0)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0, testhistogram3_bucket)`, + piped: `testhistogram3_bucket | histogram_quantile(0)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0, testhistogram_bucket)`, + piped: `testhistogram_bucket | histogram_quantile(0)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.01, nonmonotonic_bucket)`, + piped: `nonmonotonic_bucket | histogram_quantile(0.01)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.2, rate(empty_bucket[10m]))`, + piped: `empty_bucket[10m] | rate | histogram_quantile(0.2)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.2, rate(testhistogram[10m]))`, + piped: `testhistogram[10m] | rate | histogram_quantile(0.2)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.2, rate(testhistogram_bucket[10m]))`, + piped: `testhistogram_bucket[10m] | rate | histogram_quantile(0.2)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.2, testhistogram)`, + piped: `testhistogram | histogram_quantile(0.2)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.2, testhistogram_bucket)`, + piped: `testhistogram_bucket | histogram_quantile(0.2)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.25, testhistogram3)`, + piped: `testhistogram3 | histogram_quantile(0.25)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.25, testhistogram3_bucket)`, + piped: `testhistogram3_bucket | histogram_quantile(0.25)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.3, avg(rate(request_duration_seconds[10m])))`, + piped: `request_duration_seconds[10m] | rate | avg | histogram_quantile(0.3)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.3, avg(rate(request_duration_seconds_bucket[10m])) by (le))`, + piped: `request_duration_seconds_bucket[10m] | rate | avg by (le) | histogram_quantile(0.3)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.3, rate(request_duration_seconds[10m]))`, + piped: `request_duration_seconds[10m] | rate | histogram_quantile(0.3)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.3, rate(request_duration_seconds_bucket[10m]))`, + piped: `request_duration_seconds_bucket[10m] | rate | histogram_quantile(0.3)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.3, sum(rate(request_duration_seconds[10m])) by (instance))`, + piped: `request_duration_seconds[10m] | rate | sum by (instance) | histogram_quantile(0.3)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.3, sum(rate(request_duration_seconds[10m])) by (job))`, + piped: `request_duration_seconds[10m] | rate | sum by (job) | histogram_quantile(0.3)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.3, sum(rate(request_duration_seconds[10m])) by (job, instance))`, + piped: `request_duration_seconds[10m] | rate | sum by (job, instance) | histogram_quantile(0.3)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.3, sum(rate(request_duration_seconds[10m])))`, + piped: `request_duration_seconds[10m] | rate | sum | histogram_quantile(0.3)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.3, sum(rate(request_duration_seconds_bucket[10m])) by (le))`, + piped: `request_duration_seconds_bucket[10m] | rate | sum by (le) | histogram_quantile(0.3)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.3, sum(rate(request_duration_seconds_bucket[10m])) by (le, instance))`, + piped: `request_duration_seconds_bucket[10m] | rate | sum by (le, instance) | histogram_quantile(0.3)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.3, sum(rate(request_duration_seconds_bucket[10m])) by (le, job))`, + piped: `request_duration_seconds_bucket[10m] | rate | sum by (le, job) | histogram_quantile(0.3)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.3, sum(rate(request_duration_seconds_bucket[10m])) by (le, job, instance))`, + piped: `request_duration_seconds_bucket[10m] | rate | sum by (le, job, instance) | histogram_quantile(0.3)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, avg(rate(request_duration_seconds[10m])))`, + piped: `request_duration_seconds[10m] | rate | avg | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, avg(rate(request_duration_seconds_bucket[10m])) by (le))`, + piped: `request_duration_seconds_bucket[10m] | rate | avg by (le) | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, rate(mixed[10m]))`, + piped: `mixed[10m] | rate | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, rate(mixed_bucket[10m]))`, + piped: `mixed_bucket[10m] | rate | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, rate(request_duration_seconds[10m]))`, + piped: `request_duration_seconds[10m] | rate | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, rate(request_duration_seconds_bucket[10m]))`, + piped: `request_duration_seconds_bucket[10m] | rate | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, rate(testhistogram2[15m]))`, + piped: `testhistogram2[15m] | rate | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, rate(testhistogram2_bucket[15m]))`, + piped: `testhistogram2_bucket[15m] | rate | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, rate(testhistogram[10m]))`, + piped: `testhistogram[10m] | rate | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, rate(testhistogram_bucket[10m]))`, + piped: `testhistogram_bucket[10m] | rate | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, sum(rate(request_duration_seconds[10m])) by (instance))`, + piped: `request_duration_seconds[10m] | rate | sum by (instance) | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, sum(rate(request_duration_seconds[10m])) by (job))`, + piped: `request_duration_seconds[10m] | rate | sum by (job) | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, sum(rate(request_duration_seconds[10m])) by (job, instance))`, + piped: `request_duration_seconds[10m] | rate | sum by (job, instance) | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, sum(rate(request_duration_seconds[10m])))`, + piped: `request_duration_seconds[10m] | rate | sum | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, sum(rate(request_duration_seconds_bucket[10m])) by (le))`, + piped: `request_duration_seconds_bucket[10m] | rate | sum by (le) | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, sum(rate(request_duration_seconds_bucket[10m])) by (le, instance))`, + piped: `request_duration_seconds_bucket[10m] | rate | sum by (le, instance) | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, sum(rate(request_duration_seconds_bucket[10m])) by (le, job))`, + piped: `request_duration_seconds_bucket[10m] | rate | sum by (le, job) | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, sum(rate(request_duration_seconds_bucket[10m])) by (le, job, instance))`, + piped: `request_duration_seconds_bucket[10m] | rate | sum by (le, job, instance) | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, testhistogram)`, + piped: `testhistogram | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, testhistogram2)`, + piped: `testhistogram2 | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, testhistogram2_bucket)`, + piped: `testhistogram2_bucket | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, testhistogram3)`, + piped: `testhistogram3 | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, testhistogram3_bucket)`, + piped: `testhistogram3_bucket | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.5, testhistogram_bucket)`, + piped: `testhistogram_bucket | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.75, rate(mixed_bucket[10m]))`, + piped: `mixed_bucket[10m] | rate | histogram_quantile(0.75)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.75, testhistogram3)`, + piped: `testhistogram3 | histogram_quantile(0.75)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.75, testhistogram3_bucket)`, + piped: `testhistogram3_bucket | histogram_quantile(0.75)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.8, rate(testhistogram[10m]))`, + piped: `testhistogram[10m] | rate | histogram_quantile(0.8)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.8, rate(testhistogram_bucket[10m]))`, + piped: `testhistogram_bucket[10m] | rate | histogram_quantile(0.8)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.8, series)`, + piped: `series | histogram_quantile(0.8)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.8, testhistogram)`, + piped: `testhistogram | histogram_quantile(0.8)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.8, testhistogram_bucket)`, + piped: `testhistogram_bucket | histogram_quantile(0.8)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.99, nonmonotonic_bucket)`, + piped: `nonmonotonic_bucket | histogram_quantile(0.99)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.99, {__name__=~"request_duration_seconds\\d*"})`, + piped: `{__name__=~"request_duration_seconds\\d*"} | histogram_quantile(0.99)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(0.99, {__name__=~"request_duration_seconds\\d*_bucket"})`, + piped: `{__name__=~"request_duration_seconds\\d*_bucket"} | histogram_quantile(0.99)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(1, rate(mixed_bucket[10m]))`, + piped: `mixed_bucket[10m] | rate | histogram_quantile(1)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(1, testhistogram)`, + piped: `testhistogram | histogram_quantile(1)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(1, testhistogram3)`, + piped: `testhistogram3 | histogram_quantile(1)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(1, testhistogram3_bucket)`, + piped: `testhistogram3_bucket | histogram_quantile(1)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(1, testhistogram_bucket)`, + piped: `testhistogram_bucket | histogram_quantile(1)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(1./6., rate(testhistogram2[15m]))`, + piped: `testhistogram2[15m] | rate | histogram_quantile(1 / 6)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(1./6., rate(testhistogram2_bucket[15m]))`, + piped: `testhistogram2_bucket[15m] | rate | histogram_quantile(1 / 6)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(1./6., testhistogram2)`, + piped: `testhistogram2 | histogram_quantile(1 / 6)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(1./6., testhistogram2_bucket)`, + piped: `testhistogram2_bucket | histogram_quantile(1 / 6)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(1.0, sum by (le) (rate(const_histogram_bucket[5m])))`, + piped: `const_histogram_bucket[5m] | rate | sum by (le) | histogram_quantile(1)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(1.0, sum(rate(const_histogram[5m])))`, + piped: `const_histogram[5m] | rate | sum | histogram_quantile(1)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(1.01, testhistogram)`, + piped: `testhistogram | histogram_quantile(1.01)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(1.01, testhistogram_bucket)`, + piped: `testhistogram_bucket | histogram_quantile(1.01)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(5./6., rate(testhistogram2[15m]))`, + piped: `testhistogram2[15m] | rate | histogram_quantile(5 / 6)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(5./6., rate(testhistogram2_bucket[15m]))`, + piped: `testhistogram2_bucket[15m] | rate | histogram_quantile(5 / 6)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(5./6., testhistogram2)`, + piped: `testhistogram2 | histogram_quantile(5 / 6)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(5./6., testhistogram2_bucket)`, + piped: `testhistogram2_bucket | histogram_quantile(5 / 6)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(NaN, non_existent)`, + piped: `non_existent | histogram_quantile(NaN)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(NaN, testhistogram)`, + piped: `testhistogram | histogram_quantile(NaN)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_quantile(NaN, testhistogram_bucket)`, + piped: `testhistogram_bucket | histogram_quantile(NaN)`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_stddev(testhistogram3)`, + piped: `testhistogram3 | histogram_stddev`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_stdvar(testhistogram3)`, + piped: `testhistogram3 | histogram_stdvar`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_sum(increase(histogram_with_reset[15m]))`, + piped: `histogram_with_reset[15m] | increase | histogram_sum`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `histogram_sum(testhistogram3)`, + piped: `testhistogram3 | histogram_sum`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `increase(histogram_with_reset[15m])`, + piped: `histogram_with_reset[15m] | increase`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `rate(const_histogram_bucket[5m])`, + piped: `const_histogram_bucket[5m] | rate`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `rate(testhistogram3_bucket{le=".2"}[10m]) / ignoring(le) rate(testhistogram3_count[10m])`, + piped: `let + x1 = testhistogram3_bucket{le=".2"}[10m] | rate + x2 = testhistogram3_count[10m] | rate +in x1 / ignoring (le) x2`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `resets(histogram_with_reset[15m])`, + piped: `histogram_with_reset[15m] | resets`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `sum(request_duration_seconds)`, + piped: `request_duration_seconds | sum`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `sum(request_duration_seconds{job="job1",instance="ins1"} + ignoring(job,instance) request_duration_seconds{job="job1",instance="ins2"} + ignoring(job,instance) request_duration_seconds{job="job2",instance="ins1"} + ignoring(job,instance) request_duration_seconds{job="job2",instance="ins2"})`, + piped: `let + x1 = request_duration_seconds{instance="ins1",job="job1"} + x2 = request_duration_seconds{instance="ins2",job="job1"} + x3 = request_duration_seconds{instance="ins1",job="job2"} + x4 = request_duration_seconds{instance="ins2",job="job2"} +in x1 + ignoring (job, instance) x2 + ignoring (job, instance) x3 + ignoring (job, instance) x4 | sum`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `sum_over_time(histogram_over_time[4m:1m])`, + piped: `histogram_over_time | sum_over_time`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `testhistogram3_bucket{le=".2"} / ignoring(le) testhistogram3_count`, + piped: `let + x1 = testhistogram3_bucket{le=".2"} + x2 = testhistogram3_count +in x1 / ignoring (le) x2`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `testhistogram3_count`, + piped: `testhistogram3_count`, + }, + { + // Source: promqltest/testdata/histograms.test + query: `testhistogram3_sum`, + piped: `testhistogram3_sum`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(build_info, {__name__=~".+_info", build_data=~".+"})`, + piped: `let + x1 = build_info +in {__name__=~".+_info",build_data=~".+"} | info(x1)`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(data_metric, {__name__="info_metric"})`, + piped: `let + x1 = data_metric +in {__name__="info_metric"} | info(x1)`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(metric @ 60)`, + piped: `metric @ 60.000 | info`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(metric offset 1m)`, + piped: `metric offset 1m | info`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(metric)`, + piped: `metric | info`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(metric, {__name__="build_info"})`, + piped: `let + x1 = metric +in {__name__="build_info"} | info(x1)`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(metric, {__name__="non_existent", data=~".+"})`, + piped: `let + x1 = metric +in {__name__="non_existent",data=~".+"} | info(x1)`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(metric, {__name__="non_existent"})`, + piped: `let + x1 = metric +in {__name__="non_existent"} | info(x1)`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(metric, {__name__="target_info"})`, + piped: `let + x1 = metric +in {__name__="target_info"} | info(x1)`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(metric, {__name__=~".+_info"})`, + piped: `let + x1 = metric +in {__name__=~".+_info"} | info(x1)`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(metric, {data=~".+", non_existent=~".*"})`, + piped: `let + x1 = metric +in {data=~".+",non_existent=~".*"} | info(x1)`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(metric, {data=~".+"})`, + piped: `let + x1 = metric +in {data=~".+"} | info(x1)`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(metric, {non_existent=~".+"})`, + piped: `let + x1 = metric +in {non_existent=~".+"} | info(x1)`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(metric_not_matching_target_info)`, + piped: `metric_not_matching_target_info | info`, + }, + { + // Source: promqltest/testdata/info.test + query: `info(metric_with_overlapping_label)`, + piped: `metric_with_overlapping_label | info`, + }, + { + // Source: promqltest/testdata/info.test + query: `info({job="work"}, {__name__="info_metric"})`, + piped: `let + x1 = {job="work"} +in {__name__="info_metric"} | info(x1)`, + }, + { + // Source: promqltest/testdata/limit.test + query: `abs(avg(limit_ratio(0.5, http_requests{instance!~"histogram_[0-9]"})) - avg(limit_ratio(-0.5, http_requests{instance!~"histogram_[0-9]"}))) <= bool stddev(http_requests{instance!~"histogram_[0-9]"})`, + piped: `let + x1 = http_requests{instance!~"histogram_[0-9]"} | limit_ratio(0.5) | avg + x2 = http_requests{instance!~"histogram_[0-9]"} | limit_ratio(-0.5) | avg + x3 = http_requests{instance!~"histogram_[0-9]"} | stddev +in x1 - x2 | abs <= bool x3`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(-1.0, http_requests) and http_requests)`, + piped: `let + x1 = http_requests | limit_ratio(-1) + x2 = http_requests +in x1 and x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(-1.1, http_requests) and http_requests)`, + piped: `let + x1 = http_requests | limit_ratio(-1.1) + x2 = http_requests +in x1 and x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(0.0, http_requests))`, + piped: `http_requests | limit_ratio(0) | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(0.2, http_requests) and limit_ratio(-0.8, http_requests))`, + piped: `let + x1 = http_requests | limit_ratio(0.2) + x2 = http_requests | limit_ratio(-0.8) +in x1 and x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(0.2, http_requests) or limit_ratio(-0.8, http_requests))`, + piped: `let + x1 = http_requests | limit_ratio(0.2) + x2 = http_requests | limit_ratio(-0.8) +in x1 or x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(0.5, http_requests) and http_requests) <= bool (4+1)`, + piped: `let + x1 = http_requests | limit_ratio(0.5) + x2 = http_requests +in x1 and x2 | count <= bool (4 + 1)`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(0.5, http_requests) and http_requests) >= bool (4-1)`, + piped: `let + x1 = http_requests | limit_ratio(0.5) + x2 = http_requests +in x1 and x2 | count >= bool (4 - 1)`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(0.5, http_requests) and limit_ratio(-0.5, http_requests))`, + piped: `let + x1 = http_requests | limit_ratio(0.5) + x2 = http_requests | limit_ratio(-0.5) +in x1 and x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(0.5, http_requests) or limit_ratio(-0.5, http_requests))`, + piped: `let + x1 = http_requests | limit_ratio(0.5) + x2 = http_requests | limit_ratio(-0.5) +in x1 or x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(0.8, http_requests) and limit_ratio(-0.2, http_requests))`, + piped: `let + x1 = http_requests | limit_ratio(0.8) + x2 = http_requests | limit_ratio(-0.2) +in x1 and x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(0.8, http_requests) or limit_ratio(-0.2, http_requests))`, + piped: `let + x1 = http_requests | limit_ratio(0.8) + x2 = http_requests | limit_ratio(-0.2) +in x1 or x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(1.0, http_requests) and http_requests)`, + piped: `let + x1 = http_requests | limit_ratio(1) + x2 = http_requests +in x1 and x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(1.1, http_requests) and http_requests)`, + piped: `let + x1 = http_requests | limit_ratio(1.1) + x2 = http_requests +in x1 and x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(scalar(bar), http_requests))`, + piped: `http_requests | limit_ratio(scalar(bar)) | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(time() % 17/17, http_requests) and limit_ratio( - (1.0 - (time() % 17/17)), http_requests))`, + piped: `let + x1 = http_requests | limit_ratio(time() % 17 / 17) + x2 = http_requests | limit_ratio(-(1 - (time() % 17 / 17))) +in x1 and x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limit_ratio(time() % 17/17, http_requests) or limit_ratio( - (1.0 - (time() % 17/17)), http_requests))`, + piped: `let + x1 = http_requests | limit_ratio(time() % 17 / 17) + x2 = http_requests | limit_ratio(-(1 - (time() % 17 / 17))) +in x1 or x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limitk by (group) (-1, http_requests))`, + piped: `http_requests | limitk(-1) by (group) | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limitk by (group) (0, http_requests))`, + piped: `http_requests | limitk(0) by (group) | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limitk by (group) (1, http_requests) and http_requests)`, + piped: `let + x1 = http_requests | limitk(1) by (group) + x2 = http_requests +in x1 and x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limitk by (group) (2, http_requests) and http_requests)`, + piped: `let + x1 = http_requests | limitk(2) by (group) + x2 = http_requests +in x1 and x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limitk(100, http_requests) and http_requests)`, + piped: `let + x1 = http_requests | limitk(100) + x2 = http_requests +in x1 and x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limitk(1000, http_requests{instance=~"histogram_[0-9]"}))`, + piped: `http_requests{instance=~"histogram_[0-9]"} | limitk(1000) | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limitk(2, http_requests) and http_requests)`, + piped: `let + x1 = http_requests | limitk(2) + x2 = http_requests +in x1 and x2 | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limitk(2, http_requests{instance=~"histogram_[0-9]"}))`, + piped: `http_requests{instance=~"histogram_[0-9]"} | limitk(2) | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `count(limitk(scalar(foo), http_requests))`, + piped: `http_requests | limitk(scalar(foo)) | count`, + }, + { + // Source: promqltest/testdata/limit.test + query: `limit_ratio(1, http_requests{instance="histogram_1"})`, + piped: `http_requests{instance="histogram_1"} | limit_ratio(1)`, + }, + { + // Source: promqltest/testdata/limit.test + query: `limitk(1, http_requests{instance="histogram_1"})`, + piped: `http_requests{instance="histogram_1"} | limitk(1)`, + }, + { + // Source: promqltest/testdata/limit.test + query: `limitk(8, http_requests{instance=~"(histogram_2|0)"})`, + piped: `http_requests{instance=~"(histogram_2|0)"} | limitk(8)`, + }, + { + // Source: promqltest/testdata/literals.test + query: `" Foo "`, + piped: `" Foo "`, + }, + { + // Source: promqltest/testdata/literals.test + query: `""`, + piped: `""`, + }, + { + // Source: promqltest/testdata/literals.test + query: `"Foo"`, + piped: `"Foo"`, + }, + { + // Source: promqltest/testdata/literals.test + query: `("")`, + piped: `("")`, + }, + { + // Source: promqltest/testdata/literals.test + query: `("Foo")`, + piped: `("Foo")`, + }, + { + // Source: promqltest/testdata/literals.test + query: `((1) / (0))`, + piped: `((1) / (0))`, + }, + { + // Source: promqltest/testdata/literals.test + query: `+0.2`, + piped: `0.2`, + }, + { + // Source: promqltest/testdata/literals.test + query: `+Inf`, + piped: `+Inf`, + }, + { + // Source: promqltest/testdata/literals.test + query: `-0.2e-6`, + piped: `-0.0000002`, + }, + { + // Source: promqltest/testdata/literals.test + query: `-1 / 0`, + piped: `-1 / 0`, + }, + { + // Source: promqltest/testdata/literals.test + query: `-inf`, + piped: `-Inf`, + }, + { + // Source: promqltest/testdata/literals.test + query: `.2`, + piped: `0.2`, + }, + { + // Source: promqltest/testdata/literals.test + query: `0 / 0`, + piped: `0 / 0`, + }, + { + // Source: promqltest/testdata/literals.test + query: `1 % 0`, + piped: `1 % 0`, + }, + { + // Source: promqltest/testdata/literals.test + query: `1 - -1`, + piped: `1 - -1`, + }, + { + // Source: promqltest/testdata/literals.test + query: `1 / 0`, + piped: `1 / 0`, + }, + { + // Source: promqltest/testdata/literals.test + query: `1+1`, + piped: `1 + 1`, + }, + { + // Source: promqltest/testdata/literals.test + query: `1-1`, + piped: `1 - 1`, + }, + { + // Source: promqltest/testdata/literals.test + query: `12.34e+6`, + piped: `12340000`, + }, + { + // Source: promqltest/testdata/literals.test + query: `12.34e-6`, + piped: `0.00001234`, + }, + { + // Source: promqltest/testdata/literals.test + query: `12.34e6`, + piped: `12340000`, + }, + { + // Source: promqltest/testdata/literals.test + query: `2.`, + piped: `2`, + }, + { + // Source: promqltest/testdata/literals.test + query: `NaN`, + piped: `NaN`, + }, + { + // Source: promqltest/testdata/literals.test + query: `inF`, + piped: `+Inf`, + }, + { + // Source: promqltest/testdata/literals.test + query: `nan`, + piped: `NaN`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `-metric_total`, + piped: `-metric_total`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `clamp(metric_total, 0, 100)`, + piped: `metric_total | clamp(0, 100)`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `first_over_time(metric_total{env="1"}[10m])`, + piped: `metric_total{env="1"}[10m] | first_over_time`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `label_join(rate({env="1"}[10m]), "__name__", "_", "__name__", "env")`, + piped: `{env="1"}[10m] | rate | label_join("__name__", "_", "__name__", "env")`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `label_join(rate({env="1"}[10m]), "my_name", "_", "__name__")`, + piped: `{env="1"}[10m] | rate | label_join("my_name", "_", "__name__")`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `label_replace(rate({env="1"}[10m]), "__name__", "rate_$1", "__name__", "(.+)")`, + piped: `{env="1"}[10m] | rate | label_replace("__name__", "rate_$1", "__name__", "(.+)")`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `label_replace(rate({env="1"}[10m]), "my_name", "rate_$1", "__name__", "(.+)")`, + piped: `{env="1"}[10m] | rate | label_replace("my_name", "rate_$1", "__name__", "(.+)")`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `last_over_time(metric_total{env="1"}[10m])`, + piped: `metric_total{env="1"}[10m] | last_over_time`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `max_over_time(metric_total{env="1"}[10m])`, + piped: `metric_total{env="1"}[10m] | max_over_time`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `metric_total * 2`, + piped: `metric_total * 2`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `metric_total + another_metric_total`, + piped: `let + x1 = metric_total + x2 = another_metric_total +in x1 + x2`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `metric_total <= another_metric_total`, + piped: `let + x1 = metric_total + x2 = another_metric_total +in x1 <= x2`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `metric_total <= bool another_metric_total`, + piped: `let + x1 = metric_total + x2 = another_metric_total +in x1 <= bool x2`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `metric_total{env="1"}`, + piped: `metric_total{env="1"}`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `rate(metric_total{env="1"}[10m])`, + piped: `metric_total{env="1"}[10m] | rate`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `round(metric_total)`, + piped: `metric_total | round`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `sum by (__name__) (rate({env="1"}[10m]))`, + piped: `{env="1"}[10m] | rate | sum by (__name__) `, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `sum by (__name__, env) (metric_total{env="1"})`, + piped: `metric_total{env="1"} | sum by (__name__, env) `, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `sum(rate({env="1"}[10m])) by (env)`, + piped: `{env="1"}[10m] | rate | sum by (env) `, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `topk(10, sum by (__name__, env) (metric_total{env="1"}))`, + piped: `metric_total{env="1"} | sum by (__name__, env) | topk(10)`, + }, + { + // Source: promqltest/testdata/name_label_dropping.test + query: `topk(10, sum by (__name__, env) (rate(metric_total{env="1"}[10m])))`, + piped: `metric_total{env="1"}[10m] | rate | sum by (__name__, env) | topk(10)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `-histogram_mul_div`, + piped: `-histogram_mul_div`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `-metric`, + piped: `-metric`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `0*histogram_mul_div`, + piped: `histogram_mul_div * 0`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `0/histogram_mul_div`, + piped: `histogram_mul_div / 0`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `3*histogram_mul_div`, + piped: `histogram_mul_div * 3`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `avg(histogram_sum)`, + piped: `histogram_sum | avg`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `avg(metric)`, + piped: `metric | avg`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `avg(metric{type=~"counter.*"})`, + piped: `metric{type=~"counter.*"} | avg`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `avg_over_time(histogram_sum_over_time[4m:1m])`, + piped: `histogram_sum_over_time | avg_over_time`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `avg_over_time(mixed[10m])`, + piped: `mixed[10m] | avg_over_time`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `avg_over_time(mixed[3m])`, + piped: `mixed[3m] | avg_over_time`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `avg_over_time(nhcb_metric[13m])`, + piped: `nhcb_metric[13m] | avg_over_time`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `changes(nhcb_metric[13m])`, + piped: `nhcb_metric[13m] | changes`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `count(histogram_sum)`, + piped: `histogram_sum | count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `count(limitk(1, metric))`, + piped: `metric | limitk(1) | count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `count(metric)`, + piped: `metric | count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `count_over_time(nhcb_metric[13m])`, + piped: `nhcb_metric[13m] | count_over_time`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `delta(nhcb_metric[13m])`, + piped: `nhcb_metric[13m] | delta`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `empty_histogram`, + piped: `empty_histogram`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `float_sample+histogram_sample`, + piped: `let + x1 = float_sample + x2 = histogram_sample +in x1 + x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `float_sample-histogram_sample`, + piped: `let + x1 = float_sample + x2 = histogram_sample +in x1 - x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `float_series_0*histogram_mul_div`, + piped: `let + x1 = float_series_0 + x2 = histogram_mul_div +in x1 * x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `float_series_3*histogram_mul_div`, + piped: `let + x1 = float_series_3 + x2 = histogram_mul_div +in x1 * x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `float_series_3/histogram_mul_div`, + piped: `let + x1 = float_series_3 + x2 = histogram_mul_div +in x1 / x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `group(metric)`, + piped: `metric | group`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_avg(balanced_histogram)`, + piped: `balanced_histogram | histogram_avg`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_avg(empty_histogram)`, + piped: `empty_histogram | histogram_avg`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_avg(incr_histogram)`, + piped: `incr_histogram | histogram_avg`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_avg(low_res_histogram)`, + piped: `low_res_histogram | histogram_avg`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_avg(multi_histogram)`, + piped: `multi_histogram | histogram_avg`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_avg(negative_histogram)`, + piped: `negative_histogram | histogram_avg`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_avg(rate(const_histogram[5m]))`, + piped: `const_histogram[5m] | rate | histogram_avg`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_avg(single_histogram)`, + piped: `single_histogram | histogram_avg`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_avg(single_zero_histogram)`, + piped: `single_zero_histogram | histogram_avg`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_avg(two_samples_histogram)`, + piped: `two_samples_histogram | histogram_avg`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(avg(metric))`, + piped: `metric | avg | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(avg(reset))`, + piped: `reset | avg | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(avg_over_time(mixed[10m]))`, + piped: `mixed[10m] | avg_over_time | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(avg_over_time(mixed[2m]))`, + piped: `mixed[2m] | avg_over_time | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(balanced_histogram)`, + piped: `balanced_histogram | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(empty_histogram)`, + piped: `empty_histogram | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(histogram unless histogram_quantile(0.5, histogram) < 3)`, + piped: `let + x1 = histogram + x2 = histogram | histogram_quantile(0.5) < 3 +in x1 unless x2 | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(histogram_count_sum_2)`, + piped: `histogram_count_sum_2 | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(incr_histogram)`, + piped: `incr_histogram | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(increase(h[40m:9m]))`, + piped: `h | increase | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(increase(metric[55m15s]))`, + piped: `metric[55m15s] | increase | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(increase(metric[90m]))`, + piped: `metric[1h30m] | increase | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(increase(reset_in_bucket[15m]))`, + piped: `reset_in_bucket[15m] | increase | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(low_res_histogram)`, + piped: `low_res_histogram | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(multi_histogram)`, + piped: `multi_histogram | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(negative_histogram)`, + piped: `negative_histogram | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(rate(const_histogram[5m]))`, + piped: `const_histogram[5m] | rate | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(rate(const_histogram[5m])) == 0.0 or histogram_fraction(0.0, 1.0, rate(const_histogram[5m])) * histogram_count(rate(const_histogram[5m]))`, + piped: `let + x1 = const_histogram[5m] | rate | histogram_count == 0 + x2 = const_histogram[5m] | rate | histogram_fraction(0, 1) + x3 = const_histogram[5m] | rate | histogram_count +in x1 or x2 * x3`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(rate(reset{timing="late"}[5m]))`, + piped: `reset{timing="late"}[5m] | rate | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(single_histogram)`, + piped: `single_histogram | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(single_zero_histogram)`, + piped: `single_zero_histogram | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(sum(metric))`, + piped: `metric | sum | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(sum(reset))`, + piped: `reset | sum | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(sum_over_time(mixed[10m]))`, + piped: `mixed[10m] | sum_over_time | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(sum_over_time(mixed[2m]))`, + piped: `mixed[2m] | sum_over_time | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(sum_over_time(reset{timing="late"}[5m]))`, + piped: `reset{timing="late"}[5m] | sum_over_time | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_count(two_samples_histogram)`, + piped: `two_samples_histogram | histogram_count`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-0.0005, 0, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(-0.0005, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-0.0005, 0.0005, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(-0.0005, 0.0005)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-0.001, 0, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(-0.001, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-0.001, 0, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(-0.001, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-0.001, 0, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(-0.001, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-0.5, 0.5, single_zero_histogram)`, + piped: `single_zero_histogram | histogram_fraction(-0.5, 0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-1.189207, 0, var_res_histogram{schema="+1"})`, + piped: `var_res_histogram{schema="+1"} | histogram_fraction(-1.189207, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-1.4142135623730951, 0, var_res_histogram{schema="0"})`, + piped: `var_res_histogram{schema="0"} | histogram_fraction(-1.4142135623730951, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-1.6817928305074292, 0, var_res_histogram{schema="+1"})`, + piped: `var_res_histogram{schema="+1"} | histogram_fraction(-1.6817928305074292, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-2, -1, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(-2, -1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-2, -1, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(-2, -1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-2, -1, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(-2, -1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-2, -1, negative_histogram)`, + piped: `negative_histogram | histogram_fraction(-2, -1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-2, -1, two_samples_histogram)`, + piped: `two_samples_histogram | histogram_fraction(-2, -1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-2, -1.5, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(-2, -1.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-2, -1.5, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(-2, -1.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-2, -1.5, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(-2, -1.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-2, 0, var_res_histogram{schema="-1"})`, + piped: `var_res_histogram{schema="-1"} | histogram_fraction(-2, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-2.82842712474619, 0, var_res_histogram{schema="0"})`, + piped: `var_res_histogram{schema="0"} | histogram_fraction(-2.82842712474619, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-3.1, -3.1, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(-3.1, -3.1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-3.1, -3.1, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(-3.1, -3.1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-3.1, -3.1, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(-3.1, -3.1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-6, -1, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(-6, -1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-6, -1, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(-6, -1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-6, -1, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(-6, -1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-6, -1.5, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(-6, -1.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-6, -1.5, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(-6, -1.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-6, -1.5, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(-6, -1.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-8, -1, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(-8, -1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-8, -1, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(-8, -1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-8, -1, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(-8, -1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-8, 0, var_res_histogram{schema="-1"})`, + piped: `var_res_histogram{schema="-1"} | histogram_fraction(-8, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-Inf, +Inf, empty_histogram)`, + piped: `empty_histogram | histogram_fraction(-Inf, +Inf)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-Inf, +Inf, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(-Inf, +Inf)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-Inf, +Inf, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(-Inf, +Inf)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-Inf, +Inf, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(-Inf, +Inf)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-Inf, +Inf, histogram_nan)`, + piped: `histogram_nan | histogram_fraction(-Inf, +Inf)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-Inf, 0, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(-Inf, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-Inf, 0, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(-Inf, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-Inf, 0, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(-Inf, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-Inf, 0.7071067811865475, histogram_nan)`, + piped: `histogram_nan | histogram_fraction(-Inf, 0.7071067811865475)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-inf, -0.0005, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(-Inf, -0.0005)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-inf, -0.0005, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(-Inf, -0.0005)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-inf, -0.001, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(-Inf, -0.001)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-inf, -0.001, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(-Inf, -0.001)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-inf, -0.001, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(-Inf, -0.001)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-inf, -6, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(-Inf, -6)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(-inf, 0.0005, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(-Inf, 0.0005)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, +Inf, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(0, +Inf)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, +Inf, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(0, +Inf)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, +Inf, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(0, +Inf)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 0, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(0, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 0, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(0, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 0, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(0, 0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 0.0005, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(0, 0.0005)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 0.001, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(0, 0.001)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 0.001, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(0, 0.001)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 0.001, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(0, 0.001)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 1.189207, var_res_histogram{schema="+1"})`, + piped: `var_res_histogram{schema="+1"} | histogram_fraction(0, 1.189207)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 1.4142135623730951, var_res_histogram{schema="0"})`, + piped: `var_res_histogram{schema="0"} | histogram_fraction(0, 1.4142135623730951)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 1.5, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(0, 1.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 1.6817928305074292, var_res_histogram{schema="+1"})`, + piped: `var_res_histogram{schema="+1"} | histogram_fraction(0, 1.6817928305074292)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 2, var_res_histogram{schema="-1"})`, + piped: `var_res_histogram{schema="-1"} | histogram_fraction(0, 2)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 2.82842712474619, var_res_histogram{schema="0"})`, + piped: `var_res_histogram{schema="0"} | histogram_fraction(0, 2.82842712474619)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 4, balanced_histogram)`, + piped: `balanced_histogram | histogram_fraction(0, 4)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 6, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(0, 6)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 8, empty_histogram)`, + piped: `empty_histogram | histogram_fraction(0, 8)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 8, single_histogram)`, + piped: `single_histogram | histogram_fraction(0, 8)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0, 8, var_res_histogram{schema="-1"})`, + piped: `var_res_histogram{schema="-1"} | histogram_fraction(0, 8)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0.0, 1.0, rate(const_histogram[5m]))`, + piped: `const_histogram[5m] | rate | histogram_fraction(0, 1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0.000001, 0.000001, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(0.000001, 0.000001)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0.000001, 0.000001, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(0.000001, 0.000001)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0.000001, 0.000001, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(0.000001, 0.000001)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0.001, inf, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(0.001, +Inf)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0.001, inf, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(0.001, +Inf)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(0.001, inf, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(0.001, +Inf)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1, 2, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(1, 2)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1, 2, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(1, 2)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1, 2, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(1, 2)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1, 2, incr_histogram)`, + piped: `incr_histogram | histogram_fraction(1, 2)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1, 2, multi_histogram)`, + piped: `multi_histogram | histogram_fraction(1, 2)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1, 2, single_histogram)`, + piped: `single_histogram | histogram_fraction(1, 2)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1, 4, low_res_histogram)`, + piped: `low_res_histogram | histogram_fraction(1, 4)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1, 6, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(1, 6)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1, 6, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(1, 6)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1, 6, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(1, 6)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1, 8, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(1, 8)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1, 8, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(1, 8)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1, 8, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(1, 8)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1.5, 2, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(1.5, 2)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1.5, 2, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(1.5, 2)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1.5, 2, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(1.5, 2)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1.5, 6, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(1.5, 6)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1.5, 6, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(1.5, 6)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(1.5, 6, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(1.5, 6)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(3.1415, 42, histogram_fraction_1)`, + piped: `histogram_fraction_1 | histogram_fraction(3.1415, 42)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(3.1415, NaN, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(3.1415, NaN)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(3.1415, NaN, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(3.1415, NaN)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(3.1415, NaN, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(3.1415, NaN)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(42, 3.1415, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(42, 3.1415)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(42, 3.1415, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(42, 3.1415)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(42, 3.1415, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(42, 3.1415)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(42, 42, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(42, 42)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(42, 42, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(42, 42)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(42, 42, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(42, 42)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(5, 10, custom_buckets_histogram)`, + piped: `custom_buckets_histogram | histogram_fraction(5, 10)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(NaN, 42, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(NaN, 42)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(NaN, 42, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(NaN, 42)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(NaN, 42, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(NaN, 42)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(NaN, NaN, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_fraction(NaN, NaN)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(NaN, NaN, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_fraction(NaN, NaN)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_fraction(NaN, NaN, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_fraction(NaN, NaN)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_mul_div*-1`, + piped: `histogram_mul_div * -1`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_mul_div*-3`, + piped: `histogram_mul_div * -3`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_mul_div*0`, + piped: `histogram_mul_div * 0`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_mul_div*0/0`, + piped: `histogram_mul_div * 0 / 0`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_mul_div*3`, + piped: `histogram_mul_div * 3`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_mul_div*float_series_0`, + piped: `let + x1 = histogram_mul_div + x2 = float_series_0 +in x1 * x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_mul_div*float_series_3`, + piped: `let + x1 = histogram_mul_div + x2 = float_series_3 +in x1 * x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_mul_div*histogram_mul_div`, + piped: `let + x1 = histogram_mul_div +in x1 * x1`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_mul_div/-3`, + piped: `histogram_mul_div / -3`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_mul_div/0`, + piped: `histogram_mul_div / 0`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_mul_div/3`, + piped: `histogram_mul_div / 3`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_mul_div/float_series_0`, + piped: `let + x1 = histogram_mul_div + x2 = float_series_0 +in x1 / x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_mul_div/float_series_3`, + piped: `let + x1 = histogram_mul_div + x2 = float_series_3 +in x1 / x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_mul_div/histogram_mul_div`, + piped: `let + x1 = histogram_mul_div +in x1 / x1`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(-1, histogram_quantile_1)`, + piped: `histogram_quantile_1 | histogram_quantile(-1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(-1, histogram_quantile_2)`, + piped: `histogram_quantile_2 | histogram_quantile(-1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(-1, histogram_quantile_3)`, + piped: `histogram_quantile_3 | histogram_quantile(-1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0, histogram_quantile_1)`, + piped: `histogram_quantile_1 | histogram_quantile(0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0, histogram_quantile_2)`, + piped: `histogram_quantile_2 | histogram_quantile(0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0, histogram_quantile_3)`, + piped: `histogram_quantile_3 | histogram_quantile(0)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.01, histogram_quantile_3)`, + piped: `histogram_quantile_3 | histogram_quantile(0.01)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.08333333333333333, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_quantile(0.08333333333333333)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.1, histogram_quantile_1)`, + piped: `histogram_quantile_1 | histogram_quantile(0.1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.1, histogram_quantile_2)`, + piped: `histogram_quantile_2 | histogram_quantile(0.1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.1, histogram_quantile_3)`, + piped: `histogram_quantile_3 | histogram_quantile(0.1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.3, histogram_quantile_3)`, + piped: `histogram_quantile_3 | histogram_quantile(0.3)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.36791979160657035, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_quantile(0.36791979160657035)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.4, histogram_nan{case="100% NaNs"})`, + piped: `histogram_nan{case="100% NaNs"} | histogram_quantile(0.4)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.4, histogram_nan{case="20% NaNs"})`, + piped: `histogram_nan{case="20% NaNs"} | histogram_quantile(0.4)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.45, histogram_quantile_3)`, + piped: `histogram_quantile_3 | histogram_quantile(0.45)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.4583333333333333, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_quantile(0.4583333333333333)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, balanced_histogram)`, + piped: `balanced_histogram | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, custom_buckets_histogram)`, + piped: `custom_buckets_histogram | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, histogram unless histogram_count(histogram) == 0)`, + piped: `let + x1 = histogram + x2 = histogram | histogram_count == 0 +in x1 unless x2 | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, histogram_quantile_1)`, + piped: `histogram_quantile_1 | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, histogram_quantile_2)`, + piped: `histogram_quantile_2 | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, histogram_quantile_3)`, + piped: `histogram_quantile_3 | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, incr_histogram)`, + piped: `incr_histogram | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, mixedHistogram)`, + piped: `mixedHistogram | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, multi_histogram)`, + piped: `multi_histogram | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, myHistogram1)`, + piped: `myHistogram1 | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, myHistogram2)`, + piped: `myHistogram2 | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, negative_histogram)`, + piped: `negative_histogram | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, nonmonotonic_bucket)`, + piped: `nonmonotonic_bucket | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, rate(incr_histogram[10m]))`, + piped: `incr_histogram[10m] | rate | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, single_histogram)`, + piped: `single_histogram | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, single_zero_histogram)`, + piped: `single_zero_histogram | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, two_samples_histogram)`, + piped: `two_samples_histogram | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5, var_res_histogram)`, + piped: `var_res_histogram | histogram_quantile(0.5)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.5416666666666666, histogram_fraction_4)`, + piped: `histogram_fraction_4 | histogram_quantile(0.5416666666666666)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.55, histogram_quantile_3)`, + piped: `histogram_quantile_3 | histogram_quantile(0.55)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.6, histogram_quantile_1)`, + piped: `histogram_quantile_1 | histogram_quantile(0.6)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.6320802083934297, histogram_fraction_2)`, + piped: `histogram_fraction_2 | histogram_quantile(0.6320802083934297)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.7, histogram_quantile_3)`, + piped: `histogram_quantile_3 | histogram_quantile(0.7)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.8, histogram_nan{case="100% NaNs"})`, + piped: `histogram_nan{case="100% NaNs"} | histogram_quantile(0.8)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.8, histogram_nan{case="20% NaNs"})`, + piped: `histogram_nan{case="20% NaNs"} | histogram_quantile(0.8)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.81, histogram_nan)`, + piped: `histogram_nan | histogram_quantile(0.81)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.9, histogram_quantile_1)`, + piped: `histogram_quantile_1 | histogram_quantile(0.9)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.9, histogram_quantile_2)`, + piped: `histogram_quantile_2 | histogram_quantile(0.9)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.9, histogram_quantile_3)`, + piped: `histogram_quantile_3 | histogram_quantile(0.9)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.9166666666666666, histogram_fraction_3)`, + piped: `histogram_fraction_3 | histogram_quantile(0.9166666666666666)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.99, histogram_quantile_1)`, + piped: `histogram_quantile_1 | histogram_quantile(0.99)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.99, histogram_quantile_2)`, + piped: `histogram_quantile_2 | histogram_quantile(0.99)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(0.99, histogram_quantile_3)`, + piped: `histogram_quantile_3 | histogram_quantile(0.99)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(1, histogram_nan)`, + piped: `histogram_nan | histogram_quantile(1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(1, histogram_quantile_1)`, + piped: `histogram_quantile_1 | histogram_quantile(1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(1, histogram_quantile_2)`, + piped: `histogram_quantile_2 | histogram_quantile(1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(1, histogram_quantile_3)`, + piped: `histogram_quantile_3 | histogram_quantile(1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(1.0, rate(const_histogram[5m]))`, + piped: `const_histogram[5m] | rate | histogram_quantile(1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(1.001, histogram_quantile_1)`, + piped: `histogram_quantile_1 | histogram_quantile(1.001)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(1.001, histogram_quantile_2)`, + piped: `histogram_quantile_2 | histogram_quantile(1.001)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_quantile(1.001, histogram_quantile_3)`, + piped: `histogram_quantile_3 | histogram_quantile(1.001)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sample+float_sample`, + piped: `let + x1 = histogram_sample + x2 = float_sample +in x1 + x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sample-float_sample`, + piped: `let + x1 = histogram_sample + x2 = float_sample +in x1 - x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stddev(histogram_stddev_stdvar_1)`, + piped: `histogram_stddev_stdvar_1 | histogram_stddev`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stddev(histogram_stddev_stdvar_2)`, + piped: `histogram_stddev_stdvar_2 | histogram_stddev`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stddev(histogram_stddev_stdvar_3)`, + piped: `histogram_stddev_stdvar_3 | histogram_stddev`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stddev(histogram_stddev_stdvar_4)`, + piped: `histogram_stddev_stdvar_4 | histogram_stddev`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stddev(histogram_stddev_stdvar_5)`, + piped: `histogram_stddev_stdvar_5 | histogram_stddev`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stddev(histogram_stddev_stdvar_6)`, + piped: `histogram_stddev_stdvar_6 | histogram_stddev`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stddev(histogram_stddev_stdvar_7)`, + piped: `histogram_stddev_stdvar_7 | histogram_stddev`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stddev(rate(const_histogram[5m]))`, + piped: `const_histogram[5m] | rate | histogram_stddev`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stdvar(histogram_stddev_stdvar_1)`, + piped: `histogram_stddev_stdvar_1 | histogram_stdvar`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stdvar(histogram_stddev_stdvar_2)`, + piped: `histogram_stddev_stdvar_2 | histogram_stdvar`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stdvar(histogram_stddev_stdvar_3)`, + piped: `histogram_stddev_stdvar_3 | histogram_stdvar`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stdvar(histogram_stddev_stdvar_4)`, + piped: `histogram_stddev_stdvar_4 | histogram_stdvar`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stdvar(histogram_stddev_stdvar_5)`, + piped: `histogram_stddev_stdvar_5 | histogram_stdvar`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stdvar(histogram_stddev_stdvar_6)`, + piped: `histogram_stddev_stdvar_6 | histogram_stdvar`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stdvar(histogram_stddev_stdvar_7)`, + piped: `histogram_stddev_stdvar_7 | histogram_stdvar`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_stdvar(rate(const_histogram[5m]))`, + piped: `const_histogram[5m] | rate | histogram_stdvar`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sub_1{idx="0"} - ignoring(idx) histogram_sub_1{idx="1"}`, + piped: `let + x1 = histogram_sub_1{idx="0"} + x2 = histogram_sub_1{idx="1"} +in x1 - ignoring (idx) x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sub_2{idx="0"} - ignoring(idx) histogram_sub_2{idx="1"}`, + piped: `let + x1 = histogram_sub_2{idx="0"} + x2 = histogram_sub_2{idx="1"} +in x1 - ignoring (idx) x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sub_3{idx="0"} - ignoring(idx) histogram_sub_3{idx="1"}`, + piped: `let + x1 = histogram_sub_3{idx="0"} + x2 = histogram_sub_3{idx="1"} +in x1 - ignoring (idx) x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(balanced_histogram)`, + piped: `balanced_histogram | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(empty_histogram)`, + piped: `empty_histogram | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(histogram_count_sum_2)`, + piped: `histogram_count_sum_2 | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(incr_histogram)`, + piped: `incr_histogram | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(increase(reset_in_bucket[15m]))`, + piped: `reset_in_bucket[15m] | increase | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(low_res_histogram)`, + piped: `low_res_histogram | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(multi_histogram)`, + piped: `multi_histogram | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(negative_histogram)`, + piped: `negative_histogram | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(rate(const_histogram[5m]))`, + piped: `const_histogram[5m] | rate | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(scalar(histogram_fraction(-Inf, +Inf, sum(histogram_fraction_4))) * histogram_fraction_4)`, + piped: `histogram_fraction_4 * scalar(histogram_fraction(-Inf, +Inf, sum(histogram_fraction_4))) | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(single_histogram)`, + piped: `single_histogram | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(single_zero_histogram)`, + piped: `single_zero_histogram | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(sum(incr_sum_histogram))`, + piped: `incr_sum_histogram | sum | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(sum(last_over_time(incr_sum_histogram[5m])))`, + piped: `incr_sum_histogram[5m] | last_over_time | sum | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `histogram_sum(two_samples_histogram)`, + piped: `two_samples_histogram | histogram_sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `incr_histogram`, + piped: `incr_histogram`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `increase(h[40m:9m])`, + piped: `h | increase`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `increase(metric[55m15s])`, + piped: `metric[55m15s] | increase`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `increase(metric[90m])`, + piped: `metric[1h30m] | increase`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `increase(nhcb_metric[13m])`, + piped: `nhcb_metric[13m] | increase`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `increase(reset_in_bucket[15m])`, + piped: `reset_in_bucket[15m] | increase`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `irate(nhcb_add_bucket[2m]) * 60`, + piped: `nhcb_add_bucket[2m] | irate * 60`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `irate(nhcb_add_buckets[2m]) * 60`, + piped: `nhcb_add_buckets[2m] | irate * 60`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `irate(nhcb_remove_buckets[2m]) * 60`, + piped: `nhcb_remove_buckets[2m] | irate * 60`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `last_over_time(nhcb_metric[13m])`, + piped: `nhcb_metric[13m] | last_over_time`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `limit_ratio(1, metric)`, + piped: `metric | limit_ratio(1)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `limitk(3, metric)`, + piped: `metric | limitk(3)`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `low_res_histogram`, + piped: `low_res_histogram`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `metric - 0.5 * metric`, + piped: `let + x1 = metric + x2 = metric * 0.5 +in x1 - x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `metric - 2 * metric`, + piped: `let + x1 = metric + x2 = metric * 2 +in x1 - x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `metric1 != metric2`, + piped: `let + x1 = metric1 + x2 = metric2 +in x1 != x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `metric1 == metric2`, + piped: `let + x1 = metric1 + x2 = metric2 +in x1 == x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `metric2 > metric2`, + piped: `let + x1 = metric2 +in x1 > x1`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `metric{series="1"} and ignoring(series) metric{series="2"}`, + piped: `let + x1 = metric{series="1"} + x2 = metric{series="2"} +in x1 and ignoring (series) x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `metric{series="1"} or ignoring(series) metric{series="2"}`, + piped: `let + x1 = metric{series="1"} + x2 = metric{series="2"} +in x1 or ignoring (series) x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `metric{series="2"} + ignoring (series) metric{series="3"}`, + piped: `let + x1 = metric{series="2"} + x2 = metric{series="3"} +in x1 + ignoring (series) x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `metric{series="2"} - ignoring (series) metric{series="3"}`, + piped: `let + x1 = metric{series="2"} + x2 = metric{series="3"} +in x1 - ignoring (series) x2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `mixed_metric1`, + piped: `mixed_metric1`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `mixed_metric2`, + piped: `mixed_metric2`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `present_over_time(nhcb_metric[13m])`, + piped: `nhcb_metric[13m] | present_over_time`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `rate(const_histogram[5m])`, + piped: `const_histogram[5m] | rate`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `rate(histogram_rate[45s])`, + piped: `histogram_rate[45s] | rate`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `rate(incr_histogram[10m])`, + piped: `incr_histogram[10m] | rate`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `rate(nhcb_metric[13m])`, + piped: `nhcb_metric[13m] | rate`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `rate(some_metric[1m30s])`, + piped: `some_metric[1m30s] | rate`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `rate(some_metric[1m])`, + piped: `some_metric[1m] | rate`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `resets(nhcb_metric[13m])`, + piped: `nhcb_metric[13m] | resets`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `sum by (group) (metric)`, + piped: `metric | sum by (group) `, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `sum(custom_buckets_histogram)`, + piped: `custom_buckets_histogram | sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `sum(histogram_sum)`, + piped: `histogram_sum | sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `sum(histogram_sum{idx="0"} + ignoring(idx) histogram_sum{idx="1"} + ignoring(idx) histogram_sum{idx="2"} + ignoring(idx) histogram_sum{idx="3"})`, + piped: `let + x1 = histogram_sum{idx="0"} + x2 = histogram_sum{idx="1"} + x3 = histogram_sum{idx="2"} + x4 = histogram_sum{idx="3"} +in x1 + ignoring (idx) x2 + ignoring (idx) x3 + ignoring (idx) x4 | sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `sum(metric)`, + piped: `metric | sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `sum(metric{type=~"counter.*"})`, + piped: `metric{type=~"counter.*"} | sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `sum({idx="0"})`, + piped: `{idx="0"} | sum`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `sum_over_time(histogram_sum_over_time[4m:1m])`, + piped: `histogram_sum_over_time | sum_over_time`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `sum_over_time(mixed[10m])`, + piped: `mixed[10m] | sum_over_time`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `sum_over_time(mixed[3m])`, + piped: `mixed[3m] | sum_over_time`, + }, + { + // Source: promqltest/testdata/native_histograms.test + query: `sum_over_time(nhcb_metric[13m])`, + piped: `nhcb_metric[13m] | sum_over_time`, + }, + { + // Source: promqltest/testdata/operators.test + query: `(SUM((http_requests_total)) BY (job)) + SUM(http_requests_total) BY (job)`, + piped: `let + x1 = (http_requests_total) | sum by (job) + x2 = http_requests_total | sum by (job) +in x1 + x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `(http_requests_total{group="canary"} + 1) and ignoring(group) http_requests_total{instance="0", group="production"}`, + piped: `let + x1 = http_requests_total{group="canary"} + 1 + x2 = http_requests_total{group="production",instance="0"} +in x1 and ignoring (group) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `(http_requests_total{group="canary"} + 1) and ignoring(group, job) http_requests_total{instance="0", group="production"}`, + piped: `let + x1 = http_requests_total{group="canary"} + 1 + x2 = http_requests_total{group="production",instance="0"} +in x1 and ignoring (group, job) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `(http_requests_total{group="canary"} + 1) and on(instance) http_requests_total{instance="0", group="production"}`, + piped: `let + x1 = http_requests_total{group="canary"} + 1 + x2 = http_requests_total{group="production",instance="0"} +in x1 and on (instance) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `(http_requests_total{group="canary"} + 1) and on(instance, job) http_requests_total{instance="0", group="production"}`, + piped: `let + x1 = http_requests_total{group="canary"} + 1 + x2 = http_requests_total{group="production",instance="0"} +in x1 and on (instance, job) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `(http_requests_total{group="canary"} + 1) or ignoring(l, group, job) (http_requests_total or cpu_count or vector_matching_a)`, + piped: `let + x1 = http_requests_total{group="canary"} + 1 + x2 = http_requests_total + x3 = cpu_count + x4 = vector_matching_a +in x1 or ignoring (l, group, job) (x2 or x3 or x4)`, + }, + { + // Source: promqltest/testdata/operators.test + query: `(http_requests_total{group="canary"} + 1) or on(instance) (http_requests_total or cpu_count or vector_matching_a)`, + piped: `let + x1 = http_requests_total{group="canary"} + 1 + x2 = http_requests_total + x3 = cpu_count + x4 = vector_matching_a +in x1 or on (instance) (x2 or x3 or x4)`, + }, + { + // Source: promqltest/testdata/operators.test + query: `(rate((http_requests_total[25m])) * 25) * 60`, + piped: `((http_requests_total[25m]) | rate * 25) * 60`, + }, + { + // Source: promqltest/testdata/operators.test + query: `(testhistogram) and on() (vector(-1) == 1)`, + piped: `let + x1 = testhistogram + x2 = vector(-1) == 1 +in x1 and on () x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `(testhistogram) and on() (vector(1) == 1)`, + piped: `let + x1 = testhistogram + x2 = vector(1) == 1 +in x1 and on () x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `(testhistogram_bucket) and on() (vector(-1) == 1)`, + piped: `let + x1 = testhistogram_bucket + x2 = vector(-1) == 1 +in x1 and on () x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `(testhistogram_bucket) and on() (vector(1) == 1)`, + piped: `let + x1 = testhistogram_bucket + x2 = vector(1) == 1 +in x1 and on () x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `- - - 1`, + piped: `-1`, + }, + { + // Source: promqltest/testdata/operators.test + query: `- - - SUM(http_requests_total) BY (job)`, + piped: `---sum by (job) (http_requests_total)`, + }, + { + // Source: promqltest/testdata/operators.test + query: `-1 * http_requests_total{group="canary", instance="0", job="api-server"} / 0`, + piped: `http_requests_total{group="canary",instance="0",job="api-server"} * -1 / 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `-2^---1*3`, + piped: `-2 ^ -1 * 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `-{__name__=~'testmetric1|testmetric2'}`, + piped: `-{__name__=~"testmetric1|testmetric2"}`, + }, + { + // Source: promqltest/testdata/operators.test + query: `0 != left_histograms`, + piped: `left_histograms != 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `0 * http_requests_total{group="canary", instance="0", job="api-server"} / 0`, + piped: `http_requests_total{group="canary",instance="0",job="api-server"} * 0 / 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `0 < left_histograms`, + piped: `left_histograms < 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `0 == bool 1`, + piped: `0 == bool 1`, + }, + { + // Source: promqltest/testdata/operators.test + query: `0 == left_histograms`, + piped: `left_histograms == 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `0 > left_histograms`, + piped: `left_histograms > 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `0 >= left_histograms`, + piped: `left_histograms >= 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `1 == bool 1`, + piped: `1 == bool 1`, + }, + { + // Source: promqltest/testdata/operators.test + query: `10 atan2 20`, + piped: `10 atan2 20`, + }, + { + // Source: promqltest/testdata/operators.test + query: `10 atan2 NaN`, + piped: `10 atan2 NaN`, + }, + { + // Source: promqltest/testdata/operators.test + query: `1000 / SUM(http_requests_total) BY (job)`, + piped: `http_requests_total | sum by (job) / 1000`, + }, + { + // Source: promqltest/testdata/operators.test + query: `1000 < SUM(http_requests_total) BY (job)`, + piped: `http_requests_total | sum by (job) < 1000`, + }, + { + // Source: promqltest/testdata/operators.test + query: `2 - SUM(http_requests_total) BY (job)`, + piped: `http_requests_total | sum by (job) - 2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `2/-2^---1*3+2`, + piped: `2 / -2 ^ -1 * 3 + 2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `3 != left_floats`, + piped: `left_floats != 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `3 != left_histograms`, + piped: `left_histograms != 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `3 < left_floats`, + piped: `left_floats < 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `3 < left_histograms`, + piped: `left_histograms < 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `3 <= left_floats`, + piped: `left_floats <= 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `3 == bool left_floats`, + piped: `left_floats == bool 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `3 == left_floats`, + piped: `left_floats == 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `3 == left_histograms`, + piped: `left_histograms == 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `3 > left_floats`, + piped: `left_floats > 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `3 > left_histograms`, + piped: `left_histograms > 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `3 >= left_floats`, + piped: `left_floats >= 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `3 >= left_histograms`, + piped: `left_histograms >= 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `COUNT(http_requests_total) BY (job) ^ COUNT(http_requests_total) BY (job)`, + piped: `let + x1 = http_requests_total | count by (job) +in x1 ^ x1`, + }, + { + // Source: promqltest/testdata/operators.test + query: `Inf == bool left_floats`, + piped: `left_floats == bool +Inf`, + }, + { + // Source: promqltest/testdata/operators.test + query: `Inf == left_floats`, + piped: `left_floats == +Inf`, + }, + { + // Source: promqltest/testdata/operators.test + query: `NaN == bool left_floats`, + piped: `left_floats == bool NaN`, + }, + { + // Source: promqltest/testdata/operators.test + query: `NaN == left_floats`, + piped: `left_floats == NaN`, + }, + { + // Source: promqltest/testdata/operators.test + query: `SUM(http_requests_total) BY (job) != 1000`, + piped: `http_requests_total | sum by (job) != 1000`, + }, + { + // Source: promqltest/testdata/operators.test + query: `SUM(http_requests_total) BY (job) % 0.3`, + piped: `http_requests_total | sum by (job) % 0.3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `SUM(http_requests_total) BY (job) % 2 ^ (3 ^ 2)`, + piped: `http_requests_total | sum by (job) % 2 ^ (3 ^ 2)`, + }, + { + // Source: promqltest/testdata/operators.test + query: `SUM(http_requests_total) BY (job) % 2 ^ 3 ^ 2`, + piped: `http_requests_total | sum by (job) % 2 ^ 3 ^ 2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `SUM(http_requests_total) BY (job) % 2 ^ 3 ^ 2 ^ 2`, + piped: `http_requests_total | sum by (job) % 2 ^ 3 ^ 2 ^ 2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `SUM(http_requests_total) BY (job) % 3`, + piped: `http_requests_total | sum by (job) % 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `SUM(http_requests_total) BY (job) % 3 ^ 2`, + piped: `http_requests_total | sum by (job) % 3 ^ 2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `SUM(http_requests_total) BY (job) + SUM(http_requests_total) BY (job)`, + piped: `let + x1 = http_requests_total | sum by (job) +in x1 + x1`, + }, + { + // Source: promqltest/testdata/operators.test + query: `SUM(http_requests_total) BY (job) - 2`, + piped: `http_requests_total | sum by (job) - 2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `SUM(http_requests_total) BY (job) <= 1000`, + piped: `http_requests_total | sum by (job) <= 1000`, + }, + { + // Source: promqltest/testdata/operators.test + query: `SUM(http_requests_total) BY (job) == 1000`, + piped: `http_requests_total | sum by (job) == 1000`, + }, + { + // Source: promqltest/testdata/operators.test + query: `SUM(http_requests_total) BY (job) == bool 1000`, + piped: `http_requests_total | sum by (job) == bool 1000`, + }, + { + // Source: promqltest/testdata/operators.test + query: `SUM(http_requests_total) BY (job) ^ 2`, + piped: `http_requests_total | sum by (job) ^ 2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `http_requests_histogram != 80`, + piped: `http_requests_histogram != 80`, + }, + { + // Source: promqltest/testdata/operators.test + query: `http_requests_histogram != http_requests_histogram`, + piped: `let + x1 = http_requests_histogram +in x1 != x1`, + }, + { + // Source: promqltest/testdata/operators.test + query: `http_requests_histogram < 80`, + piped: `http_requests_histogram < 80`, + }, + { + // Source: promqltest/testdata/operators.test + query: `http_requests_histogram <= 80`, + piped: `http_requests_histogram <= 80`, + }, + { + // Source: promqltest/testdata/operators.test + query: `http_requests_histogram == http_requests_histogram`, + piped: `let + x1 = http_requests_histogram +in x1 == x1`, + }, + { + // Source: promqltest/testdata/operators.test + query: `http_requests_histogram > 80`, + piped: `http_requests_histogram > 80`, + }, + { + // Source: promqltest/testdata/operators.test + query: `http_requests_histogram >= 80`, + piped: `http_requests_histogram >= 80`, + }, + { + // Source: promqltest/testdata/operators.test + query: `http_requests_total AND IGNORING (group, instance, job) vector(1)`, + piped: `let + x1 = http_requests_total + x2 = vector(1) +in x1 and ignoring (group, instance, job) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `http_requests_total AND ON (dummy) vector(1)`, + piped: `let + x1 = http_requests_total + x2 = vector(1) +in x1 and on (dummy) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `http_requests_total{job="api-server", group="canary"} + rate(http_requests_total{job="api-server"}[10m]) * 5 * 60`, + piped: `let + x1 = http_requests_total{group="canary",job="api-server"} + x2 = http_requests_total{job="api-server"}[10m] | rate * 5 * 60 +in x1 + x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats != 3`, + piped: `left_floats != 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats != bool right_floats`, + piped: `let + x1 = left_floats + x2 = right_floats +in x1 != bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats != right_floats`, + piped: `let + x1 = left_floats + x2 = right_floats +in x1 != x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats < 3`, + piped: `left_floats < 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats < bool right_floats`, + piped: `let + x1 = left_floats + x2 = right_floats +in x1 < bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats < right_floats`, + piped: `let + x1 = left_floats + x2 = right_floats +in x1 < x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats <= 3`, + piped: `left_floats <= 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats <= bool right_floats`, + piped: `let + x1 = left_floats + x2 = right_floats +in x1 <= bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats <= right_floats`, + piped: `let + x1 = left_floats + x2 = right_floats +in x1 <= x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats == 3`, + piped: `left_floats == 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats == Inf`, + piped: `left_floats == +Inf`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats == NaN`, + piped: `left_floats == NaN`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats == bool 3`, + piped: `left_floats == bool 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats == bool Inf`, + piped: `left_floats == bool +Inf`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats == bool NaN`, + piped: `left_floats == bool NaN`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats == bool right_floats`, + piped: `let + x1 = left_floats + x2 = right_floats +in x1 == bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats == does_not_match`, + piped: `let + x1 = left_floats + x2 = does_not_match +in x1 == x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats == right_floats`, + piped: `let + x1 = left_floats + x2 = right_floats +in x1 == x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats > 3`, + piped: `left_floats > 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats > bool right_floats`, + piped: `let + x1 = left_floats + x2 = right_floats +in x1 > bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats > right_floats`, + piped: `let + x1 = left_floats + x2 = right_floats +in x1 > x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats >= 3`, + piped: `left_floats >= 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats >= bool right_floats`, + piped: `let + x1 = left_floats + x2 = right_floats +in x1 >= bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_floats >= right_floats`, + piped: `let + x1 = left_floats + x2 = right_floats +in x1 >= x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms != 0`, + piped: `left_histograms != 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms != 3`, + piped: `left_histograms != 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms != bool 0`, + piped: `left_histograms != bool 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms != bool 3`, + piped: `left_histograms != bool 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms != bool right_floats_for_histograms`, + piped: `let + x1 = left_histograms + x2 = right_floats_for_histograms +in x1 != bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms != bool right_histograms`, + piped: `let + x1 = left_histograms + x2 = right_histograms +in x1 != bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms != right_floats_for_histograms`, + piped: `let + x1 = left_histograms + x2 = right_floats_for_histograms +in x1 != x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms != right_histograms`, + piped: `let + x1 = left_histograms + x2 = right_histograms +in x1 != x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms < 0`, + piped: `left_histograms < 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms < 3`, + piped: `left_histograms < 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms < bool 0`, + piped: `left_histograms < bool 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms < bool 3`, + piped: `left_histograms < bool 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms < bool right_floats_for_histograms`, + piped: `let + x1 = left_histograms + x2 = right_floats_for_histograms +in x1 < bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms < bool right_histograms`, + piped: `let + x1 = left_histograms + x2 = right_histograms +in x1 < bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms < right_floats_for_histograms`, + piped: `let + x1 = left_histograms + x2 = right_floats_for_histograms +in x1 < x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms < right_histograms`, + piped: `let + x1 = left_histograms + x2 = right_histograms +in x1 < x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms <= 0`, + piped: `left_histograms <= 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms <= 3`, + piped: `left_histograms <= 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms <= bool 0`, + piped: `left_histograms <= bool 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms <= bool 3`, + piped: `left_histograms <= bool 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms <= bool right_floats_for_histograms`, + piped: `let + x1 = left_histograms + x2 = right_floats_for_histograms +in x1 <= bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms <= bool right_histograms`, + piped: `let + x1 = left_histograms + x2 = right_histograms +in x1 <= bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms <= right_floats_for_histograms`, + piped: `let + x1 = left_histograms + x2 = right_floats_for_histograms +in x1 <= x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms <= right_histograms`, + piped: `let + x1 = left_histograms + x2 = right_histograms +in x1 <= x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms == 0`, + piped: `left_histograms == 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms == 3`, + piped: `left_histograms == 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms == bool 0`, + piped: `left_histograms == bool 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms == bool 3`, + piped: `left_histograms == bool 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms == bool right_floats_for_histograms`, + piped: `let + x1 = left_histograms + x2 = right_floats_for_histograms +in x1 == bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms == bool right_histograms`, + piped: `let + x1 = left_histograms + x2 = right_histograms +in x1 == bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms == right_floats_for_histograms`, + piped: `let + x1 = left_histograms + x2 = right_floats_for_histograms +in x1 == x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms == right_histograms`, + piped: `let + x1 = left_histograms + x2 = right_histograms +in x1 == x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms > 0`, + piped: `left_histograms > 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms > 3`, + piped: `left_histograms > 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms > bool 0`, + piped: `left_histograms > bool 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms > bool 3`, + piped: `left_histograms > bool 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms > bool right_floats_for_histograms`, + piped: `let + x1 = left_histograms + x2 = right_floats_for_histograms +in x1 > bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms > bool right_histograms`, + piped: `let + x1 = left_histograms + x2 = right_histograms +in x1 > bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms > right_floats_for_histograms`, + piped: `let + x1 = left_histograms + x2 = right_floats_for_histograms +in x1 > x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms > right_histograms`, + piped: `let + x1 = left_histograms + x2 = right_histograms +in x1 > x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms >= 0`, + piped: `left_histograms >= 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms >= 3`, + piped: `left_histograms >= 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms >= bool 0`, + piped: `left_histograms >= bool 0`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms >= bool 3`, + piped: `left_histograms >= bool 3`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms >= bool right_floats_for_histograms`, + piped: `let + x1 = left_histograms + x2 = right_floats_for_histograms +in x1 >= bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms >= bool right_histograms`, + piped: `let + x1 = left_histograms + x2 = right_histograms +in x1 >= bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms >= right_floats_for_histograms`, + piped: `let + x1 = left_histograms + x2 = right_floats_for_histograms +in x1 >= x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `left_histograms >= right_histograms`, + piped: `let + x1 = left_histograms + x2 = right_histograms +in x1 >= x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `metricA + ignoring() metricB`, + piped: `let + x1 = metricA + x2 = metricB +in x1 + x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `metricA + metricB`, + piped: `let + x1 = metricA + x2 = metricB +in x1 + x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_cpu % 2`, + piped: `node_cpu % 2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_cpu * 2`, + piped: `node_cpu * 2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_cpu * ignoring (role, mode) group_left (role) node_role`, + piped: `let + x1 = node_cpu + x2 = node_role +in x1 * ignoring (role, mode) group_left (role) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_cpu * on (instance) group_left (role) node_role`, + piped: `let + x1 = node_cpu + x2 = node_role +in x1 * on (instance) group_left (role) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_cpu + 2`, + piped: `node_cpu + 2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_cpu + on(dummy) group_left(foo) random*0`, + piped: `let + x1 = node_cpu + x2 = random * 0 +in x1 + on (dummy) group_left (foo) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_cpu - 2`, + piped: `node_cpu - 2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_cpu / 2`, + piped: `node_cpu / 2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_cpu / ignoring (mode) group_left sum without (mode)(node_cpu)`, + piped: `let + x1 = node_cpu + x2 = node_cpu | sum without (mode) +in x1 / ignoring (mode) group_left () x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_cpu / ignoring (mode) group_left(dummy) sum without (mode)(node_cpu)`, + piped: `let + x1 = node_cpu + x2 = node_cpu | sum without (mode) +in x1 / ignoring (mode) group_left (dummy) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_cpu / on (instance) group_left sum by (instance,job)(node_cpu)`, + piped: `let + x1 = node_cpu + x2 = node_cpu | sum by (instance, job) +in x1 / on (instance) group_left () x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_cpu > on(job, instance) group_left(target) (threshold or on (job, instance) (sum by (job, instance)(node_cpu) * 0 + 1))`, + piped: `let + x1 = node_cpu + x2 = threshold + x3 = node_cpu | sum by (job, instance) * 0 + 1 +in x1 > on (job, instance) group_left (target) (x2 or on (job, instance) x3)`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_cpu > on(job, instance) group_left(target) threshold`, + piped: `let + x1 = node_cpu + x2 = threshold +in x1 > on (job, instance) group_left (target) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_cpu ^ 2`, + piped: `node_cpu ^ 2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_role * ignoring (role) group_right (role) node_var`, + piped: `let + x1 = node_role + x2 = node_var +in x1 * ignoring (role) group_right (role) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_role * on (instance) group_right (role) node_var`, + piped: `let + x1 = node_role + x2 = node_var +in x1 * on (instance) group_right (role) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_var * ignoring (role) group_left (role) node_role`, + piped: `let + x1 = node_var + x2 = node_role +in x1 * ignoring (role) group_left (role) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `node_var * on (instance) group_left (role) node_role`, + piped: `let + x1 = node_var + x2 = node_role +in x1 * on (instance) group_left (role) x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `random + on() metricA`, + piped: `let + x1 = random + x2 = metricA +in x1 + on () x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `sum by (mode, job)(node_cpu) / on (job) group_left sum by (job)(node_cpu)`, + piped: `let + x1 = node_cpu | sum by (mode, job) + x2 = node_cpu | sum by (job) +in x1 / on (job) group_left () x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `sum without (instance)(node_cpu) / ignoring (mode) group_left sum without (instance, mode)(node_cpu)`, + piped: `let + x1 = node_cpu | sum without (instance) + x2 = node_cpu | sum without (instance, mode) +in x1 / ignoring (mode) group_left () x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `sum(sum by (mode, job)(node_cpu) / on (job) group_left sum by (job)(node_cpu))`, + piped: `let + x1 = node_cpu | sum by (mode, job) + x2 = node_cpu | sum by (job) +in x1 / on (job) group_left () x2 | sum`, + }, + { + // Source: promqltest/testdata/operators.test + query: `sum(sum without (instance)(node_cpu) / ignoring (mode) group_left sum without (instance, mode)(node_cpu))`, + piped: `let + x1 = node_cpu | sum without (instance) + x2 = node_cpu | sum without (instance, mode) +in x1 / ignoring (mode) group_left () x2 | sum`, + }, + { + // Source: promqltest/testdata/operators.test + query: `test_total < bool test_smaller`, + piped: `let + x1 = test_total + x2 = test_smaller +in x1 < bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `test_total < test_smaller`, + piped: `let + x1 = test_total + x2 = test_smaller +in x1 < x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `test_total > bool test_smaller`, + piped: `let + x1 = test_total + x2 = test_smaller +in x1 > bool x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `test_total > test_smaller`, + piped: `let + x1 = test_total + x2 = test_smaller +in x1 > x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `trigy atan2 trigNaN`, + piped: `let + x1 = trigy + x2 = trigNaN +in x1 atan2 x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `trigy atan2 trigx`, + piped: `let + x1 = trigy + x2 = trigx +in x1 atan2 x2`, + }, + { + // Source: promqltest/testdata/operators.test + query: `{job="app-server"} == 80`, + piped: `{job="app-server"} == 80`, + }, + { + // Source: promqltest/testdata/range_queries.test + query: `foo > 2 or bar`, + piped: `let + x1 = foo > 2 + x2 = bar +in x1 or x2`, + }, + { + // Source: promqltest/testdata/range_queries.test + query: `metric`, + piped: `metric`, + }, + { + // Source: promqltest/testdata/range_queries.test + query: `requests * 2`, + piped: `requests * 2`, + }, + { + // Source: promqltest/testdata/range_queries.test + query: `some_metric[1m]`, + piped: `some_metric[1m]`, + }, + { + // Source: promqltest/testdata/range_queries.test + query: `some_metric[2m]`, + piped: `some_metric[2m]`, + }, + { + // Source: promqltest/testdata/range_queries.test + query: `some_metric_with_stale_marker[3m]`, + piped: `some_metric_with_stale_marker[3m]`, + }, + { + // Source: promqltest/testdata/range_queries.test + query: `some_nonexistent_metric[1m]`, + piped: `some_nonexistent_metric[1m]`, + }, + { + // Source: promqltest/testdata/range_queries.test + query: `sum_over_time(bar[30s])`, + piped: `bar[30s] | sum_over_time`, + }, + { + // Source: promqltest/testdata/selectors.test + query: `http_requests_total{group!="canary"}`, + piped: `http_requests_total{group!="canary"}`, + }, + { + // Source: promqltest/testdata/selectors.test + query: `http_requests_total{group="production",job="api-server"} offset 5m`, + piped: `http_requests_total{group="production",job="api-server"} offset 5m`, + }, + { + // Source: promqltest/testdata/selectors.test + query: `http_requests_total{group="production",job=~"api-.+"}`, + piped: `http_requests_total{group="production",job=~"api-.+"}`, + }, + { + // Source: promqltest/testdata/selectors.test + query: `http_requests_total{job!~"api-.+",group!="canary"}`, + piped: `http_requests_total{group!="canary",job!~"api-.+"}`, + }, + { + // Source: promqltest/testdata/selectors.test + query: `http_requests_total{job=~".+-server",group!="canary"}`, + piped: `http_requests_total{group!="canary",job=~".+-server"}`, + }, + { + // Source: promqltest/testdata/selectors.test + query: `metric1 offset 15m or metric2 offset 45m`, + piped: `let + x1 = metric1 offset 15m + x2 = metric2 offset 45m +in x1 or x2`, + }, + { + // Source: promqltest/testdata/selectors.test + query: `x{y="testvalue"}`, + piped: `x{y="testvalue"}`, + }, + { + // Source: promqltest/testdata/selectors.test + query: `{__name__=~".+"}`, + piped: `{__name__=~".+"}`, + }, + { + // Source: promqltest/testdata/selectors.test + query: `{job=~".+-server", job!~"api-.+"}`, + piped: `{job!~"api-.+",job=~".+-server"}`, + }, + { + // Source: promqltest/testdata/subquery.test + query: `increase(native_histogram[10m:15s])`, + piped: `native_histogram | increase`, + }, + { + // Source: promqltest/testdata/subquery.test + query: `increase(native_histogram[10m:3m])`, + piped: `native_histogram | increase`, + }, + { + // Source: promqltest/testdata/subquery.test + query: `min_over_time((topk(1, foo))[1m:5m])`, + piped: `(foo | topk(1)) | min_over_time`, + }, + { + // Source: promqltest/testdata/subquery.test + query: `min_over_time(rate(metric_total[5m])[20m:1m])`, + piped: `metric_total[5m] | rate | min_over_time`, + }, + { + // Source: promqltest/testdata/subquery.test + query: `sum_over_time(metric_total[50s:10s])`, + piped: `metric_total | sum_over_time`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `acos(trig - 10.1)`, + piped: `trig - 10.1 | acos`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `acosh(trig)`, + piped: `trig | acosh`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `asin(trig - 10.1)`, + piped: `trig - 10.1 | asin`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `asinh(trig)`, + piped: `trig | asinh`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `atan(trig)`, + piped: `trig | atan`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `atanh(trig - 10.1)`, + piped: `trig - 10.1 | atanh`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `cos(trig)`, + piped: `trig | cos`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `cosh(trig)`, + piped: `trig | cosh`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `deg(trig - 10)`, + piped: `trig - 10 | deg`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `deg(trig - 20)`, + piped: `trig - 20 | deg`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `deg(trig)`, + piped: `trig | deg`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `rad(trig - 10)`, + piped: `trig - 10 | rad`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `rad(trig - 20)`, + piped: `trig - 20 | rad`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `rad(trig)`, + piped: `trig | rad`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `sin(trig)`, + piped: `trig | sin`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `sinh(trig)`, + piped: `trig | sinh`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `tan(trig)`, + piped: `trig | tan`, + }, + { + // Source: promqltest/testdata/trig_functions.test + query: `tanh(trig)`, + piped: `trig | tanh`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `(http_requests_total{group="canary"} + 1) and http_requests_total{instance="0"}`, + piped: `let + x1 = http_requests_total{group="canary"} + 1 + x2 = http_requests_total{instance="0"} +in x1 and x2`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `(http_requests_total{group="canary"} + 1) or http_requests_total{instance="1"}`, + piped: `let + x1 = http_requests_total{group="canary"} + 1 + x2 = http_requests_total{instance="1"} +in x1 or x2`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `+http_requests_total{job="api-server",instance="0",group="production"}`, + piped: `+http_requests_total{group="production",instance="0",job="api-server"}`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `-10^3 * - SUM(http_requests_total) BY (job) ^ -1`, + piped: `-sum by (job) (http_requests_total) ^ -1 * -10 ^ 3`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `-http_requests_total{job="api-server",instance="0",group="production"}`, + piped: `-http_requests_total{group="production",instance="0",job="api-server"}`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `0 * http_requests_total{group="canary", instance="0", job="api-server"} % 0`, + piped: `http_requests_total{group="canary",instance="0",job="api-server"} * 0 % 0`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `SUM(http_requests_total) BY (job)`, + piped: `http_requests_total | sum by (job) `, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `SUM(http_requests_total) BY (job) != bool SUM(http_requests_total) BY (job)`, + piped: `let + x1 = http_requests_total | sum by (job) +in x1 != bool x1`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `SUM(http_requests_total) BY (job) - COUNT(http_requests_total) BY (job)`, + piped: `let + x1 = http_requests_total | sum by (job) + x2 = http_requests_total | count by (job) +in x1 - x2`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `SUM(http_requests_total) BY (job) / 0`, + piped: `http_requests_total | sum by (job) / 0`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `SUM(http_requests_total) BY (job) == bool SUM(http_requests_total) BY (job)`, + piped: `let + x1 = http_requests_total | sum by (job) +in x1 == bool x1`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `SUM(http_requests_total) BY (job) > 1000`, + piped: `http_requests_total | sum by (job) > 1000`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `SUM(http_requests_total{__type__="counter", __unit__="request"}) BY (job)`, + piped: `http_requests_total{__type__="counter",__unit__="request"} | sum by (job) `, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `SUM({__type__="counter", __unit__="request"}) BY (job)`, + piped: `{__type__="counter",__unit__="request"} | sum by (job) `, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `SUM({__type__="counter"}) BY (job)`, + piped: `{__type__="counter"} | sum by (job) `, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `SUM({__unit__="request"}) BY (job)`, + piped: `{__unit__="request"} | sum by (job) `, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `http_requests_total{__type__="counter", job="api-server", group="canary"}`, + piped: `http_requests_total{__type__="counter",group="canary",job="api-server"}`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `http_requests_total{group="canary", instance="0", job="api-server"} / 0`, + piped: `http_requests_total{group="canary",instance="0",job="api-server"} / 0`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `http_requests_total{group="canary"} / ignoring(group) http_requests_total{group="production"}`, + piped: `let + x1 = http_requests_total{group="canary"} + x2 = http_requests_total{group="production"} +in x1 / ignoring (group) x2`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `http_requests_total{group="canary"} / on(instance,job) http_requests_total{group="production"}`, + piped: `let + x1 = http_requests_total{group="canary"} + x2 = http_requests_total{group="production"} +in x1 / on (instance, job) x2`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `http_requests_total{group="canary"} and http_requests_total{instance="0"}`, + piped: `let + x1 = http_requests_total{group="canary"} + x2 = http_requests_total{instance="0"} +in x1 and x2`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `http_requests_total{group="canary"} or http_requests_total{group="production"}`, + piped: `let + x1 = http_requests_total{group="canary"} + x2 = http_requests_total{group="production"} +in x1 or x2`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `http_requests_total{group="canary"} unless http_requests_total{instance="0"}`, + piped: `let + x1 = http_requests_total{group="canary"} + x2 = http_requests_total{instance="0"} +in x1 unless x2`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `http_requests_total{group="canary"} unless ignoring(group) http_requests_total{instance="0"}`, + piped: `let + x1 = http_requests_total{group="canary"} + x2 = http_requests_total{instance="0"} +in x1 unless ignoring (group) x2`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `http_requests_total{group="canary"} unless ignoring(group, instance) http_requests_total{instance="0"}`, + piped: `let + x1 = http_requests_total{group="canary"} + x2 = http_requests_total{instance="0"} +in x1 unless ignoring (group, instance) x2`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `http_requests_total{group="canary"} unless on(job) http_requests_total{instance="0"}`, + piped: `let + x1 = http_requests_total{group="canary"} + x2 = http_requests_total{instance="0"} +in x1 unless on (job) x2`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `http_requests_total{group="canary"} unless on(job, instance) http_requests_total{instance="0"}`, + piped: `let + x1 = http_requests_total{group="canary"} + x2 = http_requests_total{instance="0"} +in x1 unless on (job, instance) x2`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `http_requests_total{job="api-server", group="canary"}`, + piped: `http_requests_total{group="canary",job="api-server"}`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `http_requests_total{job="api-server", instance="0", group="production"} == bool 100`, + piped: `http_requests_total{group="production",instance="0",job="api-server"} == bool 100`, + }, + { + // Source: promqltest/testdata/type_and_unit.test + query: `rate(http_requests_total[25m]) * 25 * 60`, + piped: `http_requests_total[25m] | rate * 25 * 60`, + }, +} diff --git a/promql/pipe_test.go b/promql/pipe_test.go new file mode 100644 index 0000000000..be2e5ea426 --- /dev/null +++ b/promql/pipe_test.go @@ -0,0 +1,77 @@ +// Copyright 2025 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License + +package promql_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/prometheus/prometheus/promql" + "github.com/prometheus/prometheus/promql/parser" +) + +func TestToPiped(t *testing.T) { + t.Cleanup(func() { + parser.EnableExperimentalFunctions = false + parser.ExperimentalDurationExpr = false + parser.EnableExtendedRangeSelectors = false + }) + parser.EnableExperimentalFunctions = true + parser.ExperimentalDurationExpr = true + parser.EnableExtendedRangeSelectors = true + + for _, tc := range manualPipedCases { + t.Run(tc.query, func(t *testing.T) { + got, err := promql.ToPiped(tc.query) + require.NoError(t, err) + require.Equal(t, tc.piped, got) + }) + } + + for _, tc := range pipedCases { + t.Run(tc.query, func(t *testing.T) { + got, err := promql.ToPiped(tc.query) + require.NoError(t, err) + require.Equal(t, tc.piped, got) + }) + } +} + +var manualPipedCases = []pipedCase{ + { + query: `( + kube_deployment_status_replicas_available{namespace='monitoring',cluster!~'o11y-.+'} > 1 +) +* +histogram_sum(sum(rate(looping_time{location='us-east1', group_name='realtime'} [2m]))) +/ +( + histogram_sum(sum(rate(looping_time{location='us-east1', group_name='realtime'} [2m]))) + + ( + histogram_sum(sum(rate(sleeping_time{location='us-east1', group_name='realtime'} [2m]))) OR on() vector(0) + ) +)`, + piped: `let + x1 = kube_deployment_status_replicas_available{cluster!~"o11y-.+",namespace="monitoring"} > 1 + x2 = looping_time{group_name="realtime",location="us-east1"}[2m] | rate | sum | histogram_sum + x3 = sleeping_time{group_name="realtime",location="us-east1"}[2m] | rate | sum | histogram_sum + x4 = vector(0) +in x1 * x2 / (x2 + (x3 or on () x4))`, + }, + { + query: `avg(sum by (group) (http_requests{job="api-server"}))`, + piped: `http_requests{job="api-server"} | sum by (group) | avg`, + }, +}