From 47ed7ec170cce1d60361886bfcdebbdc97c85284 Mon Sep 17 00:00:00 2001 From: gaoxingliang Date: Fri, 26 Jul 2019 10:21:01 +0800 Subject: [PATCH] =?UTF-8?q?planner/core:=20give=20the=20full=20schema=20in?= =?UTF-8?q?formation=20when=20group=20by=20f=E2=80=A6=20(#11406)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- planner/core/logical_plan_builder.go | 2 +- planner/core/logical_plan_test.go | 66 ++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 94c36b75ac..77325fccaf 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -1769,7 +1769,7 @@ func (b *PlanBuilder) checkOnlyFullGroupByWithGroupClause(p LogicalPlan, sel *as } switch errExprLoc.Loc { case ErrExprInSelect: - return ErrFieldNotInGroupBy.GenWithStackByArgs(errExprLoc.Offset+1, errExprLoc.Loc, sel.Fields.Fields[errExprLoc.Offset].Text()) + return ErrFieldNotInGroupBy.GenWithStackByArgs(errExprLoc.Offset+1, errExprLoc.Loc, col.DBName.O+"."+col.TblName.O+"."+col.OrigColName.O) case ErrExprInOrderBy: return ErrFieldNotInGroupBy.GenWithStackByArgs(errExprLoc.Offset+1, errExprLoc.Loc, sel.OrderBy.Items[errExprLoc.Offset].Expr.Text()) } diff --git a/planner/core/logical_plan_test.go b/planner/core/logical_plan_test.go index 7761ea3f2f..b2770092a5 100644 --- a/planner/core/logical_plan_test.go +++ b/planner/core/logical_plan_test.go @@ -22,6 +22,7 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" @@ -574,6 +575,71 @@ func (s *testPlanSuite) TestDeriveNotNullConds(c *C) { } } +func buildLogicPlan4GroupBy(s *testPlanSuite, c *C, sql string) (Plan, error) { + sqlMode := s.ctx.GetSessionVars().SQLMode + mockedTableInfo := MockSignedTable() + // mock the table info here for later use + // enable only full group by + s.ctx.GetSessionVars().SQLMode = sqlMode | mysql.ModeOnlyFullGroupBy + defer func() { s.ctx.GetSessionVars().SQLMode = sqlMode }() // restore it + comment := Commentf("for %s", sql) + stmt, err := s.ParseOneStmt(sql, "", "") + c.Assert(err, IsNil, comment) + + stmt.(*ast.SelectStmt).From.TableRefs.Left.(*ast.TableSource).Source.(*ast.TableName).TableInfo = mockedTableInfo + + return BuildLogicalPlan(context.Background(), s.ctx, stmt, s.is) +} + +func (s *testPlanSuite) TestGroupByWhenNotExistCols(c *C) { + sqlTests := []struct { + sql string + expectedErrMatch string + }{ + { + sql: "select a from t group by b", + expectedErrMatch: ".*contains nonaggregated column 'test\\.t\\.a'.*", + }, + { + // has an as column alias + sql: "select a as tempField from t group by b", + expectedErrMatch: ".*contains nonaggregated column 'test\\.t\\.a'.*", + }, + { + // has as table alias + sql: "select tempTable.a from t as tempTable group by b", + expectedErrMatch: ".*contains nonaggregated column 'test\\.tempTable\\.a'.*", + }, + { + // has a func call + sql: "select length(a) from t group by b", + expectedErrMatch: ".*contains nonaggregated column 'test\\.t\\.a'.*", + }, + { + // has a func call with two cols + sql: "select length(b + a) from t group by b", + expectedErrMatch: ".*contains nonaggregated column 'test\\.t\\.a'.*", + }, + { + // has a func call with two cols + sql: "select length(a + b) from t group by b", + expectedErrMatch: ".*contains nonaggregated column 'test\\.t\\.a'.*", + }, + { + // has a func call with two cols + sql: "select length(a + b) as tempField from t group by b", + expectedErrMatch: ".*contains nonaggregated column 'test\\.t\\.a'.*", + }, + } + for _, test := range sqlTests { + sql := test.sql + p, err := buildLogicPlan4GroupBy(s, c, sql) + c.Assert(err, NotNil) + c.Assert(p, IsNil) + c.Assert(err, ErrorMatches, test.expectedErrMatch) + } +} + func (s *testPlanSuite) TestDupRandJoinCondsPushDown(c *C) { sql := "select * from t as t1 join t t2 on t1.a > rand() and t1.a > rand()" comment := Commentf("for %s", sql)