3
0

Fix aggregation count when no arguments are provided

Older versions allowed count(), the new one did not.
The new version now allso supports count() which behaves
how it did before.
This commit is contained in:
Tomaž Jerman 2022-10-25 11:49:05 +02:00
parent 24b5d7c72d
commit f6266fb3d5
3 changed files with 20 additions and 17 deletions

View File

@ -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
}

View File

@ -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)"))
})
}

View File

@ -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": {