diff --git a/pkg/dal/aggregator.go b/pkg/dal/aggregator.go index f886e91ff..f4317ab95 100644 --- a/pkg/dal/aggregator.go +++ b/pkg/dal/aggregator.go @@ -109,9 +109,11 @@ func (a *aggregator) AddAggregate(ident string, expr *ql.ASTNode) (err error) { // Prepare a runner in case we're not simply copying values if inIdent == "" { // - make evaluator - def.eval, err = newRunnerGvalParsed(expr) - if err != nil { - return + if expr != nil { + def.eval, err = newRunnerGvalParsed(expr) + if err != nil { + return + } } } @@ -189,9 +191,13 @@ func (a *aggregator) aggregate(ctx context.Context, attr aggregateDef, i int, v func (a *aggregator) walkValues(ctx context.Context, r ValueGetter, cc map[string]uint, attr aggregateDef, run func(v any, isNil bool)) (err error) { var out any if attr.inIdent == "" { - out, err = attr.eval.Eval(ctx, r) - if err != nil { - return + if attr.eval != nil { + out, err = attr.eval.Eval(ctx, r) + if err != nil { + return + } + } else { + out = r } run(out, reflect2.IsNil(out)) @@ -335,12 +341,9 @@ func unpackExpressionNode(n *ql.ASTNode) (aggOp string, expr *ql.ASTNode, err er return } - if len(n.Args) != 1 { - err = fmt.Errorf("impossible state: aggregate function must have exactly one argument") - return + if len(n.Args) > 0 { + expr = n.Args[0] } - - expr = n.Args[0] return } diff --git a/pkg/dal/aggregator_test.go b/pkg/dal/aggregator_test.go index b979a1a40..860259daa 100644 --- a/pkg/dal/aggregator_test.go +++ b/pkg/dal/aggregator_test.go @@ -188,9 +188,4 @@ func TestAggregatorInit(t *testing.T) { agg := Aggregator() require.Error(t, agg.AddAggregateE("count", "div(v)")) }) - - t.Run("invalid expression", func(t *testing.T) { - agg := Aggregator() - require.Error(t, agg.AddAggregateE("x", "sum(q we)")) - }) } diff --git a/store/adapters/rdbms/ql/ref.go b/store/adapters/rdbms/ql/ref.go index a652b9584..708203a14 100644 --- a/store/adapters/rdbms/ql/ref.go +++ b/store/adapters/rdbms/ql/ref.go @@ -227,7 +227,12 @@ var ( }, "count": { Handler: func(args ...exp.Expression) exp.Expression { - return exp.NewSQLFunctionExpression("COUNT", args[0]) + var arg exp.Expression = exp.NewLiteralExpression("*") + if len(args) > 0 { + arg = args[0] + } + + return exp.NewSQLFunctionExpression("COUNT", arg) }, }, "sum": {