Skip to content

Commit ae72e72

Browse files
winorosti-chi-bot
authored andcommitted
This is an automated cherry-pick of pingcap#33567
Signed-off-by: ti-chi-bot <[email protected]>
1 parent e62ed60 commit ae72e72

File tree

6 files changed

+2136
-0
lines changed

6 files changed

+2136
-0
lines changed

executor/aggregate_test.go

Lines changed: 1591 additions & 0 deletions
Large diffs are not rendered by default.

pkg/planner/core/logical_plan_builder.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"unicode"
2727

2828
"github.com/pingcap/errors"
29+
<<<<<<< HEAD:pkg/planner/core/logical_plan_builder.go
2930
"github.com/pingcap/failpoint"
3031
"github.com/pingcap/tidb/pkg/domain"
3132
"github.com/pingcap/tidb/pkg/expression"
@@ -67,6 +68,41 @@ import (
6768
"github.com/pingcap/tidb/pkg/util/set"
6869
"github.com/pingcap/tidb/pkg/util/size"
6970
"github.com/pingcap/tipb/go-tipb"
71+
=======
72+
"github.com/pingcap/tidb/domain"
73+
"github.com/pingcap/tidb/expression"
74+
"github.com/pingcap/tidb/expression/aggregation"
75+
"github.com/pingcap/tidb/infoschema"
76+
"github.com/pingcap/tidb/kv"
77+
"github.com/pingcap/tidb/metrics"
78+
"github.com/pingcap/tidb/parser"
79+
"github.com/pingcap/tidb/parser/ast"
80+
"github.com/pingcap/tidb/parser/format"
81+
"github.com/pingcap/tidb/parser/model"
82+
"github.com/pingcap/tidb/parser/mysql"
83+
"github.com/pingcap/tidb/parser/opcode"
84+
"github.com/pingcap/tidb/parser/terror"
85+
fd "github.com/pingcap/tidb/planner/funcdep"
86+
"github.com/pingcap/tidb/planner/property"
87+
"github.com/pingcap/tidb/planner/util"
88+
"github.com/pingcap/tidb/privilege"
89+
"github.com/pingcap/tidb/sessionctx"
90+
"github.com/pingcap/tidb/sessionctx/variable"
91+
"github.com/pingcap/tidb/statistics"
92+
"github.com/pingcap/tidb/table"
93+
"github.com/pingcap/tidb/table/tables"
94+
"github.com/pingcap/tidb/table/temptable"
95+
"github.com/pingcap/tidb/types"
96+
driver "github.com/pingcap/tidb/types/parser_driver"
97+
util2 "github.com/pingcap/tidb/util"
98+
"github.com/pingcap/tidb/util/chunk"
99+
"github.com/pingcap/tidb/util/collate"
100+
"github.com/pingcap/tidb/util/dbterror"
101+
"github.com/pingcap/tidb/util/hack"
102+
"github.com/pingcap/tidb/util/logutil"
103+
"github.com/pingcap/tidb/util/plancodec"
104+
"github.com/pingcap/tidb/util/set"
105+
>>>>>>> 571d97bb16f (planner: using the funcdep to check the only_full_group_by (#33567)):planner/core/logical_plan_builder.go
70106
)
71107

72108
const (
@@ -3827,8 +3863,14 @@ type aggColNameResolver struct {
38273863
colNameResolver
38283864
}
38293865

3866+
<<<<<<< HEAD:pkg/planner/core/logical_plan_builder.go
38303867
func (*aggColNameResolver) Enter(inNode ast.Node) (ast.Node, bool) {
38313868
if _, ok := inNode.(*ast.ColumnNameExpr); ok {
3869+
=======
3870+
func (c *aggColNameResolver) Enter(inNode ast.Node) (ast.Node, bool) {
3871+
switch inNode.(type) {
3872+
case *ast.ColumnNameExpr:
3873+
>>>>>>> 571d97bb16f (planner: using the funcdep to check the only_full_group_by (#33567)):planner/core/logical_plan_builder.go
38323874
return inNode, true
38333875
}
38343876
return inNode, false

pkg/planner/core/logical_plans.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"math"
2121
"unsafe"
2222

23+
<<<<<<< HEAD:pkg/planner/core/logical_plans.go
2324
"github.com/pingcap/tidb/pkg/expression"
2425
"github.com/pingcap/tidb/pkg/expression/aggregation"
2526
"github.com/pingcap/tidb/pkg/infoschema"
@@ -40,6 +41,24 @@ import (
4041
"github.com/pingcap/tidb/pkg/util/ranger"
4142
"github.com/pingcap/tidb/pkg/util/size"
4243
"github.com/pingcap/tipb/go-tipb"
44+
=======
45+
"github.com/pingcap/tidb/expression"
46+
"github.com/pingcap/tidb/expression/aggregation"
47+
"github.com/pingcap/tidb/infoschema"
48+
"github.com/pingcap/tidb/parser/ast"
49+
"github.com/pingcap/tidb/parser/auth"
50+
"github.com/pingcap/tidb/parser/model"
51+
"github.com/pingcap/tidb/parser/mysql"
52+
fd "github.com/pingcap/tidb/planner/funcdep"
53+
"github.com/pingcap/tidb/planner/property"
54+
"github.com/pingcap/tidb/planner/util"
55+
"github.com/pingcap/tidb/sessionctx"
56+
"github.com/pingcap/tidb/statistics"
57+
"github.com/pingcap/tidb/table"
58+
"github.com/pingcap/tidb/types"
59+
"github.com/pingcap/tidb/util/logutil"
60+
"github.com/pingcap/tidb/util/ranger"
61+
>>>>>>> 571d97bb16f (planner: using the funcdep to check the only_full_group_by (#33567)):planner/core/logical_plans.go
4362
"go.uber.org/zap"
4463
)
4564

@@ -367,12 +386,20 @@ func (p *LogicalJoin) extractFDForOuterJoin(filtersFromApply []expression.Expres
367386
opt.SkipFDRule331 = true
368387
}
369388

389+
<<<<<<< HEAD:pkg/planner/core/logical_plans.go
370390
opt.OnlyInnerFilter = len(eqCondSlice) == 0 && len(outerCondition) == 0 && len(p.OtherConditions) == 0
391+
=======
392+
opt.OnlyInnerFilter = len(eqCondSlice) == 0 && len(outerCondition) == 0
393+
>>>>>>> 571d97bb16f (planner: using the funcdep to check the only_full_group_by (#33567)):planner/core/logical_plans.go
371394
if opt.OnlyInnerFilter {
372395
// if one of the inner condition is constant false, the inner side are all null, left make constant all of that.
373396
for _, one := range innerCondition {
374397
if c, ok := one.(*expression.Constant); ok && c.DeferredExpr == nil && c.ParamMarker == nil {
398+
<<<<<<< HEAD:pkg/planner/core/logical_plans.go
375399
if isTrue, err := c.Value.ToBool(p.SCtx().GetSessionVars().StmtCtx); err == nil {
400+
=======
401+
if isTrue, err := c.Value.ToBool(p.ctx.GetSessionVars().StmtCtx); err == nil {
402+
>>>>>>> 571d97bb16f (planner: using the funcdep to check the only_full_group_by (#33567)):planner/core/logical_plans.go
376403
if isTrue == 0 {
377404
// c is false
378405
opt.InnerIsFalse = true

pkg/planner/funcdep/extract_fd_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"fmt"
2020
"testing"
2121

22+
<<<<<<< HEAD:pkg/planner/funcdep/extract_fd_test.go
2223
"github.com/pingcap/tidb/pkg/domain"
2324
"github.com/pingcap/tidb/pkg/infoschema"
2425
"github.com/pingcap/tidb/pkg/parser"
@@ -27,6 +28,15 @@ import (
2728
"github.com/pingcap/tidb/pkg/sessiontxn"
2829
"github.com/pingcap/tidb/pkg/testkit"
2930
"github.com/pingcap/tidb/pkg/util/hint"
31+
=======
32+
"github.com/pingcap/tidb/domain"
33+
"github.com/pingcap/tidb/infoschema"
34+
"github.com/pingcap/tidb/parser"
35+
plannercore "github.com/pingcap/tidb/planner/core"
36+
"github.com/pingcap/tidb/sessionctx"
37+
"github.com/pingcap/tidb/testkit"
38+
"github.com/pingcap/tidb/util/hint"
39+
>>>>>>> 571d97bb16f (planner: using the funcdep to check the only_full_group_by (#33567)):planner/funcdep/extract_fd_test.go
3040
"github.com/stretchr/testify/require"
3141
)
3242

@@ -381,3 +391,52 @@ func TestFDSet_MakeOuterJoin(t *testing.T) {
381391
require.Equal(t, tt.fd, plannercore.FDToString(p.(plannercore.LogicalPlan)), comment)
382392
}
383393
}
394+
395+
func TestFDSet_MakeOuterJoin(t *testing.T) {
396+
store, clean := testkit.CreateMockStore(t)
397+
defer clean()
398+
par := parser.New()
399+
par.SetParserConfig(parser.ParserConfig{EnableWindowFunction: true, EnableStrictDoubleTypeCheck: true})
400+
401+
tk := testkit.NewTestKit(t, store)
402+
tk.MustExec("use test")
403+
tk.MustExec("set @@session.tidb_enable_new_only_full_group_by_check = 'on';")
404+
tk.MustExec("CREATE TABLE X (a INT PRIMARY KEY, b INT, c INT, d INT, e INT)")
405+
tk.MustExec("CREATE UNIQUE INDEX uni ON X (b, c)")
406+
tk.MustExec("CREATE TABLE Y (m INT, n INT, p INT, q INT, PRIMARY KEY (m, n))")
407+
408+
tests := []struct {
409+
sql string
410+
best string
411+
fd string
412+
}{
413+
{
414+
sql: "select * from X left outer join (select *, p+q from Y) Y1 ON true",
415+
best: "Join{DataScan(X)->DataScan(Y)->Projection}->Projection",
416+
fd: "{(1)-->(2-5), (2,3)~~>(1,4,5), (6,7)-->(8,9,11), (8,9)-->(11), (1,6,7)-->(2-5,8,9,11)} >>> {(1)-->(2-5), (2,3)~~>(1,4,5), (6,7)-->(8,9,11), (8,9)-->(11), (1,6,7)-->(2-5,8,9,11)}",
417+
},
418+
}
419+
420+
ctx := context.TODO()
421+
is := testGetIS(t, tk.Session())
422+
for i, tt := range tests {
423+
comment := fmt.Sprintf("case:%v sql:%s", i, tt.sql)
424+
stmt, err := par.ParseOneStmt(tt.sql, "", "")
425+
require.NoError(t, err, comment)
426+
tk.Session().GetSessionVars().PlanID = 0
427+
tk.Session().GetSessionVars().PlanColumnID = 0
428+
err = plannercore.Preprocess(tk.Session(), stmt, plannercore.WithPreprocessorReturn(&plannercore.PreprocessorReturn{InfoSchema: is}))
429+
require.NoError(t, err, comment)
430+
tk.Session().PrepareTSFuture(ctx)
431+
builder, _ := plannercore.NewPlanBuilder().Init(tk.Session(), is, &hint.BlockHintProcessor{})
432+
// extract FD to every OP
433+
p, err := builder.Build(ctx, stmt)
434+
require.NoError(t, err, comment)
435+
p, err = plannercore.LogicalOptimizeTest(ctx, builder.GetOptFlag(), p.(plannercore.LogicalPlan))
436+
require.NoError(t, err, comment)
437+
require.Equal(t, tt.best, plannercore.ToString(p), comment)
438+
// extract FD to every OP
439+
p.(plannercore.LogicalPlan).ExtractFD()
440+
require.Equal(t, tt.fd, plannercore.FDToString(p.(plannercore.LogicalPlan)), comment)
441+
}
442+
}

0 commit comments

Comments
 (0)