From 2c0e47b618ed731a62f1fb2856eff3ad20133fc3 Mon Sep 17 00:00:00 2001 From: Ti Chi Robot Date: Tue, 21 May 2024 12:17:52 +0800 Subject: [PATCH] planner: make `var_samp` can be used as a window function (#53130) (#53287) close pingcap/tidb#52933 --- pkg/executor/window_test.go | 9 +++++++++ pkg/parser/parser.go | 6 +++++- pkg/parser/parser.y | 6 +++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/pkg/executor/window_test.go b/pkg/executor/window_test.go index 3404acfea4d61..d75fb6582b847 100644 --- a/pkg/executor/window_test.go +++ b/pkg/executor/window_test.go @@ -539,3 +539,12 @@ func TestIssue45964And46050(t *testing.T) { testReturnColumnNullableAttribute(tk, "cume_dist()", false) testReturnColumnNullableAttribute(tk, "percent_rank()", false) } + +func TestVarSampAsAWindowFunction(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t1 (c1 int)") + tk.MustExec("select var_samp(c1) from t1") + tk.MustExec("select c1, var_samp(c1) over (partition by c1) from t1") +} diff --git a/pkg/parser/parser.go b/pkg/parser/parser.go index e86562ff32872..fedab96aa35bf 100644 --- a/pkg/parser/parser.go +++ b/pkg/parser/parser.go @@ -18256,7 +18256,11 @@ yynewstate: } case 1538: { - parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } } case 1539: { diff --git a/pkg/parser/parser.y b/pkg/parser/parser.y index 39bba61530204..03b00283ab828 100644 --- a/pkg/parser/parser.y +++ b/pkg/parser/parser.y @@ -8372,7 +8372,11 @@ SumExpr: } | builtinVarSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause { - $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + if $6 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } } | "JSON_ARRAYAGG" '(' Expression ')' OptWindowingClause {