diff --git a/planner/core/integration_test.go b/planner/core/integration_test.go index 83e464f31ec3c..5afbc96f03c27 100644 --- a/planner/core/integration_test.go +++ b/planner/core/integration_test.go @@ -1899,6 +1899,7 @@ func TestINLJHintSmallTable(t *testing.T) { tk.MustExec("explain format = 'brief' select /*+ TIDB_INLJ(t1) */ * from t1 join t2 on t1.a = t2.a") } +<<<<<<< HEAD func TestIndexJoinUniqueCompositeIndex(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -1975,6 +1976,20 @@ func TestIndexMergeHint4CNF(t *testing.T) { }) tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) } +======= +func TestIssue46580(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`CREATE TABLE t0(c0 INT);`) + tk.MustExec(`CREATE TABLE t1(c0 BOOL, c1 BOOL);`) + tk.MustExec(`INSERT INTO t1 VALUES (false, true);`) + tk.MustExec(`INSERT INTO t1 VALUES (true, true);`) + tk.MustExec(`CREATE definer='root'@'localhost' VIEW v0(c0, c1, c2) AS SELECT t1.c0, LOG10(t0.c0), t1.c0 FROM t0, t1;`) + tk.MustExec(`INSERT INTO t0(c0) VALUES (3);`) + tk.MustQuery(`SELECT /*+ MERGE_JOIN(t1, t0, v0)*/v0.c2, t1.c0 FROM v0, t0 CROSS JOIN t1 ORDER BY -v0.c1;`).Sort().Check( + testkit.Rows(`0 0`, `0 1`, `1 0`, `1 1`)) +>>>>>>> 51f6bb90d98 (planner: fix Uncertain Results caused by MERGE_JOIN (#47078)) } func TestInvisibleIndex(t *testing.T) { diff --git a/planner/core/rule_inject_extra_projection.go b/planner/core/rule_inject_extra_projection.go index 308584b0bc1c9..9f2c13593394b 100644 --- a/planner/core/rule_inject_extra_projection.go +++ b/planner/core/rule_inject_extra_projection.go @@ -275,6 +275,7 @@ func InjectProjBelowSort(p PhysicalPlan, orderByItems []*util.ByItems) PhysicalP if origChildProj, isChildProj := childPlan.(*PhysicalProjection); isChildProj { refine4NeighbourProj(bottomProj, origChildProj) } + refine4NeighbourProj(topProj, bottomProj) return topProj } @@ -336,6 +337,7 @@ func TurnNominalSortIntoProj(p PhysicalPlan, onlyColumn bool, orderByItems []*ut if origChildProj, isChildProj := childPlan.(*PhysicalProjection); isChildProj { refine4NeighbourProj(bottomProj, origChildProj) } + refine4NeighbourProj(topProj, bottomProj) return topProj }