From 12bab9180362896c9b79a4613ae03ba7b8965bdd Mon Sep 17 00:00:00 2001 From: "Zhuomin(Charming) Liu" Date: Thu, 26 Sep 2019 10:44:17 +0800 Subject: [PATCH] planner: fix some window specific check bug for window function. (#12394) --- planner/core/logical_plan_builder.go | 5 ++++- planner/core/logical_plan_test.go | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 5ff63363a8e68..85dbea58850a8 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -3301,7 +3301,10 @@ func (b *PlanBuilder) checkOriginWindowSpecs(funcs []*ast.WindowFuncExpr, orderB if end.Type == ast.Preceding && end.UnBounded { return ErrWindowFrameEndIllegal.GenWithStackByArgs(getWindowName(spec.Name.O)) } - if start.Type == ast.Following && end.Type == ast.Preceding { + if start.Type == ast.Following && (end.Type == ast.Preceding || end.Type == ast.CurrentRow) { + return ErrWindowFrameIllegal.GenWithStackByArgs(getWindowName(spec.Name.O)) + } + if (start.Type == ast.Following || start.Type == ast.CurrentRow) && end.Type == ast.Preceding { return ErrWindowFrameIllegal.GenWithStackByArgs(getWindowName(spec.Name.O)) } diff --git a/planner/core/logical_plan_test.go b/planner/core/logical_plan_test.go index 7044937619e67..791e58dd796be 100644 --- a/planner/core/logical_plan_test.go +++ b/planner/core/logical_plan_test.go @@ -2481,6 +2481,18 @@ func (s *testPlanSuite) TestWindowFunction(c *C) { sql: "SELECT NTH_VALUE(fieldA, -1) OVER (w1 PARTITION BY fieldB ORDER BY fieldB , fieldA ) AS 'ntile', fieldA, fieldB FROM ( SELECT a AS fieldA, b AS fieldB FROM t ) as temp WINDOW w1 AS ( ORDER BY fieldB ASC, fieldA DESC )", result: "[planner:1210]Incorrect arguments to nth_value", }, + { + sql: "SELECT SUM(a) OVER w AS 'sum' FROM t WINDOW w AS (ROWS BETWEEN 1 FOLLOWING AND CURRENT ROW )", + result: "[planner:3586]Window 'w': frame start or end is negative, NULL or of non-integral type", + }, + { + sql: "SELECT SUM(a) OVER w AS 'sum' FROM t WINDOW w AS (ROWS BETWEEN CURRENT ROW AND 1 PRECEDING )", + result: "[planner:3586]Window 'w': frame start or end is negative, NULL or of non-integral type", + }, + { + sql: "SELECT SUM(a) OVER w AS 'sum' FROM t WINDOW w AS (ROWS BETWEEN 1 FOLLOWING AND 1 PRECEDING )", + result: "[planner:3586]Window 'w': frame start or end is negative, NULL or of non-integral type", + }, // Test issue 11943 { sql: "SELECT ROW_NUMBER() OVER (partition by b) + a FROM t",