diff --git a/app/vmselect/promql/eval.go b/app/vmselect/promql/eval.go
index 761e1db4b6..b58c8fdb07 100644
--- a/app/vmselect/promql/eval.go
+++ b/app/vmselect/promql/eval.go
@@ -329,6 +329,10 @@ func tryGetArgRollupFuncWithMetricExpr(ae *metricsql.AggrFuncExpr) (*metricsql.F
 		return nil, nil
 	}
 	rollupArgIdx := getRollupArgIdx(fe.Name)
+	if rollupArgIdx >= len(fe.Args) {
+		// Incorrect number of args for rollup func.
+		return nil, nil
+	}
 	arg := fe.Args[rollupArgIdx]
 	if me, ok := arg.(*metricsql.MetricExpr); ok {
 		if me.IsEmpty() {
@@ -366,7 +370,7 @@ func evalRollupFuncArgs(ec *EvalConfig, fe *metricsql.FuncExpr) ([]interface{},
 	var re *metricsql.RollupExpr
 	rollupArgIdx := getRollupArgIdx(fe.Name)
 	if len(fe.Args) <= rollupArgIdx {
-		return nil, nil, fmt.Errorf("expecting at least %d args to %q; got %d args; expr: %q", rollupArgIdx, fe.Name, len(fe.Args), fe.AppendString(nil))
+		return nil, nil, fmt.Errorf("expecting at least %d args to %q; got %d args; expr: %q", rollupArgIdx+1, fe.Name, len(fe.Args), fe.AppendString(nil))
 	}
 	args := make([]interface{}, len(fe.Args))
 	for i, arg := range fe.Args {
diff --git a/app/vmselect/promql/exec_test.go b/app/vmselect/promql/exec_test.go
index 731f1e2af1..ea99f0c75a 100644
--- a/app/vmselect/promql/exec_test.go
+++ b/app/vmselect/promql/exec_test.go
@@ -5304,6 +5304,9 @@ func TestExecError(t *testing.T) {
 	f(`aggr_over_time()`)
 	f(`aggr_over_time(foo)`)
 	f(`aggr_over_time("foo", bar, 1)`)
+	f(`sum(aggr_over_time())`)
+	f(`sum(aggr_over_time(foo))`)
+	f(`count(aggr_over_time("foo", bar, 1))`)
 	f(`hoeffding_bound_lower()`)
 	f(`hoeffding_bound_lower(1)`)
 	f(`hoeffding_bound_lower(0.99, foo, 1)`)