diff --git a/executor/aggregate_test.go b/executor/aggregate_test.go index fca05420430ad..d5f1b80a25944 100644 --- a/executor/aggregate_test.go +++ b/executor/aggregate_test.go @@ -566,6 +566,20 @@ func (s *testSuite1) TestOnlyFullGroupBy(c *C) { c.Assert(terror.ErrorEqual(err, plannercore.ErrAmbiguous), IsTrue, Commentf("err %v", err)) } +func (s *testSuite1) TestIssue13652(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set sql_mode = 'ONLY_FULL_GROUP_BY'") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a real)") + tk.MustQuery("select a from t group by (a)") + tk.MustQuery("select a from t group by ((a))") + tk.MustQuery("select a from t group by +a") + tk.MustQuery("select a from t group by ((+a))") + _, err := tk.Exec("select a from t group by (-a)") + c.Assert(err.Error(), Equals, "[planner:1055]Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.t.a' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by") +} + func (s *testSuite1) TestHaving(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index a79f29a08fa88..489abead9afbf 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -1737,14 +1737,15 @@ func (b *PlanBuilder) checkOnlyFullGroupByWithGroupClause(p LogicalPlan, sel *as gbyExprs := make([]ast.ExprNode, 0, len(sel.Fields.Fields)) schema := p.Schema() for _, byItem := range sel.GroupBy.Items { - if colExpr, ok := byItem.Expr.(*ast.ColumnNameExpr); ok { + expr := getInnerFromParenthesesAndUnaryPlus(byItem.Expr) + if colExpr, ok := expr.(*ast.ColumnNameExpr); ok { col, err := schema.FindColumn(colExpr.Name) if err != nil || col == nil { continue } gbyCols[col] = struct{}{} } else { - gbyExprs = append(gbyExprs, byItem.Expr) + gbyExprs = append(gbyExprs, expr) } }