Skip to content

Commit 7279b9e

Browse files
winorosti-chi-bot
authored andcommitted
This is an automated cherry-pick of pingcap#45565
Signed-off-by: ti-chi-bot <[email protected]>
1 parent 5e74466 commit 7279b9e

File tree

5 files changed

+110
-16
lines changed

5 files changed

+110
-16
lines changed

planner/core/main_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ func TestMain(m *testing.M) {
3535

3636
testDataMap.LoadTestSuiteData("testdata", "integration_partition_suite")
3737
testDataMap.LoadTestSuiteData("testdata", "index_merge_suite")
38+
<<<<<<< HEAD
3839
testDataMap.LoadTestSuiteData("testdata", "plan_normalized_suite")
3940
testDataMap.LoadTestSuiteData("testdata", "stats_suite")
4041
testDataMap.LoadTestSuiteData("testdata", "ordered_result_mode_suite")
@@ -51,6 +52,10 @@ func TestMain(m *testing.M) {
5152
testDataMap.LoadTestSuiteData("testdata", "flat_plan_suite")
5253
testDataMap.LoadTestSuiteData("testdata", "binary_plan_suite")
5354
testDataMap.LoadTestSuiteData("testdata", "json_plan_suite")
55+
=======
56+
testDataMap.LoadTestSuiteData("testdata", "runtime_filter_generator_suite")
57+
testDataMap.LoadTestSuiteData("testdata", "join_reorder_suite")
58+
>>>>>>> dc04e2ca077 (planner: clean the one side filters for outer join reorder which is not done in #44409 (#45565))
5459

5560
indexMergeSuiteData = testDataMap["index_merge_suite"]
5661
planSuiteUnexportedData = testDataMap["plan_suite_unexported"]
@@ -139,3 +144,7 @@ func GetIndexMergeSuiteData() testdata.TestData {
139144
func GetJSONPlanSuiteData() testdata.TestData {
140145
return testDataMap["json_plan_suite"]
141146
}
147+
148+
func GetJoinReorderData() testdata.TestData {
149+
return testDataMap["join_reorder_suite"]
150+
}

planner/core/rule_join_reorder.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,12 +426,17 @@ func (s *baseSingleGroupJoinOrderSolver) makeJoin(leftPlan, rightPlan LogicalPla
426426
remainOtherConds, otherConds = expression.FilterOutInPlace(remainOtherConds, func(expr expression.Expression) bool {
427427
return expression.ExprFromSchema(expr, mergedSchema)
428428
})
429-
if (joinType.JoinType == LeftOuterJoin || joinType.JoinType == RightOuterJoin || joinType.JoinType == LeftOuterSemiJoin || joinType.JoinType == AntiLeftOuterSemiJoin) && len(otherConds) > 0 {
429+
430+
if joinType.JoinType == LeftOuterJoin || joinType.JoinType == RightOuterJoin || joinType.JoinType == LeftOuterSemiJoin || joinType.JoinType == AntiLeftOuterSemiJoin {
430431
// the original outer join's other conditions has been bound to the outer join Edge,
431432
// these remained other condition here shouldn't be appended to it because on-mismatch
432433
// logic will produce more append-null rows which is banned in original semantic.
433434
remainOtherConds = append(remainOtherConds, otherConds...) // nozero
435+
remainOtherConds = append(remainOtherConds, leftConds...) // nozero
436+
remainOtherConds = append(remainOtherConds, rightConds...) // nozero
434437
otherConds = otherConds[:0]
438+
leftConds = leftConds[:0]
439+
rightConds = rightConds[:0]
435440
}
436441
if len(joinType.outerBindCondition) > 0 {
437442
remainOBOtherConds := make([]expression.Expression, len(joinType.outerBindCondition))

planner/core/rule_join_reorder_test.go

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,14 @@ package core_test
1717
import (
1818
"testing"
1919

20+
<<<<<<< HEAD
2021
"github.com/pingcap/failpoint"
2122
"github.com/pingcap/tidb/domain"
2223
"github.com/pingcap/tidb/parser/model"
2324
plannercore "github.com/pingcap/tidb/planner/core"
25+
=======
26+
"github.com/pingcap/tidb/planner/core"
27+
>>>>>>> dc04e2ca077 (planner: clean the one side filters for outer join reorder which is not done in #44409 (#45565))
2428
"github.com/pingcap/tidb/testkit"
2529
"github.com/pingcap/tidb/testkit/testdata"
2630
"github.com/stretchr/testify/require"
@@ -366,21 +370,28 @@ func TestAdditionOtherConditionsRemained4OuterJoin(t *testing.T) {
366370
tk.MustExec("INSERT INTO queries_program(`id`, `identifier_id`) values(8, 13), (9, 14);")
367371
tk.MustExec("INSERT INTO queries_channel(`id`, `identifier_id`) values(5, 13);")
368372

369-
tk.MustQuery("SELECT `queries_identifier`.`id`, `queries_identifier`.`name` FROM `queries_identifier` LEFT OUTER JOIN `queries_channel` ON (`queries_identifier`.`id` = `queries_channel`.`identifier_id`) INNER JOIN `queries_program` ON (`queries_identifier`.`id` = `queries_program`.`identifier_id`) WHERE ((`queries_channel`.`id` = 5 AND `queries_program`.`id` = 9) OR `queries_program`.`id` = 8) ORDER BY `queries_identifier`.`id` ASC;").Check(testkit.Rows("" +
370-
"13 i1"))
371-
tk.MustQuery("SELECT `queries_identifier`.`id`, `queries_identifier`.`name` FROM `queries_identifier` RIGHT OUTER JOIN `queries_channel` ON (`queries_identifier`.`id` = `queries_channel`.`identifier_id`) INNER JOIN `queries_program` ON (`queries_identifier`.`id` = `queries_program`.`identifier_id`) WHERE ((`queries_channel`.`id` = 5 AND `queries_program`.`id` = 9) OR `queries_program`.`id` = 8) ORDER BY `queries_identifier`.`id` ASC;").Check(testkit.Rows("" +
372-
"13 i1"))
373-
tk.MustQuery("explain format = 'brief' SELECT `queries_identifier`.`id`, `queries_identifier`.`name` FROM `queries_identifier` LEFT OUTER JOIN `queries_channel` ON (`queries_identifier`.`id` = `queries_channel`.`identifier_id`) INNER JOIN `queries_program` ON (`queries_identifier`.`id` = `queries_program`.`identifier_id`) WHERE ((`queries_channel`.`id` = 5 AND `queries_program`.`id` = 9) OR `queries_program`.`id` = 8) ORDER BY `queries_identifier`.`id` ASC;").Check(testkit.Rows(""+
374-
"Sort 2.50 root test.queries_identifier.id",
375-
"└─Projection 2.50 root test.queries_identifier.id, test.queries_identifier.name",
376-
" └─Selection 2.50 root or(and(eq(test.queries_channel.id, 5), eq(test.queries_program.id, 9)), eq(test.queries_program.id, 8))",
377-
" └─IndexJoin 3.12 root left outer join, inner:IndexReader, outer key:test.queries_identifier.id, inner key:test.queries_channel.identifier_id, equal cond:eq(test.queries_identifier.id, test.queries_channel.identifier_id)",
378-
" ├─IndexHashJoin(Build) 2.50 root inner join, inner:TableReader, outer key:test.queries_program.identifier_id, inner key:test.queries_identifier.id, equal cond:eq(test.queries_program.identifier_id, test.queries_identifier.id)",
379-
" │ ├─Batch_Point_Get(Build) 2.00 root table:queries_program handle:[8 9], keep order:false, desc:false",
380-
" │ └─TableReader(Probe) 2.00 root data:TableRangeScan",
381-
" │ └─TableRangeScan 2.00 cop[tikv] table:queries_identifier range: decided by [test.queries_program.identifier_id], keep order:false, stats:pseudo",
382-
" └─IndexReader(Probe) 2.50 root index:IndexRangeScan",
383-
" └─IndexRangeScan 2.50 cop[tikv] table:queries_channel, index:identifier_id(identifier_id) range: decided by [eq(test.queries_channel.identifier_id, test.queries_identifier.id)], keep order:false, stats:pseudo"))
373+
tk.MustExec("create table t(a int)")
374+
tk.MustExec("create table t1(a int, b int)")
375+
tk.MustExec("create table t2(a int, b int, c int)")
376+
tk.MustExec("create table t3(a int, b int)")
377+
tk.MustExec("create table t4(a int, b int)")
378+
379+
testData := core.GetJoinReorderData()
380+
var (
381+
input []string
382+
output []struct {
383+
SQL string
384+
Output []string
385+
}
386+
)
387+
testData.LoadTestCases(t, &input, &output)
388+
for i, sql := range input {
389+
testdata.OnRecord(func() {
390+
output[i].SQL = sql
391+
output[i].Output = testdata.ConvertRowsToStrings(tk.MustQuery(sql).Rows())
392+
})
393+
tk.MustQuery(sql).Check(testkit.Rows(output[i].Output...))
394+
}
384395
}
385396

386397
func TestOuterJoinWIthEqCondCrossInnerJoin(t *testing.T) {

planner/core/testdata/join_reorder_suite_in.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[
22
{
3+
<<<<<<< HEAD
34
"name": "TestStraightJoinHint",
45
"cases": [
56
"select /*+ straight_join() */ * from t, t1, t2, t3 where t.a = t1.a and t1.b=t2.b;",
@@ -524,3 +525,15 @@
524525
]
525526
}
526527
]
528+
=======
529+
"name": "TestAdditionOtherConditionsRemained4OuterJoin",
530+
"cases": [
531+
"SELECT `queries_identifier`.`id`, `queries_identifier`.`name` FROM `queries_identifier` LEFT OUTER JOIN `queries_channel` ON (`queries_identifier`.`id` = `queries_channel`.`identifier_id`) INNER JOIN `queries_program` ON (`queries_identifier`.`id` = `queries_program`.`identifier_id`) WHERE ((`queries_channel`.`id` = 5 AND `queries_program`.`id` = 9) OR `queries_program`.`id` = 8) ORDER BY `queries_identifier`.`id` ASC",
532+
"SELECT `queries_identifier`.`id`, `queries_identifier`.`name` FROM `queries_identifier` RIGHT OUTER JOIN `queries_channel` ON (`queries_identifier`.`id` = `queries_channel`.`identifier_id`) INNER JOIN `queries_program` ON (`queries_identifier`.`id` = `queries_program`.`identifier_id`) WHERE ((`queries_channel`.`id` = 5 AND `queries_program`.`id` = 9) OR `queries_program`.`id` = 8) ORDER BY `queries_identifier`.`id` ASC",
533+
"explain format = 'brief' SELECT `queries_identifier`.`id`, `queries_identifier`.`name` FROM `queries_identifier` LEFT OUTER JOIN `queries_channel` ON (`queries_identifier`.`id` = `queries_channel`.`identifier_id`) INNER JOIN `queries_program` ON (`queries_identifier`.`id` = `queries_program`.`identifier_id`) WHERE ((`queries_channel`.`id` = 5 AND `queries_program`.`id` = 9) OR `queries_program`.`id` = 8) ORDER BY `queries_identifier`.`id` ASC;",
534+
// The where clause should be a Selection out of joins.
535+
"explain format='brief' select * from t left join t1 on t.a=t1.a inner join t2 on t.a=t2.a and t2.c = 100 left join t3 on t2.a=t3.a and t3.b > 1 left join t4 on t2.a = t4.a where (t2.b > 100 or t.a > 10 or t1.b < 10)"
536+
]
537+
}
538+
]
539+
>>>>>>> dc04e2ca077 (planner: clean the one side filters for outer join reorder which is not done in #44409 (#45565))

planner/core/testdata/join_reorder_suite_out.json

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[
22
{
3+
<<<<<<< HEAD
34
"Name": "TestStraightJoinHint",
45
"Cases": [
56
{
@@ -9656,6 +9657,61 @@
96569657
"Warning": [
96579658
"Warning 1815 There are no matching table names for (t2) in optimizer hint /*+ LEADING(t3, t2) */. Maybe you can use the table alias name",
96589659
"Warning 1815 leading hint is inapplicable, check if the leading hint table is valid"
9660+
=======
9661+
"Name": "TestAdditionOtherConditionsRemained4OuterJoin",
9662+
"Cases": [
9663+
{
9664+
"SQL": "SELECT `queries_identifier`.`id`, `queries_identifier`.`name` FROM `queries_identifier` LEFT OUTER JOIN `queries_channel` ON (`queries_identifier`.`id` = `queries_channel`.`identifier_id`) INNER JOIN `queries_program` ON (`queries_identifier`.`id` = `queries_program`.`identifier_id`) WHERE ((`queries_channel`.`id` = 5 AND `queries_program`.`id` = 9) OR `queries_program`.`id` = 8) ORDER BY `queries_identifier`.`id` ASC",
9665+
"Output": [
9666+
"13 i1"
9667+
]
9668+
},
9669+
{
9670+
"SQL": "SELECT `queries_identifier`.`id`, `queries_identifier`.`name` FROM `queries_identifier` RIGHT OUTER JOIN `queries_channel` ON (`queries_identifier`.`id` = `queries_channel`.`identifier_id`) INNER JOIN `queries_program` ON (`queries_identifier`.`id` = `queries_program`.`identifier_id`) WHERE ((`queries_channel`.`id` = 5 AND `queries_program`.`id` = 9) OR `queries_program`.`id` = 8) ORDER BY `queries_identifier`.`id` ASC",
9671+
"Output": [
9672+
"13 i1"
9673+
]
9674+
},
9675+
{
9676+
"SQL": "explain format = 'brief' SELECT `queries_identifier`.`id`, `queries_identifier`.`name` FROM `queries_identifier` LEFT OUTER JOIN `queries_channel` ON (`queries_identifier`.`id` = `queries_channel`.`identifier_id`) INNER JOIN `queries_program` ON (`queries_identifier`.`id` = `queries_program`.`identifier_id`) WHERE ((`queries_channel`.`id` = 5 AND `queries_program`.`id` = 9) OR `queries_program`.`id` = 8) ORDER BY `queries_identifier`.`id` ASC;",
9677+
"Output": [
9678+
"Sort 2.50 root test.queries_identifier.id",
9679+
"└─Projection 2.50 root test.queries_identifier.id, test.queries_identifier.name",
9680+
" └─Selection 2.50 root or(and(eq(test.queries_channel.id, 5), eq(test.queries_program.id, 9)), eq(test.queries_program.id, 8))",
9681+
" └─IndexJoin 3.12 root left outer join, inner:IndexReader, outer key:test.queries_identifier.id, inner key:test.queries_channel.identifier_id, equal cond:eq(test.queries_identifier.id, test.queries_channel.identifier_id)",
9682+
" ├─IndexHashJoin(Build) 2.50 root inner join, inner:TableReader, outer key:test.queries_program.identifier_id, inner key:test.queries_identifier.id, equal cond:eq(test.queries_program.identifier_id, test.queries_identifier.id)",
9683+
" │ ├─Batch_Point_Get(Build) 2.00 root table:queries_program handle:[8 9], keep order:false, desc:false",
9684+
" │ └─TableReader(Probe) 2.00 root data:TableRangeScan",
9685+
" │ └─TableRangeScan 2.00 cop[tikv] table:queries_identifier range: decided by [test.queries_program.identifier_id], keep order:false, stats:pseudo",
9686+
" └─IndexReader(Probe) 2.50 root index:IndexRangeScan",
9687+
" └─IndexRangeScan 2.50 cop[tikv] table:queries_channel, index:identifier_id(identifier_id) range: decided by [eq(test.queries_channel.identifier_id, test.queries_identifier.id)], keep order:false, stats:pseudo"
9688+
]
9689+
},
9690+
{
9691+
"SQL": "explain format='brief' select * from t left join t1 on t.a=t1.a inner join t2 on t.a=t2.a and t2.c = 100 left join t3 on t2.a=t3.a and t3.b > 1 left join t4 on t2.a = t4.a where (t2.b > 100 or t.a > 10 or t1.b < 10)",
9692+
"Output": [
9693+
"Projection 19.51 root test.t.a, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t2.c, test.t3.a, test.t3.b, test.t4.a, test.t4.b",
9694+
"└─Selection 19.51 root or(gt(test.t2.b, 100), or(gt(test.t.a, 10), lt(test.t1.b, 10))), or(gt(test.t2.b, 100), or(gt(test.t2.a, 10), lt(test.t1.b, 10)))",
9695+
" └─HashJoin 24.39 root left outer join, equal:[eq(test.t2.a, test.t4.a)]",
9696+
" ├─HashJoin(Build) 19.51 root left outer join, equal:[eq(test.t.a, test.t1.a)]",
9697+
" │ ├─HashJoin(Build) 15.61 root inner join, equal:[eq(test.t2.a, test.t.a)]",
9698+
" │ │ ├─HashJoin(Build) 12.49 root left outer join, equal:[eq(test.t2.a, test.t3.a)]",
9699+
" │ │ │ ├─TableReader(Build) 9.99 root data:Selection",
9700+
" │ │ │ │ └─Selection 9.99 cop[tikv] eq(test.t2.c, 100), not(isnull(test.t2.a))",
9701+
" │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo",
9702+
" │ │ │ └─TableReader(Probe) 3330.00 root data:Selection",
9703+
" │ │ │ └─Selection 3330.00 cop[tikv] gt(test.t3.b, 1), not(isnull(test.t3.a))",
9704+
" │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo",
9705+
" │ │ └─TableReader(Probe) 9990.00 root data:Selection",
9706+
" │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))",
9707+
" │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo",
9708+
" │ └─TableReader(Probe) 9990.00 root data:Selection",
9709+
" │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))",
9710+
" │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo",
9711+
" └─TableReader(Probe) 9990.00 root data:Selection",
9712+
" └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))",
9713+
" └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo"
9714+
>>>>>>> dc04e2ca077 (planner: clean the one side filters for outer join reorder which is not done in #44409 (#45565))
96599715
]
96609716
}
96619717
]

0 commit comments

Comments
 (0)