diff --git a/sql3/planner/expression.go b/sql3/planner/expression.go index 052ddf2dc..721ff86e3 100644 --- a/sql3/planner/expression.go +++ b/sql3/planner/expression.go @@ -2899,7 +2899,7 @@ func (p *ExecutionPlanner) compileCallExpr(expr *parser.Call) (_ types.PlanExpre return agg, nil case "PERCENTILE": - agg := newPercentilePlanExpression(args[0], args[1], expr.ResultDataType) + agg := newPercentilePlanExpression(expr.Name.NamePos, args[0], args[1], expr.ResultDataType) return agg, nil case "CORR": diff --git a/sql3/planner/expressionagg.go b/sql3/planner/expressionagg.go index b260a0c45..6de922b51 100644 --- a/sql3/planner/expressionagg.go +++ b/sql3/planner/expressionagg.go @@ -881,6 +881,7 @@ func (n *maxPlanExpression) WithChildren(children ...types.PlanExpression) (type // percentilePlanExpression handles PERCENTILE() type percentilePlanExpression struct { + pos parser.Pos arg types.PlanExpression nthArg types.PlanExpression returnDataType parser.ExprDataType @@ -888,8 +889,9 @@ type percentilePlanExpression struct { var _ types.Aggregable = (*percentilePlanExpression)(nil) -func newPercentilePlanExpression(arg types.PlanExpression, nthArg types.PlanExpression, returnDataType parser.ExprDataType) *percentilePlanExpression { +func newPercentilePlanExpression(pos parser.Pos, arg types.PlanExpression, nthArg types.PlanExpression, returnDataType parser.ExprDataType) *percentilePlanExpression { return &percentilePlanExpression{ + pos: pos, arg: arg, nthArg: nthArg, returnDataType: returnDataType, @@ -905,7 +907,7 @@ func (n *percentilePlanExpression) Evaluate(currentRow []interface{}) (interface } func (n *percentilePlanExpression) NewBuffer() (types.AggregationBuffer, error) { - return NewAggCountBuffer(n), nil + return nil, sql3.NewErrUnsupported(n.pos.Line, n.pos.Column, true, "Percentile call that can't be pushed down to PQL") } func (n *percentilePlanExpression) FirstChildExpr() types.PlanExpression { @@ -941,7 +943,7 @@ func (n *percentilePlanExpression) WithChildren(children ...types.PlanExpression if len(children) != 2 { return nil, sql3.NewErrInternalf("unexpected number of children '%d'", len(children)) } - return newPercentilePlanExpression(children[0], children[1], n.returnDataType), nil + return newPercentilePlanExpression(n.pos, children[0], children[1], n.returnDataType), nil } // aggregator for CORR() diff --git a/sql3/test/defs/defs_aggregate.go b/sql3/test/defs/defs_aggregate.go index ea43ec730..c9553f98a 100644 --- a/sql3/test/defs/defs_aggregate.go +++ b/sql3/test/defs/defs_aggregate.go @@ -494,6 +494,12 @@ var percentileTests = TableTest{ ), ExpErr: "integer, decimal or timestamp expression expected", }, + { + SQLs: sqls( + "SELECT percentile(i1, 50) AS avg_rows FROM percentile_test WHERE s1 != 'a'", + ), + ExpErr: "Percentile call that can't be pushed down to PQL is not supported", + }, { SQLs: sqls( "SELECT percentile(i1, 50) AS p_rows FROM percentile_test",