diff --git a/pkg/executor/test/cte/cte_test.go b/pkg/executor/test/cte/cte_test.go index 513c978c49eb3..ee836e09d5bfe 100644 --- a/pkg/executor/test/cte/cte_test.go +++ b/pkg/executor/test/cte/cte_test.go @@ -231,14 +231,14 @@ func TestCTEIterationMemTracker(t *testing.T) { tk.MustQuery(fmt.Sprintf("explain analyze with recursive cte1 as (select c1 from t1 union all select c1 + 1 c1 from cte1 where c1 < %d) select * from cte1", maxIter)) } -func TestCTETableInvaildTask(t *testing.T) { +func TestCTETableInvalidTask(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("CREATE TABLE p ( groupid bigint(20) DEFAULT NULL, KEY k1 (groupid));") tk.MustExec(`CREATE TABLE g (groupid bigint(20) DEFAULT NULL,parentid bigint(20) NOT NULL,KEY k1 (parentid),KEY k2 (groupid,parentid));`) tk.MustExec(`set tidb_opt_enable_hash_join=off;`) - tk.MustQuery(`explain WITH RECURSIVE w(gid) AS ( + tk.MustQuery(`explain format='brief' WITH RECURSIVE w(gid) AS ( SELECT groupId FROM @@ -261,22 +261,22 @@ WHERE FROM w );`).Check(testkit.Rows( - "Projection_54 9990.00 root 1->Column#17", - "└─IndexJoin_59 9990.00 root inner join, inner:IndexReader_58, outer key:test.p.groupid, inner key:test.g.groupid, equal cond:eq(test.p.groupid, test.g.groupid)", - " ├─HashAgg_75(Build) 12800.00 root group by:test.p.groupid, funcs:firstrow(test.p.groupid)->test.p.groupid", - " │ └─Selection_72 12800.00 root not(isnull(test.p.groupid))", - " │ └─CTEFullScan_73 16000.00 root CTE:w data:CTE_0", - " └─IndexReader_58(Probe) 9990.00 root index:Selection_57", - " └─Selection_57 9990.00 cop[tikv] not(isnull(test.g.groupid))", - " └─IndexRangeScan_56 10000.00 cop[tikv] table:g, index:k2(groupid, parentid) range: decided by [eq(test.g.groupid, test.p.groupid)], keep order:false, stats:pseudo", + "Projection 9990.00 root 1->Column#17", + "└─IndexJoin 9990.00 root inner join, inner:IndexReader, outer key:test.p.groupid, inner key:test.g.groupid, equal cond:eq(test.p.groupid, test.g.groupid)", + " ├─HashAgg(Build) 12800.00 root group by:test.p.groupid, funcs:firstrow(test.p.groupid)->test.p.groupid", + " │ └─Selection 12800.00 root not(isnull(test.p.groupid))", + " │ └─CTEFullScan 16000.00 root CTE:w data:CTE_0", + " └─IndexReader(Probe) 9990.00 root index:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.g.groupid))", + " └─IndexRangeScan 10000.00 cop[tikv] table:g, index:k2(groupid, parentid) range: decided by [eq(test.g.groupid, test.p.groupid)], keep order:false, stats:pseudo", "CTE_0 16000.00 root Recursive CTE", - "├─IndexReader_24(Seed Part) 10000.00 root index:IndexFullScan_23", - "│ └─IndexFullScan_23 10000.00 cop[tikv] table:p, index:k1(groupid) keep order:false, stats:pseudo", - "└─IndexHashJoin_34(Recursive Part) 10000.00 root inner join, inner:IndexLookUp_31, outer key:test.p.groupid, inner key:test.g.parentid, equal cond:eq(test.p.groupid, test.g.parentid)", - " ├─Selection_51(Build) 8000.00 root not(isnull(test.p.groupid))", - " │ └─CTETable_52 10000.00 root Scan on CTE_0", - " └─IndexLookUp_31(Probe) 10000.00 root ", - " ├─IndexRangeScan_29(Build) 10000.00 cop[tikv] table:g, index:k1(parentid) range: decided by [eq(test.g.parentid, test.p.groupid)], keep order:false, stats:pseudo", - " └─TableRowIDScan_30(Probe) 10000.00 cop[tikv] table:g keep order:false, stats:pseudo")) + "├─IndexReader(Seed Part) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:p, index:k1(groupid) keep order:false, stats:pseudo", + "└─IndexHashJoin(Recursive Part) 10000.00 root inner join, inner:IndexLookUp, outer key:test.p.groupid, inner key:test.g.parentid, equal cond:eq(test.p.groupid, test.g.parentid)", + " ├─Selection(Build) 8000.00 root not(isnull(test.p.groupid))", + " │ └─CTETable 10000.00 root Scan on CTE_0", + " └─IndexLookUp(Probe) 10000.00 root ", + " ├─IndexRangeScan(Build) 10000.00 cop[tikv] table:g, index:k1(parentid) range: decided by [eq(test.g.parentid, test.p.groupid)], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 10000.00 cop[tikv] table:g keep order:false, stats:pseudo")) tk.MustQuery(`show warnings`).Check(testkit.Rows()) } diff --git a/pkg/executor/test/executor/executor_test.go b/pkg/executor/test/executor/executor_test.go index 094a1fe0525f7..b9efca75dd47d 100644 --- a/pkg/executor/test/executor/executor_test.go +++ b/pkg/executor/test/executor/executor_test.go @@ -757,6 +757,7 @@ func TestUnreasonablyClose(t *testing.T) { for i, tc := range []string{ "select /*+ hash_join(t1)*/ * from t t1 join t t2 on t1.a = t2.a", "select /*+ merge_join(t1)*/ * from t t1 join t t2 on t1.f = t2.f", + "select /*+ merge_join(t1)*/ t1.f, t2.f from t t1 join t t2 on t1.f = t2.f", "select t.f from t use index(f)", "select /*+ inl_join(t1) */ * from t t1 join t t2 on t1.f=t2.f", "select /*+ inl_hash_join(t1) */ * from t t1 join t t2 on t1.f=t2.f", diff --git a/pkg/planner/core/casetest/dag/testdata/plan_suite_out.json b/pkg/planner/core/casetest/dag/testdata/plan_suite_out.json index 8b22670c75ceb..b2db2f3bd20f1 100644 --- a/pkg/planner/core/casetest/dag/testdata/plan_suite_out.json +++ b/pkg/planner/core/casetest/dag/testdata/plan_suite_out.json @@ -241,11 +241,11 @@ }, { "SQL": "select /*+ TIDB_SMJ(t1,t2,t3)*/ * from t t1, t t2, t t3 where t1.c = t2.c and t1.d = t2.d and t3.c = t1.c and t3.d = t1.d", - "Best": "MergeInnerJoin{MergeInnerJoin{IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(test.t.c,test.t.c)(test.t.d,test.t.d)->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(test.t.c,test.t.c)(test.t.d,test.t.d)" + "Best": "MergeInnerJoin{MergeInnerJoin{TableReader(Table(t))->Sort->TableReader(Table(t))->Sort}(test.t.c,test.t.c)(test.t.d,test.t.d)->TableReader(Table(t))->Sort}(test.t.c,test.t.c)(test.t.d,test.t.d)" }, { "SQL": "select /*+ TIDB_SMJ(t1,t2,t3)*/ * from t t1, t t2, t t3 where t1.c = t2.c and t1.d = t2.d and t3.c = t1.c and t3.d = t1.d order by t1.c", - "Best": "MergeInnerJoin{MergeInnerJoin{IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(test.t.c,test.t.c)(test.t.d,test.t.d)->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(test.t.c,test.t.c)(test.t.d,test.t.d)" + "Best": "MergeInnerJoin{MergeInnerJoin{TableReader(Table(t))->Sort->TableReader(Table(t))->Sort}(test.t.c,test.t.c)(test.t.d,test.t.d)->TableReader(Table(t))->Sort}(test.t.c,test.t.c)(test.t.d,test.t.d)" }, { "SQL": "select /*+ TIDB_SMJ(t1,t2,t3)*/ * from t t1 left outer join t t2 on t1.a = t2.a left outer join t t3 on t2.a = t3.a", @@ -436,8 +436,8 @@ }, { "SQL": "delete /*+ TIDB_SMJ(t1, t2) */ from t1 using t t1, t t2 where t1.c=t2.c", - "Best": "MergeInnerJoin{IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(test.t.c,test.t.c)->Delete", - "Hints": "merge_join(`test`.`t1`), use_index(@`del_1` `test`.`t1` `c_d_e`), order_index(@`del_1` `test`.`t1` `c_d_e`), use_index(@`del_1` `test`.`t2` `c_d_e`), order_index(@`del_1` `test`.`t2` `c_d_e`)" + "Best": "MergeInnerJoin{TableReader(Table(t))->Sort->TableReader(Table(t))->Sort}(test.t.c,test.t.c)->Delete", + "Hints": "merge_join(`test`.`t1`), use_index(@`del_1` `test`.`t1` ), no_order_index(@`del_1` `test`.`t1` `primary`), use_index(@`del_1` `test`.`t2` ), no_order_index(@`del_1` `test`.`t2` `primary`)" }, { "SQL": "update /*+ TIDB_SMJ(t1, t2) */ t t1, t t2 set t1.c=1, t2.c=1 where t1.a=t2.a", diff --git a/pkg/planner/core/casetest/hint/testdata/integration_suite_out.json b/pkg/planner/core/casetest/hint/testdata/integration_suite_out.json index ee7fcb216ebb7..a82d04cf149fb 100644 --- a/pkg/planner/core/casetest/hint/testdata/integration_suite_out.json +++ b/pkg/planner/core/casetest/hint/testdata/integration_suite_out.json @@ -946,10 +946,9 @@ "Plan": [ "Projection 15593.77 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", "└─MergeJoin 15593.77 root inner join, left key:test.t2.a, right key:test.t1.a", - " ├─Projection(Build) 10000.00 root test.t1.a, test.t1.b", - " │ └─IndexLookUp 10000.00 root ", - " │ ├─IndexFullScan(Build) 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", - " │ └─TableRowIDScan(Probe) 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " ├─Sort(Build) 10000.00 root test.t1.a", + " │ └─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", " └─Sort(Probe) 12475.01 root test.t2.a", " └─HashJoin 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", " ├─TableReader(Build) 9980.01 root data:Selection", @@ -969,15 +968,14 @@ " ├─TableReader(Build) 10000.00 root data:TableFullScan", " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", " └─MergeJoin(Probe) 12475.01 root inner join, left key:test.t2.b, right key:test.t3.b", - " ├─Projection(Build) 9990.00 root test.t3.a, test.t3.b", - " │ └─IndexLookUp 9990.00 root ", - " │ ├─IndexFullScan(Build) 9990.00 cop[tikv] table:t3, index:idx_b(b) keep order:true, stats:pseudo", - " │ └─TableRowIDScan(Probe) 9990.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - " └─Projection(Probe) 9980.01 root test.t2.a, test.t2.b", - " └─IndexLookUp 9980.01 root ", - " ├─IndexFullScan(Build) 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", - " └─Selection(Probe) 9980.01 cop[tikv] not(isnull(test.t2.a))", - " └─TableRowIDScan 9990.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + " ├─Sort(Build) 9990.00 root test.t3.b", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─Sort(Probe) 9980.01 root test.t2.b", + " └─TableReader 9980.01 root data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warn": null }, @@ -1213,10 +1211,9 @@ "Plan": [ "Projection 15609.38 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", "└─MergeJoin 15609.38 root right outer join, left key:test.t1.a, right key:test.t2.a", - " ├─Projection(Build) 10000.00 root test.t1.a, test.t1.b", - " │ └─IndexLookUp 10000.00 root ", - " │ ├─IndexFullScan(Build) 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", - " │ └─TableRowIDScan(Probe) 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " ├─Sort(Build) 10000.00 root test.t1.a", + " │ └─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", " └─Sort(Probe) 12487.50 root test.t2.a", " └─HashJoin 12487.50 root inner join, equal:[eq(test.t3.b, test.t2.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", @@ -1235,14 +1232,14 @@ "├─TableReader(Build) 10000.00 root data:TableFullScan", "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", "└─MergeJoin(Probe) 12487.50 root inner join, left key:test.t2.b, right key:test.t3.b", - " ├─Projection(Build) 9990.00 root test.t3.a, test.t3.b", - " │ └─IndexLookUp 9990.00 root ", - " │ ├─IndexFullScan(Build) 9990.00 cop[tikv] table:t3, index:idx_b(b) keep order:true, stats:pseudo", - " │ └─TableRowIDScan(Probe) 9990.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - " └─Projection(Probe) 9990.00 root test.t2.a, test.t2.b", - " └─IndexLookUp 9990.00 root ", - " ├─IndexFullScan(Build) 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", - " └─TableRowIDScan(Probe) 9990.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + " ├─Sort(Build) 9990.00 root test.t3.b", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─Sort(Probe) 9990.00 root test.t2.b", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warn": null }, @@ -1386,11 +1383,11 @@ { "SQL": "explain with tt as (select /*+ leading(t3), merge_join(t1) */ t1.a from t1 join t2 join t3 where t1.a = t2.a and t2.b=t3.b) select * from tt t1 join tt t2 on t1.a=t2.a", "Plan": [ - "HashJoin_113 24316.55 root inner join, equal:[eq(test.t1.a, test.t1.a)]", - "├─Selection_117(Build) 12475.01 root not(isnull(test.t1.a))", - "│ └─CTEFullScan_118 15593.77 root CTE:tt AS t2 data:CTE_0", - "└─Selection_115(Probe) 12475.01 root not(isnull(test.t1.a))", - " └─CTEFullScan_116 15593.77 root CTE:tt AS t1 data:CTE_0", + "HashJoin_118 24316.55 root inner join, equal:[eq(test.t1.a, test.t1.a)]", + "├─Selection_122(Build) 12475.01 root not(isnull(test.t1.a))", + "│ └─CTEFullScan_123 15593.77 root CTE:tt AS t2 data:CTE_0", + "└─Selection_120(Probe) 12475.01 root not(isnull(test.t1.a))", + " └─CTEFullScan_121 15593.77 root CTE:tt AS t1 data:CTE_0", "CTE_0 15593.77 root Non-Recursive CTE", "└─MergeJoin_22(Seed Part) 15593.77 root inner join, left key:test.t2.a, right key:test.t1.a", " ├─IndexReader_110(Build) 10000.00 root index:IndexFullScan_109", @@ -1459,29 +1456,27 @@ "SQL": "explain with tt as (select /*+ leading(t2), merge_join(t2), merge() */ t1.a from t1 join t2 join t3 where t1.a = t2.a and t2.b=t3.b) select * from tt t1 join tt t2 on t1.a=t2.a", "Plan": [ "HashJoin_48 30395.69 root inner join, equal:[eq(test.t2.b, test.t3.b)]", - "├─IndexReader_145(Build) 9990.00 root index:IndexFullScan_144", - "│ └─IndexFullScan_144 9990.00 cop[tikv] table:t3, index:idx_b(b) keep order:false, stats:pseudo", - "└─MergeJoin_142(Probe) 24316.55 root inner join, left key:test.t1.a, right key:test.t2.a", - " ├─Projection_92(Build) 9980.01 root test.t2.a, test.t2.b", - " │ └─IndexLookUp_91 9980.01 root ", - " │ ├─IndexFullScan_88(Build) 9990.00 cop[tikv] table:t2, index:idx_a(a) keep order:true, stats:pseudo", - " │ └─Selection_90(Probe) 9980.01 cop[tikv] not(isnull(test.t2.b))", - " │ └─TableRowIDScan_89 9990.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - " └─MergeJoin_53(Probe) 19492.21 root inner join, left key:test.t1.a, right key:test.t1.a", - " ├─IndexReader_87(Build) 10000.00 root index:IndexFullScan_86", - " │ └─IndexFullScan_86 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", + "├─IndexReader_172(Build) 9990.00 root index:IndexFullScan_171", + "│ └─IndexFullScan_171 9990.00 cop[tikv] table:t3, index:idx_b(b) keep order:false, stats:pseudo", + "└─MergeJoin_170(Probe) 24316.55 root inner join, left key:test.t1.a, right key:test.t2.a", + " ├─Sort_165(Build) 9980.01 root test.t2.a", + " │ └─TableReader_156 9980.01 root data:Selection_155", + " │ └─Selection_155 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan_154 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─MergeJoin_109(Probe) 19492.21 root inner join, left key:test.t1.a, right key:test.t1.a", + " ├─IndexReader_102(Build) 10000.00 root index:IndexFullScan_101", + " │ └─IndexFullScan_101 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", " └─MergeJoin_54(Probe) 15593.77 root inner join, left key:test.t2.a, right key:test.t1.a", - " ├─IndexReader_85(Build) 10000.00 root index:IndexFullScan_84", - " │ └─IndexFullScan_84 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", - " └─Sort_75(Probe) 12475.01 root test.t2.a", - " └─MergeJoin_66 12475.01 root inner join, left key:test.t2.b, right key:test.t3.b", - " ├─IndexReader_74(Build) 9990.00 root index:IndexFullScan_73", - " │ └─IndexFullScan_73 9990.00 cop[tikv] table:t3, index:idx_b(b) keep order:true, stats:pseudo", - " └─Projection_72(Probe) 9980.01 root test.t2.a, test.t2.b", - " └─IndexLookUp_71 9980.01 root ", - " ├─IndexFullScan_68(Build) 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", - " └─Selection_70(Probe) 9980.01 cop[tikv] not(isnull(test.t2.a))", - " └─TableRowIDScan_69 9990.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + " ├─IndexReader_100(Build) 10000.00 root index:IndexFullScan_99", + " │ └─IndexFullScan_99 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", + " └─Sort_98(Probe) 12475.01 root test.t2.a", + " └─MergeJoin_67 12475.01 root inner join, left key:test.t2.b, right key:test.t3.b", + " ├─IndexReader_94(Build) 9990.00 root index:IndexFullScan_93", + " │ └─IndexFullScan_93 9990.00 cop[tikv] table:t3, index:idx_b(b) keep order:true, stats:pseudo", + " └─Sort_92(Probe) 9980.01 root test.t2.b", + " └─TableReader_83 9980.01 root data:Selection_82", + " └─Selection_82 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " └─TableFullScan_81 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warn": [ "[planner:1815]We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" @@ -1495,15 +1490,13 @@ "│ └─IndexFullScan 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:false, stats:pseudo", "└─Projection(Probe) 12487.50 root test.t.a, test.t.b, test.t1.a, test.t1.b", " └─MergeJoin 12487.50 root inner join, left key:test.t1.a, right key:test.t.a", - " ├─Projection(Build) 10000.00 root test.t.a, test.t.b", - " │ └─IndexLookUp 10000.00 root ", - " │ ├─IndexFullScan(Build) 10000.00 cop[tikv] table:t, index:idx_a(a) keep order:true, stats:pseudo", - " │ └─TableRowIDScan(Probe) 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - " └─Projection(Probe) 9990.00 root test.t1.a, test.t1.b", - " └─IndexLookUp 9990.00 root ", - " ├─IndexFullScan(Build) 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", - " └─Selection(Probe) 9990.00 cop[tikv] not(isnull(test.t1.b))", - " └─TableRowIDScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " ├─Sort(Build) 10000.00 root test.t.a", + " │ └─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─Sort(Probe) 9990.00 root test.t1.a", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warn": [ "[planner:1815]leading hint is inapplicable, check the join type or the join algorithm hint" @@ -1531,10 +1524,9 @@ "Plan": [ "Projection 12487.50 root test.t.a, test.t.b, test.t1.a, test.t1.b", "└─MergeJoin 12487.50 root inner join, left key:test.t1.a, right key:test.t.a", - " ├─Projection(Build) 10000.00 root test.t.a, test.t.b", - " │ └─IndexLookUp 10000.00 root ", - " │ ├─IndexFullScan(Build) 10000.00 cop[tikv] table:t, index:idx_a(a) keep order:true, stats:pseudo", - " │ └─TableRowIDScan(Probe) 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " ├─Sort(Build) 10000.00 root test.t.a", + " │ └─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", " └─Sort(Probe) 9990.00 root test.t1.a", " └─HashJoin 9990.00 root inner join, equal:[eq(test.t2.b, test.t1.b)]", " ├─StreamAgg(Build) 7992.00 root group by:test.t2.b, funcs:firstrow(test.t2.b)->test.t2.b", @@ -1571,21 +1563,19 @@ "Plan": [ "Projection 12487.50 root test.t.a, test.t.b, test.t1.a, test.t1.b", "└─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)], other cond:lt(cast(test.t1.a, decimal(10,0) BINARY), Column#10)", - " ├─HashAgg(Build) 7992.00 root group by:test.t2.b, funcs:sum(Column#31)->Column#10, funcs:firstrow(test.t2.b)->test.t2.b", + " ├─HashAgg(Build) 7992.00 root group by:test.t2.b, funcs:sum(Column#32)->Column#10, funcs:firstrow(test.t2.b)->test.t2.b", " │ └─TableReader 7992.00 root data:HashAgg", - " │ └─HashAgg 7992.00 cop[tikv] group by:test.t2.b, funcs:sum(test.t2.a)->Column#31", + " │ └─HashAgg 7992.00 cop[tikv] group by:test.t2.b, funcs:sum(test.t2.a)->Column#32", " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", " └─MergeJoin(Probe) 12487.50 root inner join, left key:test.t1.a, right key:test.t.a", - " ├─Projection(Build) 10000.00 root test.t.a, test.t.b", - " │ └─IndexLookUp 10000.00 root ", - " │ ├─IndexFullScan(Build) 10000.00 cop[tikv] table:t, index:idx_a(a) keep order:true, stats:pseudo", - " │ └─TableRowIDScan(Probe) 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - " └─Projection(Probe) 9990.00 root test.t1.a, test.t1.b", - " └─IndexLookUp 9990.00 root ", - " ├─IndexFullScan(Build) 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", - " └─Selection(Probe) 9990.00 cop[tikv] not(isnull(test.t1.b))", - " └─TableRowIDScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " ├─Sort(Build) 10000.00 root test.t.a", + " │ └─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─Sort(Probe) 9990.00 root test.t1.a", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warn": [ "[planner:1815]There are no matching table names for (t2) in optimizer hint /*+ LEADING(t2) */. Maybe you can use the table alias name" @@ -1617,14 +1607,12 @@ "Projection 12500.00 root test.t.a, test.t.b, test.t1.a, test.t1.b", "└─Apply 12500.00 root CARTESIAN inner join, other cond:lt(cast(test.t1.a, decimal(10,0) BINARY), Column#10)", " ├─MergeJoin(Build) 12500.00 root inner join, left key:test.t.a, right key:test.t1.a", - " │ ├─Projection(Build) 10000.00 root test.t1.a, test.t1.b", - " │ │ └─IndexLookUp 10000.00 root ", - " │ │ ├─IndexFullScan(Build) 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", - " │ │ └─TableRowIDScan(Probe) 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " │ └─Projection(Probe) 10000.00 root test.t.a, test.t.b", - " │ └─IndexLookUp 10000.00 root ", - " │ ├─IndexFullScan(Build) 10000.00 cop[tikv] table:t, index:idx_a(a) keep order:true, stats:pseudo", - " │ └─TableRowIDScan(Probe) 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " │ ├─Sort(Build) 10000.00 root test.t1.a", + " │ │ └─TableReader 10000.00 root data:TableFullScan", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " │ └─Sort(Probe) 10000.00 root test.t.a", + " │ └─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", " └─MaxOneRow(Probe) 12500.00 root ", " └─StreamAgg 12500.00 root funcs:sum(Column#25)->Column#10", " └─Projection 125000.00 root cast(test.t2.a, decimal(10,0) BINARY)->Column#25", diff --git a/pkg/planner/core/casetest/physicalplantest/testdata/plan_suite_out.json b/pkg/planner/core/casetest/physicalplantest/testdata/plan_suite_out.json index f7121171c1fd0..af4734d523a10 100644 --- a/pkg/planner/core/casetest/physicalplantest/testdata/plan_suite_out.json +++ b/pkg/planner/core/casetest/physicalplantest/testdata/plan_suite_out.json @@ -1251,15 +1251,17 @@ { "SQL": "explain select /*+ merge_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", "Plan": [ - "MergeJoin_10 12487.50 root inner join, left key:test.t.a, right key:test.t.a", - "├─Projection_19(Build) 9990.00 root test.t.a, test.t.b, test.t.c", - "│ └─IndexLookUp_18 9990.00 root ", - "│ ├─IndexFullScan_16(Build) 9990.00 cop[tikv] table:t2, index:idx_a(a) keep order:true, stats:pseudo", - "│ └─TableRowIDScan_17(Probe) 9990.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─Projection_15(Probe) 9990.00 root test.t.a, test.t.b, test.t.c", - " └─IndexLookUp_14 9990.00 root ", - " ├─IndexFullScan_12(Build) 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", - " └─TableRowIDScan_13(Probe) 9990.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "MergeJoin_11 12487.50 root inner join, left key:test.t.a, right key:test.t.a", + "├─Sort_49(Build) 9990.00 root test.t.a", + "│ └─TableReader_45 9990.00 root MppVersion: 2, data:ExchangeSender_44", + "│ └─ExchangeSender_44 9990.00 mpp[tiflash] ExchangeType: PassThrough", + "│ └─Selection_43 9990.00 mpp[tiflash] not(isnull(test.t.a))", + "│ └─TableFullScan_42 10000.00 mpp[tiflash] table:t2 pushed down filter:empty, keep order:false, stats:pseudo", + "└─Sort_34(Probe) 9990.00 root test.t.a", + " └─TableReader_30 9990.00 root MppVersion: 2, data:ExchangeSender_29", + " └─ExchangeSender_29 9990.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Selection_28 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan_27 10000.00 mpp[tiflash] table:t1 pushed down filter:empty, keep order:false, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because you have used hint to specify a join algorithm which is not supported by mpp now.", @@ -1289,15 +1291,17 @@ { "SQL": "explain select /*+ merge_join(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", "Plan": [ - "MergeJoin_10 12487.50 root inner join, left key:test.t.a, right key:test.t.a", - "├─Projection_19(Build) 9990.00 root test.t.a, test.t.b, test.t.c", - "│ └─IndexLookUp_18 9990.00 root ", - "│ ├─IndexFullScan_16(Build) 9990.00 cop[tikv] table:t2, index:idx_a(a) keep order:true, stats:pseudo", - "│ └─TableRowIDScan_17(Probe) 9990.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─Projection_15(Probe) 9990.00 root test.t.a, test.t.b, test.t.c", - " └─IndexLookUp_14 9990.00 root ", - " ├─IndexFullScan_12(Build) 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo", - " └─TableRowIDScan_13(Probe) 9990.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "MergeJoin_11 12487.50 root inner join, left key:test.t.a, right key:test.t.a", + "├─Sort_49(Build) 9990.00 root test.t.a", + "│ └─TableReader_45 9990.00 root MppVersion: 2, data:ExchangeSender_44", + "│ └─ExchangeSender_44 9990.00 mpp[tiflash] ExchangeType: PassThrough", + "│ └─Selection_43 9990.00 mpp[tiflash] not(isnull(test.t.a))", + "│ └─TableFullScan_42 10000.00 mpp[tiflash] table:t2 pushed down filter:empty, keep order:false, stats:pseudo", + "└─Sort_34(Probe) 9990.00 root test.t.a", + " └─TableReader_30 9990.00 root MppVersion: 2, data:ExchangeSender_29", + " └─ExchangeSender_29 9990.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Selection_28 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " └─TableFullScan_27 10000.00 mpp[tiflash] table:t1 pushed down filter:empty, keep order:false, stats:pseudo" ], "Warn": null }, @@ -2701,8 +2705,8 @@ }, { "SQL": "select /*+ MERGE_JOIN(t1) */ t1.b, t2.b from t1 inner join t2 on t1.a = t2.a;", - "Plan": "MergeInnerJoin{IndexLookUp(Index(t1.idx_a)[[-inf,+inf]], Table(t1))->Projection->IndexLookUp(Index(t2.idx_a)[[-inf,+inf]], Table(t2))->Projection}(test.t1.a,test.t2.a)", - "Hints": "merge_join(`test`.`t1`), use_index(@`sel_1` `test`.`t1` `idx_a`), order_index(@`sel_1` `test`.`t1` `idx_a`), use_index(@`sel_1` `test`.`t2` `idx_a`), order_index(@`sel_1` `test`.`t2` `idx_a`)" + "Plan": "MergeInnerJoin{TableReader(Table(t1)->Sel([not(isnull(test.t1.a))]))->Sort->TableReader(Table(t2)->Sel([not(isnull(test.t2.a))]))->Sort}(test.t1.a,test.t2.a)", + "Hints": "merge_join(`test`.`t1`), use_index(@`sel_1` `test`.`t1` ), use_index(@`sel_1` `test`.`t2` )" } ] }, diff --git a/pkg/planner/core/casetest/testdata/plan_normalized_suite_out.json b/pkg/planner/core/casetest/testdata/plan_normalized_suite_out.json index eace2a1ef0f2f..7be4636f8f444 100644 --- a/pkg/planner/core/casetest/testdata/plan_normalized_suite_out.json +++ b/pkg/planner/core/casetest/testdata/plan_normalized_suite_out.json @@ -419,8 +419,8 @@ " TableReader root ", " └─ExchangeSender cop[tiflash] ", " └─Projection cop[tiflash] test.t1.a", - " └─Selection cop[tiflash] gt(test.t1.a, ?)", - " └─TableFullScan cop[tiflash] table:t1, range:[?,?], pushed down filter:gt(test.t1.b, ?), keep order:false" + " └─Selection cop[tiflash] gt(test.t1.b, ?)", + " └─TableFullScan cop[tiflash] table:t1, range:[?,?], pushed down filter:gt(test.t1.a, ?), keep order:false" ] }, { @@ -428,8 +428,8 @@ "Plan": [ " TableReader root ", " └─ExchangeSender cop[tiflash] ", - " └─Selection cop[tiflash] gt(test.t1.c, ?)", - " └─TableFullScan cop[tiflash] table:t1, range:[?,?], pushed down filter:gt(test.t1.a, ?), gt(test.t1.b, ?), keep order:false" + " └─Selection cop[tiflash] gt(test.t1.a, ?)", + " └─TableFullScan cop[tiflash] table:t1, range:[?,?], pushed down filter:gt(test.t1.b, ?), gt(test.t1.c, ?), keep order:false" ] }, { @@ -445,8 +445,8 @@ "Plan": [ " TableReader root ", " └─ExchangeSender cop[tiflash] ", - " └─Selection cop[tiflash] gt(test.t1.a, ?), or(lt(test.t1.a, ?), lt(test.t1.b, ?))", - " └─TableFullScan cop[tiflash] table:t1, range:[?,?], pushed down filter:gt(test.t1.b, ?), keep order:false" + " └─Selection cop[tiflash] gt(test.t1.b, ?), or(lt(test.t1.a, ?), lt(test.t1.b, ?))", + " └─TableFullScan cop[tiflash] table:t1, range:[?,?], pushed down filter:gt(test.t1.a, ?), keep order:false" ] }, { diff --git a/pkg/planner/core/casetest/windows/testdata/window_push_down_suite_out.json b/pkg/planner/core/casetest/windows/testdata/window_push_down_suite_out.json index cee5c05feb5eb..e5866b6ee4cb9 100644 --- a/pkg/planner/core/casetest/windows/testdata/window_push_down_suite_out.json +++ b/pkg/planner/core/casetest/windows/testdata/window_push_down_suite_out.json @@ -10,9 +10,9 @@ { "SQL": "explain select *, row_number() over () FROM employee -- 1. empty partition", "Plan": [ - "TableReader_22 10000.00 root MppVersion: 2, data:ExchangeSender_21", - "└─ExchangeSender_21 10000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─Window_20 10000.00 mpp[tiflash] row_number()->Column#6 over(rows between current row and current row)", + "TableReader_27 10000.00 root MppVersion: 2, data:ExchangeSender_26", + "└─ExchangeSender_26 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Window_25 10000.00 mpp[tiflash] row_number()->Column#6 over(rows between current row and current row)", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] ", " └─ExchangeSender_11 10000.00 mpp[tiflash] ExchangeType: PassThrough, Compression: FAST", " └─TableFullScan_10 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" @@ -104,9 +104,9 @@ { "SQL": "explain select *, rank() over () FROM (select *, row_number() over () a from employee) tmp -- 6. multi window from sub query", "Plan": [ - "TableReader_36 10000.00 root MppVersion: 2, data:ExchangeSender_35", - "└─ExchangeSender_35 10000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─Window_34 10000.00 mpp[tiflash] rank()->Column#8 over()", + "TableReader_41 10000.00 root MppVersion: 2, data:ExchangeSender_40", + "└─ExchangeSender_40 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Window_39 10000.00 mpp[tiflash] rank()->Column#8 over()", " └─Window_14 10000.00 mpp[tiflash] row_number()->Column#6 over(rows between current row and current row)", " └─ExchangeReceiver_18 10000.00 mpp[tiflash] ", " └─ExchangeSender_17 10000.00 mpp[tiflash] ExchangeType: PassThrough, Compression: FAST", @@ -117,9 +117,9 @@ { "SQL": "explain select *, rank() over (partition by deptid) FROM (select *, row_number() over () a from employee) tmp -- 6.1 multi window from sub query", "Plan": [ - "TableReader_37 10000.00 root MppVersion: 2, data:ExchangeSender_36", - "└─ExchangeSender_36 10000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─Window_35 10000.00 mpp[tiflash] rank()->Column#8 over(partition by test.employee.deptid), stream_count: 8", + "TableReader_42 10000.00 root MppVersion: 2, data:ExchangeSender_41", + "└─ExchangeSender_41 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Window_40 10000.00 mpp[tiflash] rank()->Column#8 over(partition by test.employee.deptid), stream_count: 8", " └─Sort_20 10000.00 mpp[tiflash] test.employee.deptid, stream_count: 8", " └─ExchangeReceiver_19 10000.00 mpp[tiflash] stream_count: 8", " └─ExchangeSender_18 10000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", @@ -182,9 +182,9 @@ { "SQL": "explain select *, row_number() over () FROM employee -- 1. pure window functions", "Plan": [ - "TableReader_22 10000.00 root MppVersion: 2, data:ExchangeSender_21", - "└─ExchangeSender_21 10000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─Window_20 10000.00 mpp[tiflash] row_number()->Column#6 over(rows between current row and current row)", + "TableReader_27 10000.00 root MppVersion: 2, data:ExchangeSender_26", + "└─ExchangeSender_26 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Window_25 10000.00 mpp[tiflash] row_number()->Column#6 over(rows between current row and current row)", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] ", " └─ExchangeSender_11 10000.00 mpp[tiflash] ExchangeType: PassThrough, Compression: FAST", " └─TableFullScan_10 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" @@ -194,9 +194,9 @@ { "SQL": "explain select *, rank() over () FROM employee", "Plan": [ - "TableReader_22 10000.00 root MppVersion: 2, data:ExchangeSender_21", - "└─ExchangeSender_21 10000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─Window_20 10000.00 mpp[tiflash] rank()->Column#6 over()", + "TableReader_27 10000.00 root MppVersion: 2, data:ExchangeSender_26", + "└─ExchangeSender_26 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Window_25 10000.00 mpp[tiflash] rank()->Column#6 over()", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] ", " └─ExchangeSender_11 10000.00 mpp[tiflash] ExchangeType: PassThrough, Compression: FAST", " └─TableFullScan_10 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" @@ -206,9 +206,9 @@ { "SQL": "explain select *, dense_rank() over () FROM employee", "Plan": [ - "TableReader_22 10000.00 root MppVersion: 2, data:ExchangeSender_21", - "└─ExchangeSender_21 10000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─Window_20 10000.00 mpp[tiflash] dense_rank()->Column#6 over()", + "TableReader_27 10000.00 root MppVersion: 2, data:ExchangeSender_26", + "└─ExchangeSender_26 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Window_25 10000.00 mpp[tiflash] dense_rank()->Column#6 over()", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] ", " └─ExchangeSender_11 10000.00 mpp[tiflash] ExchangeType: PassThrough, Compression: FAST", " └─TableFullScan_10 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" @@ -218,9 +218,9 @@ { "SQL": "explain select *, lead(empid) over () FROM employee", "Plan": [ - "TableReader_22 10000.00 root MppVersion: 2, data:ExchangeSender_21", - "└─ExchangeSender_21 10000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─Window_20 10000.00 mpp[tiflash] lead(test.employee.empid)->Column#6 over()", + "TableReader_27 10000.00 root MppVersion: 2, data:ExchangeSender_26", + "└─ExchangeSender_26 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Window_25 10000.00 mpp[tiflash] lead(test.employee.empid)->Column#6 over()", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] ", " └─ExchangeSender_11 10000.00 mpp[tiflash] ExchangeType: PassThrough, Compression: FAST", " └─TableFullScan_10 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" @@ -230,9 +230,9 @@ { "SQL": "explain select *, lag(empid) over () FROM employee", "Plan": [ - "TableReader_22 10000.00 root MppVersion: 2, data:ExchangeSender_21", - "└─ExchangeSender_21 10000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─Window_20 10000.00 mpp[tiflash] lag(test.employee.empid)->Column#6 over()", + "TableReader_27 10000.00 root MppVersion: 2, data:ExchangeSender_26", + "└─ExchangeSender_26 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Window_25 10000.00 mpp[tiflash] lag(test.employee.empid)->Column#6 over()", " └─ExchangeReceiver_12 10000.00 mpp[tiflash] ", " └─ExchangeSender_11 10000.00 mpp[tiflash] ExchangeType: PassThrough, Compression: FAST", " └─TableFullScan_10 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" @@ -243,9 +243,9 @@ "SQL": "explain select *, sum(empid) over () FROM employee -- 2. agg functions", "Plan": [ "Window_8 10000.00 root sum(cast(test.employee.empid, decimal(10,0) BINARY))->Column#6 over()", - "└─TableReader_13 10000.00 root MppVersion: 2, data:ExchangeSender_12", - " └─ExchangeSender_12 10000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─TableFullScan_11 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" + "└─TableReader_18 10000.00 root MppVersion: 2, data:ExchangeSender_17", + " └─ExchangeSender_17 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─TableFullScan_16 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because window function `sum` or its arguments are not supported now.", @@ -256,9 +256,9 @@ "SQL": "explain select *, count(empid) over () FROM employee", "Plan": [ "Window_8 10000.00 root count(test.employee.empid)->Column#6 over()", - "└─TableReader_13 10000.00 root MppVersion: 2, data:ExchangeSender_12", - " └─ExchangeSender_12 10000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─TableFullScan_11 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" + "└─TableReader_18 10000.00 root MppVersion: 2, data:ExchangeSender_17", + " └─ExchangeSender_17 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─TableFullScan_16 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because window function `count` or its arguments are not supported now.", @@ -269,9 +269,9 @@ "SQL": "explain select *, min(empid) over () FROM employee", "Plan": [ "Window_8 10000.00 root min(test.employee.empid)->Column#6 over()", - "└─TableReader_13 10000.00 root MppVersion: 2, data:ExchangeSender_12", - " └─ExchangeSender_12 10000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─TableFullScan_11 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" + "└─TableReader_18 10000.00 root MppVersion: 2, data:ExchangeSender_17", + " └─ExchangeSender_17 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─TableFullScan_16 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because window function `min` or its arguments are not supported now.", @@ -282,9 +282,9 @@ "SQL": "explain select *, max(empid) over () FROM employee", "Plan": [ "Window_8 10000.00 root max(test.employee.empid)->Column#6 over()", - "└─TableReader_13 10000.00 root MppVersion: 2, data:ExchangeSender_12", - " └─ExchangeSender_12 10000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─TableFullScan_11 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" + "└─TableReader_18 10000.00 root MppVersion: 2, data:ExchangeSender_17", + " └─ExchangeSender_17 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─TableFullScan_16 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because window function `max` or its arguments are not supported now.", @@ -295,9 +295,9 @@ "SQL": "explain select *, avg(empid) over () FROM employee", "Plan": [ "Window_8 10000.00 root avg(cast(test.employee.empid, decimal(10,0) BINARY))->Column#6 over()", - "└─TableReader_13 10000.00 root MppVersion: 2, data:ExchangeSender_12", - " └─ExchangeSender_12 10000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─TableFullScan_11 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" + "└─TableReader_18 10000.00 root MppVersion: 2, data:ExchangeSender_17", + " └─ExchangeSender_17 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─TableFullScan_16 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because window function `avg` or its arguments are not supported now.", @@ -420,11 +420,11 @@ { "SQL": "explain select count(distinct empid) from (select *, row_number() over () from employee) t", "Plan": [ - "TableReader_36 1.00 root MppVersion: 2, data:ExchangeSender_35", - "└─ExchangeSender_35 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─Projection_34 1.00 mpp[tiflash] Column#7", - " └─HashAgg_33 1.00 mpp[tiflash] funcs:count(distinct test.employee.empid)->Column#7", - " └─Window_25 10000.00 mpp[tiflash] row_number()->Column#6 over(rows between current row and current row)", + "TableReader_41 1.00 root MppVersion: 2, data:ExchangeSender_40", + "└─ExchangeSender_40 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection_39 1.00 mpp[tiflash] Column#7", + " └─HashAgg_38 1.00 mpp[tiflash] funcs:count(distinct test.employee.empid)->Column#7", + " └─Window_30 10000.00 mpp[tiflash] row_number()->Column#6 over(rows between current row and current row)", " └─ExchangeReceiver_17 10000.00 mpp[tiflash] ", " └─ExchangeSender_16 10000.00 mpp[tiflash] ExchangeType: PassThrough, Compression: FAST", " └─TableFullScan_15 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" @@ -455,11 +455,11 @@ { "SQL": "explain select count(empid) from (select *, row_number() over () a from employee) t group by a", "Plan": [ - "TableReader_53 10000.00 root MppVersion: 2, data:ExchangeSender_52", - "└─ExchangeSender_52 10000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─Projection_47 10000.00 mpp[tiflash] Column#7", - " └─HashAgg_45 10000.00 mpp[tiflash] group by:Column#6, funcs:count(test.employee.empid)->Column#7", - " └─Window_28 10000.00 mpp[tiflash] row_number()->Column#6 over(rows between current row and current row)", + "TableReader_58 10000.00 root MppVersion: 2, data:ExchangeSender_57", + "└─ExchangeSender_57 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection_52 10000.00 mpp[tiflash] Column#7", + " └─HashAgg_50 10000.00 mpp[tiflash] group by:Column#6, funcs:count(test.employee.empid)->Column#7", + " └─Window_33 10000.00 mpp[tiflash] row_number()->Column#6 over(rows between current row and current row)", " └─ExchangeReceiver_20 10000.00 mpp[tiflash] ", " └─ExchangeSender_19 10000.00 mpp[tiflash] ExchangeType: PassThrough, Compression: FAST", " └─TableFullScan_18 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" diff --git a/pkg/planner/core/find_best_task.go b/pkg/planner/core/find_best_task.go index 6deb698fdc6e6..60b39a40fe41c 100644 --- a/pkg/planner/core/find_best_task.go +++ b/pkg/planner/core/find_best_task.go @@ -1273,8 +1273,8 @@ func isPointGetConvertableSchema(ds *logicalop.DataSource) bool { // exploreEnforcedPlan determines whether to explore enforced plans for this DataSource if it has already found an unenforced plan. // See #46177 for more information. func exploreEnforcedPlan(ds *logicalop.DataSource) bool { - // default value is false to keep it compatible with previous versions. - return fixcontrol.GetBoolWithDefault(ds.SCtx().GetSessionVars().GetOptimizerFixControlMap(), fixcontrol.Fix46177, false) + // default value is true which is different than original implementation. + return fixcontrol.GetBoolWithDefault(ds.SCtx().GetSessionVars().GetOptimizerFixControlMap(), fixcontrol.Fix46177, true) } func findBestTask4LogicalDataSource(lp base.LogicalPlan, prop *property.PhysicalProperty, planCounter *base.PlanCounterTp, opt *optimizetrace.PhysicalOptimizeOp) (t base.Task, cntPlan int64, err error) { diff --git a/pkg/planner/core/testdata/runtime_filter_generator_suite_in.json b/pkg/planner/core/testdata/runtime_filter_generator_suite_in.json index 033e6b931e8e1..dfc6895441171 100644 --- a/pkg/planner/core/testdata/runtime_filter_generator_suite_in.json +++ b/pkg/planner/core/testdata/runtime_filter_generator_suite_in.json @@ -8,12 +8,13 @@ "select /*+ broadcast_join(t2, t1), hash_join_build(t2) */ * from t2, (select k1 from t1 group by k1) t1 where t1.k1=t2.k1; -- Global doesn't support", "select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1, t2 where t1.k1=t2.k1; -- t1 is build side", "select * from t1_tikv as t1, t2 where t1.k1=t2.k1; -- Doesn't support hash join in root", - "select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1, t2 where t1.k1+1=t2.k1; -- Support transform src expression t1.k1+1", + "format='brief' select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1, t2 where t1.k1+1=t2.k1; -- Support transform src expression t1.k1+1", "format='brief' select /*+ broadcast_join(t2, t1), hash_join_build(t2) */ * from t2, (select k1, k1+1 as k11 from t1) t1 where t1.k1=t2.k1; -- Only support origin column k1", "select /*+ hash_join_build(t2) */ * from t2, (select k1, k1+1 as k11 from t1) t1 where t1.k11=t2.k1; -- Doesn't support transform column k11", - "select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1, t2 where t1.k1=t2.k1+1; -- Doesn't support target expression t2.k1+1", - "select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1 right join t2 on t1.k1=t2.k1; -- t2 side couldn't be RF target side, no RF", - "format='brief' select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1 where t1.k1 not in (select k1 from t2); -- RF could not push to t2 because of anti join", + "format='brief' select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1, t2 where t1.k1=t2.k1+1; -- Doesn't support target expression t2.k1+1", + "format='brief' select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1 right join t2 on t1.k1=t2.k1; -- t2 side couldn't be RF target side, no RF", + // TO-DO reinstate flaky test that was removed to support enabling fix control 46177 + // "format='brief' select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1 where t1.k1 not in (select k1 from t2); -- RF could not push to t2 because of anti join", "select /*+ hash_join_build(t1) */ * from t1, t2 where t1.k1<=>t2.k1; -- Doesn't support null safe eq predicate" ] } diff --git a/pkg/planner/core/testdata/runtime_filter_generator_suite_out.json b/pkg/planner/core/testdata/runtime_filter_generator_suite_out.json index 0df45feccaf82..8f2e1b65181ca 100644 --- a/pkg/planner/core/testdata/runtime_filter_generator_suite_out.json +++ b/pkg/planner/core/testdata/runtime_filter_generator_suite_out.json @@ -92,17 +92,17 @@ ] }, { - "SQL": "select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1, t2 where t1.k1+1=t2.k1; -- Support transform src expression t1.k1+1", + "SQL": "format='brief' select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1, t2 where t1.k1+1=t2.k1; -- Support transform src expression t1.k1+1", "Plan": [ - "TableReader_22 1.00 root MppVersion: 2, data:ExchangeSender_21", - "└─ExchangeSender_21 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─Projection_20 1.00 mpp[tiflash] test.t1.k1, test.t2.k1, test.t2.k2, test.t2.k3", - " └─HashJoin_19 1.00 mpp[tiflash] inner join, equal:[eq(Column#7, test.t2.k1)], runtime filter:0[IN] <- Column#7", - " ├─ExchangeReceiver_14(Build) 1.00 mpp[tiflash] ", - " │ └─ExchangeSender_13 1.00 mpp[tiflash] ExchangeType: Broadcast, Compression: FAST", - " │ └─Projection_11 1.00 mpp[tiflash] test.t1.k1, plus(test.t1.k1, 1)->Column#7", - " │ └─TableFullScan_12 1.00 mpp[tiflash] table:t1 keep order:false", - " └─TableFullScan_15(Probe) 1.00 mpp[tiflash] table:t2 keep order:false, runtime filter:0[IN] -> test.t2.k1" + "TableReader 1.00 root MppVersion: 2, data:ExchangeSender", + "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 mpp[tiflash] test.t1.k1, test.t2.k1, test.t2.k2, test.t2.k3", + " └─HashJoin 1.00 mpp[tiflash] inner join, equal:[eq(Column#7, test.t2.k1)], runtime filter:0[IN] <- Column#7", + " ├─ExchangeReceiver(Build) 1.00 mpp[tiflash] ", + " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: Broadcast, Compression: FAST", + " │ └─Projection 1.00 mpp[tiflash] test.t1.k1, plus(test.t1.k1, 1)->Column#7", + " │ └─TableFullScan 1.00 mpp[tiflash] table:t1 keep order:false", + " └─TableFullScan(Probe) 1.00 mpp[tiflash] table:t2 keep order:false, runtime filter:0[IN] -> test.t2.k1" ] }, { @@ -136,41 +136,29 @@ ] }, { - "SQL": "select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1, t2 where t1.k1=t2.k1+1; -- Doesn't support target expression t2.k1+1", - "Plan": [ - "TableReader_21 1.00 root MppVersion: 2, data:ExchangeSender_20", - "└─ExchangeSender_20 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─Projection_19 1.00 mpp[tiflash] test.t1.k1, test.t2.k1, test.t2.k2, test.t2.k3", - " └─HashJoin_18 1.00 mpp[tiflash] inner join, equal:[eq(test.t1.k1, Column#7)]", - " ├─ExchangeReceiver_12(Build) 1.00 mpp[tiflash] ", - " │ └─ExchangeSender_11 1.00 mpp[tiflash] ExchangeType: Broadcast, Compression: FAST", - " │ └─TableFullScan_10 1.00 mpp[tiflash] table:t1 keep order:false", - " └─Projection_13(Probe) 1.00 mpp[tiflash] test.t2.k1, test.t2.k2, test.t2.k3, plus(test.t2.k1, 1)->Column#7", - " └─TableFullScan_14 1.00 mpp[tiflash] table:t2 keep order:false" - ] - }, - { - "SQL": "select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1 right join t2 on t1.k1=t2.k1; -- t2 side couldn't be RF target side, no RF", + "SQL": "format='brief' select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1, t2 where t1.k1=t2.k1+1; -- Doesn't support target expression t2.k1+1", "Plan": [ - "TableReader_17 1.00 root MppVersion: 2, data:ExchangeSender_16", - "└─ExchangeSender_16 1.00 mpp[tiflash] ExchangeType: PassThrough", - " └─HashJoin_15 1.00 mpp[tiflash] right outer join, equal:[eq(test.t1.k1, test.t2.k1)]", - " ├─ExchangeReceiver_11(Build) 1.00 mpp[tiflash] ", - " │ └─ExchangeSender_10 1.00 mpp[tiflash] ExchangeType: Broadcast, Compression: FAST", - " │ └─Selection_9 1.00 mpp[tiflash] not(isnull(test.t1.k1))", - " │ └─TableFullScan_8 1.00 mpp[tiflash] table:t1 pushed down filter:empty, keep order:false", - " └─TableFullScan_12(Probe) 1.00 mpp[tiflash] table:t2 keep order:false" + "TableReader 1.00 root MppVersion: 2, data:ExchangeSender", + "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 mpp[tiflash] test.t1.k1, test.t2.k1, test.t2.k2, test.t2.k3", + " └─HashJoin 1.00 mpp[tiflash] inner join, equal:[eq(test.t1.k1, Column#7)]", + " ├─ExchangeReceiver(Build) 1.00 mpp[tiflash] ", + " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: Broadcast, Compression: FAST", + " │ └─TableFullScan 1.00 mpp[tiflash] table:t1 keep order:false", + " └─Projection(Probe) 1.00 mpp[tiflash] test.t2.k1, test.t2.k2, test.t2.k3, plus(test.t2.k1, 1)->Column#7", + " └─TableFullScan 1.00 mpp[tiflash] table:t2 keep order:false" ] }, { - "SQL": "format='brief' select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1 where t1.k1 not in (select k1 from t2); -- RF could not push to t2 because of anti join", + "SQL": "format='brief' select /*+ broadcast_join(t1, t2), hash_join_build(t1) */ * from t1 right join t2 on t1.k1=t2.k1; -- t2 side couldn't be RF target side, no RF", "Plan": [ - "TableReader 0.80 root MppVersion: 2, data:ExchangeSender", - "└─ExchangeSender 0.80 mpp[tiflash] ExchangeType: PassThrough", - " └─HashJoin 0.80 mpp[tiflash] Null-aware anti semi join, equal:[eq(test.t1.k1, test.t2.k1)]", + "TableReader 1.00 root MppVersion: 2, data:ExchangeSender", + "└─ExchangeSender 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 1.00 mpp[tiflash] right outer join, equal:[eq(test.t1.k1, test.t2.k1)]", " ├─ExchangeReceiver(Build) 1.00 mpp[tiflash] ", " │ └─ExchangeSender 1.00 mpp[tiflash] ExchangeType: Broadcast, Compression: FAST", - " │ └─TableFullScan 1.00 mpp[tiflash] table:t1 keep order:false", + " │ └─Selection 1.00 mpp[tiflash] not(isnull(test.t1.k1))", + " │ └─TableFullScan 1.00 mpp[tiflash] table:t1 pushed down filter:empty, keep order:false", " └─TableFullScan(Probe) 1.00 mpp[tiflash] table:t2 keep order:false" ] }, diff --git a/tests/integrationtest/r/cte.result b/tests/integrationtest/r/cte.result index 10aaa081a63b5..77e2da6a50c35 100644 --- a/tests/integrationtest/r/cte.result +++ b/tests/integrationtest/r/cte.result @@ -379,17 +379,17 @@ insert into t1 values(1), (2), (1), (2); create table tpk(c1 int primary key); insert into tpk values(1), (2), (3); // Expect a Sort operator on CTE. -explain with cte1 as (select c1 from t1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; +explain format='brief' with cte1 as (select c1 from t1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; id estRows task access object operator info -MergeJoin_25 12487.50 root inner join, left key:cte.t1.c1, right key:cte.t1.c1 -├─Sort_23(Build) 9990.00 root cte.t1.c1 -│ └─TableReader_22 9990.00 root data:Selection_21 -│ └─Selection_21 9990.00 cop[tikv] not(isnull(cte.t1.c1)) -│ └─TableFullScan_20 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -└─Sort_19(Probe) 9990.00 root cte.t1.c1 - └─TableReader_18 9990.00 root data:Selection_17 - └─Selection_17 9990.00 cop[tikv] not(isnull(cte.t1.c1)) - └─TableFullScan_16 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo +MergeJoin 12487.50 root inner join, left key:cte.t1.c1, right key:cte.t1.c1 +├─Sort(Build) 9990.00 root cte.t1.c1 +│ └─TableReader 9990.00 root data:Selection +│ └─Selection 9990.00 cop[tikv] not(isnull(cte.t1.c1)) +│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +└─Sort(Probe) 9990.00 root cte.t1.c1 + └─TableReader 9990.00 root data:Selection + └─Selection 9990.00 cop[tikv] not(isnull(cte.t1.c1)) + └─TableFullScan 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo with cte1 as (select c1 from t1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; c1 c1 1 1 @@ -401,30 +401,30 @@ c1 c1 2 2 2 2 // Sort should not exist, because tpk.c1 is pk. Not the best plan for now(#25674). -explain with cte1 as (select c1 from tpk) select /*+ MERGE_JOIN(dt1, dt2) */ * from tpk dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; +explain format='brief' with cte1 as (select c1 from tpk) select /*+ MERGE_JOIN(dt1, dt2) */ * from tpk dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; id estRows task access object operator info -MergeJoin_27 12500.00 root inner join, left key:cte.tpk.c1, right key:cte.tpk.c1 -├─TableReader_24(Build) 10000.00 root data:TableFullScan_23 -│ └─TableFullScan_23 10000.00 cop[tikv] table:tpk keep order:true, stats:pseudo -└─TableReader_22(Probe) 10000.00 root data:TableFullScan_21 - └─TableFullScan_21 10000.00 cop[tikv] table:dt1 keep order:true, stats:pseudo +MergeJoin 12500.00 root inner join, left key:cte.tpk.c1, right key:cte.tpk.c1 +├─TableReader(Build) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:tpk keep order:true, stats:pseudo +└─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:dt1 keep order:true, stats:pseudo with cte1 as (select c1 from tpk) select /*+ MERGE_JOIN(dt1, dt2) */ * from tpk dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; c1 c1 1 1 2 2 3 3 // Sort should not exist, because we have order by in CTE definition. Not the best plan for now(#25674). -explain with cte1 as (select c1 from t1 order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; +explain format='brief' with cte1 as (select c1 from t1 order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; id estRows task access object operator info -MergeJoin_25 12487.50 root inner join, left key:cte.t1.c1, right key:cte.t1.c1 -├─Sort_23(Build) 9990.00 root cte.t1.c1 -│ └─TableReader_22 9990.00 root data:Selection_21 -│ └─Selection_21 9990.00 cop[tikv] not(isnull(cte.t1.c1)) -│ └─TableFullScan_20 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -└─Sort_19(Probe) 9990.00 root cte.t1.c1 - └─TableReader_18 9990.00 root data:Selection_17 - └─Selection_17 9990.00 cop[tikv] not(isnull(cte.t1.c1)) - └─TableFullScan_16 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo +MergeJoin 12487.50 root inner join, left key:cte.t1.c1, right key:cte.t1.c1 +├─Sort(Build) 9990.00 root cte.t1.c1 +│ └─TableReader 9990.00 root data:Selection +│ └─Selection 9990.00 cop[tikv] not(isnull(cte.t1.c1)) +│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +└─Sort(Probe) 9990.00 root cte.t1.c1 + └─TableReader 9990.00 root data:Selection + └─Selection 9990.00 cop[tikv] not(isnull(cte.t1.c1)) + └─TableFullScan 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo with cte1 as (select c1 from t1 order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; c1 c1 1 1 @@ -436,22 +436,22 @@ c1 c1 2 2 2 2 // Expect a Sort operator on CTE. Because it's recursive. -explain with recursive cte1 as (select c1 from t1 union select c1 +1 c1 from cte1 where c1 < 3) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; +explain format='brief' with recursive cte1 as (select c1 from t1 union select c1 +1 c1 from cte1 where c1 < 3) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; id estRows task access object operator info -MergeJoin_36 8001.00 root inner join, left key:cte.t1.c1, right key:cte.t1.c1 -├─Sort_34(Build) 6400.80 root cte.t1.c1 -│ └─Selection_32 6400.80 root not(isnull(cte.t1.c1)) -│ └─CTEFullScan_33 8001.00 root CTE:cte1 AS dt2 data:CTE_0 -└─Sort_30(Probe) 9990.00 root cte.t1.c1 - └─TableReader_29 9990.00 root data:Selection_28 - └─Selection_28 9990.00 cop[tikv] not(isnull(cte.t1.c1)) - └─TableFullScan_27 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo +MergeJoin 8001.00 root inner join, left key:cte.t1.c1, right key:cte.t1.c1 +├─Sort(Build) 6400.80 root cte.t1.c1 +│ └─Selection 6400.80 root not(isnull(cte.t1.c1)) +│ └─CTEFullScan 8001.00 root CTE:cte1 AS dt2 data:CTE_0 +└─Sort(Probe) 9990.00 root cte.t1.c1 + └─TableReader 9990.00 root data:Selection + └─Selection 9990.00 cop[tikv] not(isnull(cte.t1.c1)) + └─TableFullScan 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo CTE_0 8001.00 root Recursive CTE -├─TableReader_18(Seed Part) 10000.00 root data:TableFullScan_17 -│ └─TableFullScan_17 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -└─Projection_19(Recursive Part) 8000.00 root cast(plus(cte.t1.c1, 1), int)->cte.t1.c1 - └─Selection_20 8000.00 root lt(cte.t1.c1, 3) - └─CTETable_21 10000.00 root Scan on CTE_0 +├─TableReader(Seed Part) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +└─Projection(Recursive Part) 8000.00 root cast(plus(cte.t1.c1, 1), int)->cte.t1.c1 + └─Selection 8000.00 root lt(cte.t1.c1, 3) + └─CTETable 10000.00 root Scan on CTE_0 with recursive cte1 as (select c1 from t1 union select c1 +1 c1 from cte1 where c1 < 3) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; c1 c1 1 1 @@ -459,22 +459,22 @@ c1 c1 2 2 2 2 // Expect a Sort operator on CTE. Because it's recursive. -explain with recursive cte1 as (select c1 from tpk union select c1 +1 c1 from cte1 where c1 < 3) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; +explain format='brief' with recursive cte1 as (select c1 from tpk union select c1 +1 c1 from cte1 where c1 < 3) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; id estRows task access object operator info -MergeJoin_36 8001.00 root inner join, left key:cte.t1.c1, right key:cte.tpk.c1 -├─Sort_34(Build) 6400.80 root cte.tpk.c1 -│ └─Selection_32 6400.80 root not(isnull(cte.tpk.c1)) -│ └─CTEFullScan_33 8001.00 root CTE:cte1 AS dt2 data:CTE_0 -└─Sort_30(Probe) 9990.00 root cte.t1.c1 - └─TableReader_29 9990.00 root data:Selection_28 - └─Selection_28 9990.00 cop[tikv] not(isnull(cte.t1.c1)) - └─TableFullScan_27 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo +MergeJoin 8001.00 root inner join, left key:cte.t1.c1, right key:cte.tpk.c1 +├─Sort(Build) 6400.80 root cte.tpk.c1 +│ └─Selection 6400.80 root not(isnull(cte.tpk.c1)) +│ └─CTEFullScan 8001.00 root CTE:cte1 AS dt2 data:CTE_0 +└─Sort(Probe) 9990.00 root cte.t1.c1 + └─TableReader 9990.00 root data:Selection + └─Selection 9990.00 cop[tikv] not(isnull(cte.t1.c1)) + └─TableFullScan 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo CTE_0 8001.00 root Recursive CTE -├─TableReader_18(Seed Part) 10000.00 root data:TableFullScan_17 -│ └─TableFullScan_17 10000.00 cop[tikv] table:tpk keep order:false, stats:pseudo -└─Projection_19(Recursive Part) 8000.00 root cast(plus(cte.tpk.c1, 1), int)->cte.tpk.c1 - └─Selection_20 8000.00 root lt(cte.tpk.c1, 3) - └─CTETable_21 10000.00 root Scan on CTE_0 +├─TableReader(Seed Part) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:tpk keep order:false, stats:pseudo +└─Projection(Recursive Part) 8000.00 root cast(plus(cte.tpk.c1, 1), int)->cte.tpk.c1 + └─Selection 8000.00 root lt(cte.tpk.c1, 3) + └─CTETable 10000.00 root Scan on CTE_0 with recursive cte1 as (select c1 from tpk union select c1 +1 c1 from cte1 where c1 < 3) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; c1 c1 1 1 @@ -483,17 +483,17 @@ c1 c1 2 2 // Got order by in CTE definition // Expect Sort operator in CTE definition. -explain with cte1 as (select c1 from t1 order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; +explain format='brief' with cte1 as (select c1 from t1 order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; id estRows task access object operator info -MergeJoin_25 12487.50 root inner join, left key:cte.t1.c1, right key:cte.t1.c1 -├─Sort_23(Build) 9990.00 root cte.t1.c1 -│ └─TableReader_22 9990.00 root data:Selection_21 -│ └─Selection_21 9990.00 cop[tikv] not(isnull(cte.t1.c1)) -│ └─TableFullScan_20 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -└─Sort_19(Probe) 9990.00 root cte.t1.c1 - └─TableReader_18 9990.00 root data:Selection_17 - └─Selection_17 9990.00 cop[tikv] not(isnull(cte.t1.c1)) - └─TableFullScan_16 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo +MergeJoin 12487.50 root inner join, left key:cte.t1.c1, right key:cte.t1.c1 +├─Sort(Build) 9990.00 root cte.t1.c1 +│ └─TableReader 9990.00 root data:Selection +│ └─Selection 9990.00 cop[tikv] not(isnull(cte.t1.c1)) +│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +└─Sort(Probe) 9990.00 root cte.t1.c1 + └─TableReader 9990.00 root data:Selection + └─Selection 9990.00 cop[tikv] not(isnull(cte.t1.c1)) + └─TableFullScan 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo with cte1 as (select c1 from t1 order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; c1 c1 1 1 @@ -505,15 +505,15 @@ c1 c1 2 2 2 2 // Sort should not exist, because tpk is ordered. Not the best plan for now(#25674). -explain with cte1 as (select c1 from tpk order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; +explain format='brief' with cte1 as (select c1 from tpk order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; id estRows task access object operator info -MergeJoin_23 12487.50 root inner join, left key:cte.t1.c1, right key:cte.tpk.c1 -├─TableReader_21(Build) 10000.00 root data:TableFullScan_20 -│ └─TableFullScan_20 10000.00 cop[tikv] table:tpk keep order:true, stats:pseudo -└─Sort_19(Probe) 9990.00 root cte.t1.c1 - └─TableReader_18 9990.00 root data:Selection_17 - └─Selection_17 9990.00 cop[tikv] not(isnull(cte.t1.c1)) - └─TableFullScan_16 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo +MergeJoin 12487.50 root inner join, left key:cte.t1.c1, right key:cte.tpk.c1 +├─TableReader(Build) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:tpk keep order:true, stats:pseudo +└─Sort(Probe) 9990.00 root cte.t1.c1 + └─TableReader 9990.00 root data:Selection + └─Selection 9990.00 cop[tikv] not(isnull(cte.t1.c1)) + └─TableFullScan 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo with cte1 as (select c1 from tpk order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; c1 c1 1 1 @@ -521,16 +521,16 @@ c1 c1 2 2 2 2 // HashJoin. No need to sort -explain with cte1 as (select c1 from t1) select /*+ HASH_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = 1 order by 1, 2; +explain format='brief' with cte1 as (select c1 from t1) select /*+ HASH_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = 1 order by 1, 2; id estRows task access object operator info -Sort_13 100000.00 root cte.t1.c1, cte.t1.c1 -└─Projection_16 100000.00 root cte.t1.c1, cte.t1.c1 - └─HashJoin_18 100000.00 root CARTESIAN inner join - ├─TableReader_21(Build) 10.00 root data:Selection_20 - │ └─Selection_20 10.00 cop[tikv] eq(cte.t1.c1, 1) - │ └─TableFullScan_19 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo - └─TableReader_23(Probe) 10000.00 root data:TableFullScan_22 - └─TableFullScan_22 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo +Sort 100000.00 root cte.t1.c1, cte.t1.c1 +└─Projection 100000.00 root cte.t1.c1, cte.t1.c1 + └─HashJoin 100000.00 root CARTESIAN inner join + ├─TableReader(Build) 10.00 root data:Selection + │ └─Selection 10.00 cop[tikv] eq(cte.t1.c1, 1) + │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo with cte1 as (select c1 from t1) select /*+ HASH_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = 1 order by 1, 2; c1 c1 1 1 @@ -541,45 +541,20 @@ c1 c1 2 1 2 1 2 1 -explain with cte1 as (select c1 from tpk) select /*+ HASH_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = 1 order by 1, 2; +explain format='brief' with cte1 as (select c1 from tpk) select /*+ HASH_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = 1 order by 1, 2; id estRows task access object operator info -Sort_13 10000.00 root cte.t1.c1, cte.tpk.c1 -└─Projection_16 10000.00 root cte.t1.c1, cte.tpk.c1 - └─HashJoin_18 10000.00 root CARTESIAN inner join - ├─Point_Get_19(Build) 1.00 root table:tpk handle:1 - └─TableReader_21(Probe) 10000.00 root data:TableFullScan_20 - └─TableFullScan_20 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo +Sort 10000.00 root cte.t1.c1, cte.tpk.c1 +└─Projection 10000.00 root cte.t1.c1, cte.tpk.c1 + └─HashJoin 10000.00 root CARTESIAN inner join + ├─Point_Get(Build) 1.00 root table:tpk handle:1 + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo with cte1 as (select c1 from tpk) select /*+ HASH_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = 1 order by 1, 2; c1 c1 1 1 1 1 2 1 2 1 -// Use same CTE. -drop table if exists tpk1, tpk; -create table tpk(c1 int primary key); -insert into tpk values(1), (2), (3); -create table tpk1(c1 int primary key); -insert into tpk1 values(1), (2), (3); -explain with cte1 as (select c1 from tpk) select /*+ merge_join(dt1, dt2) */ * from tpk1 dt1 inner join cte1 dt2 inner join cte1 dt3 on dt1.c1 = dt2.c1 and dt2.c1 = dt3.c1; -id estRows task access object operator info -HashJoin_19 12500.00 root inner join, equal:[eq(cte.tpk.c1, cte.tpk.c1)] -├─Selection_28(Build) 8000.00 root not(isnull(cte.tpk.c1)) -│ └─CTEFullScan_29 10000.00 root CTE:cte1 AS dt3 data:CTE_0 -└─MergeJoin_21(Probe) 10000.00 root inner join, left key:cte.tpk1.c1, right key:cte.tpk.c1 - ├─Sort_27(Build) 8000.00 root cte.tpk.c1 - │ └─Selection_25 8000.00 root not(isnull(cte.tpk.c1)) - │ └─CTEFullScan_26 10000.00 root CTE:cte1 AS dt2 data:CTE_0 - └─TableReader_23(Probe) 10000.00 root data:TableFullScan_22 - └─TableFullScan_22 10000.00 cop[tikv] table:dt1 keep order:true, stats:pseudo -CTE_0 10000.00 root Non-Recursive CTE -└─TableReader_15(Seed Part) 10000.00 root data:TableFullScan_14 - └─TableFullScan_14 10000.00 cop[tikv] table:tpk keep order:false, stats:pseudo -with cte1 as (select c1 from tpk) select /*+ merge_join(dt1, dt2) */ * from tpk1 dt1 inner join cte1 dt2 inner join cte1 dt3 on dt1.c1 = dt2.c1 and dt2.c1 = dt3.c1; -c1 c1 c1 -1 1 1 -2 2 2 -3 3 3 // Test CTE as inner side of Apply drop table if exists t1, t2; create table t1(c1 int, c2 int); diff --git a/tests/integrationtest/r/planner/core/casetest/rule/rule_derive_topn_from_window.result b/tests/integrationtest/r/planner/core/casetest/rule/rule_derive_topn_from_window.result index 9ac40b62945bb..07fa422b112f8 100644 --- a/tests/integrationtest/r/planner/core/casetest/rule/rule_derive_topn_from_window.result +++ b/tests/integrationtest/r/planner/core/casetest/rule/rule_derive_topn_from_window.result @@ -111,11 +111,12 @@ explain format = 'brief' select * from (select a, row_number() over (partition b id estRows task access object operator info Projection 8000.00 root planner__core__casetest__rule__rule_derive_topn_from_window.ti.a, Column#6 └─Selection 8000.00 root le(Column#6, 1) - └─Window 10000.00 root row_number()->Column#6 over(partition by planner__core__casetest__rule__rule_derive_topn_from_window.ti.c rows between current row and current row) - └─Projection 10000.00 root planner__core__casetest__rule__rule_derive_topn_from_window.ti.a, planner__core__casetest__rule__rule_derive_topn_from_window.ti.c - └─IndexLookUp 10000.00 root - ├─IndexFullScan(Build) 10000.00 cop[tikv] table:ti, index:c(c) keep order:true, stats:pseudo - └─TableRowIDScan(Probe) 10000.00 cop[tikv] table:ti keep order:false, stats:pseudo + └─Shuffle 10000.00 root execution info: concurrency:5, data sources:[TableReader] + └─Window 10000.00 root row_number()->Column#6 over(partition by planner__core__casetest__rule__rule_derive_topn_from_window.ti.c rows between current row and current row) + └─Sort 10000.00 root planner__core__casetest__rule__rule_derive_topn_from_window.ti.c + └─ShuffleReceiver 10000.00 root + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:ti keep order:false, stats:pseudo explain format = 'brief' with agg_t as (select count(*) cnt, a from t group by a) select * from (select row_number() over () as rownumber from agg_t) DT where rownumber <= 3 -- pattern on non-data source; id estRows task access object operator info Projection 6400.00 root Column#14 diff --git a/tests/integrationtest/r/planner/core/casetest/rule/rule_join_reorder.result b/tests/integrationtest/r/planner/core/casetest/rule/rule_join_reorder.result index 297bd172295fb..db8b8662267f8 100644 --- a/tests/integrationtest/r/planner/core/casetest/rule/rule_join_reorder.result +++ b/tests/integrationtest/r/planner/core/casetest/rule/rule_join_reorder.result @@ -2213,15 +2213,14 @@ HashJoin 15593.77 root inner join, equal:[eq(planner__core__casetest__rule__rul │ └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t2.b)) │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo └─MergeJoin(Probe) 12475.01 root inner join, left key:planner__core__casetest__rule__rule_join_reorder.t.a, right key:planner__core__casetest__rule__rule_join_reorder.t1.a - ├─Projection(Build) 9980.01 root planner__core__casetest__rule__rule_join_reorder.t1.a, planner__core__casetest__rule__rule_join_reorder.t1.b - │ └─IndexLookUp 9980.01 root - │ ├─IndexFullScan(Build) 9990.00 cop[tikv] table:t1, index:a(a) keep order:true, stats:pseudo - │ └─Selection(Probe) 9980.01 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t1.b)) - │ └─TableRowIDScan 9990.00 cop[tikv] table:t1 keep order:false, stats:pseudo - └─Projection(Probe) 9990.00 root planner__core__casetest__rule__rule_join_reorder.t.a, planner__core__casetest__rule__rule_join_reorder.t.b - └─IndexLookUp 9990.00 root - ├─IndexFullScan(Build) 9990.00 cop[tikv] table:t, index:a(a) keep order:true, stats:pseudo - └─TableRowIDScan(Probe) 9990.00 cop[tikv] table:t keep order:false, stats:pseudo + ├─Sort(Build) 9980.01 root planner__core__casetest__rule__rule_join_reorder.t1.a + │ └─TableReader 9980.01 root data:Selection + │ └─Selection 9980.01 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t1.a)), not(isnull(planner__core__casetest__rule__rule_join_reorder.t1.b)) + │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo + └─Sort(Probe) 9990.00 root planner__core__casetest__rule__rule_join_reorder.t.a + └─TableReader 9990.00 root data:Selection + └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t.a)) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ straight_join() INL_JOIN(t1) */ * from t, t1, t2 where t.a = t1.a and t1.b=t2.b; id estRows task access object operator info HashJoin 15593.77 root inner join, equal:[eq(planner__core__casetest__rule__rule_join_reorder.t1.b, planner__core__casetest__rule__rule_join_reorder.t2.b)] diff --git a/tests/integrationtest/r/planner/core/integration.result b/tests/integrationtest/r/planner/core/integration.result index 5d11834452edd..a050b898a80e2 100644 --- a/tests/integrationtest/r/planner/core/integration.result +++ b/tests/integrationtest/r/planner/core/integration.result @@ -4268,22 +4268,6 @@ pad char(60) NOT NULL DEFAULT '', PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */, KEY k (k) ); -set @@tidb_opt_fix_control = '46177:off'; -explain format='brief' select row_number() over(order by a.k) from (select * from sbtest where id<10) a; -id estRows task access object operator info -Projection 10.00 root Column#6->Column#7 -└─Window 10.00 root row_number()->Column#6 over(order by planner__core__integration.sbtest.k rows between current row and current row) - └─IndexReader 10.00 root index:Selection - └─Selection 10.00 cop[tikv] lt(planner__core__integration.sbtest.id, 10) - └─IndexFullScan 10000.00 cop[tikv] table:sbtest, index:k(k) keep order:true, stats:pseudo -explain format='brief' select /*+ stream_agg() */ count(1) from sbtest where id<1 group by k; -id estRows task access object operator info -StreamAgg 1.00 root group by:planner__core__integration.sbtest.k, funcs:count(Column#6)->Column#5 -└─IndexReader 1.00 root index:StreamAgg - └─StreamAgg 1.00 cop[tikv] group by:planner__core__integration.sbtest.k, funcs:count(1)->Column#6 - └─Selection 1.00 cop[tikv] lt(planner__core__integration.sbtest.id, 1) - └─IndexFullScan 10000.00 cop[tikv] table:sbtest, index:k(k) keep order:true, stats:pseudo -set @@tidb_opt_fix_control = '46177:on'; explain format='brief' select row_number() over(order by a.k) from (select * from sbtest where id<10) a; id estRows task access object operator info Projection 10.00 root Column#6->Column#7 @@ -4297,7 +4281,6 @@ StreamAgg 1.00 root group by:planner__core__integration.sbtest.k, funcs:count(1 └─Sort 1.00 root planner__core__integration.sbtest.k └─TableReader 1.00 root data:TableRangeScan └─TableRangeScan 1.00 cop[tikv] table:sbtest range:[0,1), keep order:false, stats:pseudo -set @@tidb_opt_fix_control = default; create table sys.t (id int); insert into sys.t values (1),(2); set tidb_isolation_read_engines='tiflash'; diff --git a/tests/integrationtest/t/cte.test b/tests/integrationtest/t/cte.test index ae9fc79d53338..56b1f49bb5fb2 100644 --- a/tests/integrationtest/t/cte.test +++ b/tests/integrationtest/t/cte.test @@ -185,49 +185,41 @@ create table tpk(c1 int primary key); insert into tpk values(1), (2), (3); --echo // Expect a Sort operator on CTE. -explain with cte1 as (select c1 from t1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; +explain format='brief' with cte1 as (select c1 from t1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; with cte1 as (select c1 from t1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; --echo // Sort should not exist, because tpk.c1 is pk. Not the best plan for now(#25674). -explain with cte1 as (select c1 from tpk) select /*+ MERGE_JOIN(dt1, dt2) */ * from tpk dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; +explain format='brief' with cte1 as (select c1 from tpk) select /*+ MERGE_JOIN(dt1, dt2) */ * from tpk dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; with cte1 as (select c1 from tpk) select /*+ MERGE_JOIN(dt1, dt2) */ * from tpk dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; --echo // Sort should not exist, because we have order by in CTE definition. Not the best plan for now(#25674). -explain with cte1 as (select c1 from t1 order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; +explain format='brief' with cte1 as (select c1 from t1 order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; with cte1 as (select c1 from t1 order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; --echo // Expect a Sort operator on CTE. Because it's recursive. -explain with recursive cte1 as (select c1 from t1 union select c1 +1 c1 from cte1 where c1 < 3) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; +explain format='brief' with recursive cte1 as (select c1 from t1 union select c1 +1 c1 from cte1 where c1 < 3) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; with recursive cte1 as (select c1 from t1 union select c1 +1 c1 from cte1 where c1 < 3) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; --echo // Expect a Sort operator on CTE. Because it's recursive. -explain with recursive cte1 as (select c1 from tpk union select c1 +1 c1 from cte1 where c1 < 3) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; +explain format='brief' with recursive cte1 as (select c1 from tpk union select c1 +1 c1 from cte1 where c1 < 3) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; with recursive cte1 as (select c1 from tpk union select c1 +1 c1 from cte1 where c1 < 3) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; --echo // Got order by in CTE definition --echo // Expect Sort operator in CTE definition. -explain with cte1 as (select c1 from t1 order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; +explain format='brief' with cte1 as (select c1 from t1 order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; with cte1 as (select c1 from t1 order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; --echo // Sort should not exist, because tpk is ordered. Not the best plan for now(#25674). -explain with cte1 as (select c1 from tpk order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; +explain format='brief' with cte1 as (select c1 from tpk order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; with cte1 as (select c1 from tpk order by c1) select /*+ MERGE_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = dt1.c1 order by 1, 2; --echo // HashJoin. No need to sort -explain with cte1 as (select c1 from t1) select /*+ HASH_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = 1 order by 1, 2; +explain format='brief' with cte1 as (select c1 from t1) select /*+ HASH_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = 1 order by 1, 2; with cte1 as (select c1 from t1) select /*+ HASH_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = 1 order by 1, 2; -explain with cte1 as (select c1 from tpk) select /*+ HASH_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = 1 order by 1, 2; +explain format='brief' with cte1 as (select c1 from tpk) select /*+ HASH_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = 1 order by 1, 2; with cte1 as (select c1 from tpk) select /*+ HASH_JOIN(dt1, dt2) */ * from t1 dt1 inner join cte1 dt2 on dt2.c1 = 1 order by 1, 2; ---echo // Use same CTE. -drop table if exists tpk1, tpk; -create table tpk(c1 int primary key); -insert into tpk values(1), (2), (3); -create table tpk1(c1 int primary key); -insert into tpk1 values(1), (2), (3); -explain with cte1 as (select c1 from tpk) select /*+ merge_join(dt1, dt2) */ * from tpk1 dt1 inner join cte1 dt2 inner join cte1 dt3 on dt1.c1 = dt2.c1 and dt2.c1 = dt3.c1; -with cte1 as (select c1 from tpk) select /*+ merge_join(dt1, dt2) */ * from tpk1 dt1 inner join cte1 dt2 inner join cte1 dt3 on dt1.c1 = dt2.c1 and dt2.c1 = dt3.c1; #case 34 --echo // Test CTE as inner side of Apply drop table if exists t1, t2; diff --git a/tests/integrationtest/t/planner/core/integration.test b/tests/integrationtest/t/planner/core/integration.test index 6b20a60e81b17..202631982ee32 100644 --- a/tests/integrationtest/t/planner/core/integration.test +++ b/tests/integrationtest/t/planner/core/integration.test @@ -2353,14 +2353,9 @@ CREATE TABLE sbtest ( PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */, KEY k (k) ); -## cannot choose the best plan with RangeScan. -set @@tidb_opt_fix_control = '46177:off'; +## confirm that we can choose the best plan with RangeScan. explain format='brief' select row_number() over(order by a.k) from (select * from sbtest where id<10) a; explain format='brief' select /*+ stream_agg() */ count(1) from sbtest where id<1 group by k; -set @@tidb_opt_fix_control = '46177:on'; -explain format='brief' select row_number() over(order by a.k) from (select * from sbtest where id<10) a; -explain format='brief' select /*+ stream_agg() */ count(1) from sbtest where id<1 group by k; -set @@tidb_opt_fix_control = default; # TestSysIsAccessibleWithTiFlashReadIsolation create table sys.t (id int);