diff --git a/promql/engine.go b/promql/engine.go index 3f4c24c2d3..baa645fd9a 100644 --- a/promql/engine.go +++ b/promql/engine.go @@ -1781,8 +1781,7 @@ func (ev *evaluator) eval(ctx context.Context, expr parser.Expr) (parser.Value, } unwrapParenExpr(&e.Args[matrixArgIndex]) - arg := unwrapStepInvariantExpr(e.Args[matrixArgIndex]) - unwrapParenExpr(&arg) + arg := e.Args[matrixArgIndex] sel := arg.(*parser.MatrixSelector) selVS := sel.VectorSelector.(*parser.VectorSelector) @@ -3794,7 +3793,9 @@ func preprocessExprHelper(expr parser.Expr, start, end time.Time) (isStepInvaria return false, false case *parser.MatrixSelector: - return preprocessExprHelper(n.VectorSelector, start, end) + // We don't need to wrap a MatrixSelector because functions over range vectors evaluate those directly. + isStepInvariant, _ := preprocessExprHelper(n.VectorSelector, start, end) + return isStepInvariant, false case *parser.SubqueryExpr: // Since we adjust offset for the @ modifier evaluation, diff --git a/promql/engine_test.go b/promql/engine_test.go index 0ade9214f8..18671c76aa 100644 --- a/promql/engine_test.go +++ b/promql/engine_test.go @@ -2423,23 +2423,21 @@ func TestPreprocessAndWrapWithStepInvariantExpr(t *testing.T) { }, { input: `test{a="b"}[5y] @ 1603774699`, - expected: &parser.StepInvariantExpr{ - Expr: &parser.MatrixSelector{ - VectorSelector: &parser.VectorSelector{ - Name: "test", - Timestamp: makeInt64Pointer(1603774699000), - LabelMatchers: []*labels.Matcher{ - parser.MustLabelMatcher(labels.MatchEqual, "a", "b"), - parser.MustLabelMatcher(labels.MatchEqual, "__name__", "test"), - }, - PosRange: posrange.PositionRange{ - Start: 0, - End: 11, - }, + expected: &parser.MatrixSelector{ + VectorSelector: &parser.VectorSelector{ + Name: "test", + Timestamp: makeInt64Pointer(1603774699000), + LabelMatchers: []*labels.Matcher{ + parser.MustLabelMatcher(labels.MatchEqual, "a", "b"), + parser.MustLabelMatcher(labels.MatchEqual, "__name__", "test"), + }, + PosRange: posrange.PositionRange{ + Start: 0, + End: 11, }, - Range: 5 * 365 * 24 * time.Hour, - EndPos: 28, }, + Range: 5 * 365 * 24 * time.Hour, + EndPos: 28, }, }, { @@ -2938,45 +2936,53 @@ func TestPreprocessAndWrapWithStepInvariantExpr(t *testing.T) { }, }, { - input: `test[5y] @ start()`, + input: `sum_over_time(test[5y] @ start())`, expected: &parser.StepInvariantExpr{ - Expr: &parser.MatrixSelector{ - VectorSelector: &parser.VectorSelector{ - Name: "test", - Timestamp: makeInt64Pointer(timestamp.FromTime(startTime)), - StartOrEnd: parser.START, - LabelMatchers: []*labels.Matcher{ - parser.MustLabelMatcher(labels.MatchEqual, "__name__", "test"), - }, - PosRange: posrange.PositionRange{ - Start: 0, - End: 4, + Expr: &parser.Call{ + Func: &parser.Function{ + Name: "sum_over_time", + ArgTypes: []parser.ValueType{parser.ValueTypeMatrix}, + ReturnType: parser.ValueTypeVector, + }, + Args: parser.Expressions{ + &parser.MatrixSelector{ + VectorSelector: &parser.VectorSelector{ + Name: "test", + Timestamp: makeInt64Pointer(timestamp.FromTime(startTime)), + StartOrEnd: parser.START, + LabelMatchers: []*labels.Matcher{ + parser.MustLabelMatcher(labels.MatchEqual, "__name__", "test"), + }, + PosRange: posrange.PositionRange{ + Start: 14, + End: 18, + }, + }, + Range: 5 * 365 * 24 * time.Hour, + EndPos: 32, }, }, - Range: 5 * 365 * 24 * time.Hour, - EndPos: 18, + PosRange: posrange.PositionRange{Start: 0, End: 33}, }, }, }, { input: `test[5y] @ end()`, - expected: &parser.StepInvariantExpr{ - Expr: &parser.MatrixSelector{ - VectorSelector: &parser.VectorSelector{ - Name: "test", - Timestamp: makeInt64Pointer(timestamp.FromTime(endTime)), - StartOrEnd: parser.END, - LabelMatchers: []*labels.Matcher{ - parser.MustLabelMatcher(labels.MatchEqual, "__name__", "test"), - }, - PosRange: posrange.PositionRange{ - Start: 0, - End: 4, - }, + expected: &parser.MatrixSelector{ + VectorSelector: &parser.VectorSelector{ + Name: "test", + Timestamp: makeInt64Pointer(timestamp.FromTime(endTime)), + StartOrEnd: parser.END, + LabelMatchers: []*labels.Matcher{ + parser.MustLabelMatcher(labels.MatchEqual, "__name__", "test"), + }, + PosRange: posrange.PositionRange{ + Start: 0, + End: 4, }, - Range: 5 * 365 * 24 * time.Hour, - EndPos: 16, }, + Range: 5 * 365 * 24 * time.Hour, + EndPos: 16, }, }, {