From e979cff6bb8ed95f24384a6c7eff7f9fd54fd570 Mon Sep 17 00:00:00 2001 From: Yiding Cui Date: Wed, 27 Nov 2019 16:39:19 +0800 Subject: [PATCH] planner: add column mapping in explain result (#13640) --- .../r/access_path_selection.result | 14 +- cmd/explaintest/r/access_tiflash.result | 22 +- cmd/explaintest/r/black_list.result | 14 +- .../r/explain-non-select-stmt.result | 6 +- cmd/explaintest/r/explain.result | 8 +- cmd/explaintest/r/explain_complex.result | 78 +- .../r/explain_complex_stats.result | 58 +- cmd/explaintest/r/explain_easy.result | 330 ++-- cmd/explaintest/r/explain_easy_stats.result | 46 +- cmd/explaintest/r/explain_indexmerge.result | 14 +- cmd/explaintest/r/generated_columns.result | 46 +- cmd/explaintest/r/index_join.result | 28 +- cmd/explaintest/r/partition_pruning.result | 1348 ++++++++--------- cmd/explaintest/r/select.result | 96 +- cmd/explaintest/r/subquery.result | 24 +- cmd/explaintest/r/topn_push_down.result | 56 +- cmd/explaintest/r/topn_pushdown.result | 4 +- cmd/explaintest/r/tpch.result | 372 ++--- cmd/explaintest/r/window_function.result | 24 +- executor/aggregate_test.go | 83 +- executor/executor_test.go | 2 +- executor/join_test.go | 42 +- executor/merge_join_test.go | 4 +- executor/testdata/agg_suite_in.json | 19 + executor/testdata/agg_suite_out.json | 81 + expression/builtin_compare_test.go | 50 +- expression/column.go | 5 + expression/constant_fold_test.go | 2 +- expression/explain.go | 16 +- expression/expression.go | 3 +- expression/integration_test.go | 24 +- expression/testdata/expression_suite_out.json | 72 +- planner/cascades/integration_test.go | 2 +- .../testdata/integration_suite_out.json | 110 +- .../cascades/testdata/stringer_suite_out.json | 152 +- .../transformation_rules_suite_out.json | 248 +-- planner/core/cbo_test.go | 388 ++--- planner/core/explain.go | 30 +- planner/core/indexmerge_test.go | 64 +- planner/core/logical_plan_builder.go | 4 +- planner/core/logical_plan_test.go | 762 ++-------- planner/core/physical_plan_test.go | 56 +- planner/core/stringer.go | 2 +- planner/core/testdata/analyze_suite_in.json | 103 ++ planner/core/testdata/analyze_suite_out.json | 234 ++- .../core/testdata/index_merge_suite_in.json | 13 + .../core/testdata/index_merge_suite_out.json | 13 + .../core/testdata/integration_suite_out.json | 32 +- planner/core/testdata/plan_suite_in.json | 9 + planner/core/testdata/plan_suite_out.json | 327 ++-- .../testdata/plan_suite_unexported_in.json | 182 +++ .../testdata/plan_suite_unexported_out.json | 752 ++++++--- statistics/selectivity_test.go | 127 +- statistics/testdata/stats_suite_in.json | 42 + statistics/testdata/stats_suite_out.json | 83 + table/tables/partition_test.go | 10 +- util/ranger/ranger_test.go | 240 +-- util/ranger/testdata/ranger_suite_out.json | 10 +- 58 files changed, 3735 insertions(+), 3251 deletions(-) create mode 100644 executor/testdata/agg_suite_in.json create mode 100644 executor/testdata/agg_suite_out.json create mode 100644 planner/core/testdata/index_merge_suite_in.json create mode 100644 planner/core/testdata/index_merge_suite_out.json create mode 100644 statistics/testdata/stats_suite_in.json create mode 100644 statistics/testdata/stats_suite_out.json diff --git a/cmd/explaintest/r/access_path_selection.result b/cmd/explaintest/r/access_path_selection.result index 6761099570558..ffe6046ece381 100644 --- a/cmd/explaintest/r/access_path_selection.result +++ b/cmd/explaintest/r/access_path_selection.result @@ -16,29 +16,29 @@ IndexReader_6 3323.33 root index:IndexScan_5 explain select a, b from access_path_selection where b < 3; id count task operator info TableReader_7 3323.33 root data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(Column#2, 3) +└─Selection_6 3323.33 cop[tikv] lt(test.access_path_selection.b, 3) └─TableScan_5 10000.00 cop[tikv] table:access_path_selection, range:[-inf,+inf], keep order:false, stats:pseudo explain select a, b from access_path_selection where a < 3 and b < 3; id count task operator info IndexReader_11 1104.45 root index:Selection_10 -└─Selection_10 1104.45 cop[tikv] lt(Column#2, 3) +└─Selection_10 1104.45 cop[tikv] lt(test.access_path_selection.b, 3) └─IndexScan_9 3323.33 cop[tikv] table:access_path_selection, index:a, b, range:[-inf,3), keep order:false, stats:pseudo explain select a, b from access_path_selection where a > 10 order by _tidb_rowid; id count task operator info -Projection_6 3333.33 root Column#1, Column#2 +Projection_6 3333.33 root test.access_path_selection.a, test.access_path_selection.b └─TableReader_13 3333.33 root data:Selection_12 - └─Selection_12 3333.33 cop[tikv] gt(Column#1, 10) + └─Selection_12 3333.33 cop[tikv] gt(test.access_path_selection.a, 10) └─TableScan_11 10000.00 cop[tikv] table:access_path_selection, range:[-inf,+inf], keep order:true, stats:pseudo explain select max(_tidb_rowid) from access_path_selection; id count task operator info -StreamAgg_13 1.00 root funcs:max(Column#3) +StreamAgg_13 1.00 root funcs:max(test.access_path_selection._tidb_rowid)->Column#4 └─Limit_17 1.00 root offset:0, count:1 └─TableReader_27 1.00 root data:Limit_26 └─Limit_26 1.00 cop[tikv] offset:0, count:1 └─TableScan_25 1.25 cop[tikv] table:access_path_selection, range:[-inf,+inf], keep order:true, desc, stats:pseudo explain select count(1) from access_path_selection; id count task operator info -StreamAgg_28 1.00 root funcs:count(Column#18) +StreamAgg_28 1.00 root funcs:count(Column#18)->Column#4 └─TableReader_29 1.00 root data:StreamAgg_8 - └─StreamAgg_8 1.00 cop[tikv] funcs:count(1) + └─StreamAgg_8 1.00 cop[tikv] funcs:count(1)->Column#18 └─TableScan_24 10000.00 cop[tikv] table:access_path_selection, range:[-inf,+inf], keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/access_tiflash.result b/cmd/explaintest/r/access_tiflash.result index f5bd4cace4dff..3bf05e9077180 100644 --- a/cmd/explaintest/r/access_tiflash.result +++ b/cmd/explaintest/r/access_tiflash.result @@ -2,33 +2,33 @@ drop table if exists t, tt; create table t(a int, b int, index ia(a)); desc select avg(a) from t; id count task operator info -StreamAgg_20 1.00 root funcs:avg(Column#7, Column#8) +StreamAgg_20 1.00 root funcs:avg(Column#7, Column#8)->Column#4 └─IndexReader_21 1.00 root index:StreamAgg_8 - └─StreamAgg_8 1.00 cop[tikv] funcs:avg(Column#1) + └─StreamAgg_8 1.00 cop[tikv] funcs:avg(test.t.a)->Column#7 └─IndexScan_19 10000.00 cop[tikv] table:t, index:a, range:[NULL,+inf], keep order:false, stats:pseudo desc select /*+ read_from_storage(tiflash[t]) */ avg(a) from t; id count task operator info -StreamAgg_16 1.00 root funcs:avg(Column#7, Column#8) +StreamAgg_16 1.00 root funcs:avg(Column#7, Column#8)->Column#4 └─TableReader_17 1.00 root data:StreamAgg_8 - └─StreamAgg_8 1.00 cop[tiflash] funcs:count(Column#1), sum(Column#1) + └─StreamAgg_8 1.00 cop[tiflash] funcs:count(test.t.a)->Column#7, funcs:sum(test.t.a)->Column#8 └─TableScan_15 10000.00 cop[tiflash] table:t, range:[-inf,+inf], keep order:false, stats:pseudo desc select /*+ read_from_storage(tiflash[t]) */ sum(a) from t; id count task operator info -StreamAgg_16 1.00 root funcs:sum(Column#6) +StreamAgg_16 1.00 root funcs:sum(Column#6)->Column#4 └─TableReader_17 1.00 root data:StreamAgg_8 - └─StreamAgg_8 1.00 cop[tiflash] funcs:sum(Column#1) + └─StreamAgg_8 1.00 cop[tiflash] funcs:sum(test.t.a)->Column#6 └─TableScan_15 10000.00 cop[tiflash] table:t, range:[-inf,+inf], keep order:false, stats:pseudo desc select /*+ read_from_storage(tiflash[t]) */ sum(a+1) from t; id count task operator info -StreamAgg_16 1.00 root funcs:sum(Column#6) +StreamAgg_16 1.00 root funcs:sum(Column#6)->Column#4 └─TableReader_17 1.00 root data:StreamAgg_8 - └─StreamAgg_8 1.00 cop[tiflash] funcs:sum(plus(Column#1, 1)) + └─StreamAgg_8 1.00 cop[tiflash] funcs:sum(plus(test.t.a, 1))->Column#6 └─TableScan_15 10000.00 cop[tiflash] table:t, range:[-inf,+inf], keep order:false, stats:pseudo desc select /*+ read_from_storage(tiflash[t]) */ sum(isnull(a)) from t; id count task operator info -StreamAgg_16 1.00 root funcs:sum(Column#6) +StreamAgg_16 1.00 root funcs:sum(Column#6)->Column#4 └─TableReader_17 1.00 root data:StreamAgg_8 - └─StreamAgg_8 1.00 cop[tiflash] funcs:sum(isnull(Column#1)) + └─StreamAgg_8 1.00 cop[tiflash] funcs:sum(isnull(test.t.a))->Column#6 └─TableScan_15 10000.00 cop[tiflash] table:t, range:[-inf,+inf], keep order:false, stats:pseudo create table tt(a int, b int, primary key(a)); desc select * from tt where (tt.a > 1 and tt.a < 20) or (tt.a >= 30 and tt.a < 55); @@ -38,5 +38,5 @@ TableReader_6 44.00 root data:TableScan_5 desc select /*+ read_from_storage(tiflash[tt]) */ * from tt where (tt.a > 1 and tt.a < 20) or (tt.a >= 30 and tt.a < 55); id count task operator info TableReader_7 44.00 root data:Selection_6 -└─Selection_6 44.00 cop[tiflash] or(and(gt(Column#1, 1), lt(Column#1, 20)), and(ge(Column#1, 30), lt(Column#1, 55))) +└─Selection_6 44.00 cop[tiflash] or(and(gt(test.tt.a, 1), lt(test.tt.a, 20)), and(ge(test.tt.a, 30), lt(test.tt.a, 55))) └─TableScan_5 44.00 cop[tiflash] table:tt, range:[-inf,+inf], keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/black_list.result b/cmd/explaintest/r/black_list.result index 991e6c2af5fab..f43e6944d73a6 100644 --- a/cmd/explaintest/r/black_list.result +++ b/cmd/explaintest/r/black_list.result @@ -4,14 +4,14 @@ create table t (a int); explain select * from t where a < 1; id count task operator info TableReader_7 3323.33 root data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(Column#1, 1) +└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1) └─TableScan_5 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo insert into mysql.opt_rule_blacklist values('predicate_push_down'); admin reload opt_rule_blacklist; explain select * from t where a < 1; id count task operator info -Selection_5 8000.00 root lt(Column#1, 1) +Selection_5 8000.00 root lt(test.t.a, 1) └─TableReader_7 10000.00 root data:TableScan_6 └─TableScan_6 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo delete from mysql.opt_rule_blacklist where name='predicate_push_down'; @@ -20,14 +20,14 @@ admin reload opt_rule_blacklist; explain select * from t where a < 1; id count task operator info TableReader_7 3323.33 root data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(Column#1, 1) +└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1) └─TableScan_5 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo insert into mysql.expr_pushdown_blacklist values('<'); admin reload expr_pushdown_blacklist; explain select * from t where a < 1; id count task operator info -Selection_5 8000.00 root lt(Column#1, 1) +Selection_5 8000.00 root lt(test.t.a, 1) └─TableReader_7 10000.00 root data:TableScan_6 └─TableScan_6 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo delete from mysql.expr_pushdown_blacklist where name='<'; @@ -36,14 +36,14 @@ admin reload expr_pushdown_blacklist; explain select * from t where a < 1; id count task operator info TableReader_7 3323.33 root data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(Column#1, 1) +└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1) └─TableScan_5 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo insert into mysql.expr_pushdown_blacklist values('lt'); admin reload expr_pushdown_blacklist; explain select * from t where a < 1; id count task operator info -Selection_5 8000.00 root lt(Column#1, 1) +Selection_5 8000.00 root lt(test.t.a, 1) └─TableReader_7 10000.00 root data:TableScan_6 └─TableScan_6 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo delete from mysql.expr_pushdown_blacklist where name='lt'; @@ -52,5 +52,5 @@ admin reload expr_pushdown_blacklist; explain select * from t where a < 1; id count task operator info TableReader_7 3323.33 root data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(Column#1, 1) +└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1) └─TableScan_5 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/explain-non-select-stmt.result b/cmd/explaintest/r/explain-non-select-stmt.result index 15835b2839a95..57495093ff9b9 100644 --- a/cmd/explaintest/r/explain-non-select-stmt.result +++ b/cmd/explaintest/r/explain-non-select-stmt.result @@ -13,17 +13,17 @@ explain delete from t where a > 100; id count task operator info Delete_4 N/A root N/A └─TableReader_8 3333.33 root data:Selection_7 - └─Selection_7 3333.33 cop[tikv] gt(Column#1, 100) + └─Selection_7 3333.33 cop[tikv] gt(test.t.a, 100) └─TableScan_6 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain update t set b = 100 where a = 200; id count task operator info Update_4 N/A root N/A └─TableReader_8 10.00 root data:Selection_7 - └─Selection_7 10.00 cop[tikv] eq(Column#1, 200) + └─Selection_7 10.00 cop[tikv] eq(test.t.a, 200) └─TableScan_6 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain replace into t select a, 100 from t; id count task operator info Insert_1 N/A root N/A -└─Projection_5 10000.00 root Column#3, 100 +└─Projection_5 10000.00 root test.t.a, 100->Column#6 └─TableReader_7 10000.00 root data:TableScan_6 └─TableScan_6 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/explain.result b/cmd/explaintest/r/explain.result index a4cc012e707b9..05140ec11395a 100644 --- a/cmd/explaintest/r/explain.result +++ b/cmd/explaintest/r/explain.result @@ -28,14 +28,14 @@ set session tidb_hashagg_partial_concurrency = 1; set session tidb_hashagg_final_concurrency = 1; explain select group_concat(a) from t group by id; id count task operator info -StreamAgg_8 8000.00 root group by:Column#6, funcs:group_concat(Column#5, ",") -└─Projection_18 10000.00 root cast(Column#2), Column#1 +StreamAgg_8 8000.00 root group by:Column#6, funcs:group_concat(Column#5, ",")->Column#4 +└─Projection_18 10000.00 root cast(test.t.a)->Column#5, test.t.id └─TableReader_15 10000.00 root data:TableScan_14 └─TableScan_14 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:true, stats:pseudo explain select group_concat(a, b) from t group by id; id count task operator info -StreamAgg_8 8000.00 root group by:Column#7, funcs:group_concat(Column#5, Column#6, ",") -└─Projection_18 10000.00 root cast(Column#2), cast(Column#3), Column#1 +StreamAgg_8 8000.00 root group by:Column#7, funcs:group_concat(Column#5, Column#6, ",")->Column#4 +└─Projection_18 10000.00 root cast(test.t.a)->Column#5, cast(test.t.b)->Column#6, test.t.id └─TableReader_15 10000.00 root data:TableScan_14 └─TableScan_14 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:true, stats:pseudo drop table t; diff --git a/cmd/explaintest/r/explain_complex.result b/cmd/explaintest/r/explain_complex.result index 438732aa452d7..3c53e8a937a84 100644 --- a/cmd/explaintest/r/explain_complex.result +++ b/cmd/explaintest/r/explain_complex.result @@ -105,68 +105,68 @@ PRIMARY KEY (`aid`,`dic`) ); explain SELECT `ds`, `p1`, `p2`, `p3`, `p4`, `p5`, `p6_md5`, `p7_md5`, count(dic) as install_device FROM `dt` use index (cmi) WHERE (`ds` >= '2016-09-01') AND (`ds` <= '2016-11-03') AND (`cm` IN ('1062', '1086', '1423', '1424', '1425', '1426', '1427', '1428', '1429', '1430', '1431', '1432', '1433', '1434', '1435', '1436', '1437', '1438', '1439', '1440', '1441', '1442', '1443', '1444', '1445', '1446', '1447', '1448', '1449', '1450', '1451', '1452', '1488', '1489', '1490', '1491', '1492', '1493', '1494', '1495', '1496', '1497', '1550', '1551', '1552', '1553', '1554', '1555', '1556', '1557', '1558', '1559', '1597', '1598', '1599', '1600', '1601', '1602', '1603', '1604', '1605', '1606', '1607', '1608', '1609', '1610', '1611', '1612', '1613', '1614', '1615', '1616', '1623', '1624', '1625', '1626', '1627', '1628', '1629', '1630', '1631', '1632', '1709', '1719', '1720', '1843', '2813', '2814', '2815', '2816', '2817', '2818', '2819', '2820', '2821', '2822', '2823', '2824', '2825', '2826', '2827', '2828', '2829', '2830', '2831', '2832', '2833', '2834', '2835', '2836', '2837', '2838', '2839', '2840', '2841', '2842', '2843', '2844', '2845', '2846', '2847', '2848', '2849', '2850', '2851', '2852', '2853', '2854', '2855', '2856', '2857', '2858', '2859', '2860', '2861', '2862', '2863', '2864', '2865', '2866', '2867', '2868', '2869', '2870', '2871', '2872', '3139', '3140', '3141', '3142', '3143', '3144', '3145', '3146', '3147', '3148', '3149', '3150', '3151', '3152', '3153', '3154', '3155', '3156', '3157', '3158', '3386', '3387', '3388', '3389', '3390', '3391', '3392', '3393', '3394', '3395', '3664', '3665', '3666', '3667', '3668', '3670', '3671', '3672', '3673', '3674', '3676', '3677', '3678', '3679', '3680', '3681', '3682', '3683', '3684', '3685', '3686', '3687', '3688', '3689', '3690', '3691', '3692', '3693', '3694', '3695', '3696', '3697', '3698', '3699', '3700', '3701', '3702', '3703', '3704', '3705', '3706', '3707', '3708', '3709', '3710', '3711', '3712', '3713', '3714', '3715', '3960', '3961', '3962', '3963', '3964', '3965', '3966', '3967', '3968', '3978', '3979', '3980', '3981', '3982', '3983', '3984', '3985', '3986', '3987', '4208', '4209', '4210', '4211', '4212', '4304', '4305', '4306', '4307', '4308', '4866', '4867', '4868', '4869', '4870', '4871', '4872', '4873', '4874', '4875')) GROUP BY `ds`, `p1`, `p2`, `p3`, `p4`, `p5`, `p6_md5`, `p7_md5` ORDER BY `ds2` DESC; id count task operator info -Projection_7 53.00 root Column#7, Column#11, Column#12, Column#13, Column#14, Column#15, Column#16, Column#17, Column#21 -└─Sort_8 53.00 root Column#8:desc - └─HashAgg_16 53.00 root group by:Column#11, Column#12, Column#13, Column#14, Column#15, Column#16, Column#17, Column#7, funcs:count(Column#32), firstrow(Column#7), firstrow(Column#34), firstrow(Column#11), firstrow(Column#12), firstrow(Column#13), firstrow(Column#14), firstrow(Column#15), firstrow(Column#16), firstrow(Column#17) +Projection_7 53.00 root test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, Column#21 +└─Sort_8 53.00 root test.dt.ds2:desc + └─HashAgg_16 53.00 root group by:test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, funcs:count(Column#32)->Column#21, funcs:firstrow(test.dt.ds)->test.dt.ds, funcs:firstrow(Column#34)->test.dt.ds2, funcs:firstrow(test.dt.p1)->test.dt.p1, funcs:firstrow(test.dt.p2)->test.dt.p2, funcs:firstrow(test.dt.p3)->test.dt.p3, funcs:firstrow(test.dt.p4)->test.dt.p4, funcs:firstrow(test.dt.p5)->test.dt.p5, funcs:firstrow(test.dt.p6_md5)->test.dt.p6_md5, funcs:firstrow(test.dt.p7_md5)->test.dt.p7_md5 └─IndexLookUp_17 53.00 root ├─IndexScan_13 2650.00 cop[tikv] table:dt, index:cm, range:[1062,1062], [1086,1086], [1423,1423], [1424,1424], [1425,1425], [1426,1426], [1427,1427], [1428,1428], [1429,1429], [1430,1430], [1431,1431], [1432,1432], [1433,1433], [1434,1434], [1435,1435], [1436,1436], [1437,1437], [1438,1438], [1439,1439], [1440,1440], [1441,1441], [1442,1442], [1443,1443], [1444,1444], [1445,1445], [1446,1446], [1447,1447], [1448,1448], [1449,1449], [1450,1450], [1451,1451], [1452,1452], [1488,1488], [1489,1489], [1490,1490], [1491,1491], [1492,1492], [1493,1493], [1494,1494], [1495,1495], [1496,1496], [1497,1497], [1550,1550], [1551,1551], [1552,1552], [1553,1553], [1554,1554], [1555,1555], [1556,1556], [1557,1557], [1558,1558], [1559,1559], [1597,1597], [1598,1598], [1599,1599], [1600,1600], [1601,1601], [1602,1602], [1603,1603], [1604,1604], [1605,1605], [1606,1606], [1607,1607], [1608,1608], [1609,1609], [1610,1610], [1611,1611], [1612,1612], [1613,1613], [1614,1614], [1615,1615], [1616,1616], [1623,1623], [1624,1624], [1625,1625], [1626,1626], [1627,1627], [1628,1628], [1629,1629], [1630,1630], [1631,1631], [1632,1632], [1709,1709], [1719,1719], [1720,1720], [1843,1843], [2813,2813], [2814,2814], [2815,2815], [2816,2816], [2817,2817], [2818,2818], [2819,2819], [2820,2820], [2821,2821], [2822,2822], [2823,2823], [2824,2824], [2825,2825], [2826,2826], [2827,2827], [2828,2828], [2829,2829], [2830,2830], [2831,2831], [2832,2832], [2833,2833], [2834,2834], [2835,2835], [2836,2836], [2837,2837], [2838,2838], [2839,2839], [2840,2840], [2841,2841], [2842,2842], [2843,2843], [2844,2844], [2845,2845], [2846,2846], [2847,2847], [2848,2848], [2849,2849], [2850,2850], [2851,2851], [2852,2852], [2853,2853], [2854,2854], [2855,2855], [2856,2856], [2857,2857], [2858,2858], [2859,2859], [2860,2860], [2861,2861], [2862,2862], [2863,2863], [2864,2864], [2865,2865], [2866,2866], [2867,2867], [2868,2868], [2869,2869], [2870,2870], [2871,2871], [2872,2872], [3139,3139], [3140,3140], [3141,3141], [3142,3142], [3143,3143], [3144,3144], [3145,3145], [3146,3146], [3147,3147], [3148,3148], [3149,3149], [3150,3150], [3151,3151], [3152,3152], [3153,3153], [3154,3154], [3155,3155], [3156,3156], [3157,3157], [3158,3158], [3386,3386], [3387,3387], [3388,3388], [3389,3389], [3390,3390], [3391,3391], [3392,3392], [3393,3393], [3394,3394], [3395,3395], [3664,3664], [3665,3665], [3666,3666], [3667,3667], [3668,3668], [3670,3670], [3671,3671], [3672,3672], [3673,3673], [3674,3674], [3676,3676], [3677,3677], [3678,3678], [3679,3679], [3680,3680], [3681,3681], [3682,3682], [3683,3683], [3684,3684], [3685,3685], [3686,3686], [3687,3687], [3688,3688], [3689,3689], [3690,3690], [3691,3691], [3692,3692], [3693,3693], [3694,3694], [3695,3695], [3696,3696], [3697,3697], [3698,3698], [3699,3699], [3700,3700], [3701,3701], [3702,3702], [3703,3703], [3704,3704], [3705,3705], [3706,3706], [3707,3707], [3708,3708], [3709,3709], [3710,3710], [3711,3711], [3712,3712], [3713,3713], [3714,3714], [3715,3715], [3960,3960], [3961,3961], [3962,3962], [3963,3963], [3964,3964], [3965,3965], [3966,3966], [3967,3967], [3968,3968], [3978,3978], [3979,3979], [3980,3980], [3981,3981], [3982,3982], [3983,3983], [3984,3984], [3985,3985], [3986,3986], [3987,3987], [4208,4208], [4209,4209], [4210,4210], [4211,4211], [4212,4212], [4304,4304], [4305,4305], [4306,4306], [4307,4307], [4308,4308], [4866,4866], [4867,4867], [4868,4868], [4869,4869], [4870,4870], [4871,4871], [4872,4872], [4873,4873], [4874,4874], [4875,4875], keep order:false, stats:pseudo - └─HashAgg_11 53.00 cop[tikv] group by:Column#11, Column#12, Column#13, Column#14, Column#15, Column#16, Column#17, Column#7, funcs:count(Column#5), firstrow(Column#8) - └─Selection_15 66.25 cop[tikv] ge(Column#7, 2016-09-01 00:00:00.000000), le(Column#7, 2016-11-03 00:00:00.000000) + └─HashAgg_11 53.00 cop[tikv] group by:test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, funcs:count(test.dt.dic)->Column#32, funcs:firstrow(test.dt.ds2)->Column#34 + └─Selection_15 66.25 cop[tikv] ge(test.dt.ds, 2016-09-01 00:00:00.000000), le(test.dt.ds, 2016-11-03 00:00:00.000000) └─TableScan_14 2650.00 cop[tikv] table:dt, keep order:false, stats:pseudo explain select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext, gad.t as gtime from st gad join (select id, aid, pt, dic, ip, t from dd where pt = 'android' and bm = 0 and t > 1478143908) sdk on gad.aid = sdk.aid and gad.ip = sdk.ip and sdk.t > gad.t where gad.t > 1478143908 and gad.pt = 'android' group by gad.aid, sdk.dic limit 2500; id count task operator info -Projection_13 1.00 root Column#1, Column#20, Column#3, Column#4, Column#23, Column#26, Column#27, Column#8, Column#9, Column#10, Column#11, Column#12, Column#13, Column#14, Column#15, Column#19 +Projection_13 1.00 root test.st.id, test.dd.id, test.st.aid, test.st.cm, test.dd.dic, test.dd.ip, test.dd.t, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, test.st.ext, test.st.t └─Limit_16 1.00 root offset:0, count:2500 - └─HashAgg_19 1.00 root group by:Column#23, Column#3, funcs:firstrow(Column#1), firstrow(Column#3), firstrow(Column#4), firstrow(Column#8), firstrow(Column#9), firstrow(Column#10), firstrow(Column#11), firstrow(Column#12), firstrow(Column#13), firstrow(Column#14), firstrow(Column#15), firstrow(Column#19), firstrow(Column#20), firstrow(Column#23), firstrow(Column#26), firstrow(Column#27) - └─IndexMergeJoin_30 0.00 root inner join, inner:IndexLookUp_28, outer key:Column#3, inner key:Column#21, other cond:eq(Column#26, Column#5), gt(Column#27, Column#19) + └─HashAgg_19 1.00 root group by:test.dd.dic, test.st.aid, funcs:firstrow(test.st.id)->test.st.id, funcs:firstrow(test.st.aid)->test.st.aid, funcs:firstrow(test.st.cm)->test.st.cm, funcs:firstrow(test.st.p1)->test.st.p1, funcs:firstrow(test.st.p2)->test.st.p2, funcs:firstrow(test.st.p3)->test.st.p3, funcs:firstrow(test.st.p4)->test.st.p4, funcs:firstrow(test.st.p5)->test.st.p5, funcs:firstrow(test.st.p6_md5)->test.st.p6_md5, funcs:firstrow(test.st.p7_md5)->test.st.p7_md5, funcs:firstrow(test.st.ext)->test.st.ext, funcs:firstrow(test.st.t)->test.st.t, funcs:firstrow(test.dd.id)->test.dd.id, funcs:firstrow(test.dd.dic)->test.dd.dic, funcs:firstrow(test.dd.ip)->test.dd.ip, funcs:firstrow(test.dd.t)->test.dd.t + └─IndexMergeJoin_30 0.00 root inner join, inner:IndexLookUp_28, outer key:test.st.aid, inner key:test.dd.aid, other cond:eq(test.dd.ip, test.st.ip), gt(test.dd.t, test.st.t) ├─IndexLookUp_28 0.00 root - │ ├─IndexScan_25 0.00 cop[tikv] table:dd, index:aid, dic, range: decided by [eq(Column#21, Column#3)], keep order:true, stats:pseudo - │ └─Selection_27 0.00 cop[tikv] eq(Column#22, "android"), eq(Column#28, 0), gt(Column#27, 1478143908), not(isnull(Column#26)), not(isnull(Column#27)) + │ ├─IndexScan_25 0.00 cop[tikv] table:dd, index:aid, dic, range: decided by [eq(test.dd.aid, test.st.aid)], keep order:true, stats:pseudo + │ └─Selection_27 0.00 cop[tikv] eq(test.dd.bm, 0), eq(test.dd.pt, "android"), gt(test.dd.t, 1478143908), not(isnull(test.dd.ip)), not(isnull(test.dd.t)) │ └─TableScan_26 0.00 cop[tikv] table:dd, keep order:false, stats:pseudo └─IndexLookUp_41 3.33 root ├─IndexScan_38 3333.33 cop[tikv] table:gad, index:t, range:(1478143908,+inf], keep order:false, stats:pseudo - └─Selection_40 3.33 cop[tikv] eq(Column#2, "android"), not(isnull(Column#5)) + └─Selection_40 3.33 cop[tikv] eq(test.st.pt, "android"), not(isnull(test.st.ip)) └─TableScan_39 3333.33 cop[tikv] table:gad, keep order:false, stats:pseudo explain select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext from st gad join dd sdk on gad.aid = sdk.aid and gad.dic = sdk.mac and gad.t < sdk.t where gad.t > 1477971479 and gad.bm = 0 and gad.pt = 'ios' and gad.dit = 'mac' and sdk.t > 1477971479 and sdk.bm = 0 and sdk.pt = 'ios' limit 3000; id count task operator info -Projection_10 0.00 root Column#1, Column#20, Column#3, Column#4, Column#23, Column#26, Column#27, Column#8, Column#9, Column#10, Column#11, Column#12, Column#13, Column#14, Column#15 +Projection_10 0.00 root test.st.id, test.dd.id, test.st.aid, test.st.cm, test.dd.dic, test.dd.ip, test.dd.t, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, test.st.ext └─Limit_13 0.00 root offset:0, count:3000 - └─IndexMergeJoin_24 0.00 root inner join, inner:IndexLookUp_22, outer key:Column#3, inner key:Column#21, other cond:eq(Column#6, Column#25), lt(Column#19, Column#27) + └─IndexMergeJoin_24 0.00 root inner join, inner:IndexLookUp_22, outer key:test.st.aid, inner key:test.dd.aid, other cond:eq(test.st.dic, test.dd.mac), lt(test.st.t, test.dd.t) ├─IndexLookUp_35 0.00 root │ ├─IndexScan_32 3333.33 cop[tikv] table:gad, index:t, range:(1477971479,+inf], keep order:false, stats:pseudo - │ └─Selection_34 0.00 cop[tikv] eq(Column#16, 0), eq(Column#2, "ios"), eq(Column#7, "mac"), not(isnull(Column#6)) + │ └─Selection_34 0.00 cop[tikv] eq(test.st.bm, 0), eq(test.st.dit, "mac"), eq(test.st.pt, "ios"), not(isnull(test.st.dic)) │ └─TableScan_33 3333.33 cop[tikv] table:gad, keep order:false, stats:pseudo └─IndexLookUp_22 0.00 root - ├─IndexScan_19 0.00 cop[tikv] table:sdk, index:aid, dic, range: decided by [eq(Column#21, Column#3)], keep order:true, stats:pseudo - └─Selection_21 0.00 cop[tikv] eq(Column#22, "ios"), eq(Column#28, 0), gt(Column#27, 1477971479), not(isnull(Column#25)), not(isnull(Column#27)) + ├─IndexScan_19 0.00 cop[tikv] table:sdk, index:aid, dic, range: decided by [eq(test.dd.aid, test.st.aid)], keep order:true, stats:pseudo + └─Selection_21 0.00 cop[tikv] eq(test.dd.bm, 0), eq(test.dd.pt, "ios"), gt(test.dd.t, 1477971479), not(isnull(test.dd.mac)), not(isnull(test.dd.t)) └─TableScan_20 0.00 cop[tikv] table:sdk, keep order:false, stats:pseudo explain SELECT cm, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(1) as click_pv, count(DISTINCT ip) as click_ip FROM st WHERE (t between 1478188800 and 1478275200) and aid='cn.sbkcq' and pt='android' GROUP BY cm, p1, p2, p3, p4, p5, p6_md5, p7_md5; id count task operator info -Projection_5 1.00 root Column#4, Column#8, Column#9, Column#10, Column#11, Column#12, Column#13, Column#14, Column#20, Column#21 -└─HashAgg_7 1.00 root group by:Column#10, Column#11, Column#12, Column#13, Column#14, Column#4, Column#8, Column#9, funcs:count(1), count(distinct Column#5), firstrow(Column#4), firstrow(Column#8), firstrow(Column#9), firstrow(Column#10), firstrow(Column#11), firstrow(Column#12), firstrow(Column#13), firstrow(Column#14) +Projection_5 1.00 root test.st.cm, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, Column#20, Column#21 +└─HashAgg_7 1.00 root group by:test.st.cm, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, funcs:count(1)->Column#20, funcs:count(distinct test.st.ip)->Column#21, funcs:firstrow(test.st.cm)->test.st.cm, funcs:firstrow(test.st.p1)->test.st.p1, funcs:firstrow(test.st.p2)->test.st.p2, funcs:firstrow(test.st.p3)->test.st.p3, funcs:firstrow(test.st.p4)->test.st.p4, funcs:firstrow(test.st.p5)->test.st.p5, funcs:firstrow(test.st.p6_md5)->test.st.p6_md5, funcs:firstrow(test.st.p7_md5)->test.st.p7_md5 └─IndexLookUp_15 0.00 root ├─IndexScan_12 250.00 cop[tikv] table:st, index:t, range:[1478188800,1478275200], keep order:false, stats:pseudo - └─Selection_14 0.00 cop[tikv] eq(Column#2, "android"), eq(Column#3, "cn.sbkcq") + └─Selection_14 0.00 cop[tikv] eq(test.st.aid, "cn.sbkcq"), eq(test.st.pt, "android") └─TableScan_13 250.00 cop[tikv] table:st, keep order:false, stats:pseudo explain select dt.id as id, dt.aid as aid, dt.pt as pt, dt.dic as dic, dt.cm as cm, rr.gid as gid, rr.acd as acd, rr.t as t,dt.p1 as p1, dt.p2 as p2, dt.p3 as p3, dt.p4 as p4, dt.p5 as p5, dt.p6_md5 as p6, dt.p7_md5 as p7 from dt dt join rr rr on (rr.pt = 'ios' and rr.t > 1478185592 and dt.aid = rr.aid and dt.dic = rr.dic) where dt.pt = 'ios' and dt.t > 1478185592 and dt.bm = 0 limit 2000; id count task operator info -Projection_10 0.00 root Column#1, Column#2, Column#4, Column#5, Column#3, Column#24, Column#25, Column#26, Column#11, Column#12, Column#13, Column#14, Column#15, Column#16, Column#17 +Projection_10 0.00 root test.dt.id, test.dt.aid, test.dt.pt, test.dt.dic, test.dt.cm, test.rr.gid, test.rr.acd, test.rr.t, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5 └─Limit_13 0.00 root offset:0, count:2000 - └─IndexJoin_19 0.00 root inner join, inner:IndexLookUp_18, outer key:Column#2, Column#5, inner key:Column#21, Column#23 + └─IndexJoin_19 0.00 root inner join, inner:IndexLookUp_18, outer key:test.dt.aid, test.dt.dic, inner key:test.rr.aid, test.rr.dic ├─TableReader_43 0.00 root data:Selection_42 - │ └─Selection_42 0.00 cop[tikv] eq(Column#18, 0), eq(Column#4, "ios"), gt(Column#9, 1478185592), not(isnull(Column#5)) + │ └─Selection_42 0.00 cop[tikv] eq(test.dt.bm, 0), eq(test.dt.pt, "ios"), gt(test.dt.t, 1478185592), not(isnull(test.dt.dic)) │ └─TableScan_41 10000.00 cop[tikv] table:dt, range:[0,+inf], keep order:false, stats:pseudo └─IndexLookUp_18 0.00 root - ├─IndexScan_15 1.25 cop[tikv] table:rr, index:aid, dic, range: decided by [eq(Column#21, Column#2) eq(Column#23, Column#5)], keep order:false, stats:pseudo - └─Selection_17 0.00 cop[tikv] eq(Column#22, "ios"), gt(Column#26, 1478185592) + ├─IndexScan_15 1.25 cop[tikv] table:rr, index:aid, dic, range: decided by [eq(test.rr.aid, test.dt.aid) eq(test.rr.dic, test.dt.dic)], keep order:false, stats:pseudo + └─Selection_17 0.00 cop[tikv] eq(test.rr.pt, "ios"), gt(test.rr.t, 1478185592) └─TableScan_16 1.25 cop[tikv] table:rr, keep order:false, stats:pseudo explain select pc,cr,count(DISTINCT uid) as pay_users,count(oid) as pay_times,sum(am) as am from pp where ps=2 and ppt>=1478188800 and ppt<1478275200 and pi in ('510017','520017') and uid in ('18089709','18090780') group by pc,cr; id count task operator info -Projection_5 1.00 root Column#14, Column#16, Column#22, Column#23, Column#24 -└─HashAgg_7 1.00 root group by:Column#14, Column#16, funcs:count(distinct Column#2), count(Column#1), sum(Column#6), firstrow(Column#14), firstrow(Column#16) +Projection_5 1.00 root test.pp.pc, test.pp.cr, Column#22, Column#23, Column#24 +└─HashAgg_7 1.00 root group by:test.pp.cr, test.pp.pc, funcs:count(distinct test.pp.uid)->Column#22, funcs:count(test.pp.oid)->Column#23, funcs:sum(test.pp.am)->Column#24, funcs:firstrow(test.pp.pc)->test.pp.pc, funcs:firstrow(test.pp.cr)->test.pp.cr └─IndexLookUp_21 0.00 root ├─IndexScan_18 0.40 cop[tikv] table:pp, index:uid, pi, range:[18089709 510017,18089709 510017], [18089709 520017,18089709 520017], [18090780 510017,18090780 510017], [18090780 520017,18090780 520017], keep order:false, stats:pseudo - └─Selection_20 0.00 cop[tikv] eq(Column#8, 2), ge(Column#4, 1478188800), lt(Column#4, 1478275200) + └─Selection_20 0.00 cop[tikv] eq(test.pp.ps, 2), ge(test.pp.ppt, 1478188800), lt(test.pp.ppt, 1478275200) └─TableScan_19 0.40 cop[tikv] table:pp, keep order:false, stats:pseudo CREATE TABLE `tbl_001` (`a` int, `b` int); CREATE TABLE `tbl_002` (`a` int, `b` int); @@ -179,8 +179,8 @@ CREATE TABLE `tbl_008` (`a` int, `b` int); CREATE TABLE `tbl_009` (`a` int, `b` int); explain select sum(a) from (select * from tbl_001 union all select * from tbl_002 union all select * from tbl_003 union all select * from tbl_004 union all select * from tbl_005 union all select * from tbl_006 union all select * from tbl_007 union all select * from tbl_008 union all select * from tbl_009) x group by b; id count task operator info -HashAgg_34 72000.00 root group by:Column#32, funcs:sum(Column#31) -└─Projection_63 90000.00 root cast(Column#28), Column#29 +HashAgg_34 72000.00 root group by:Column#32, funcs:sum(Column#31)->Column#30 +└─Projection_63 90000.00 root cast(Column#28)->Column#31, Column#29 └─Union_35 90000.00 root ├─TableReader_38 10000.00 root data:TableScan_37 │ └─TableScan_37 10000.00 cop[tikv] table:tbl_001, range:[-inf,+inf], keep order:false, stats:pseudo @@ -242,20 +242,20 @@ UNIQUE KEY org_employee_position_pk (hotel_id,user_id,position_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; explain SELECT d.id, d.ctx, d.name, d.left_value, d.right_value, d.depth, d.leader_id, d.status, d.created_on, d.updated_on FROM org_department AS d LEFT JOIN org_position AS p ON p.department_id = d.id AND p.status = 1000 LEFT JOIN org_employee_position AS ep ON ep.position_id = p.id AND ep.status = 1000 WHERE (d.ctx = 1 AND (ep.user_id = 62 OR d.id = 20 OR d.id = 20) AND d.status = 1000) GROUP BY d.id ORDER BY d.left_value; id count task operator info -Sort_10 1.00 root Column#4:asc -└─HashAgg_15 1.00 root group by:Column#1, funcs:firstrow(Column#1), firstrow(Column#2), firstrow(Column#3), firstrow(Column#4), firstrow(Column#5), firstrow(Column#6), firstrow(Column#7), firstrow(Column#8), firstrow(Column#9), firstrow(Column#10) - └─Selection_22 0.01 root or(eq(Column#22, 62), or(eq(Column#1, 20), eq(Column#1, 20))) - └─HashLeftJoin_24 0.02 root left outer join, inner:IndexMergeJoin_40 (REVERSED), equal:[eq(Column#11, Column#23)] - ├─IndexMergeJoin_40 0.01 root left outer join, inner:IndexLookUp_38, outer key:Column#1, inner key:Column#17 +Sort_10 1.00 root test.org_department.left_value:asc +└─HashAgg_15 1.00 root group by:test.org_department.id, funcs:firstrow(test.org_department.id)->test.org_department.id, funcs:firstrow(test.org_department.ctx)->test.org_department.ctx, funcs:firstrow(test.org_department.name)->test.org_department.name, funcs:firstrow(test.org_department.left_value)->test.org_department.left_value, funcs:firstrow(test.org_department.right_value)->test.org_department.right_value, funcs:firstrow(test.org_department.depth)->test.org_department.depth, funcs:firstrow(test.org_department.leader_id)->test.org_department.leader_id, funcs:firstrow(test.org_department.status)->test.org_department.status, funcs:firstrow(test.org_department.created_on)->test.org_department.created_on, funcs:firstrow(test.org_department.updated_on)->test.org_department.updated_on + └─Selection_22 0.01 root or(eq(test.org_employee_position.user_id, 62), or(eq(test.org_department.id, 20), eq(test.org_department.id, 20))) + └─HashLeftJoin_24 0.02 root left outer join, inner:IndexMergeJoin_40 (REVERSED), equal:[eq(test.org_position.id, test.org_employee_position.position_id)] + ├─IndexMergeJoin_40 0.01 root left outer join, inner:IndexLookUp_38, outer key:test.org_department.id, inner key:test.org_position.department_id │ ├─IndexLookUp_62 0.01 root │ │ ├─IndexScan_59 10.00 cop[tikv] table:d, index:ctx, range:[1,1], keep order:false, stats:pseudo - │ │ └─Selection_61 0.01 cop[tikv] eq(Column#8, 1000) + │ │ └─Selection_61 0.01 cop[tikv] eq(test.org_department.status, 1000) │ │ └─TableScan_60 10.00 cop[tikv] table:d, keep order:false, stats:pseudo │ └─IndexLookUp_38 0.00 root - │ ├─Selection_36 1.25 cop[tikv] not(isnull(Column#17)) - │ │ └─IndexScan_34 1.25 cop[tikv] table:p, index:department_id, range: decided by [eq(Column#17, Column#1)], keep order:true, stats:pseudo - │ └─Selection_37 0.00 cop[tikv] eq(Column#18, 1000) + │ ├─Selection_36 1.25 cop[tikv] not(isnull(test.org_position.department_id)) + │ │ └─IndexScan_34 1.25 cop[tikv] table:p, index:department_id, range: decided by [eq(test.org_position.department_id, test.org_department.id)], keep order:true, stats:pseudo + │ └─Selection_37 0.00 cop[tikv] eq(test.org_position.status, 1000) │ └─TableScan_35 1.25 cop[tikv] table:p, keep order:false, stats:pseudo └─TableReader_72 9.99 root data:Selection_71 - └─Selection_71 9.99 cop[tikv] eq(Column#24, 1000), not(isnull(Column#23)) + └─Selection_71 9.99 cop[tikv] eq(test.org_employee_position.status, 1000), not(isnull(test.org_employee_position.position_id)) └─TableScan_70 10000.00 cop[tikv] table:ep, range:[-inf,+inf], keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/explain_complex_stats.result b/cmd/explaintest/r/explain_complex_stats.result index a6b1842ed4d22..af8be114b249b 100644 --- a/cmd/explaintest/r/explain_complex_stats.result +++ b/cmd/explaintest/r/explain_complex_stats.result @@ -115,66 +115,66 @@ PRIMARY KEY (aid,dic) load stats 's/explain_complex_stats_rr.json'; explain SELECT ds, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(dic) as install_device FROM dt use index (cm) WHERE (ds >= '2016-09-01') AND (ds <= '2016-11-03') AND (cm IN ('1062', '1086', '1423', '1424', '1425', '1426', '1427', '1428', '1429', '1430', '1431', '1432', '1433', '1434', '1435', '1436', '1437', '1438', '1439', '1440', '1441', '1442', '1443', '1444', '1445', '1446', '1447', '1448', '1449', '1450', '1451', '1452', '1488', '1489', '1490', '1491', '1492', '1493', '1494', '1495', '1496', '1497', '1550', '1551', '1552', '1553', '1554', '1555', '1556', '1557', '1558', '1559', '1597', '1598', '1599', '1600', '1601', '1602', '1603', '1604', '1605', '1606', '1607', '1608', '1609', '1610', '1611', '1612', '1613', '1614', '1615', '1616', '1623', '1624', '1625', '1626', '1627', '1628', '1629', '1630', '1631', '1632', '1709', '1719', '1720', '1843', '2813', '2814', '2815', '2816', '2817', '2818', '2819', '2820', '2821', '2822', '2823', '2824', '2825', '2826', '2827', '2828', '2829', '2830', '2831', '2832', '2833', '2834', '2835', '2836', '2837', '2838', '2839', '2840', '2841', '2842', '2843', '2844', '2845', '2846', '2847', '2848', '2849', '2850', '2851', '2852', '2853', '2854', '2855', '2856', '2857', '2858', '2859', '2860', '2861', '2862', '2863', '2864', '2865', '2866', '2867', '2868', '2869', '2870', '2871', '2872', '3139', '3140', '3141', '3142', '3143', '3144', '3145', '3146', '3147', '3148', '3149', '3150', '3151', '3152', '3153', '3154', '3155', '3156', '3157', '3158', '3386', '3387', '3388', '3389', '3390', '3391', '3392', '3393', '3394', '3395', '3664', '3665', '3666', '3667', '3668', '3670', '3671', '3672', '3673', '3674', '3676', '3677', '3678', '3679', '3680', '3681', '3682', '3683', '3684', '3685', '3686', '3687', '3688', '3689', '3690', '3691', '3692', '3693', '3694', '3695', '3696', '3697', '3698', '3699', '3700', '3701', '3702', '3703', '3704', '3705', '3706', '3707', '3708', '3709', '3710', '3711', '3712', '3713', '3714', '3715', '3960', '3961', '3962', '3963', '3964', '3965', '3966', '3967', '3968', '3978', '3979', '3980', '3981', '3982', '3983', '3984', '3985', '3986', '3987', '4208', '4209', '4210', '4211', '4212', '4304', '4305', '4306', '4307', '4308', '4866', '4867', '4868', '4869', '4870', '4871', '4872', '4873', '4874', '4875')) GROUP BY ds, p1, p2, p3, p4, p5, p6_md5, p7_md5 ORDER BY ds2 DESC; id count task operator info -Projection_7 21.53 root Column#7, Column#11, Column#12, Column#13, Column#14, Column#15, Column#16, Column#17, Column#21 -└─Sort_8 21.53 root Column#8:desc - └─HashAgg_16 21.53 root group by:Column#11, Column#12, Column#13, Column#14, Column#15, Column#16, Column#17, Column#7, funcs:count(Column#32), firstrow(Column#7), firstrow(Column#34), firstrow(Column#11), firstrow(Column#12), firstrow(Column#13), firstrow(Column#14), firstrow(Column#15), firstrow(Column#16), firstrow(Column#17) +Projection_7 21.53 root test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, Column#21 +└─Sort_8 21.53 root test.dt.ds2:desc + └─HashAgg_16 21.53 root group by:test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, funcs:count(Column#32)->Column#21, funcs:firstrow(test.dt.ds)->test.dt.ds, funcs:firstrow(Column#34)->test.dt.ds2, funcs:firstrow(test.dt.p1)->test.dt.p1, funcs:firstrow(test.dt.p2)->test.dt.p2, funcs:firstrow(test.dt.p3)->test.dt.p3, funcs:firstrow(test.dt.p4)->test.dt.p4, funcs:firstrow(test.dt.p5)->test.dt.p5, funcs:firstrow(test.dt.p6_md5)->test.dt.p6_md5, funcs:firstrow(test.dt.p7_md5)->test.dt.p7_md5 └─IndexLookUp_17 21.53 root ├─IndexScan_13 128.32 cop[tikv] table:dt, index:cm, range:[1062,1062], [1086,1086], [1423,1423], [1424,1424], [1425,1425], [1426,1426], [1427,1427], [1428,1428], [1429,1429], [1430,1430], [1431,1431], [1432,1432], [1433,1433], [1434,1434], [1435,1435], [1436,1436], [1437,1437], [1438,1438], [1439,1439], [1440,1440], [1441,1441], [1442,1442], [1443,1443], [1444,1444], [1445,1445], [1446,1446], [1447,1447], [1448,1448], [1449,1449], [1450,1450], [1451,1451], [1452,1452], [1488,1488], [1489,1489], [1490,1490], [1491,1491], [1492,1492], [1493,1493], [1494,1494], [1495,1495], [1496,1496], [1497,1497], [1550,1550], [1551,1551], [1552,1552], [1553,1553], [1554,1554], [1555,1555], [1556,1556], [1557,1557], [1558,1558], [1559,1559], [1597,1597], [1598,1598], [1599,1599], [1600,1600], [1601,1601], [1602,1602], [1603,1603], [1604,1604], [1605,1605], [1606,1606], [1607,1607], [1608,1608], [1609,1609], [1610,1610], [1611,1611], [1612,1612], [1613,1613], [1614,1614], [1615,1615], [1616,1616], [1623,1623], [1624,1624], [1625,1625], [1626,1626], [1627,1627], [1628,1628], [1629,1629], [1630,1630], [1631,1631], [1632,1632], [1709,1709], [1719,1719], [1720,1720], [1843,1843], [2813,2813], [2814,2814], [2815,2815], [2816,2816], [2817,2817], [2818,2818], [2819,2819], [2820,2820], [2821,2821], [2822,2822], [2823,2823], [2824,2824], [2825,2825], [2826,2826], [2827,2827], [2828,2828], [2829,2829], [2830,2830], [2831,2831], [2832,2832], [2833,2833], [2834,2834], [2835,2835], [2836,2836], [2837,2837], [2838,2838], [2839,2839], [2840,2840], [2841,2841], [2842,2842], [2843,2843], [2844,2844], [2845,2845], [2846,2846], [2847,2847], [2848,2848], [2849,2849], [2850,2850], [2851,2851], [2852,2852], [2853,2853], [2854,2854], [2855,2855], [2856,2856], [2857,2857], [2858,2858], [2859,2859], [2860,2860], [2861,2861], [2862,2862], [2863,2863], [2864,2864], [2865,2865], [2866,2866], [2867,2867], [2868,2868], [2869,2869], [2870,2870], [2871,2871], [2872,2872], [3139,3139], [3140,3140], [3141,3141], [3142,3142], [3143,3143], [3144,3144], [3145,3145], [3146,3146], [3147,3147], [3148,3148], [3149,3149], [3150,3150], [3151,3151], [3152,3152], [3153,3153], [3154,3154], [3155,3155], [3156,3156], [3157,3157], [3158,3158], [3386,3386], [3387,3387], [3388,3388], [3389,3389], [3390,3390], [3391,3391], [3392,3392], [3393,3393], [3394,3394], [3395,3395], [3664,3664], [3665,3665], [3666,3666], [3667,3667], [3668,3668], [3670,3670], [3671,3671], [3672,3672], [3673,3673], [3674,3674], [3676,3676], [3677,3677], [3678,3678], [3679,3679], [3680,3680], [3681,3681], [3682,3682], [3683,3683], [3684,3684], [3685,3685], [3686,3686], [3687,3687], [3688,3688], [3689,3689], [3690,3690], [3691,3691], [3692,3692], [3693,3693], [3694,3694], [3695,3695], [3696,3696], [3697,3697], [3698,3698], [3699,3699], [3700,3700], [3701,3701], [3702,3702], [3703,3703], [3704,3704], [3705,3705], [3706,3706], [3707,3707], [3708,3708], [3709,3709], [3710,3710], [3711,3711], [3712,3712], [3713,3713], [3714,3714], [3715,3715], [3960,3960], [3961,3961], [3962,3962], [3963,3963], [3964,3964], [3965,3965], [3966,3966], [3967,3967], [3968,3968], [3978,3978], [3979,3979], [3980,3980], [3981,3981], [3982,3982], [3983,3983], [3984,3984], [3985,3985], [3986,3986], [3987,3987], [4208,4208], [4209,4209], [4210,4210], [4211,4211], [4212,4212], [4304,4304], [4305,4305], [4306,4306], [4307,4307], [4308,4308], [4866,4866], [4867,4867], [4868,4868], [4869,4869], [4870,4870], [4871,4871], [4872,4872], [4873,4873], [4874,4874], [4875,4875], keep order:false - └─HashAgg_11 21.53 cop[tikv] group by:Column#11, Column#12, Column#13, Column#14, Column#15, Column#16, Column#17, Column#7, funcs:count(Column#5), firstrow(Column#8) - └─Selection_15 21.56 cop[tikv] ge(Column#7, 2016-09-01 00:00:00.000000), le(Column#7, 2016-11-03 00:00:00.000000) + └─HashAgg_11 21.53 cop[tikv] group by:test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, funcs:count(test.dt.dic)->Column#32, funcs:firstrow(test.dt.ds2)->Column#34 + └─Selection_15 21.56 cop[tikv] ge(test.dt.ds, 2016-09-01 00:00:00.000000), le(test.dt.ds, 2016-11-03 00:00:00.000000) └─TableScan_14 128.32 cop[tikv] table:dt, keep order:false explain select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext, gad.t as gtime from st gad join (select id, aid, pt, dic, ip, t from dd where pt = 'android' and bm = 0 and t > 1478143908) sdk on gad.aid = sdk.aid and gad.ip = sdk.ip and sdk.t > gad.t where gad.t > 1478143908 and gad.bm = 0 and gad.pt = 'android' group by gad.aid, sdk.dic limit 2500; id count task operator info -Projection_13 424.00 root Column#1, Column#20, Column#3, Column#4, Column#23, Column#26, Column#27, Column#8, Column#9, Column#10, Column#11, Column#12, Column#13, Column#14, Column#15, Column#19 +Projection_13 424.00 root test.st.id, test.dd.id, test.st.aid, test.st.cm, test.dd.dic, test.dd.ip, test.dd.t, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, test.st.ext, test.st.t └─Limit_16 424.00 root offset:0, count:2500 - └─HashAgg_19 424.00 root group by:Column#23, Column#3, funcs:firstrow(Column#1), firstrow(Column#3), firstrow(Column#4), firstrow(Column#8), firstrow(Column#9), firstrow(Column#10), firstrow(Column#11), firstrow(Column#12), firstrow(Column#13), firstrow(Column#14), firstrow(Column#15), firstrow(Column#19), firstrow(Column#20), firstrow(Column#23), firstrow(Column#26), firstrow(Column#27) - └─IndexMergeJoin_30 424.00 root inner join, inner:IndexLookUp_28, outer key:Column#3, inner key:Column#21, other cond:eq(Column#5, Column#26), gt(Column#27, Column#19) + └─HashAgg_19 424.00 root group by:test.dd.dic, test.st.aid, funcs:firstrow(test.st.id)->test.st.id, funcs:firstrow(test.st.aid)->test.st.aid, funcs:firstrow(test.st.cm)->test.st.cm, funcs:firstrow(test.st.p1)->test.st.p1, funcs:firstrow(test.st.p2)->test.st.p2, funcs:firstrow(test.st.p3)->test.st.p3, funcs:firstrow(test.st.p4)->test.st.p4, funcs:firstrow(test.st.p5)->test.st.p5, funcs:firstrow(test.st.p6_md5)->test.st.p6_md5, funcs:firstrow(test.st.p7_md5)->test.st.p7_md5, funcs:firstrow(test.st.ext)->test.st.ext, funcs:firstrow(test.st.t)->test.st.t, funcs:firstrow(test.dd.id)->test.dd.id, funcs:firstrow(test.dd.dic)->test.dd.dic, funcs:firstrow(test.dd.ip)->test.dd.ip, funcs:firstrow(test.dd.t)->test.dd.t + └─IndexMergeJoin_30 424.00 root inner join, inner:IndexLookUp_28, outer key:test.st.aid, inner key:test.dd.aid, other cond:eq(test.st.ip, test.dd.ip), gt(test.dd.t, test.st.t) ├─TableReader_37 424.00 root data:Selection_36 - │ └─Selection_36 424.00 cop[tikv] eq(Column#16, 0), eq(Column#2, "android"), gt(Column#19, 1478143908), not(isnull(Column#5)) + │ └─Selection_36 424.00 cop[tikv] eq(test.st.bm, 0), eq(test.st.pt, "android"), gt(test.st.t, 1478143908), not(isnull(test.st.ip)) │ └─TableScan_35 1999.00 cop[tikv] table:gad, range:[0,+inf], keep order:false └─IndexLookUp_28 0.23 root - ├─IndexScan_25 1.00 cop[tikv] table:dd, index:aid, dic, range: decided by [eq(Column#21, Column#3)], keep order:true - └─Selection_27 0.23 cop[tikv] eq(Column#22, "android"), eq(Column#28, 0), gt(Column#27, 1478143908), not(isnull(Column#26)), not(isnull(Column#27)) + ├─IndexScan_25 1.00 cop[tikv] table:dd, index:aid, dic, range: decided by [eq(test.dd.aid, test.st.aid)], keep order:true + └─Selection_27 0.23 cop[tikv] eq(test.dd.bm, 0), eq(test.dd.pt, "android"), gt(test.dd.t, 1478143908), not(isnull(test.dd.ip)), not(isnull(test.dd.t)) └─TableScan_26 1.00 cop[tikv] table:dd, keep order:false explain select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext from st gad join dd sdk on gad.aid = sdk.aid and gad.dic = sdk.mac and gad.t < sdk.t where gad.t > 1477971479 and gad.bm = 0 and gad.pt = 'ios' and gad.dit = 'mac' and sdk.t > 1477971479 and sdk.bm = 0 and sdk.pt = 'ios' limit 3000; id count task operator info -Projection_10 170.34 root Column#1, Column#20, Column#3, Column#4, Column#23, Column#26, Column#27, Column#8, Column#9, Column#10, Column#11, Column#12, Column#13, Column#14, Column#15 +Projection_10 170.34 root test.st.id, test.dd.id, test.st.aid, test.st.cm, test.dd.dic, test.dd.ip, test.dd.t, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, test.st.ext └─Limit_13 170.34 root offset:0, count:3000 - └─IndexMergeJoin_24 170.34 root inner join, inner:IndexLookUp_22, outer key:Column#3, inner key:Column#21, other cond:eq(Column#6, Column#25), lt(Column#19, Column#27) + └─IndexMergeJoin_24 170.34 root inner join, inner:IndexLookUp_22, outer key:test.st.aid, inner key:test.dd.aid, other cond:eq(test.st.dic, test.dd.mac), lt(test.st.t, test.dd.t) ├─TableReader_31 170.34 root data:Selection_30 - │ └─Selection_30 170.34 cop[tikv] eq(Column#16, 0), eq(Column#2, "ios"), eq(Column#7, "mac"), gt(Column#19, 1477971479), not(isnull(Column#6)) + │ └─Selection_30 170.34 cop[tikv] eq(test.st.bm, 0), eq(test.st.dit, "mac"), eq(test.st.pt, "ios"), gt(test.st.t, 1477971479), not(isnull(test.st.dic)) │ └─TableScan_29 1999.00 cop[tikv] table:gad, range:[0,+inf], keep order:false └─IndexLookUp_22 0.25 root - ├─IndexScan_19 1.00 cop[tikv] table:sdk, index:aid, dic, range: decided by [eq(Column#21, Column#3)], keep order:true - └─Selection_21 0.25 cop[tikv] eq(Column#22, "ios"), eq(Column#28, 0), gt(Column#27, 1477971479), not(isnull(Column#25)), not(isnull(Column#27)) + ├─IndexScan_19 1.00 cop[tikv] table:sdk, index:aid, dic, range: decided by [eq(test.dd.aid, test.st.aid)], keep order:true + └─Selection_21 0.25 cop[tikv] eq(test.dd.bm, 0), eq(test.dd.pt, "ios"), gt(test.dd.t, 1477971479), not(isnull(test.dd.mac)), not(isnull(test.dd.t)) └─TableScan_20 1.00 cop[tikv] table:sdk, keep order:false explain SELECT cm, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(1) as click_pv, count(DISTINCT ip) as click_ip FROM st WHERE (t between 1478188800 and 1478275200) and aid='cn.sbkcq' and pt='android' GROUP BY cm, p1, p2, p3, p4, p5, p6_md5, p7_md5; id count task operator info -Projection_5 39.28 root Column#4, Column#8, Column#9, Column#10, Column#11, Column#12, Column#13, Column#14, Column#20, Column#21 -└─HashAgg_7 39.28 root group by:Column#10, Column#11, Column#12, Column#13, Column#14, Column#4, Column#8, Column#9, funcs:count(1), count(distinct Column#5), firstrow(Column#4), firstrow(Column#8), firstrow(Column#9), firstrow(Column#10), firstrow(Column#11), firstrow(Column#12), firstrow(Column#13), firstrow(Column#14) +Projection_5 39.28 root test.st.cm, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, Column#20, Column#21 +└─HashAgg_7 39.28 root group by:test.st.cm, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, funcs:count(1)->Column#20, funcs:count(distinct test.st.ip)->Column#21, funcs:firstrow(test.st.cm)->test.st.cm, funcs:firstrow(test.st.p1)->test.st.p1, funcs:firstrow(test.st.p2)->test.st.p2, funcs:firstrow(test.st.p3)->test.st.p3, funcs:firstrow(test.st.p4)->test.st.p4, funcs:firstrow(test.st.p5)->test.st.p5, funcs:firstrow(test.st.p6_md5)->test.st.p6_md5, funcs:firstrow(test.st.p7_md5)->test.st.p7_md5 └─IndexLookUp_15 39.38 root ├─IndexScan_12 160.23 cop[tikv] table:st, index:t, range:[1478188800,1478275200], keep order:false - └─Selection_14 39.38 cop[tikv] eq(Column#2, "android"), eq(Column#3, "cn.sbkcq") + └─Selection_14 39.38 cop[tikv] eq(test.st.aid, "cn.sbkcq"), eq(test.st.pt, "android") └─TableScan_13 160.23 cop[tikv] table:st, keep order:false explain select dt.id as id, dt.aid as aid, dt.pt as pt, dt.dic as dic, dt.cm as cm, rr.gid as gid, rr.acd as acd, rr.t as t,dt.p1 as p1, dt.p2 as p2, dt.p3 as p3, dt.p4 as p4, dt.p5 as p5, dt.p6_md5 as p6, dt.p7_md5 as p7 from dt dt join rr rr on (rr.pt = 'ios' and rr.t > 1478185592 and dt.aid = rr.aid and dt.dic = rr.dic) where dt.pt = 'ios' and dt.t > 1478185592 and dt.bm = 0 limit 2000; id count task operator info -Projection_10 428.32 root Column#1, Column#2, Column#4, Column#5, Column#3, Column#24, Column#25, Column#26, Column#11, Column#12, Column#13, Column#14, Column#15, Column#16, Column#17 +Projection_10 428.32 root test.dt.id, test.dt.aid, test.dt.pt, test.dt.dic, test.dt.cm, test.rr.gid, test.rr.acd, test.rr.t, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5 └─Limit_13 428.32 root offset:0, count:2000 - └─IndexJoin_19 428.32 root inner join, inner:IndexLookUp_18, outer key:Column#2, Column#5, inner key:Column#21, Column#23 + └─IndexJoin_19 428.32 root inner join, inner:IndexLookUp_18, outer key:test.dt.aid, test.dt.dic, inner key:test.rr.aid, test.rr.dic ├─TableReader_43 428.32 root data:Selection_42 - │ └─Selection_42 428.32 cop[tikv] eq(Column#18, 0), eq(Column#4, "ios"), gt(Column#9, 1478185592), not(isnull(Column#5)) + │ └─Selection_42 428.32 cop[tikv] eq(test.dt.bm, 0), eq(test.dt.pt, "ios"), gt(test.dt.t, 1478185592), not(isnull(test.dt.dic)) │ └─TableScan_41 2000.00 cop[tikv] table:dt, range:[0,+inf], keep order:false └─IndexLookUp_18 0.48 root - ├─IndexScan_15 1.00 cop[tikv] table:rr, index:aid, dic, range: decided by [eq(Column#21, Column#2) eq(Column#23, Column#5)], keep order:false - └─Selection_17 0.48 cop[tikv] eq(Column#22, "ios"), gt(Column#26, 1478185592) + ├─IndexScan_15 1.00 cop[tikv] table:rr, index:aid, dic, range: decided by [eq(test.rr.aid, test.dt.aid) eq(test.rr.dic, test.dt.dic)], keep order:false + └─Selection_17 0.48 cop[tikv] eq(test.rr.pt, "ios"), gt(test.rr.t, 1478185592) └─TableScan_16 1.00 cop[tikv] table:rr, keep order:false explain select pc,cr,count(DISTINCT uid) as pay_users,count(oid) as pay_times,sum(am) as am from pp where ps=2 and ppt>=1478188800 and ppt<1478275200 and pi in ('510017','520017') and uid in ('18089709','18090780') group by pc,cr; id count task operator info -Projection_5 207.86 root Column#14, Column#16, Column#22, Column#23, Column#24 -└─HashAgg_7 207.86 root group by:Column#14, Column#16, funcs:count(distinct Column#2), count(Column#1), sum(Column#6), firstrow(Column#14), firstrow(Column#16) +Projection_5 207.86 root test.pp.pc, test.pp.cr, Column#22, Column#23, Column#24 +└─HashAgg_7 207.86 root group by:test.pp.cr, test.pp.pc, funcs:count(distinct test.pp.uid)->Column#22, funcs:count(test.pp.oid)->Column#23, funcs:sum(test.pp.am)->Column#24, funcs:firstrow(test.pp.pc)->test.pp.pc, funcs:firstrow(test.pp.cr)->test.pp.cr └─IndexLookUp_21 207.86 root ├─IndexScan_15 627.00 cop[tikv] table:pp, index:ps, range:[2,2], keep order:false - └─Selection_17 207.86 cop[tikv] ge(Column#4, 1478188800), in(Column#17, 510017, 520017), in(Column#2, 18089709, 18090780), lt(Column#4, 1478275200) + └─Selection_17 207.86 cop[tikv] ge(test.pp.ppt, 1478188800), in(test.pp.pi, 510017, 520017), in(test.pp.uid, 18089709, 18090780), lt(test.pp.ppt, 1478275200) └─TableScan_16 627.00 cop[tikv] table:pp, keep order:false drop table if exists tbl_001; CREATE TABLE tbl_001 (a int, b int); @@ -205,8 +205,8 @@ CREATE TABLE tbl_009 (a int, b int); load stats 's/explain_complex_stats_tbl_009.json'; explain select sum(a) from (select * from tbl_001 union all select * from tbl_002 union all select * from tbl_003 union all select * from tbl_004 union all select * from tbl_005 union all select * from tbl_006 union all select * from tbl_007 union all select * from tbl_008 union all select * from tbl_009) x group by b; id count task operator info -HashAgg_34 18000.00 root group by:Column#32, funcs:sum(Column#31) -└─Projection_63 18000.00 root cast(Column#28), Column#29 +HashAgg_34 18000.00 root group by:Column#32, funcs:sum(Column#31)->Column#30 +└─Projection_63 18000.00 root cast(Column#28)->Column#31, Column#29 └─Union_35 18000.00 root ├─TableReader_38 2000.00 root data:TableScan_37 │ └─TableScan_37 2000.00 cop[tikv] table:tbl_001, range:[-inf,+inf], keep order:false diff --git a/cmd/explaintest/r/explain_easy.result b/cmd/explaintest/r/explain_easy.result index 94fe3054a6d78..b1f9ba92be976 100644 --- a/cmd/explaintest/r/explain_easy.result +++ b/cmd/explaintest/r/explain_easy.result @@ -11,14 +11,14 @@ set @@session.tidb_hashagg_partial_concurrency = 1; set @@session.tidb_hashagg_final_concurrency = 1; explain select * from t3 where exists (select s.a from t3 s having sum(s.a) = t3.a ); id count task operator info -Projection_11 8000.00 root Column#1, Column#2, Column#3, Column#4 +Projection_11 8000.00 root test.t3.a, test.t3.b, test.t3.c, test.t3.d └─HashLeftJoin_12 8000.00 root semi join, inner:StreamAgg_27, equal:[eq(Column#13, Column#11)] - ├─Projection_13 10000.00 root Column#1, Column#2, Column#3, Column#4, cast(Column#1) + ├─Projection_13 10000.00 root test.t3.a, test.t3.b, test.t3.c, test.t3.d, cast(test.t3.a)->Column#13 │ └─TableReader_15 10000.00 root data:TableScan_14 │ └─TableScan_14 10000.00 cop[tikv] table:t3, range:[-inf,+inf], keep order:false, stats:pseudo - └─StreamAgg_27 1.00 root funcs:sum(Column#16) + └─StreamAgg_27 1.00 root funcs:sum(Column#16)->Column#11 └─TableReader_28 1.00 root data:StreamAgg_19 - └─StreamAgg_19 1.00 cop[tikv] funcs:sum(Column#6) + └─StreamAgg_19 1.00 cop[tikv] funcs:sum(test.t3.a)->Column#16 └─TableScan_26 10000.00 cop[tikv] table:s, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t1; id count task operator info @@ -31,7 +31,7 @@ IndexLookUp_12 10000.00 root └─TableScan_11 10000.00 cop[tikv] table:t1, keep order:false, stats:pseudo explain select * from t2 order by c2; id count task operator info -Sort_4 10000.00 root Column#2:asc +Sort_4 10000.00 root test.t2.c2:asc └─TableReader_8 10000.00 root data:TableScan_7 └─TableScan_7 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t1 where t1.c1 > 0; @@ -44,11 +44,11 @@ IndexReader_6 10.00 root index:IndexScan_5 └─IndexScan_5 10.00 cop[tikv] table:t1, index:c2, range:[1,1], keep order:false, stats:pseudo explain select * from t1 left join t2 on t1.c2 = t2.c1 where t1.c1 > 1; id count task operator info -HashLeftJoin_23 4166.67 root left outer join, inner:TableReader_33 (REVERSED), equal:[eq(Column#2, Column#4)] +HashLeftJoin_23 4166.67 root left outer join, inner:TableReader_33 (REVERSED), equal:[eq(test.t1.c2, test.t2.c1)] ├─TableReader_33 3333.33 root data:TableScan_32 │ └─TableScan_32 3333.33 cop[tikv] table:t1, range:(1,+inf], keep order:false, stats:pseudo └─TableReader_36 9990.00 root data:Selection_35 - └─Selection_35 9990.00 cop[tikv] not(isnull(Column#4)) + └─Selection_35 9990.00 cop[tikv] not(isnull(test.t2.c1)) └─TableScan_34 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo explain update t1 set t1.c2 = 2 where t1.c1 = 1; id count task operator info @@ -62,58 +62,58 @@ Delete_4 N/A root N/A └─TableScan_10 10.00 cop[tikv] table:t1, keep order:false, stats:pseudo explain select count(b.c2) from t1 a, t2 b where a.c1 = b.c2 group by a.c1; id count task operator info -Projection_11 9990.00 root cast(Column#8) -└─HashLeftJoin_21 9990.00 root inner join, inner:HashAgg_28, equal:[eq(Column#1, Column#5)] +Projection_11 9990.00 root cast(Column#8)->Column#7 +└─HashLeftJoin_21 9990.00 root inner join, inner:HashAgg_28, equal:[eq(test.t1.c1, test.t2.c2)] ├─TableReader_34 10000.00 root data:TableScan_33 │ └─TableScan_33 10000.00 cop[tikv] table:a, range:[-inf,+inf], keep order:false, stats:pseudo - └─HashAgg_28 7992.00 root group by:Column#5, funcs:count(Column#9), firstrow(Column#5) + └─HashAgg_28 7992.00 root group by:test.t2.c2, funcs:count(Column#9)->Column#8, funcs:firstrow(test.t2.c2)->test.t2.c2 └─TableReader_29 7992.00 root data:HashAgg_23 - └─HashAgg_23 7992.00 cop[tikv] group by:Column#5, funcs:count(Column#5) - └─Selection_27 9990.00 cop[tikv] not(isnull(Column#5)) + └─HashAgg_23 7992.00 cop[tikv] group by:test.t2.c2, funcs:count(test.t2.c2)->Column#9 + └─Selection_27 9990.00 cop[tikv] not(isnull(test.t2.c2)) └─TableScan_26 10000.00 cop[tikv] table:b, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 order by t2.c2 limit 0, 1; id count task operator info -TopN_7 1.00 root Column#2:asc, offset:0, count:1 +TopN_7 1.00 root test.t2.c2:asc, offset:0, count:1 └─TableReader_15 1.00 root data:TopN_14 - └─TopN_14 1.00 cop[tikv] Column#2:asc, offset:0, count:1 + └─TopN_14 1.00 cop[tikv] test.t2.c2:asc, offset:0, count:1 └─TableScan_13 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t1 where c1 > 1 and c2 = 1 and c3 < 1; id count task operator info IndexLookUp_11 1.11 root ├─IndexScan_8 33.33 cop[tikv] table:t1, index:c2, range:(1 1,1 +inf], keep order:false, stats:pseudo -└─Selection_10 1.11 cop[tikv] lt(Column#3, 1) +└─Selection_10 1.11 cop[tikv] lt(test.t1.c3, 1) └─TableScan_9 33.33 cop[tikv] table:t1, keep order:false, stats:pseudo explain select * from t1 where c1 = 1 and c2 > 1; id count task operator info TableReader_7 0.33 root data:Selection_6 -└─Selection_6 0.33 cop[tikv] gt(Column#2, 1) +└─Selection_6 0.33 cop[tikv] gt(test.t1.c2, 1) └─TableScan_5 1.00 cop[tikv] table:t1, range:[1,1], keep order:false, stats:pseudo explain select sum(t1.c1 in (select c1 from t2)) from t1; id count task operator info -StreamAgg_12 1.00 root funcs:sum(Column#10) -└─Projection_23 10000.00 root cast(Column#7) - └─HashLeftJoin_22 10000.00 root CARTESIAN left outer semi join, inner:IndexReader_21, other cond:eq(Column#1, Column#4) +StreamAgg_12 1.00 root funcs:sum(Column#10)->Column#8 +└─Projection_23 10000.00 root cast(Column#7)->Column#10 + └─HashLeftJoin_22 10000.00 root CARTESIAN left outer semi join, inner:IndexReader_21, other cond:eq(test.t1.c1, test.t2.c1) ├─TableReader_15 10000.00 root data:TableScan_14 │ └─TableScan_14 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─IndexReader_21 10000.00 root index:IndexScan_20 └─IndexScan_20 10000.00 cop[tikv] table:t2, index:c1, range:[NULL,+inf], keep order:false, stats:pseudo explain select c1 from t1 where c1 in (select c2 from t2); id count task operator info -Projection_9 9990.00 root Column#1 -└─HashLeftJoin_19 9990.00 root inner join, inner:HashAgg_23, equal:[eq(Column#1, Column#5)] +Projection_9 9990.00 root test.t1.c1 +└─HashLeftJoin_19 9990.00 root inner join, inner:HashAgg_23, equal:[eq(test.t1.c1, test.t2.c2)] ├─TableReader_32 10000.00 root data:TableScan_31 │ └─TableScan_31 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo - └─HashAgg_23 7992.00 root group by:Column#5, funcs:firstrow(Column#5) + └─HashAgg_23 7992.00 root group by:test.t2.c2, funcs:firstrow(test.t2.c2)->test.t2.c2 └─TableReader_30 9990.00 root data:Selection_29 - └─Selection_29 9990.00 cop[tikv] not(isnull(Column#5)) + └─Selection_29 9990.00 cop[tikv] not(isnull(test.t2.c2)) └─TableScan_28 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo explain select (select count(1) k from t1 s where s.c1 = t1.c1 having k != 0) from t1; id count task operator info -Projection_12 10000.00 root ifnull(Column#7, 0) -└─MergeJoin_13 10000.00 root left outer join, left key:Column#1, right key:Column#4 +Projection_12 10000.00 root ifnull(Column#7, 0)->Column#7 +└─MergeJoin_13 10000.00 root left outer join, left key:test.t1.c1, right key:test.t1.c1 ├─TableReader_17 10000.00 root data:TableScan_16 │ └─TableScan_16 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:true, stats:pseudo - └─Projection_18 8000.00 root 1, Column#4 + └─Projection_18 8000.00 root 1->Column#7, test.t1.c1 └─TableReader_20 10000.00 root data:TableScan_19 └─TableScan_19 10000.00 cop[tikv] table:s, range:[-inf,+inf], keep order:true, stats:pseudo explain select * from information_schema.columns; @@ -121,14 +121,14 @@ id count task operator info MemTableScan_4 10000.00 root explain select c2 = (select c2 from t2 where t1.c1 = t2.c1 order by c1 limit 1) from t1; id count task operator info -Projection_12 10000.00 root eq(Column#2, Column#5) +Projection_12 10000.00 root eq(test.t1.c2, test.t2.c2)->Column#8 └─Apply_14 10000.00 root CARTESIAN left outer join, inner:Projection_43 ├─TableReader_16 10000.00 root data:TableScan_15 │ └─TableScan_15 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo - └─Projection_43 1.00 root Column#4, Column#5 + └─Projection_43 1.00 root test.t2.c1, test.t2.c2 └─IndexLookUp_42 1.00 root limit embedded(offset:0, count:1) ├─Limit_41 1.00 cop[tikv] offset:0, count:1 - │ └─IndexScan_39 1.00 cop[tikv] table:t2, index:c1, range: decided by [eq(Column#1, Column#4)], keep order:true, stats:pseudo + │ └─IndexScan_39 1.00 cop[tikv] table:t2, index:c1, range: decided by [eq(test.t1.c1, test.t2.c1)], keep order:true, stats:pseudo └─TableScan_40 1.00 cop[tikv] table:t2, keep order:false, stats:pseudo explain select * from t1 order by c1 desc limit 1; id count task operator info @@ -140,17 +140,17 @@ explain select * from t4 use index(idx) where a > 1 and b > 1 and c > 1 limit 1; id count task operator info Limit_9 1.00 root offset:0, count:1 └─IndexLookUp_16 1.00 root - ├─Selection_13 3.00 cop[tikv] gt(Column#2, 1) + ├─Selection_13 3.00 cop[tikv] gt(test.t4.b, 1) │ └─IndexScan_11 9.00 cop[tikv] table:t4, index:a, b, range:(1,+inf], keep order:false, stats:pseudo └─Limit_15 1.00 cop[tikv] offset:0, count:1 - └─Selection_14 1.00 cop[tikv] gt(Column#3, 1) + └─Selection_14 1.00 cop[tikv] gt(test.t4.c, 1) └─TableScan_12 3.00 cop[tikv] table:t4, keep order:false, stats:pseudo explain select * from t4 where a > 1 and c > 1 limit 1; id count task operator info Limit_8 1.00 root offset:0, count:1 └─TableReader_14 1.00 root data:Limit_13 └─Limit_13 1.00 cop[tikv] offset:0, count:1 - └─Selection_12 1.00 cop[tikv] gt(Column#3, 1) + └─Selection_12 1.00 cop[tikv] gt(test.t4.c, 1) └─TableScan_11 3.00 cop[tikv] table:t4, range:(1,+inf], keep order:false, stats:pseudo explain select ifnull(null, t1.c1) from t1; id count task operator info @@ -163,63 +163,63 @@ TableReader_5 10000.00 root data:TableScan_4 explain select c1 from t2 union select c1 from t2 union all select c1 from t2; id count task operator info Union_17 26000.00 root -├─HashAgg_21 16000.00 root group by:Column#10, funcs:firstrow(Column#12) +├─HashAgg_21 16000.00 root group by:Column#10, funcs:firstrow(Column#12)->Column#10 │ └─Union_22 16000.00 root -│ ├─StreamAgg_27 8000.00 root group by:Column#7, funcs:firstrow(Column#7), firstrow(Column#7) +│ ├─StreamAgg_27 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#12, funcs:firstrow(test.t2.c1)->Column#10 │ │ └─IndexReader_40 10000.00 root index:IndexScan_39 │ │ └─IndexScan_39 10000.00 cop[tikv] table:t2, index:c1, range:[NULL,+inf], keep order:true, stats:pseudo -│ └─StreamAgg_45 8000.00 root group by:Column#4, funcs:firstrow(Column#4), firstrow(Column#4) +│ └─StreamAgg_45 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#12, funcs:firstrow(test.t2.c1)->Column#10 │ └─IndexReader_58 10000.00 root index:IndexScan_57 │ └─IndexScan_57 10000.00 cop[tikv] table:t2, index:c1, range:[NULL,+inf], keep order:true, stats:pseudo └─IndexReader_63 10000.00 root index:IndexScan_62 └─IndexScan_62 10000.00 cop[tikv] table:t2, index:c1, range:[NULL,+inf], keep order:false, stats:pseudo explain select c1 from t2 union all select c1 from t2 union select c1 from t2; id count task operator info -HashAgg_18 24000.00 root group by:Column#10, funcs:firstrow(Column#11) +HashAgg_18 24000.00 root group by:Column#10, funcs:firstrow(Column#11)->Column#10 └─Union_19 24000.00 root - ├─StreamAgg_24 8000.00 root group by:Column#7, funcs:firstrow(Column#7), firstrow(Column#7) + ├─StreamAgg_24 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#11, funcs:firstrow(test.t2.c1)->Column#10 │ └─IndexReader_37 10000.00 root index:IndexScan_36 │ └─IndexScan_36 10000.00 cop[tikv] table:t2, index:c1, range:[NULL,+inf], keep order:true, stats:pseudo - ├─StreamAgg_42 8000.00 root group by:Column#4, funcs:firstrow(Column#4), firstrow(Column#4) + ├─StreamAgg_42 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#11, funcs:firstrow(test.t2.c1)->Column#10 │ └─IndexReader_55 10000.00 root index:IndexScan_54 │ └─IndexScan_54 10000.00 cop[tikv] table:t2, index:c1, range:[NULL,+inf], keep order:true, stats:pseudo - └─StreamAgg_60 8000.00 root group by:Column#1, funcs:firstrow(Column#1), firstrow(Column#1) + └─StreamAgg_60 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#11, funcs:firstrow(test.t2.c1)->Column#10 └─IndexReader_73 10000.00 root index:IndexScan_72 └─IndexScan_72 10000.00 cop[tikv] table:t2, index:c1, range:[NULL,+inf], keep order:true, stats:pseudo explain select count(1) from (select count(1) from (select * from t1 where c3 = 100) k) k2; id count task operator info -StreamAgg_13 1.00 root funcs:count(1) -└─StreamAgg_28 1.00 root funcs:firstrow(Column#8) +StreamAgg_13 1.00 root funcs:count(1)->Column#5 +└─StreamAgg_28 1.00 root funcs:firstrow(Column#8)->Column#6 └─TableReader_29 1.00 root data:StreamAgg_17 - └─StreamAgg_17 1.00 cop[tikv] funcs:firstrow(1) - └─Selection_27 10.00 cop[tikv] eq(Column#3, 100) + └─StreamAgg_17 1.00 cop[tikv] funcs:firstrow(1)->Column#8 + └─Selection_27 10.00 cop[tikv] eq(test.t1.c3, 100) └─TableScan_26 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo explain select 1 from (select count(c2), count(c3) from t1) k; id count task operator info -Projection_5 1.00 root 1 -└─StreamAgg_21 1.00 root funcs:firstrow(Column#13) +Projection_5 1.00 root 1->Column#6 +└─StreamAgg_21 1.00 root funcs:firstrow(Column#13)->Column#7 └─TableReader_22 1.00 root data:StreamAgg_9 - └─StreamAgg_9 1.00 cop[tikv] funcs:firstrow(1) + └─StreamAgg_9 1.00 cop[tikv] funcs:firstrow(1)->Column#13 └─TableScan_19 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo explain select count(1) from (select max(c2), count(c3) as m from t1) k; id count task operator info -StreamAgg_11 1.00 root funcs:count(1) -└─StreamAgg_27 1.00 root funcs:firstrow(Column#12) +StreamAgg_11 1.00 root funcs:count(1)->Column#6 +└─StreamAgg_27 1.00 root funcs:firstrow(Column#12)->Column#7 └─TableReader_28 1.00 root data:StreamAgg_15 - └─StreamAgg_15 1.00 cop[tikv] funcs:firstrow(1) + └─StreamAgg_15 1.00 cop[tikv] funcs:firstrow(1)->Column#12 └─TableScan_25 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo explain select count(1) from (select count(c2) from t1 group by c3) k; id count task operator info -StreamAgg_11 1.00 root funcs:count(1) -└─HashAgg_22 8000.00 root group by:Column#3, funcs:firstrow(1) +StreamAgg_11 1.00 root funcs:count(1)->Column#5 +└─HashAgg_22 8000.00 root group by:test.t1.c3, funcs:firstrow(1)->Column#6 └─TableReader_19 10000.00 root data:TableScan_18 └─TableScan_18 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo set @@session.tidb_opt_insubq_to_join_and_agg=0; explain select sum(t1.c1 in (select c1 from t2)) from t1; id count task operator info -StreamAgg_12 1.00 root funcs:sum(Column#10) -└─Projection_23 10000.00 root cast(Column#7) - └─HashLeftJoin_22 10000.00 root CARTESIAN left outer semi join, inner:IndexReader_21, other cond:eq(Column#1, Column#4) +StreamAgg_12 1.00 root funcs:sum(Column#10)->Column#8 +└─Projection_23 10000.00 root cast(Column#7)->Column#10 + └─HashLeftJoin_22 10000.00 root CARTESIAN left outer semi join, inner:IndexReader_21, other cond:eq(test.t1.c1, test.t2.c1) ├─TableReader_15 10000.00 root data:TableScan_14 │ └─TableScan_14 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─IndexReader_21 10000.00 root index:IndexScan_20 @@ -231,17 +231,17 @@ Projection_6 10000.00 root Column#7 ├─TableReader_9 10000.00 root data:TableScan_8 │ └─TableScan_8 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 10.00 root data:Selection_13 - └─Selection_13 10.00 cop[tikv] eq(1, Column#5) + └─Selection_13 10.00 cop[tikv] eq(1, test.t2.c2) └─TableScan_12 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo explain select sum(6 in (select c2 from t2)) from t1; id count task operator info -StreamAgg_12 1.00 root funcs:sum(Column#10) -└─Projection_22 10000.00 root cast(Column#7) +StreamAgg_12 1.00 root funcs:sum(Column#10)->Column#8 +└─Projection_22 10000.00 root cast(Column#7)->Column#10 └─HashLeftJoin_21 10000.00 root CARTESIAN left outer semi join, inner:TableReader_20 ├─TableReader_15 10000.00 root data:TableScan_14 │ └─TableScan_14 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_20 10.00 root data:Selection_19 - └─Selection_19 10.00 cop[tikv] eq(6, Column#5) + └─Selection_19 10.00 cop[tikv] eq(6, test.t2.c2) └─TableScan_18 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo explain format="dot" select sum(t1.c1 in (select c1 from t2)) from t1; dot contents @@ -306,105 +306,105 @@ create table t(a int primary key, b int, c int, index idx(b)); explain select t.c in (select count(*) from t s ignore index(idx), t t1 where s.a = t.a and s.a = t1.a) from t; id count task operator info Projection_11 10000.00 root Column#11 -└─Apply_13 10000.00 root CARTESIAN left outer semi join, inner:StreamAgg_20, other cond:eq(Column#3, Column#10) +└─Apply_13 10000.00 root CARTESIAN left outer semi join, inner:StreamAgg_20, other cond:eq(test.t.c, Column#10) ├─TableReader_15 10000.00 root data:TableScan_14 │ └─TableScan_14 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo - └─StreamAgg_20 1.00 root funcs:count(1) - └─MergeJoin_54 12.50 root inner join, left key:Column#4, right key:Column#7 + └─StreamAgg_20 1.00 root funcs:count(1)->Column#10 + └─MergeJoin_54 12.50 root inner join, left key:test.t.a, right key:test.t.a ├─TableReader_47 1.00 root data:TableScan_46 - │ └─TableScan_46 1.00 cop[tikv] table:s, range: decided by [eq(Column#4, Column#1)], keep order:true, stats:pseudo + │ └─TableScan_46 1.00 cop[tikv] table:s, range: decided by [eq(test.t.a, test.t.a)], keep order:true, stats:pseudo └─TableReader_49 1.00 root data:TableScan_48 - └─TableScan_48 1.00 cop[tikv] table:t1, range: decided by [eq(Column#7, Column#1)], keep order:true, stats:pseudo + └─TableScan_48 1.00 cop[tikv] table:t1, range: decided by [eq(test.t.a, test.t.a)], keep order:true, stats:pseudo explain select t.c in (select count(*) from t s use index(idx), t t1 where s.b = t.a and s.a = t1.a) from t; id count task operator info Projection_11 10000.00 root Column#11 -└─Apply_13 10000.00 root CARTESIAN left outer semi join, inner:StreamAgg_20, other cond:eq(Column#3, Column#10) +└─Apply_13 10000.00 root CARTESIAN left outer semi join, inner:StreamAgg_20, other cond:eq(test.t.c, Column#10) ├─TableReader_15 10000.00 root data:TableScan_14 │ └─TableScan_14 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo - └─StreamAgg_20 1.00 root funcs:count(1) - └─IndexMergeJoin_44 12.50 root inner join, inner:TableReader_42, outer key:Column#4, inner key:Column#7 + └─StreamAgg_20 1.00 root funcs:count(1)->Column#10 + └─IndexMergeJoin_44 12.50 root inner join, inner:TableReader_42, outer key:test.t.a, inner key:test.t.a ├─IndexReader_33 10.00 root index:IndexScan_32 - │ └─IndexScan_32 10.00 cop[tikv] table:s, index:b, range: decided by [eq(Column#5, Column#1)], keep order:false, stats:pseudo + │ └─IndexScan_32 10.00 cop[tikv] table:s, index:b, range: decided by [eq(test.t.b, test.t.a)], keep order:false, stats:pseudo └─TableReader_42 1.00 root data:TableScan_41 - └─TableScan_41 1.00 cop[tikv] table:t1, range: decided by [Column#4], keep order:true, stats:pseudo + └─TableScan_41 1.00 cop[tikv] table:t1, range: decided by [test.t.a], keep order:true, stats:pseudo explain select t.c in (select count(*) from t s use index(idx), t t1 where s.b = t.a and s.c = t1.a) from t; id count task operator info Projection_11 10000.00 root Column#11 -└─Apply_13 10000.00 root CARTESIAN left outer semi join, inner:StreamAgg_20, other cond:eq(Column#3, Column#10) +└─Apply_13 10000.00 root CARTESIAN left outer semi join, inner:StreamAgg_20, other cond:eq(test.t.c, Column#10) ├─TableReader_15 10000.00 root data:TableScan_14 │ └─TableScan_14 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo - └─StreamAgg_20 1.00 root funcs:count(1) - └─IndexMergeJoin_46 12.49 root inner join, inner:TableReader_44, outer key:Column#6, inner key:Column#7 + └─StreamAgg_20 1.00 root funcs:count(1)->Column#10 + └─IndexMergeJoin_46 12.49 root inner join, inner:TableReader_44, outer key:test.t.c, inner key:test.t.a ├─IndexLookUp_35 9.99 root - │ ├─IndexScan_32 10.00 cop[tikv] table:s, index:b, range: decided by [eq(Column#5, Column#1)], keep order:false, stats:pseudo - │ └─Selection_34 9.99 cop[tikv] not(isnull(Column#6)) + │ ├─IndexScan_32 10.00 cop[tikv] table:s, index:b, range: decided by [eq(test.t.b, test.t.a)], keep order:false, stats:pseudo + │ └─Selection_34 9.99 cop[tikv] not(isnull(test.t.c)) │ └─TableScan_33 10.00 cop[tikv] table:s, keep order:false, stats:pseudo └─TableReader_44 1.00 root data:TableScan_43 - └─TableScan_43 1.00 cop[tikv] table:t1, range: decided by [Column#6], keep order:true, stats:pseudo + └─TableScan_43 1.00 cop[tikv] table:t1, range: decided by [test.t.c], keep order:true, stats:pseudo insert into t values(1, 1, 1), (2, 2 ,2), (3, 3, 3), (4, 3, 4),(5,3,5); analyze table t; explain select t.c in (select count(*) from t s, t t1 where s.b = t.a and s.b = 3 and s.a = t1.a) from t; id count task operator info Projection_11 5.00 root Column#11 -└─Apply_13 5.00 root CARTESIAN left outer semi join, inner:StreamAgg_20, other cond:eq(Column#3, Column#10) +└─Apply_13 5.00 root CARTESIAN left outer semi join, inner:StreamAgg_20, other cond:eq(test.t.c, Column#10) ├─TableReader_15 5.00 root data:TableScan_14 │ └─TableScan_14 5.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false - └─StreamAgg_20 1.00 root funcs:count(1) - └─MergeJoin_51 2.40 root inner join, left key:Column#4, right key:Column#7 + └─StreamAgg_20 1.00 root funcs:count(1)->Column#10 + └─MergeJoin_51 2.40 root inner join, left key:test.t.a, right key:test.t.a ├─IndexReader_38 2.40 root index:Selection_37 - │ └─Selection_37 2.40 cop[tikv] eq(3, Column#1) + │ └─Selection_37 2.40 cop[tikv] eq(3, test.t.a) │ └─IndexScan_36 3.00 cop[tikv] table:s, index:b, range:[3,3], keep order:true └─TableReader_41 4.00 root data:Selection_40 - └─Selection_40 4.00 cop[tikv] eq(3, Column#1) + └─Selection_40 4.00 cop[tikv] eq(3, test.t.a) └─TableScan_39 5.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:true explain select t.c in (select count(*) from t s left join t t1 on s.a = t1.a where 3 = t.a and s.b = 3) from t; id count task operator info Projection_10 5.00 root Column#11 -└─Apply_12 5.00 root CARTESIAN left outer semi join, inner:StreamAgg_19, other cond:eq(Column#3, Column#10) +└─Apply_12 5.00 root CARTESIAN left outer semi join, inner:StreamAgg_19, other cond:eq(test.t.c, Column#10) ├─TableReader_14 5.00 root data:TableScan_13 │ └─TableScan_13 5.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false - └─StreamAgg_19 1.00 root funcs:count(1) - └─MergeJoin_50 2.40 root left outer join, left key:Column#4, right key:Column#7 + └─StreamAgg_19 1.00 root funcs:count(1)->Column#10 + └─MergeJoin_50 2.40 root left outer join, left key:test.t.a, right key:test.t.a ├─IndexReader_37 2.40 root index:Selection_36 - │ └─Selection_36 2.40 cop[tikv] eq(3, Column#1) + │ └─Selection_36 2.40 cop[tikv] eq(3, test.t.a) │ └─IndexScan_35 3.00 cop[tikv] table:s, index:b, range:[3,3], keep order:true └─TableReader_40 4.00 root data:Selection_39 - └─Selection_39 4.00 cop[tikv] eq(3, Column#1) + └─Selection_39 4.00 cop[tikv] eq(3, test.t.a) └─TableScan_38 5.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:true explain select t.c in (select count(*) from t s right join t t1 on s.a = t1.a where 3 = t.a and t1.b = 3) from t; id count task operator info Projection_10 5.00 root Column#11 -└─Apply_12 5.00 root CARTESIAN left outer semi join, inner:StreamAgg_19, other cond:eq(Column#3, Column#10) +└─Apply_12 5.00 root CARTESIAN left outer semi join, inner:StreamAgg_19, other cond:eq(test.t.c, Column#10) ├─TableReader_14 5.00 root data:TableScan_13 │ └─TableScan_13 5.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false - └─StreamAgg_19 1.00 root funcs:count(1) - └─MergeJoin_49 2.40 root right outer join, left key:Column#4, right key:Column#7 + └─StreamAgg_19 1.00 root funcs:count(1)->Column#10 + └─MergeJoin_49 2.40 root right outer join, left key:test.t.a, right key:test.t.a ├─TableReader_36 4.00 root data:Selection_35 - │ └─Selection_35 4.00 cop[tikv] eq(3, Column#1) + │ └─Selection_35 4.00 cop[tikv] eq(3, test.t.a) │ └─TableScan_34 5.00 cop[tikv] table:s, range:[-inf,+inf], keep order:true └─IndexReader_39 2.40 root index:Selection_38 - └─Selection_38 2.40 cop[tikv] eq(3, Column#1) + └─Selection_38 2.40 cop[tikv] eq(3, test.t.a) └─IndexScan_37 3.00 cop[tikv] table:t1, index:b, range:[3,3], keep order:true drop table if exists t; create table t(a int unsigned); explain select t.a = '123455' from t; id count task operator info -Projection_3 10000.00 root eq(Column#1, 123455) +Projection_3 10000.00 root eq(test.t.a, 123455)->Column#3 └─TableReader_5 10000.00 root data:TableScan_4 └─TableScan_4 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select t.a > '123455' from t; id count task operator info -Projection_3 10000.00 root gt(Column#1, 123455) +Projection_3 10000.00 root gt(test.t.a, 123455)->Column#3 └─TableReader_5 10000.00 root data:TableScan_4 └─TableScan_4 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select t.a != '123455' from t; id count task operator info -Projection_3 10000.00 root ne(Column#1, 123455) +Projection_3 10000.00 root ne(test.t.a, 123455)->Column#3 └─TableReader_5 10000.00 root data:TableScan_4 └─TableScan_4 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select t.a = 12345678912345678998789678687678.111 from t; id count task operator info -Projection_3 10000.00 root 0 +Projection_3 10000.00 root 0->Column#3 └─TableReader_5 10000.00 root data:TableScan_4 └─TableScan_4 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo drop table if exists t; @@ -416,7 +416,7 @@ IndexReader_6 10.00 root index:IndexScan_5 explain select * from t where b in (1, 2) and b in (1, 3); id count task operator info TableReader_7 10.00 root data:Selection_6 -└─Selection_6 10.00 cop[tikv] in(Column#2, 1, 2), in(Column#2, 1, 3) +└─Selection_6 10.00 cop[tikv] in(test.t.b, 1, 2), in(test.t.b, 1, 3) └─TableScan_5 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t where a = 1 and a = 1; id count task operator info @@ -430,17 +430,17 @@ id count task operator info TableDual_5 0.00 root rows:0 explain select * from t t1 join t t2 where t1.b = t2.b and t2.b is null; id count task operator info -Projection_7 0.00 root Column#1, Column#2, Column#4, Column#5 -└─HashRightJoin_9 0.00 root inner join, inner:TableReader_12, equal:[eq(Column#5, Column#2)] +Projection_7 0.00 root test.t.a, test.t.b, test.t.a, test.t.b +└─HashRightJoin_9 0.00 root inner join, inner:TableReader_12, equal:[eq(test.t.b, test.t.b)] ├─TableReader_12 0.00 root data:Selection_11 - │ └─Selection_11 0.00 cop[tikv] isnull(Column#5), not(isnull(Column#5)) + │ └─Selection_11 0.00 cop[tikv] isnull(test.t.b), not(isnull(test.t.b)) │ └─TableScan_10 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 9990.00 root data:Selection_17 - └─Selection_17 9990.00 cop[tikv] not(isnull(Column#2)) + └─Selection_17 9990.00 cop[tikv] not(isnull(test.t.b)) └─TableScan_16 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t t1 where not exists (select * from t t2 where t1.b = t2.b); id count task operator info -HashLeftJoin_9 8000.00 root anti semi join, inner:TableReader_15, equal:[eq(Column#2, Column#5)] +HashLeftJoin_9 8000.00 root anti semi join, inner:TableReader_15, equal:[eq(test.t.b, test.t.b)] ├─TableReader_11 10000.00 root data:TableScan_10 │ └─TableScan_10 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_15 10000.00 root data:TableScan_14 @@ -452,7 +452,7 @@ id count task operator info TableDual_5 0.00 root rows:0 explain select null or a > 1 from t; id count task operator info -Projection_3 10000.00 root or(NULL, gt(Column#1, 1)) +Projection_3 10000.00 root or(, gt(test.t.a, 1))->Column#2 └─TableReader_5 10000.00 root data:TableScan_4 └─TableScan_4 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t where a = 1 for update; @@ -465,9 +465,9 @@ begin; insert tb values ('1'); explain select * from ta where a = 1; id count task operator info -Projection_5 8000.00 root Column#1 -└─Selection_6 8000.00 root eq(cast(Column#1), 1) - └─UnionScan_7 10000.00 root eq(cast(Column#1), 1) +Projection_5 8000.00 root test.ta.a +└─Selection_6 8000.00 root eq(cast(test.ta.a), 1) + └─UnionScan_7 10000.00 root eq(cast(test.ta.a), 1) └─TableReader_9 10000.00 root data:TableScan_8 └─TableScan_8 10000.00 cop[tikv] table:ta, range:[-inf,+inf], keep order:false, stats:pseudo rollback; @@ -486,7 +486,7 @@ drop table if exists t; create table t(a int, nb int not null, nc int not null); explain select ifnull(a, 0) from t; id count task operator info -Projection_3 10000.00 root ifnull(Column#1, 0) +Projection_3 10000.00 root ifnull(test.t.a, 0)->Column#5 └─TableReader_5 10000.00 root data:TableScan_4 └─TableScan_4 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select ifnull(nb, 0) from t; @@ -499,104 +499,104 @@ TableReader_5 10000.00 root data:TableScan_4 └─TableScan_4 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select ifnull(a, 0), ifnull(nb, 0) from t; id count task operator info -Projection_3 10000.00 root ifnull(Column#1, 0), Column#2 +Projection_3 10000.00 root ifnull(test.t.a, 0)->Column#5, test.t.nb └─TableReader_5 10000.00 root data:TableScan_4 └─TableScan_4 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select ifnull(nb, 0), ifnull(nb, 0) from t; id count task operator info -Projection_3 10000.00 root Column#2, Column#2 +Projection_3 10000.00 root test.t.nb, test.t.nb └─TableReader_5 10000.00 root data:TableScan_4 └─TableScan_4 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select 1+ifnull(nb, 0) from t; id count task operator info -Projection_3 10000.00 root plus(1, Column#2) +Projection_3 10000.00 root plus(1, test.t.nb)->Column#5 └─TableReader_5 10000.00 root data:TableScan_4 └─TableScan_4 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select 1+ifnull(a, 0) from t; id count task operator info -Projection_3 10000.00 root plus(1, ifnull(Column#1, 0)) +Projection_3 10000.00 root plus(1, ifnull(test.t.a, 0))->Column#5 └─TableReader_5 10000.00 root data:TableScan_4 └─TableScan_4 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select 1+ifnull(nb, 0) from t where nb=1; id count task operator info -Projection_4 10.00 root plus(1, Column#2) +Projection_4 10.00 root plus(1, test.t.nb)->Column#5 └─TableReader_7 10.00 root data:Selection_6 - └─Selection_6 10.00 cop[tikv] eq(Column#2, 1) + └─Selection_6 10.00 cop[tikv] eq(test.t.nb, 1) └─TableScan_5 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t ta left outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(ta.nb, 1) or ta.nb is null; id count task operator info -HashLeftJoin_7 8320.83 root left outer join, inner:TableReader_13, equal:[eq(Column#2, Column#6)], left cond:[gt(Column#1, 1)] +HashLeftJoin_7 8320.83 root left outer join, inner:TableReader_13, equal:[eq(test.t.nb, test.t.nb)], left cond:[gt(test.t.a, 1)] ├─TableReader_11 6656.67 root data:Selection_10 -│ └─Selection_10 6656.67 cop[tikv] or(Column#2, isnull(Column#2)) +│ └─Selection_10 6656.67 cop[tikv] or(test.t.nb, isnull(test.t.nb)) │ └─TableScan_9 10000.00 cop[tikv] table:ta, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_13 10000.00 root data:TableScan_12 └─TableScan_12 10000.00 cop[tikv] table:tb, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t ta right outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.nb, 1) or tb.nb is null; id count task operator info -HashRightJoin_7 6656.67 root right outer join, inner:TableReader_11, equal:[eq(Column#2, Column#6)] +HashRightJoin_7 6656.67 root right outer join, inner:TableReader_11, equal:[eq(test.t.nb, test.t.nb)] ├─TableReader_11 3333.33 root data:Selection_10 -│ └─Selection_10 3333.33 cop[tikv] gt(Column#1, 1) +│ └─Selection_10 3333.33 cop[tikv] gt(test.t.a, 1) │ └─TableScan_9 10000.00 cop[tikv] table:ta, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 6656.67 root data:Selection_13 - └─Selection_13 6656.67 cop[tikv] or(Column#6, isnull(Column#6)) + └─Selection_13 6656.67 cop[tikv] or(test.t.nb, isnull(test.t.nb)) └─TableScan_12 10000.00 cop[tikv] table:tb, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t ta inner join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.nb, 1) or tb.nb is null; id count task operator info -HashRightJoin_9 4166.67 root inner join, inner:TableReader_12, equal:[eq(Column#2, Column#6)] +HashRightJoin_9 4166.67 root inner join, inner:TableReader_12, equal:[eq(test.t.nb, test.t.nb)] ├─TableReader_12 3333.33 root data:Selection_11 -│ └─Selection_11 3333.33 cop[tikv] gt(Column#1, 1) +│ └─Selection_11 3333.33 cop[tikv] gt(test.t.a, 1) │ └─TableScan_10 10000.00 cop[tikv] table:ta, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_15 6656.67 root data:Selection_14 - └─Selection_14 6656.67 cop[tikv] or(Column#6, isnull(Column#6)) + └─Selection_14 6656.67 cop[tikv] or(test.t.nb, isnull(test.t.nb)) └─TableScan_13 10000.00 cop[tikv] table:tb, range:[-inf,+inf], keep order:false, stats:pseudo explain select ifnull(t.nc, 1) in (select count(*) from t s , t t1 where s.a = t.a and s.a = t1.a) from t; id count task operator info Projection_12 10000.00 root Column#14 -└─Apply_14 10000.00 root CARTESIAN left outer semi join, inner:HashAgg_19, other cond:eq(Column#3, Column#13) +└─Apply_14 10000.00 root CARTESIAN left outer semi join, inner:HashAgg_19, other cond:eq(test.t.nc, Column#13) ├─TableReader_16 10000.00 root data:TableScan_15 │ └─TableScan_15 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo - └─HashAgg_19 1.00 root funcs:count(Column#15) - └─HashLeftJoin_20 9.99 root inner join, inner:HashAgg_30, equal:[eq(Column#5, Column#9)] + └─HashAgg_19 1.00 root funcs:count(Column#15)->Column#13 + └─HashLeftJoin_20 9.99 root inner join, inner:HashAgg_30, equal:[eq(test.t.a, test.t.a)] ├─TableReader_24 9.99 root data:Selection_23 - │ └─Selection_23 9.99 cop[tikv] eq(Column#5, Column#1), not(isnull(Column#5)) + │ └─Selection_23 9.99 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a)) │ └─TableScan_22 10000.00 cop[tikv] table:s, range:[-inf,+inf], keep order:false, stats:pseudo - └─HashAgg_30 7.99 root group by:Column#9, funcs:count(Column#16), firstrow(Column#9) + └─HashAgg_30 7.99 root group by:test.t.a, funcs:count(Column#16)->Column#15, funcs:firstrow(test.t.a)->test.t.a └─TableReader_31 7.99 root data:HashAgg_25 - └─HashAgg_25 7.99 cop[tikv] group by:Column#9, funcs:count(1) - └─Selection_29 9.99 cop[tikv] eq(Column#9, Column#1), not(isnull(Column#9)) + └─HashAgg_25 7.99 cop[tikv] group by:test.t.a, funcs:count(1)->Column#16 + └─Selection_29 9.99 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a)) └─TableScan_28 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t ta left outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.a, 1) or tb.a is null; id count task operator info -Selection_7 10000.00 root or(ifnull(Column#5, 1), isnull(Column#5)) -└─HashLeftJoin_8 12500.00 root left outer join, inner:TableReader_13, equal:[eq(Column#2, Column#6)], left cond:[gt(Column#1, 1)] +Selection_7 10000.00 root or(ifnull(test.t.a, 1), isnull(test.t.a)) +└─HashLeftJoin_8 12500.00 root left outer join, inner:TableReader_13, equal:[eq(test.t.nb, test.t.nb)], left cond:[gt(test.t.a, 1)] ├─TableReader_11 10000.00 root data:TableScan_10 │ └─TableScan_10 10000.00 cop[tikv] table:ta, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_13 10000.00 root data:TableScan_12 └─TableScan_12 10000.00 cop[tikv] table:tb, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t ta right outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.a, 1) or tb.a is null; id count task operator info -HashRightJoin_7 8000.00 root right outer join, inner:TableReader_11, equal:[eq(Column#2, Column#6)] +HashRightJoin_7 8000.00 root right outer join, inner:TableReader_11, equal:[eq(test.t.nb, test.t.nb)] ├─TableReader_11 3333.33 root data:Selection_10 -│ └─Selection_10 3333.33 cop[tikv] gt(Column#1, 1) +│ └─Selection_10 3333.33 cop[tikv] gt(test.t.a, 1) │ └─TableScan_9 10000.00 cop[tikv] table:ta, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 8000.00 root data:Selection_13 - └─Selection_13 8000.00 cop[tikv] or(ifnull(Column#5, 1), isnull(Column#5)) + └─Selection_13 8000.00 cop[tikv] or(ifnull(test.t.a, 1), isnull(test.t.a)) └─TableScan_12 10000.00 cop[tikv] table:tb, range:[-inf,+inf], keep order:false, stats:pseudo explain select ifnull(t.a, 1) in (select count(*) from t s , t t1 where s.a = t.a and s.a = t1.a) from t; id count task operator info Projection_12 10000.00 root Column#14 -└─Apply_14 10000.00 root CARTESIAN left outer semi join, inner:HashAgg_19, other cond:eq(ifnull(Column#1, 1), Column#13) +└─Apply_14 10000.00 root CARTESIAN left outer semi join, inner:HashAgg_19, other cond:eq(ifnull(test.t.a, 1), Column#13) ├─TableReader_16 10000.00 root data:TableScan_15 │ └─TableScan_15 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo - └─HashAgg_19 1.00 root funcs:count(Column#15) - └─HashLeftJoin_20 9.99 root inner join, inner:HashAgg_30, equal:[eq(Column#5, Column#9)] + └─HashAgg_19 1.00 root funcs:count(Column#15)->Column#13 + └─HashLeftJoin_20 9.99 root inner join, inner:HashAgg_30, equal:[eq(test.t.a, test.t.a)] ├─TableReader_24 9.99 root data:Selection_23 - │ └─Selection_23 9.99 cop[tikv] eq(Column#5, Column#1), not(isnull(Column#5)) + │ └─Selection_23 9.99 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a)) │ └─TableScan_22 10000.00 cop[tikv] table:s, range:[-inf,+inf], keep order:false, stats:pseudo - └─HashAgg_30 7.99 root group by:Column#9, funcs:count(Column#16), firstrow(Column#9) + └─HashAgg_30 7.99 root group by:test.t.a, funcs:count(Column#16)->Column#15, funcs:firstrow(test.t.a)->test.t.a └─TableReader_31 7.99 root data:HashAgg_25 - └─HashAgg_25 7.99 cop[tikv] group by:Column#9, funcs:count(1) - └─Selection_29 9.99 cop[tikv] eq(Column#9, Column#1), not(isnull(Column#9)) + └─HashAgg_25 7.99 cop[tikv] group by:test.t.a, funcs:count(1)->Column#16 + └─Selection_29 9.99 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a)) └─TableScan_28 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo drop table if exists t; create table t(a int); @@ -605,31 +605,31 @@ id count task operator info Point_Get_1 1.00 root table:t, handle:0 explain select * from t where _tidb_rowid > 0; id count task operator info -Projection_4 8000.00 root Column#1 +Projection_4 8000.00 root test.t.a └─TableReader_6 10000.00 root data:TableScan_5 └─TableScan_5 10000.00 cop[tikv] table:t, range:(0,+inf], keep order:false, stats:pseudo explain select a, _tidb_rowid from t where a > 0; id count task operator info TableReader_7 3333.33 root data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(Column#1, 0) +└─Selection_6 3333.33 cop[tikv] gt(test.t.a, 0) └─TableScan_5 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t where _tidb_rowid > 0 and a > 0; id count task operator info -Projection_4 2666.67 root Column#1 +Projection_4 2666.67 root test.t.a └─TableReader_7 2666.67 root data:Selection_6 - └─Selection_6 2666.67 cop[tikv] gt(Column#1, 0) + └─Selection_6 2666.67 cop[tikv] gt(test.t.a, 0) └─TableScan_5 3333.33 cop[tikv] table:t, range:(0,+inf], keep order:false, stats:pseudo drop table if exists t; create table t(a int, b int, c int); explain select * from (select * from t order by (select 2)) t order by a, b; id count task operator info -Sort_12 10000.00 root Column#1:asc, Column#2:asc +Sort_12 10000.00 root test.t.a:asc, test.t.b:asc └─TableReader_18 10000.00 root data:TableScan_17 └─TableScan_17 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from (select * from t order by c) t order by a, b; id count task operator info -Sort_6 10000.00 root Column#1:asc, Column#2:asc -└─Sort_9 10000.00 root Column#3:asc +Sort_6 10000.00 root test.t.a:asc, test.t.b:asc +└─Sort_9 10000.00 root test.t.c:asc └─TableReader_12 10000.00 root data:TableScan_11 └─TableScan_11 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo drop table if exists t; @@ -637,20 +637,20 @@ set @@session.tidb_opt_insubq_to_join_and_agg=1; explain SELECT 0 AS a FROM dual UNION SELECT 1 AS a FROM dual ORDER BY a; id count task operator info Sort_13 2.00 root Column#3:asc -└─HashAgg_17 2.00 root group by:Column#3, funcs:firstrow(Column#6) +└─HashAgg_17 2.00 root group by:Column#3, funcs:firstrow(Column#6)->Column#3 └─Union_18 2.00 root - ├─HashAgg_19 1.00 root group by:0, funcs:firstrow(0), firstrow(0) + ├─HashAgg_19 1.00 root group by:0, funcs:firstrow(0)->Column#6, funcs:firstrow(0)->Column#3 │ └─TableDual_22 1.00 root rows:1 - └─HashAgg_25 1.00 root group by:1, funcs:firstrow(1), firstrow(1) + └─HashAgg_25 1.00 root group by:1, funcs:firstrow(1)->Column#6, funcs:firstrow(1)->Column#3 └─TableDual_28 1.00 root rows:1 explain SELECT 0 AS a FROM dual UNION (SELECT 1 AS a FROM dual ORDER BY a); id count task operator info -HashAgg_15 2.00 root group by:Column#3, funcs:firstrow(Column#6) +HashAgg_15 2.00 root group by:Column#3, funcs:firstrow(Column#6)->Column#3 └─Union_16 2.00 root - ├─HashAgg_17 1.00 root group by:0, funcs:firstrow(0), firstrow(0) + ├─HashAgg_17 1.00 root group by:0, funcs:firstrow(0)->Column#6, funcs:firstrow(0)->Column#3 │ └─TableDual_20 1.00 root rows:1 - └─StreamAgg_27 1.00 root group by:Column#1, funcs:firstrow(Column#1), firstrow(Column#1) - └─Projection_32 1.00 root 1 + └─StreamAgg_27 1.00 root group by:Column#1, funcs:firstrow(Column#1)->Column#6, funcs:firstrow(Column#1)->Column#3 + └─Projection_32 1.00 root 1->Column#1 └─TableDual_33 1.00 root rows:1 create table t (i int key, j int, unique key (i, j)); begin; @@ -666,15 +666,15 @@ begin; insert into t values (1); explain select * from t left outer join t t1 on t.a = t1.a where t.a not between 1 and 2; id count task operator info -Projection_8 8320.83 root Column#1, Column#3 -└─HashLeftJoin_9 8320.83 root left outer join, inner:UnionScan_15, equal:[eq(Column#1, Column#3)] - ├─UnionScan_11 6656.67 root not(and(ge(Column#1, 1), le(Column#1, 2))) +Projection_8 8320.83 root test.t.a, test.t.a +└─HashLeftJoin_9 8320.83 root left outer join, inner:UnionScan_15, equal:[eq(test.t.a, test.t.a)] + ├─UnionScan_11 6656.67 root not(and(ge(test.t.a, 1), le(test.t.a, 2))) │ └─TableReader_14 6656.67 root data:Selection_13 - │ └─Selection_13 6656.67 cop[tikv] or(lt(Column#1, 1), gt(Column#1, 2)) + │ └─Selection_13 6656.67 cop[tikv] or(lt(test.t.a, 1), gt(test.t.a, 2)) │ └─TableScan_12 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo - └─UnionScan_15 6656.67 root not(and(ge(Column#3, 1), le(Column#3, 2))), not(isnull(Column#3)) + └─UnionScan_15 6656.67 root not(and(ge(test.t.a, 1), le(test.t.a, 2))), not(isnull(test.t.a)) └─TableReader_18 6656.67 root data:Selection_17 - └─Selection_17 6656.67 cop[tikv] not(isnull(Column#3)), or(lt(Column#3, 1), gt(Column#3, 2)) + └─Selection_17 6656.67 cop[tikv] not(isnull(test.t.a)), or(lt(test.t.a, 1), gt(test.t.a, 2)) └─TableScan_16 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo rollback; drop table if exists t; @@ -684,12 +684,12 @@ analyze table t; explain select * from t where a = 1; id count task operator info TableReader_7 1.00 root data:Selection_6 -└─Selection_6 1.00 cop[tikv] eq(Column#1, 00:00:01.000000) +└─Selection_6 1.00 cop[tikv] eq(test.t.a, 00:00:01.000000) └─TableScan_5 3.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false explain select * from t where b = "1000-01-01"; id count task operator info TableReader_7 1.00 root data:Selection_6 -└─Selection_6 1.00 cop[tikv] eq(Column#2, 1000-01-01 00:00:00.000000) +└─Selection_6 1.00 cop[tikv] eq(test.t.b, 1000-01-01 00:00:00.000000) └─TableScan_5 3.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false drop table t; create table t(a int); @@ -698,7 +698,7 @@ analyze table t with 1 buckets; explain select * from t where a >= 3 and a <= 8; id count task operator info TableReader_7 0.00 root data:Selection_6 -└─Selection_6 0.00 cop[tikv] ge(Column#1, 3), le(Column#1, 8) +└─Selection_6 0.00 cop[tikv] ge(test.t.a, 3), le(test.t.a, 8) └─TableScan_5 8.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false drop table t; create table t(a int, b int, index idx_ab(a, b)); @@ -714,12 +714,12 @@ drop table if exists t; create table t(a int, b int); explain select a, b from (select a, b, avg(b) over (partition by a)as avg_b from t) as tt where a > 10 and b < 10 and a > avg_b; id count task operator info -Projection_8 2666.67 root Column#1, Column#2 -└─Selection_9 2666.67 root gt(cast(Column#1), Column#5), lt(Column#2, 10) - └─Window_10 3333.33 root avg(cast(Column#2)) over(partition by Column#1) - └─Sort_14 3333.33 root Column#1:asc +Projection_8 2666.67 root test.t.a, test.t.b +└─Selection_9 2666.67 root gt(cast(test.t.a), Column#5), lt(test.t.b, 10) + └─Window_10 3333.33 root avg(cast(test.t.b))->Column#5 over(partition by test.t.a) + └─Sort_14 3333.33 root test.t.a:asc └─TableReader_13 3333.33 root data:Selection_12 - └─Selection_12 3333.33 cop[tikv] gt(Column#1, 10) + └─Selection_12 3333.33 cop[tikv] gt(test.t.a, 10) └─TableScan_11 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo drop table if exists t; create table t(a int, b int); diff --git a/cmd/explaintest/r/explain_easy_stats.result b/cmd/explaintest/r/explain_easy_stats.result index 8857754ae38b2..cb8274456dafe 100644 --- a/cmd/explaintest/r/explain_easy_stats.result +++ b/cmd/explaintest/r/explain_easy_stats.result @@ -14,14 +14,14 @@ set @@session.tidb_hashagg_partial_concurrency = 1; set @@session.tidb_hashagg_final_concurrency = 1; explain select * from t3 where exists (select s.a from t3 s having sum(s.a) = t3.a ); id count task operator info -Projection_11 1600.00 root Column#1, Column#2, Column#3, Column#4 +Projection_11 1600.00 root test.t3.a, test.t3.b, test.t3.c, test.t3.d └─HashLeftJoin_12 1600.00 root semi join, inner:StreamAgg_27, equal:[eq(Column#13, Column#11)] - ├─Projection_13 2000.00 root Column#1, Column#2, Column#3, Column#4, cast(Column#1) + ├─Projection_13 2000.00 root test.t3.a, test.t3.b, test.t3.c, test.t3.d, cast(test.t3.a)->Column#13 │ └─TableReader_15 2000.00 root data:TableScan_14 │ └─TableScan_14 2000.00 cop[tikv] table:t3, range:[-inf,+inf], keep order:false - └─StreamAgg_27 1.00 root funcs:sum(Column#16) + └─StreamAgg_27 1.00 root funcs:sum(Column#16)->Column#11 └─TableReader_28 1.00 root data:StreamAgg_19 - └─StreamAgg_19 1.00 cop[tikv] funcs:sum(Column#6) + └─StreamAgg_19 1.00 cop[tikv] funcs:sum(test.t3.a)->Column#16 └─TableScan_26 2000.00 cop[tikv] table:s, range:[-inf,+inf], keep order:false explain select * from t1; id count task operator info @@ -34,7 +34,7 @@ IndexLookUp_12 1999.00 root └─TableScan_11 1999.00 cop[tikv] table:t1, keep order:false explain select * from t2 order by c2; id count task operator info -Sort_4 1985.00 root Column#2:asc +Sort_4 1985.00 root test.t2.c2:asc └─TableReader_8 1985.00 root data:TableScan_7 └─TableScan_7 1985.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false explain select * from t1 where t1.c1 > 0; @@ -47,11 +47,11 @@ IndexReader_6 0.00 root index:IndexScan_5 └─IndexScan_5 0.00 cop[tikv] table:t1, index:c2, range:[1,1], keep order:false explain select * from t1 left join t2 on t1.c2 = t2.c1 where t1.c1 > 1; id count task operator info -HashLeftJoin_22 2481.25 root left outer join, inner:TableReader_36, equal:[eq(Column#2, Column#4)] +HashLeftJoin_22 2481.25 root left outer join, inner:TableReader_36, equal:[eq(test.t1.c2, test.t2.c1)] ├─TableReader_33 1998.00 root data:TableScan_32 │ └─TableScan_32 1998.00 cop[tikv] table:t1, range:(1,+inf], keep order:false └─TableReader_36 1985.00 root data:Selection_35 - └─Selection_35 1985.00 cop[tikv] not(isnull(Column#4)) + └─Selection_35 1985.00 cop[tikv] not(isnull(test.t2.c1)) └─TableScan_34 1985.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false explain update t1 set t1.c2 = 2 where t1.c1 = 1; id count task operator info @@ -65,54 +65,54 @@ Delete_4 N/A root N/A └─TableScan_10 0.00 cop[tikv] table:t1, keep order:false explain select count(b.c2) from t1 a, t2 b where a.c1 = b.c2 group by a.c1; id count task operator info -Projection_11 1985.00 root cast(Column#8) -└─HashLeftJoin_21 1985.00 root inner join, inner:HashAgg_25, equal:[eq(Column#1, Column#5)] +Projection_11 1985.00 root cast(Column#8)->Column#7 +└─HashLeftJoin_21 1985.00 root inner join, inner:HashAgg_25, equal:[eq(test.t1.c1, test.t2.c2)] ├─TableReader_34 1999.00 root data:TableScan_33 │ └─TableScan_33 1999.00 cop[tikv] table:a, range:[-inf,+inf], keep order:false - └─HashAgg_25 1985.00 root group by:Column#5, funcs:count(Column#5), firstrow(Column#5) + └─HashAgg_25 1985.00 root group by:test.t2.c2, funcs:count(test.t2.c2)->Column#8, funcs:firstrow(test.t2.c2)->test.t2.c2 └─TableReader_32 1985.00 root data:Selection_31 - └─Selection_31 1985.00 cop[tikv] not(isnull(Column#5)) + └─Selection_31 1985.00 cop[tikv] not(isnull(test.t2.c2)) └─TableScan_30 1985.00 cop[tikv] table:b, range:[-inf,+inf], keep order:false explain select * from t2 order by t2.c2 limit 0, 1; id count task operator info -TopN_7 1.00 root Column#2:asc, offset:0, count:1 +TopN_7 1.00 root test.t2.c2:asc, offset:0, count:1 └─TableReader_15 1.00 root data:TopN_14 - └─TopN_14 1.00 cop[tikv] Column#2:asc, offset:0, count:1 + └─TopN_14 1.00 cop[tikv] test.t2.c2:asc, offset:0, count:1 └─TableScan_13 1985.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false explain select * from t1 where c1 > 1 and c2 = 1 and c3 < 1; id count task operator info IndexLookUp_11 0.00 root ├─IndexScan_8 0.00 cop[tikv] table:t1, index:c2, range:(1 1,1 +inf], keep order:false -└─Selection_10 0.00 cop[tikv] lt(Column#3, 1) +└─Selection_10 0.00 cop[tikv] lt(test.t1.c3, 1) └─TableScan_9 0.00 cop[tikv] table:t1, keep order:false explain select * from t1 where c1 = 1 and c2 > 1; id count task operator info TableReader_7 0.50 root data:Selection_6 -└─Selection_6 0.50 cop[tikv] gt(Column#2, 1) +└─Selection_6 0.50 cop[tikv] gt(test.t1.c2, 1) └─TableScan_5 1.00 cop[tikv] table:t1, range:[1,1], keep order:false explain select c1 from t1 where c1 in (select c2 from t2); id count task operator info -Projection_9 1985.00 root Column#1 -└─HashLeftJoin_19 1985.00 root inner join, inner:HashAgg_23, equal:[eq(Column#1, Column#5)] +Projection_9 1985.00 root test.t1.c1 +└─HashLeftJoin_19 1985.00 root inner join, inner:HashAgg_23, equal:[eq(test.t1.c1, test.t2.c2)] ├─TableReader_32 1999.00 root data:TableScan_31 │ └─TableScan_31 1999.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false - └─HashAgg_23 1985.00 root group by:Column#5, funcs:firstrow(Column#5) + └─HashAgg_23 1985.00 root group by:test.t2.c2, funcs:firstrow(test.t2.c2)->test.t2.c2 └─TableReader_30 1985.00 root data:Selection_29 - └─Selection_29 1985.00 cop[tikv] not(isnull(Column#5)) + └─Selection_29 1985.00 cop[tikv] not(isnull(test.t2.c2)) └─TableScan_28 1985.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false explain select * from information_schema.columns; id count task operator info MemTableScan_4 10000.00 root explain select c2 = (select c2 from t2 where t1.c1 = t2.c1 order by c1 limit 1) from t1; id count task operator info -Projection_12 1999.00 root eq(Column#2, Column#5) +Projection_12 1999.00 root eq(test.t1.c2, test.t2.c2)->Column#8 └─Apply_14 1999.00 root CARTESIAN left outer join, inner:Projection_43 ├─TableReader_16 1999.00 root data:TableScan_15 │ └─TableScan_15 1999.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false - └─Projection_43 1.00 root Column#4, Column#5 + └─Projection_43 1.00 root test.t2.c1, test.t2.c2 └─IndexLookUp_42 1.00 root limit embedded(offset:0, count:1) ├─Limit_41 1.00 cop[tikv] offset:0, count:1 - │ └─IndexScan_39 1.25 cop[tikv] table:t2, index:c1, range: decided by [eq(Column#1, Column#4)], keep order:true + │ └─IndexScan_39 1.25 cop[tikv] table:t2, index:c1, range: decided by [eq(test.t1.c1, test.t2.c1)], keep order:true └─TableScan_40 1.00 cop[tikv] table:t2, keep order:false, stats:pseudo explain select * from t1 order by c1 desc limit 1; id count task operator info @@ -128,7 +128,7 @@ Projection_6 1999.00 root Column#7 ├─TableReader_9 1999.00 root data:TableScan_8 │ └─TableScan_8 1999.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false └─TableReader_14 0.00 root data:Selection_13 - └─Selection_13 0.00 cop[tikv] eq(1, Column#5) + └─Selection_13 0.00 cop[tikv] eq(1, test.t2.c2) └─TableScan_12 1985.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false explain format="dot" select 1 in (select c2 from t2) from t1; dot contents diff --git a/cmd/explaintest/r/explain_indexmerge.result b/cmd/explaintest/r/explain_indexmerge.result index fb26773144db6..c70ada6513807 100644 --- a/cmd/explaintest/r/explain_indexmerge.result +++ b/cmd/explaintest/r/explain_indexmerge.result @@ -16,12 +16,12 @@ id count task operator info IndexMerge_12 98.00 root ├─TableScan_8 49.00 cop[tikv] table:t, range:[-inf,50), keep order:false ├─IndexScan_9 49.00 cop[tikv] table:t, index:b, range:[-inf,50), keep order:false -└─Selection_11 98.00 cop[tikv] gt(Column#6, 100) +└─Selection_11 98.00 cop[tikv] gt(test.t.f, 100) └─TableScan_10 98.00 cop[tikv] table:t, keep order:false explain select * from t where a < 50 or b < 5000000; id count task operator info TableReader_7 4000000.00 root data:Selection_6 -└─Selection_6 4000000.00 cop[tikv] or(lt(Column#1, 50), lt(Column#2, 5000000)) +└─Selection_6 4000000.00 cop[tikv] or(lt(test.t.a, 50), lt(test.t.b, 5000000)) └─TableScan_5 5000000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false explain select * from t where b < 50 or c < 50; id count task operator info @@ -32,7 +32,7 @@ IndexMerge_11 98.00 root explain select * from t where b < 50 or c < 5000000; id count task operator info TableReader_7 4000000.00 root data:Selection_6 -└─Selection_6 4000000.00 cop[tikv] or(lt(Column#2, 50), lt(Column#3, 5000000)) +└─Selection_6 4000000.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 5000000)) └─TableScan_5 5000000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false explain select * from t where a < 50 or b < 50 or c < 50; id count task operator info @@ -46,7 +46,7 @@ id count task operator info IndexMerge_17 0.00 root ├─TableScan_13 9.00 cop[tikv] table:t, range:[-inf,10), keep order:false ├─IndexScan_14 9.00 cop[tikv] table:t, index:d, range:[-inf,10), keep order:false -└─Selection_16 0.00 cop[tikv] lt(Column#6, 10), or(lt(Column#2, 10000), lt(Column#3, 10000)) +└─Selection_16 0.00 cop[tikv] lt(test.t.f, 10), or(lt(test.t.b, 10000), lt(test.t.c, 10000)) └─TableScan_15 18.00 cop[tikv] table:t, keep order:false explain format="dot" select * from t where (a < 50 or b < 50) and f > 100; dot contents @@ -93,17 +93,17 @@ id count task operator info IndexMerge_9 0.00 root ├─IndexScan_5 9999.00 cop[tikv] table:t, index:b, range:[-inf,10000), keep order:false ├─IndexScan_6 9999.00 cop[tikv] table:t, index:c, range:[-inf,10000), keep order:false -└─Selection_8 0.00 cop[tikv] lt(Column#6, 10), or(lt(Column#1, 10), lt(Column#4, 10)) +└─Selection_8 0.00 cop[tikv] lt(test.t.f, 10), or(lt(test.t.a, 10), lt(test.t.d, 10)) └─TableScan_7 19998.00 cop[tikv] table:t, keep order:false explain select /*+ use_index_merge(t, tb) */ * from t where b < 50 or c < 5000000; id count task operator info TableReader_7 4000000.00 root data:Selection_6 -└─Selection_6 4000000.00 cop[tikv] or(lt(Column#2, 50), lt(Column#3, 5000000)) +└─Selection_6 4000000.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 5000000)) └─TableScan_5 5000000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false explain select /*+ no_index_merge(), use_index_merge(t, tb, tc) */ * from t where b < 50 or c < 5000000; id count task operator info TableReader_7 4000000.00 root data:Selection_6 -└─Selection_6 4000000.00 cop[tikv] or(lt(Column#2, 50), lt(Column#3, 5000000)) +└─Selection_6 4000000.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 5000000)) └─TableScan_5 5000000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false explain select /*+ use_index_merge(t, primary, tb) */ * from t where a < 50 or b < 5000000; id count task operator info diff --git a/cmd/explaintest/r/generated_columns.result b/cmd/explaintest/r/generated_columns.result index 4cd0f39e02d11..77f37d887a580 100644 --- a/cmd/explaintest/r/generated_columns.result +++ b/cmd/explaintest/r/generated_columns.result @@ -8,7 +8,7 @@ KEY (city) ); EXPLAIN SELECT name, id FROM person WHERE city = 'Beijing'; id count task operator info -Projection_4 10.00 root Column#2, Column#1 +Projection_4 10.00 root test.person.name, test.person.id └─IndexLookUp_10 10.00 root ├─IndexScan_8 10.00 cop[tikv] table:person, index:city, range:["Beijing","Beijing"], keep order:false, stats:pseudo └─TableScan_9 10.00 cop[tikv] table:person, keep order:false, stats:pseudo @@ -33,12 +33,12 @@ IndexReader_6 3323.33 root index:IndexScan_5 EXPLAIN SELECT a, b from sgc where b < 3; id count task operator info IndexReader_13 3323.33 root index:Selection_12 -└─Selection_12 3323.33 cop[tikv] lt(Column#4, 3) +└─Selection_12 3323.33 cop[tikv] lt(test.sgc.b, 3) └─IndexScan_11 10000.00 cop[tikv] table:sgc, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT a, b from sgc where a < 3 and b < 3; id count task operator info IndexReader_11 1104.45 root index:Selection_10 -└─Selection_10 1104.45 cop[tikv] lt(Column#4, 3) +└─Selection_10 1104.45 cop[tikv] lt(test.sgc.b, 3) └─IndexScan_9 3323.33 cop[tikv] table:sgc, index:a, b, range:[-inf,3), keep order:false, stats:pseudo DROP TABLE IF EXISTS sgc1, sgc2; @@ -71,23 +71,23 @@ VALUES ('{"a": 1}', '{"1": "1"}'); ANALYZE TABLE sgc1, sgc2; EXPLAIN SELECT /*+ TIDB_INLJ(sgc1, sgc2) */ * from sgc1 join sgc2 on sgc1.a=sgc2.a; id count task operator info -IndexJoin_26 5.00 root inner join, inner:IndexLookUp_25, outer key:Column#8, inner key:Column#3 +IndexJoin_26 5.00 root inner join, inner:IndexLookUp_25, outer key:test.sgc2.a, inner key:test.sgc1.a ├─IndexLookUp_25 5.00 root -│ ├─Selection_24 5.00 cop[tikv] not(isnull(Column#3)) -│ │ └─IndexScan_22 5.00 cop[tikv] table:sgc1, index:a, range: decided by [eq(Column#3, Column#8)], keep order:false +│ ├─Selection_24 5.00 cop[tikv] not(isnull(test.sgc1.a)) +│ │ └─IndexScan_22 5.00 cop[tikv] table:sgc1, index:a, range: decided by [eq(test.sgc1.a, test.sgc2.a)], keep order:false │ └─TableScan_23 5.00 cop[tikv] table:sgc1, keep order:false └─TableReader_38 1.00 root data:Selection_37 - └─Selection_37 1.00 cop[tikv] not(isnull(Column#8)) + └─Selection_37 1.00 cop[tikv] not(isnull(test.sgc2.a)) └─TableScan_36 1.00 cop[tikv] table:sgc2, range:[-inf,+inf], keep order:false EXPLAIN SELECT * from sgc1 join sgc2 on sgc1.a=sgc2.a; id count task operator info -Projection_6 5.00 root Column#1, Column#2, Column#3, Column#4, Column#6, Column#7, Column#8, Column#9 -└─HashRightJoin_24 5.00 root inner join, inner:TableReader_43, equal:[eq(Column#8, Column#3)] +Projection_6 5.00 root test.sgc1.j1, test.sgc1.j2, test.sgc1.a, test.sgc1.b, test.sgc2.j1, test.sgc2.j2, test.sgc2.a, test.sgc2.b +└─HashRightJoin_24 5.00 root inner join, inner:TableReader_43, equal:[eq(test.sgc2.a, test.sgc1.a)] ├─TableReader_43 1.00 root data:Selection_42 - │ └─Selection_42 1.00 cop[tikv] not(isnull(Column#8)) + │ └─Selection_42 1.00 cop[tikv] not(isnull(test.sgc2.a)) │ └─TableScan_41 1.00 cop[tikv] table:sgc2, range:[-inf,+inf], keep order:false └─TableReader_52 5.00 root data:Selection_51 - └─Selection_51 5.00 cop[tikv] not(isnull(Column#3)) + └─Selection_51 5.00 cop[tikv] not(isnull(test.sgc1.a)) └─TableScan_50 5.00 cop[tikv] table:sgc1, range:[-inf,+inf], keep order:false DROP TABLE IF EXISTS sgc3; CREATE TABLE sgc3 ( @@ -106,34 +106,34 @@ EXPLAIN SELECT * FROM sgc3 WHERE a <= 1; id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] le(Column#2, 1) +│ └─Selection_10 3323.33 cop[tikv] le(test.sgc3.a, 1) │ └─TableScan_9 10000.00 cop[tikv] table:sgc3, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] le(Column#2, 1) + └─Selection_13 3323.33 cop[tikv] le(test.sgc3.a, 1) └─TableScan_12 10000.00 cop[tikv] table:sgc3, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM sgc3 WHERE a < 7; id count task operator info Union_13 23263.33 root ├─TableReader_16 3323.33 root data:Selection_15 -│ └─Selection_15 3323.33 cop[tikv] lt(Column#2, 7) +│ └─Selection_15 3323.33 cop[tikv] lt(test.sgc3.a, 7) │ └─TableScan_14 10000.00 cop[tikv] table:sgc3, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3323.33 root data:Selection_18 -│ └─Selection_18 3323.33 cop[tikv] lt(Column#2, 7) +│ └─Selection_18 3323.33 cop[tikv] lt(test.sgc3.a, 7) │ └─TableScan_17 10000.00 cop[tikv] table:sgc3, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_22 3323.33 root data:Selection_21 -│ └─Selection_21 3323.33 cop[tikv] lt(Column#2, 7) +│ └─Selection_21 3323.33 cop[tikv] lt(test.sgc3.a, 7) │ └─TableScan_20 10000.00 cop[tikv] table:sgc3, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_25 3323.33 root data:Selection_24 -│ └─Selection_24 3323.33 cop[tikv] lt(Column#2, 7) +│ └─Selection_24 3323.33 cop[tikv] lt(test.sgc3.a, 7) │ └─TableScan_23 10000.00 cop[tikv] table:sgc3, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_28 3323.33 root data:Selection_27 -│ └─Selection_27 3323.33 cop[tikv] lt(Column#2, 7) +│ └─Selection_27 3323.33 cop[tikv] lt(test.sgc3.a, 7) │ └─TableScan_26 10000.00 cop[tikv] table:sgc3, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_31 3323.33 root data:Selection_30 -│ └─Selection_30 3323.33 cop[tikv] lt(Column#2, 7) +│ └─Selection_30 3323.33 cop[tikv] lt(test.sgc3.a, 7) │ └─TableScan_29 10000.00 cop[tikv] table:sgc3, partition:p5, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_34 3323.33 root data:Selection_33 - └─Selection_33 3323.33 cop[tikv] lt(Column#2, 7) + └─Selection_33 3323.33 cop[tikv] lt(test.sgc3.a, 7) └─TableScan_32 10000.00 cop[tikv] table:sgc3, partition:max, range:[-inf,+inf], keep order:false, stats:pseudo DROP TABLE IF EXISTS t1; CREATE TABLE t1(a INT, b INT AS (a+1) VIRTUAL, c INT AS (b+1) VIRTUAL, d INT AS (c+1) VIRTUAL, KEY(b), INDEX IDX(c, d)); @@ -144,7 +144,7 @@ IndexReader_6 10.00 root index:IndexScan_5 └─IndexScan_5 10.00 cop[tikv] table:t1, index:b, range:[1,1], keep order:false, stats:pseudo EXPLAIN SELECT b, c, d FROM t1 WHERE b=1; id count task operator info -Projection_4 10.00 root Column#2, Column#3, Column#4 +Projection_4 10.00 root test.t1.b, test.t1.c, test.t1.d └─IndexLookUp_10 10.00 root ├─IndexScan_8 10.00 cop[tikv] table:t1, index:b, range:[1,1], keep order:false, stats:pseudo └─TableScan_9 10.00 cop[tikv] table:t1, keep order:false, stats:pseudo @@ -155,7 +155,7 @@ IndexLookUp_10 10.00 root └─TableScan_9 10.00 cop[tikv] table:t1, keep order:false, stats:pseudo EXPLAIN SELECT c FROM t1 WHERE c=2 AND d=3; id count task operator info -Projection_4 0.10 root Column#3 +Projection_4 0.10 root test.t1.c └─IndexReader_6 0.10 root index:IndexScan_5 └─IndexScan_5 0.10 cop[tikv] table:t1, index:c, d, range:[2 3,2 3], keep order:false, stats:pseudo DROP TABLE IF EXISTS person; @@ -168,7 +168,7 @@ KEY(city_no)); INSERT INTO person (name, address_info) VALUES ("John", CAST('{"city_no": 1}' AS JSON)); EXPLAIN SELECT name FROM person where city_no=1; id count task operator info -Projection_4 10.00 root Column#2 +Projection_4 10.00 root test.person.name └─IndexLookUp_10 10.00 root ├─IndexScan_8 10.00 cop[tikv] table:person, index:city_no, range:[1,1], keep order:false, stats:pseudo └─TableScan_9 10.00 cop[tikv] table:person, keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/index_join.result b/cmd/explaintest/r/index_join.result index 68c53dbe4f809..3baa1d13fa27a 100644 --- a/cmd/explaintest/r/index_join.result +++ b/cmd/explaintest/r/index_join.result @@ -8,23 +8,23 @@ set session tidb_hashagg_partial_concurrency = 1; set session tidb_hashagg_final_concurrency = 1; explain select /*+ TIDB_INLJ(t1, t2) */ * from t1 join t2 on t1.a=t2.a; id count task operator info -IndexJoin_25 5.00 root inner join, inner:IndexLookUp_24, outer key:Column#4, inner key:Column#1 +IndexJoin_25 5.00 root inner join, inner:IndexLookUp_24, outer key:test.t2.a, inner key:test.t1.a ├─IndexLookUp_24 5.00 root -│ ├─Selection_23 5.00 cop[tikv] not(isnull(Column#1)) -│ │ └─IndexScan_21 5.00 cop[tikv] table:t1, index:a, range: decided by [eq(Column#1, Column#4)], keep order:false +│ ├─Selection_23 5.00 cop[tikv] not(isnull(test.t1.a)) +│ │ └─IndexScan_21 5.00 cop[tikv] table:t1, index:a, range: decided by [eq(test.t1.a, test.t2.a)], keep order:false │ └─TableScan_22 5.00 cop[tikv] table:t1, keep order:false └─TableReader_37 1.00 root data:Selection_36 - └─Selection_36 1.00 cop[tikv] not(isnull(Column#4)) + └─Selection_36 1.00 cop[tikv] not(isnull(test.t2.a)) └─TableScan_35 1.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false explain select * from t1 join t2 on t1.a=t2.a; id count task operator info -Projection_6 5.00 root Column#1, Column#2, Column#4, Column#5 -└─HashRightJoin_23 5.00 root inner join, inner:TableReader_34, equal:[eq(Column#4, Column#1)] +Projection_6 5.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b +└─HashRightJoin_23 5.00 root inner join, inner:TableReader_34, equal:[eq(test.t2.a, test.t1.a)] ├─TableReader_34 1.00 root data:Selection_33 - │ └─Selection_33 1.00 cop[tikv] not(isnull(Column#4)) + │ └─Selection_33 1.00 cop[tikv] not(isnull(test.t2.a)) │ └─TableScan_32 1.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false └─TableReader_40 5.00 root data:Selection_39 - └─Selection_39 5.00 cop[tikv] not(isnull(Column#1)) + └─Selection_39 5.00 cop[tikv] not(isnull(test.t1.a)) └─TableScan_38 5.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false drop table if exists t1, t2; create table t1(a int not null, b int not null); @@ -32,11 +32,11 @@ create table t2(a int not null, b int not null, key a(a)); set @@tidb_opt_insubq_to_join_and_agg=0; explain select /*+ TIDB_INLJ(t2@sel_2) */ * from t1 where t1.a in (select t2.a from t2); id count task operator info -IndexJoin_10 8000.00 root semi join, inner:IndexReader_9, outer key:Column#1, inner key:Column#4 +IndexJoin_10 8000.00 root semi join, inner:IndexReader_9, outer key:test.t1.a, inner key:test.t2.a ├─TableReader_18 10000.00 root data:TableScan_17 │ └─TableScan_17 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─IndexReader_9 1.25 root index:IndexScan_8 - └─IndexScan_8 1.25 cop[tikv] table:t2, index:a, range: decided by [eq(Column#4, Column#1)], keep order:false, stats:pseudo + └─IndexScan_8 1.25 cop[tikv] table:t2, index:a, range: decided by [eq(test.t2.a, test.t1.a)], keep order:false, stats:pseudo show warnings; Level Code Message set @@tidb_opt_insubq_to_join_and_agg=1; @@ -45,11 +45,11 @@ create table t1(a int not null, b int not null, key a(a)); create table t2(a int not null, b int not null, key a(a)); explain select /*+ TIDB_INLJ(t1) */ * from t1 where t1.a in (select t2.a from t2); id count task operator info -Projection_8 10000.00 root Column#1, Column#2 -└─IndexJoin_12 10000.00 root inner join, inner:IndexLookUp_11, outer key:Column#4, inner key:Column#1 +Projection_8 10000.00 root test.t1.a, test.t1.b +└─IndexJoin_12 10000.00 root inner join, inner:IndexLookUp_11, outer key:test.t2.a, inner key:test.t1.a ├─IndexLookUp_11 1.25 root - │ ├─IndexScan_9 1.25 cop[tikv] table:t1, index:a, range: decided by [eq(Column#1, Column#4)], keep order:false, stats:pseudo + │ ├─IndexScan_9 1.25 cop[tikv] table:t1, index:a, range: decided by [eq(test.t1.a, test.t2.a)], keep order:false, stats:pseudo │ └─TableScan_10 1.25 cop[tikv] table:t1, keep order:false, stats:pseudo - └─StreamAgg_25 8000.00 root group by:Column#4, funcs:firstrow(Column#4) + └─StreamAgg_25 8000.00 root group by:test.t2.a, funcs:firstrow(test.t2.a)->test.t2.a └─IndexReader_38 10000.00 root index:IndexScan_37 └─IndexScan_37 10000.00 cop[tikv] table:t2, index:a, range:[NULL,+inf], keep order:true, stats:pseudo diff --git a/cmd/explaintest/r/partition_pruning.result b/cmd/explaintest/r/partition_pruning.result index 5b0c32032bf85..f6bcb89dd33cc 100644 --- a/cmd/explaintest/r/partition_pruning.result +++ b/cmd/explaintest/r/partition_pruning.result @@ -1041,488 +1041,488 @@ EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_20 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00) + └─Selection_26 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00) +│ └─Selection_20 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00) + └─Selection_26 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); id count task operator info IndexReader_11 10.00 root index:Selection_10 -└─Selection_10 10.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:00) +└─Selection_10 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) +│ └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) +│ └─Selection_27 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) + └─Selection_33 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_27 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) + └─Selection_33 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_8 6646.67 root ├─IndexReader_14 3323.33 root index:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_13 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_20 3323.33 root index:Selection_19 - └─Selection_19 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59) + └─Selection_19 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) └─IndexScan_18 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_8 6646.67 root ├─IndexReader_14 3323.33 root index:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59) +│ └─Selection_13 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_20 3323.33 root index:Selection_19 - └─Selection_19 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59) + └─Selection_19 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) └─IndexScan_18 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info IndexReader_11 10.00 root index:Selection_10 -└─Selection_10 10.00 cop[tikv] eq(Column#2, 2009-04-02 23:59:59) +└─Selection_10 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_11 16666.67 root ├─IndexReader_17 3333.33 root index:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_16 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_15 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_23 3333.33 root index:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_22 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_21 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_29 3333.33 root index:Selection_28 -│ └─Selection_28 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_28 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_27 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_35 3333.33 root index:Selection_34 -│ └─Selection_34 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_34 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_33 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_41 3333.33 root index:Selection_40 - └─Selection_40 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) + └─Selection_40 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) └─IndexScan_39 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_11 16666.67 root ├─IndexReader_17 3333.33 root index:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_16 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_15 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_23 3333.33 root index:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_22 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_21 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_29 3333.33 root index:Selection_28 -│ └─Selection_28 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_28 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_27 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_35 3333.33 root index:Selection_34 -│ └─Selection_34 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_34 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_33 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_41 3333.33 root index:Selection_40 - └─Selection_40 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) + └─Selection_40 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) └─IndexScan_39 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] lt(Column#2, 2009-04-03) +│ └─Selection_20 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] lt(Column#2, 2009-04-03) + └─Selection_26 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] le(Column#2, 2009-04-03) +│ └─Selection_20 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] le(Column#2, 2009-04-03) + └─Selection_26 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); id count task operator info IndexReader_11 10.00 root index:Selection_10 -└─Selection_10 10.00 cop[tikv] eq(Column#2, 2009-04-03) +└─Selection_10 10.00 cop[tikv] eq(test.t1.b, 2009-04-03) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03) +│ └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] ge(Column#2, 2009-04-03) +│ └─Selection_27 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] ge(Column#2, 2009-04-03) + └─Selection_33 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03) +│ └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] gt(Column#2, 2009-04-03) +│ └─Selection_27 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] gt(Column#2, 2009-04-03) + └─Selection_33 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_20 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_26 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_20 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_26 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; id count task operator info IndexReader_11 10.00 root index:Selection_10 -└─Selection_10 10.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:00.000000) +└─Selection_10 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_27 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_33 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_27 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_33 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; id count task operator info Union_8 6646.67 root ├─IndexReader_14 3323.33 root index:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_13 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_20 3323.33 root index:Selection_19 - └─Selection_19 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_19 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) └─IndexScan_18 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; id count task operator info Union_8 6646.67 root ├─IndexReader_14 3323.33 root index:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_13 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_20 3323.33 root index:Selection_19 - └─Selection_19 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_19 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) └─IndexScan_18 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; id count task operator info IndexReader_11 10.00 root index:Selection_10 -└─Selection_10 10.00 cop[tikv] eq(Column#2, 2009-04-02 23:59:59.000000) +└─Selection_10 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59.000000) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; id count task operator info Union_11 16666.67 root ├─IndexReader_17 3333.33 root index:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_16 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_15 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_23 3333.33 root index:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_22 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_21 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_29 3333.33 root index:Selection_28 -│ └─Selection_28 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_28 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_27 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_35 3333.33 root index:Selection_34 -│ └─Selection_34 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_34 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_33 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_41 3333.33 root index:Selection_40 - └─Selection_40 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_40 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) └─IndexScan_39 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; id count task operator info Union_11 16666.67 root ├─IndexReader_17 3333.33 root index:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_16 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_15 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_23 3333.33 root index:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_22 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_21 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_29 3333.33 root index:Selection_28 -│ └─Selection_28 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_28 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_27 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_35 3333.33 root index:Selection_34 -│ └─Selection_34 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_34 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_33 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_41 3333.33 root index:Selection_40 - └─Selection_40 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_40 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) └─IndexScan_39 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_20 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_26 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_20 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_26 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; id count task operator info IndexReader_11 10.00 root index:Selection_10 -└─Selection_10 10.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:00.000000) +└─Selection_10 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_27 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_33 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_27 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_33 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_20 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:01) + └─Selection_26 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:01) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:01) +│ └─Selection_20 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:01) + └─Selection_26 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info IndexReader_11 10.00 root index:Selection_10 -└─Selection_10 10.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:01) +└─Selection_10 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:01) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) +│ └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) +│ └─Selection_27 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) + └─Selection_33 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_27 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) + └─Selection_33 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_8 6646.67 root ├─IndexReader_14 3323.33 root index:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_13 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_20 3323.33 root index:Selection_19 - └─Selection_19 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:58) + └─Selection_19 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) └─IndexScan_18 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_8 6646.67 root ├─IndexReader_14 3323.33 root index:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:58) +│ └─Selection_13 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_20 3323.33 root index:Selection_19 - └─Selection_19 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:58) + └─Selection_19 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) └─IndexScan_18 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info IndexReader_11 10.00 root index:Selection_10 -└─Selection_10 10.00 cop[tikv] eq(Column#2, 2009-04-02 23:59:58) +└─Selection_10 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:58) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_11 16666.67 root ├─IndexReader_17 3333.33 root index:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_16 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_15 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_23 3333.33 root index:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_22 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_21 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_29 3333.33 root index:Selection_28 -│ └─Selection_28 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_28 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_27 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_35 3333.33 root index:Selection_34 -│ └─Selection_34 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_34 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_33 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_41 3333.33 root index:Selection_40 - └─Selection_40 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) + └─Selection_40 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) └─IndexScan_39 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_11 16666.67 root ├─IndexReader_17 3333.33 root index:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_16 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_15 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_23 3333.33 root index:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_22 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_21 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_29 3333.33 root index:Selection_28 -│ └─Selection_28 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_28 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_27 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_35 3333.33 root index:Selection_34 -│ └─Selection_34 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_34 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_33 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_41 3333.33 root index:Selection_40 - └─Selection_40 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) + └─Selection_40 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) └─IndexScan_39 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo DROP TABLE t1; # Test with DATE column NOT NULL @@ -1544,488 +1544,488 @@ EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_20 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00) + └─Selection_26 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00) +│ └─Selection_20 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00) + └─Selection_26 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); id count task operator info IndexReader_11 10.00 root index:Selection_10 -└─Selection_10 10.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:00) +└─Selection_10 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) +│ └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) +│ └─Selection_27 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) + └─Selection_33 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_27 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) + └─Selection_33 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_8 6646.67 root ├─IndexReader_14 3323.33 root index:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_13 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_20 3323.33 root index:Selection_19 - └─Selection_19 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59) + └─Selection_19 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) └─IndexScan_18 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_8 6646.67 root ├─IndexReader_14 3323.33 root index:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59) +│ └─Selection_13 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_20 3323.33 root index:Selection_19 - └─Selection_19 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59) + └─Selection_19 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) └─IndexScan_18 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info IndexReader_11 0.00 root index:Selection_10 -└─Selection_10 0.00 cop[tikv] eq(Column#2, 2009-04-02 23:59:59) +└─Selection_10 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_11 16666.67 root ├─IndexReader_17 3333.33 root index:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_16 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_15 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_23 3333.33 root index:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_22 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_21 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_29 3333.33 root index:Selection_28 -│ └─Selection_28 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_28 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_27 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_35 3333.33 root index:Selection_34 -│ └─Selection_34 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_34 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_33 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_41 3333.33 root index:Selection_40 - └─Selection_40 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) + └─Selection_40 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) └─IndexScan_39 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_11 16666.67 root ├─IndexReader_17 3333.33 root index:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_16 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_15 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_23 3333.33 root index:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_22 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_21 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_29 3333.33 root index:Selection_28 -│ └─Selection_28 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_28 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_27 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_35 3333.33 root index:Selection_34 -│ └─Selection_34 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_34 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─IndexScan_33 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_41 3333.33 root index:Selection_40 - └─Selection_40 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) + └─Selection_40 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) └─IndexScan_39 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] lt(Column#2, 2009-04-03) +│ └─Selection_20 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] lt(Column#2, 2009-04-03) + └─Selection_26 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] le(Column#2, 2009-04-03) +│ └─Selection_20 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] le(Column#2, 2009-04-03) + └─Selection_26 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); id count task operator info IndexReader_11 10.00 root index:Selection_10 -└─Selection_10 10.00 cop[tikv] eq(Column#2, 2009-04-03) +└─Selection_10 10.00 cop[tikv] eq(test.t1.b, 2009-04-03) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03) +│ └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] ge(Column#2, 2009-04-03) +│ └─Selection_27 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] ge(Column#2, 2009-04-03) + └─Selection_33 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03) +│ └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] gt(Column#2, 2009-04-03) +│ └─Selection_27 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] gt(Column#2, 2009-04-03) + └─Selection_33 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_20 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_26 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_20 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_26 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; id count task operator info IndexReader_11 10.00 root index:Selection_10 -└─Selection_10 10.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:00.000000) +└─Selection_10 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_27 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_33 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_27 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_33 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; id count task operator info Union_8 6646.67 root ├─IndexReader_14 3323.33 root index:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_13 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_20 3323.33 root index:Selection_19 - └─Selection_19 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_19 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) └─IndexScan_18 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; id count task operator info Union_8 6646.67 root ├─IndexReader_14 3323.33 root index:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_13 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_20 3323.33 root index:Selection_19 - └─Selection_19 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_19 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) └─IndexScan_18 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; id count task operator info IndexReader_11 0.00 root index:Selection_10 -└─Selection_10 0.00 cop[tikv] eq(Column#2, 2009-04-02 23:59:59.000000) +└─Selection_10 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59.000000) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; id count task operator info Union_11 16666.67 root ├─IndexReader_17 3333.33 root index:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_16 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_15 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_23 3333.33 root index:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_22 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_21 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_29 3333.33 root index:Selection_28 -│ └─Selection_28 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_28 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_27 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_35 3333.33 root index:Selection_34 -│ └─Selection_34 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_34 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_33 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_41 3333.33 root index:Selection_40 - └─Selection_40 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_40 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) └─IndexScan_39 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; id count task operator info Union_11 16666.67 root ├─IndexReader_17 3333.33 root index:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_16 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_15 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_23 3333.33 root index:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_22 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_21 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_29 3333.33 root index:Selection_28 -│ └─Selection_28 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_28 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_27 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_35 3333.33 root index:Selection_34 -│ └─Selection_34 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_34 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─IndexScan_33 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_41 3333.33 root index:Selection_40 - └─Selection_40 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_40 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) └─IndexScan_39 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_20 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_26 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_20 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_26 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; id count task operator info IndexReader_11 10.00 root index:Selection_10 -└─Selection_10 10.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:00.000000) +└─Selection_10 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_27 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_33 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_27 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_33 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_20 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:01) + └─Selection_26 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_9 9970.00 root ├─IndexReader_15 3323.33 root index:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:01) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_13 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_21 3323.33 root index:Selection_20 -│ └─Selection_20 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:01) +│ └─Selection_20 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_19 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_27 3323.33 root index:Selection_26 - └─Selection_26 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:01) + └─Selection_26 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) └─IndexScan_25 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info IndexReader_11 0.00 root index:Selection_10 -└─Selection_10 0.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:01) +└─Selection_10 0.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:01) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) +│ └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) +│ └─Selection_27 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) + └─Selection_33 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_10 13333.33 root ├─IndexReader_16 3333.33 root index:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_14 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_22 3333.33 root index:Selection_21 -│ └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_20 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_28 3333.33 root index:Selection_27 -│ └─Selection_27 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_27 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) │ └─IndexScan_26 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_34 3333.33 root index:Selection_33 - └─Selection_33 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) + └─Selection_33 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) └─IndexScan_32 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_8 6646.67 root ├─IndexReader_14 3323.33 root index:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_13 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_20 3323.33 root index:Selection_19 - └─Selection_19 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:58) + └─Selection_19 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) └─IndexScan_18 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_8 6646.67 root ├─IndexReader_14 3323.33 root index:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:58) +│ └─Selection_13 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_20 3323.33 root index:Selection_19 - └─Selection_19 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:58) + └─Selection_19 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) └─IndexScan_18 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info IndexReader_11 0.00 root index:Selection_10 -└─Selection_10 0.00 cop[tikv] eq(Column#2, 2009-04-02 23:59:58) +└─Selection_10 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:58) └─IndexScan_9 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_11 16666.67 root ├─IndexReader_17 3333.33 root index:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_16 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_15 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_23 3333.33 root index:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_22 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_21 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_29 3333.33 root index:Selection_28 -│ └─Selection_28 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_28 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_27 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_35 3333.33 root index:Selection_34 -│ └─Selection_34 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_34 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_33 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_41 3333.33 root index:Selection_40 - └─Selection_40 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) + └─Selection_40 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) └─IndexScan_39 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_11 16666.67 root ├─IndexReader_17 3333.33 root index:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_16 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_15 10000.00 cop[tikv] table:t1, partition:p20090401, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_23 3333.33 root index:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_22 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_21 10000.00 cop[tikv] table:t1, partition:p20090402, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_29 3333.33 root index:Selection_28 -│ └─Selection_28 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_28 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_27 10000.00 cop[tikv] table:t1, partition:p20090403, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo ├─IndexReader_35 3333.33 root index:Selection_34 -│ └─Selection_34 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_34 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─IndexScan_33 10000.00 cop[tikv] table:t1, partition:p20090404, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo └─IndexReader_41 3333.33 root index:Selection_40 - └─Selection_40 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) + └─Selection_40 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) └─IndexScan_39 10000.00 cop[tikv] table:t1, partition:p20090405, index:a, b, range:[NULL,+inf], keep order:false, stats:pseudo DROP TABLE t1; # Test with DATETIME column NULL @@ -2046,488 +2046,488 @@ EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_11 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00) + └─Selection_17 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00) +│ └─Selection_11 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00) + └─Selection_17 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:00) +└─Selection_7 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) +│ └─Selection_12 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) +│ └─Selection_18 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) + └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_12 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_18 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) + └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_10 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59) + └─Selection_13 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59) +│ └─Selection_10 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59) + └─Selection_13 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#2, 2009-04-02 23:59:59) +└─Selection_7 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_13 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3333.33 root data:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_16 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_15 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_19 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_18 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3333.33 root data:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_22 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_21 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3333.33 root data:Selection_25 - └─Selection_25 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) + └─Selection_25 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) └─TableScan_24 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_13 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3333.33 root data:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_16 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_15 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_19 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_18 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3333.33 root data:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_22 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_21 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3333.33 root data:Selection_25 - └─Selection_25 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) + └─Selection_25 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) └─TableScan_24 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] lt(Column#2, 2009-04-03) +│ └─Selection_11 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] lt(Column#2, 2009-04-03) + └─Selection_17 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] le(Column#2, 2009-04-03) +│ └─Selection_11 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] le(Column#2, 2009-04-03) + └─Selection_17 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#2, 2009-04-03) +└─Selection_7 10.00 cop[tikv] eq(test.t1.b, 2009-04-03) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] ge(Column#2, 2009-04-03) +│ └─Selection_12 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] ge(Column#2, 2009-04-03) +│ └─Selection_18 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03) + └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] gt(Column#2, 2009-04-03) +│ └─Selection_12 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] gt(Column#2, 2009-04-03) +│ └─Selection_18 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03) + └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_11 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_17 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_11 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_17 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:00.000000) +└─Selection_7 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_12 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_18 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_12 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_18 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_10 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_13 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_10 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_13 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#2, 2009-04-02 23:59:59.000000) +└─Selection_7 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59.000000) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_13 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3333.33 root data:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_16 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_15 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_19 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_18 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3333.33 root data:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_22 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_21 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3333.33 root data:Selection_25 - └─Selection_25 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_25 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) └─TableScan_24 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_13 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3333.33 root data:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_16 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_15 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_19 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_18 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3333.33 root data:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_22 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_21 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3333.33 root data:Selection_25 - └─Selection_25 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_25 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) └─TableScan_24 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_11 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_17 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_11 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_17 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:00.000000) +└─Selection_7 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_12 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_18 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_12 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_18 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_11 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:01) + └─Selection_17 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:01) +│ └─Selection_11 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:01) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:01) + └─Selection_17 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:01) +└─Selection_7 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:01) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) +│ └─Selection_12 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) +│ └─Selection_18 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) + └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_12 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_18 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) + └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_10 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:58) + └─Selection_13 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:58) +│ └─Selection_10 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:58) + └─Selection_13 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#2, 2009-04-02 23:59:58) +└─Selection_7 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:58) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_13 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3333.33 root data:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_16 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_15 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_19 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_18 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3333.33 root data:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_22 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_21 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3333.33 root data:Selection_25 - └─Selection_25 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) + └─Selection_25 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) └─TableScan_24 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_13 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3333.33 root data:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_16 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_15 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_19 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_18 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3333.33 root data:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_22 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_21 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3333.33 root data:Selection_25 - └─Selection_25 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) + └─Selection_25 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) └─TableScan_24 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo DROP TABLE t1; # Test with DATE column NULL @@ -2548,488 +2548,488 @@ EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_11 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00) + └─Selection_17 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00) +│ └─Selection_11 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00) + └─Selection_17 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:00) +└─Selection_7 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) +│ └─Selection_12 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) +│ └─Selection_18 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00) + └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_12 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) +│ └─Selection_18 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00) + └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_10 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59) + └─Selection_13 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59) +│ └─Selection_10 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59) + └─Selection_13 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info TableReader_8 0.00 root data:Selection_7 -└─Selection_7 0.00 cop[tikv] eq(Column#2, 2009-04-02 23:59:59) +└─Selection_7 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_13 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3333.33 root data:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_16 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_15 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_19 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_18 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3333.33 root data:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) +│ └─Selection_22 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_21 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3333.33 root data:Selection_25 - └─Selection_25 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59) + └─Selection_25 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) └─TableScan_24 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_13 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3333.33 root data:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_16 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_15 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_19 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_18 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3333.33 root data:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) +│ └─Selection_22 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) │ └─TableScan_21 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3333.33 root data:Selection_25 - └─Selection_25 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59) + └─Selection_25 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) └─TableScan_24 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] lt(Column#2, 2009-04-03) +│ └─Selection_11 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] lt(Column#2, 2009-04-03) + └─Selection_17 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] le(Column#2, 2009-04-03) +│ └─Selection_11 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] le(Column#2, 2009-04-03) + └─Selection_17 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#2, 2009-04-03) +└─Selection_7 10.00 cop[tikv] eq(test.t1.b, 2009-04-03) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] ge(Column#2, 2009-04-03) +│ └─Selection_12 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] ge(Column#2, 2009-04-03) +│ └─Selection_18 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03) + └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] gt(Column#2, 2009-04-03) +│ └─Selection_12 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] gt(Column#2, 2009-04-03) +│ └─Selection_18 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03) + └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_11 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_17 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_11 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_17 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:00.000000) +└─Selection_7 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_12 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_18 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_12 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_18 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_10 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_13 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_10 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_13 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; id count task operator info TableReader_8 0.00 root data:Selection_7 -└─Selection_7 0.00 cop[tikv] eq(Column#2, 2009-04-02 23:59:59.000000) +└─Selection_7 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59.000000) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_13 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3333.33 root data:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_16 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_15 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_19 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_18 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3333.33 root data:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_22 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_21 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3333.33 root data:Selection_25 - └─Selection_25 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_25 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) └─TableScan_24 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_13 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3333.33 root data:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_16 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_15 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_19 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_18 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3333.33 root data:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) +│ └─Selection_22 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) │ └─TableScan_21 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3333.33 root data:Selection_25 - └─Selection_25 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:59.000000) + └─Selection_25 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) └─TableScan_24 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_11 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_17 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_11 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_17 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:00.000000) +└─Selection_7 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_12 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_18 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_12 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) +│ └─Selection_18 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:00.000000) + └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_11 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] lt(Column#2, 2009-04-03 00:00:01) + └─Selection_17 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:01) +│ └─Selection_11 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:01) +│ └─Selection_14 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] le(Column#2, 2009-04-03 00:00:01) + └─Selection_17 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info TableReader_8 0.00 root data:Selection_7 -└─Selection_7 0.00 cop[tikv] eq(Column#2, 2009-04-03 00:00:01) +└─Selection_7 0.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:01) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) +│ └─Selection_12 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) +│ └─Selection_18 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] ge(Column#2, 2009-04-03 00:00:01) + └─Selection_21 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_12 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) +│ └─Selection_18 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] gt(Column#2, 2009-04-03 00:00:01) + └─Selection_21 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_10 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] lt(Column#2, 2009-04-02 23:59:58) + └─Selection_13 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:58) +│ └─Selection_10 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] le(Column#2, 2009-04-02 23:59:58) + └─Selection_13 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info TableReader_8 0.00 root data:Selection_7 -└─Selection_7 0.00 cop[tikv] eq(Column#2, 2009-04-02 23:59:58) +└─Selection_7 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:58) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_13 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3333.33 root data:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_16 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_15 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_19 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_18 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3333.33 root data:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) +│ └─Selection_22 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_21 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3333.33 root data:Selection_25 - └─Selection_25 3333.33 cop[tikv] ge(Column#2, 2009-04-02 23:59:58) + └─Selection_25 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) └─TableScan_24 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_13 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3333.33 root data:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_16 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_15 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_19 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_18 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3333.33 root data:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) +│ └─Selection_22 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) │ └─TableScan_21 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3333.33 root data:Selection_25 - └─Selection_25 3333.33 cop[tikv] gt(Column#2, 2009-04-02 23:59:58) + └─Selection_25 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) └─TableScan_24 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo DROP TABLE t1; # For better code coverage of the patch @@ -3048,19 +3048,19 @@ EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-99' AS DATETIME); id count task operator info Union_11 0.00 root ├─TableReader_14 0.00 root data:Selection_13 -│ └─Selection_13 0.00 cop[tikv] lt(Column#2, NULL) +│ └─Selection_13 0.00 cop[tikv] lt(test.t1.b, NULL) │ └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 0.00 root data:Selection_16 -│ └─Selection_16 0.00 cop[tikv] lt(Column#2, NULL) +│ └─Selection_16 0.00 cop[tikv] lt(test.t1.b, NULL) │ └─TableScan_15 10000.00 cop[tikv] table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 0.00 root data:Selection_19 -│ └─Selection_19 0.00 cop[tikv] lt(Column#2, NULL) +│ └─Selection_19 0.00 cop[tikv] lt(test.t1.b, NULL) │ └─TableScan_18 10000.00 cop[tikv] table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 0.00 root data:Selection_22 -│ └─Selection_22 0.00 cop[tikv] lt(Column#2, NULL) +│ └─Selection_22 0.00 cop[tikv] lt(test.t1.b, NULL) │ └─TableScan_21 10000.00 cop[tikv] table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 0.00 root data:Selection_25 - └─Selection_25 0.00 cop[tikv] lt(Column#2, NULL) + └─Selection_25 0.00 cop[tikv] lt(test.t1.b, NULL) └─TableScan_24 10000.00 cop[tikv] table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo DROP TABLE t1; CREATE TABLE t1 @@ -3086,12 +3086,12 @@ insert into t3 values (5),(15); explain select * from t3 where a=11; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 11) +└─Selection_7 10.00 cop[tikv] eq(test.t3.a, 11) └─TableScan_6 10000.00 cop[tikv] table:t3, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t3 where a=10; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 10) +└─Selection_7 10.00 cop[tikv] eq(test.t3.a, 10) └─TableScan_6 10000.00 cop[tikv] table:t3, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t3 where a=20; id count task operator info @@ -3110,145 +3110,145 @@ insert into t7 values (10),(30),(50); explain select * from t7 where a < 5; id count task operator info TableReader_8 3323.33 root data:Selection_7 -└─Selection_7 3323.33 cop[tikv] lt(Column#1, 5) +└─Selection_7 3323.33 cop[tikv] lt(test.t7.a, 5) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a < 9; id count task operator info TableReader_8 3323.33 root data:Selection_7 -└─Selection_7 3323.33 cop[tikv] lt(Column#1, 9) +└─Selection_7 3323.33 cop[tikv] lt(test.t7.a, 9) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a <= 9; id count task operator info TableReader_8 3323.33 root data:Selection_7 -└─Selection_7 3323.33 cop[tikv] le(Column#1, 9) +└─Selection_7 3323.33 cop[tikv] le(test.t7.a, 9) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a = 9; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 9) +└─Selection_7 10.00 cop[tikv] eq(test.t7.a, 9) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a >= 9; id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] ge(Column#1, 9) +│ └─Selection_13 3333.33 cop[tikv] ge(test.t7.a, 9) │ └─TableScan_12 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3333.33 root data:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] ge(Column#1, 9) +│ └─Selection_16 3333.33 cop[tikv] ge(test.t7.a, 9) │ └─TableScan_15 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] ge(Column#1, 9) +│ └─Selection_19 3333.33 cop[tikv] ge(test.t7.a, 9) │ └─TableScan_18 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3333.33 root data:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] ge(Column#1, 9) +│ └─Selection_22 3333.33 cop[tikv] ge(test.t7.a, 9) │ └─TableScan_21 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3333.33 root data:Selection_25 - └─Selection_25 3333.33 cop[tikv] ge(Column#1, 9) + └─Selection_25 3333.33 cop[tikv] ge(test.t7.a, 9) └─TableScan_24 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a > 9; id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] gt(Column#1, 9) +│ └─Selection_12 3333.33 cop[tikv] gt(test.t7.a, 9) │ └─TableScan_11 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#1, 9) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t7.a, 9) │ └─TableScan_14 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] gt(Column#1, 9) +│ └─Selection_18 3333.33 cop[tikv] gt(test.t7.a, 9) │ └─TableScan_17 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] gt(Column#1, 9) + └─Selection_21 3333.33 cop[tikv] gt(test.t7.a, 9) └─TableScan_20 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a < 10; id count task operator info TableReader_8 3323.33 root data:Selection_7 -└─Selection_7 3323.33 cop[tikv] lt(Column#1, 10) +└─Selection_7 3323.33 cop[tikv] lt(test.t7.a, 10) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a <= 10; id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] le(Column#1, 10) +│ └─Selection_10 3323.33 cop[tikv] le(test.t7.a, 10) │ └─TableScan_9 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] le(Column#1, 10) + └─Selection_13 3323.33 cop[tikv] le(test.t7.a, 10) └─TableScan_12 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a = 10; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 10) +└─Selection_7 10.00 cop[tikv] eq(test.t7.a, 10) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a >= 10; id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] ge(Column#1, 10) +│ └─Selection_12 3333.33 cop[tikv] ge(test.t7.a, 10) │ └─TableScan_11 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#1, 10) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t7.a, 10) │ └─TableScan_14 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] ge(Column#1, 10) +│ └─Selection_18 3333.33 cop[tikv] ge(test.t7.a, 10) │ └─TableScan_17 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] ge(Column#1, 10) + └─Selection_21 3333.33 cop[tikv] ge(test.t7.a, 10) └─TableScan_20 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a > 10; id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] gt(Column#1, 10) +│ └─Selection_12 3333.33 cop[tikv] gt(test.t7.a, 10) │ └─TableScan_11 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#1, 10) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t7.a, 10) │ └─TableScan_14 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] gt(Column#1, 10) +│ └─Selection_18 3333.33 cop[tikv] gt(test.t7.a, 10) │ └─TableScan_17 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] gt(Column#1, 10) + └─Selection_21 3333.33 cop[tikv] gt(test.t7.a, 10) └─TableScan_20 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a < 89; id count task operator info Union_11 16616.67 root ├─TableReader_14 3323.33 root data:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] lt(Column#1, 89) +│ └─Selection_13 3323.33 cop[tikv] lt(test.t7.a, 89) │ └─TableScan_12 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3323.33 root data:Selection_16 -│ └─Selection_16 3323.33 cop[tikv] lt(Column#1, 89) +│ └─Selection_16 3323.33 cop[tikv] lt(test.t7.a, 89) │ └─TableScan_15 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3323.33 root data:Selection_19 -│ └─Selection_19 3323.33 cop[tikv] lt(Column#1, 89) +│ └─Selection_19 3323.33 cop[tikv] lt(test.t7.a, 89) │ └─TableScan_18 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3323.33 root data:Selection_22 -│ └─Selection_22 3323.33 cop[tikv] lt(Column#1, 89) +│ └─Selection_22 3323.33 cop[tikv] lt(test.t7.a, 89) │ └─TableScan_21 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3323.33 root data:Selection_25 - └─Selection_25 3323.33 cop[tikv] lt(Column#1, 89) + └─Selection_25 3323.33 cop[tikv] lt(test.t7.a, 89) └─TableScan_24 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a <= 89; id count task operator info Union_11 16616.67 root ├─TableReader_14 3323.33 root data:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] le(Column#1, 89) +│ └─Selection_13 3323.33 cop[tikv] le(test.t7.a, 89) │ └─TableScan_12 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3323.33 root data:Selection_16 -│ └─Selection_16 3323.33 cop[tikv] le(Column#1, 89) +│ └─Selection_16 3323.33 cop[tikv] le(test.t7.a, 89) │ └─TableScan_15 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3323.33 root data:Selection_19 -│ └─Selection_19 3323.33 cop[tikv] le(Column#1, 89) +│ └─Selection_19 3323.33 cop[tikv] le(test.t7.a, 89) │ └─TableScan_18 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3323.33 root data:Selection_22 -│ └─Selection_22 3323.33 cop[tikv] le(Column#1, 89) +│ └─Selection_22 3323.33 cop[tikv] le(test.t7.a, 89) │ └─TableScan_21 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3323.33 root data:Selection_25 - └─Selection_25 3323.33 cop[tikv] le(Column#1, 89) + └─Selection_25 3323.33 cop[tikv] le(test.t7.a, 89) └─TableScan_24 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a = 89; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 89) +└─Selection_7 10.00 cop[tikv] eq(test.t7.a, 89) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a > 89; id count task operator info @@ -3256,43 +3256,43 @@ TableDual_6 0.00 root rows:0 explain select * from t7 where a >= 89; id count task operator info TableReader_8 3333.33 root data:Selection_7 -└─Selection_7 3333.33 cop[tikv] ge(Column#1, 89) +└─Selection_7 3333.33 cop[tikv] ge(test.t7.a, 89) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a < 90; id count task operator info Union_11 16616.67 root ├─TableReader_14 3323.33 root data:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] lt(Column#1, 90) +│ └─Selection_13 3323.33 cop[tikv] lt(test.t7.a, 90) │ └─TableScan_12 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3323.33 root data:Selection_16 -│ └─Selection_16 3323.33 cop[tikv] lt(Column#1, 90) +│ └─Selection_16 3323.33 cop[tikv] lt(test.t7.a, 90) │ └─TableScan_15 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3323.33 root data:Selection_19 -│ └─Selection_19 3323.33 cop[tikv] lt(Column#1, 90) +│ └─Selection_19 3323.33 cop[tikv] lt(test.t7.a, 90) │ └─TableScan_18 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3323.33 root data:Selection_22 -│ └─Selection_22 3323.33 cop[tikv] lt(Column#1, 90) +│ └─Selection_22 3323.33 cop[tikv] lt(test.t7.a, 90) │ └─TableScan_21 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3323.33 root data:Selection_25 - └─Selection_25 3323.33 cop[tikv] lt(Column#1, 90) + └─Selection_25 3323.33 cop[tikv] lt(test.t7.a, 90) └─TableScan_24 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a <= 90; id count task operator info Union_11 16616.67 root ├─TableReader_14 3323.33 root data:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] le(Column#1, 90) +│ └─Selection_13 3323.33 cop[tikv] le(test.t7.a, 90) │ └─TableScan_12 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3323.33 root data:Selection_16 -│ └─Selection_16 3323.33 cop[tikv] le(Column#1, 90) +│ └─Selection_16 3323.33 cop[tikv] le(test.t7.a, 90) │ └─TableScan_15 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3323.33 root data:Selection_19 -│ └─Selection_19 3323.33 cop[tikv] le(Column#1, 90) +│ └─Selection_19 3323.33 cop[tikv] le(test.t7.a, 90) │ └─TableScan_18 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3323.33 root data:Selection_22 -│ └─Selection_22 3323.33 cop[tikv] le(Column#1, 90) +│ └─Selection_22 3323.33 cop[tikv] le(test.t7.a, 90) │ └─TableScan_21 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3323.33 root data:Selection_25 - └─Selection_25 3323.33 cop[tikv] le(Column#1, 90) + └─Selection_25 3323.33 cop[tikv] le(test.t7.a, 90) └─TableScan_24 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a = 90; id count task operator info @@ -3309,7 +3309,7 @@ TableDual_6 0.00 root rows:0 explain select * from t7 where a > 11 and a < 29; id count task operator info TableReader_8 250.00 root data:Selection_7 -└─Selection_7 250.00 cop[tikv] gt(Column#1, 11), lt(Column#1, 29) +└─Selection_7 250.00 cop[tikv] gt(test.t7.a, 11), lt(test.t7.a, 29) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo drop table t7; create table t7 (a int unsigned not null) partition by RANGE(a) ( @@ -3323,145 +3323,145 @@ insert into t7 values (10),(30),(50); explain select * from t7 where a < 5; id count task operator info TableReader_8 3323.33 root data:Selection_7 -└─Selection_7 3323.33 cop[tikv] lt(Column#1, 5) +└─Selection_7 3323.33 cop[tikv] lt(test.t7.a, 5) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a < 9; id count task operator info TableReader_8 3323.33 root data:Selection_7 -└─Selection_7 3323.33 cop[tikv] lt(Column#1, 9) +└─Selection_7 3323.33 cop[tikv] lt(test.t7.a, 9) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a <= 9; id count task operator info TableReader_8 3323.33 root data:Selection_7 -└─Selection_7 3323.33 cop[tikv] le(Column#1, 9) +└─Selection_7 3323.33 cop[tikv] le(test.t7.a, 9) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a = 9; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 9) +└─Selection_7 10.00 cop[tikv] eq(test.t7.a, 9) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a >= 9; id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] ge(Column#1, 9) +│ └─Selection_13 3333.33 cop[tikv] ge(test.t7.a, 9) │ └─TableScan_12 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3333.33 root data:Selection_16 -│ └─Selection_16 3333.33 cop[tikv] ge(Column#1, 9) +│ └─Selection_16 3333.33 cop[tikv] ge(test.t7.a, 9) │ └─TableScan_15 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] ge(Column#1, 9) +│ └─Selection_19 3333.33 cop[tikv] ge(test.t7.a, 9) │ └─TableScan_18 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3333.33 root data:Selection_22 -│ └─Selection_22 3333.33 cop[tikv] ge(Column#1, 9) +│ └─Selection_22 3333.33 cop[tikv] ge(test.t7.a, 9) │ └─TableScan_21 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3333.33 root data:Selection_25 - └─Selection_25 3333.33 cop[tikv] ge(Column#1, 9) + └─Selection_25 3333.33 cop[tikv] ge(test.t7.a, 9) └─TableScan_24 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a > 9; id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] gt(Column#1, 9) +│ └─Selection_12 3333.33 cop[tikv] gt(test.t7.a, 9) │ └─TableScan_11 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#1, 9) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t7.a, 9) │ └─TableScan_14 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] gt(Column#1, 9) +│ └─Selection_18 3333.33 cop[tikv] gt(test.t7.a, 9) │ └─TableScan_17 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] gt(Column#1, 9) + └─Selection_21 3333.33 cop[tikv] gt(test.t7.a, 9) └─TableScan_20 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a < 10; id count task operator info TableReader_8 3323.33 root data:Selection_7 -└─Selection_7 3323.33 cop[tikv] lt(Column#1, 10) +└─Selection_7 3323.33 cop[tikv] lt(test.t7.a, 10) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a <= 10; id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] le(Column#1, 10) +│ └─Selection_10 3323.33 cop[tikv] le(test.t7.a, 10) │ └─TableScan_9 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] le(Column#1, 10) + └─Selection_13 3323.33 cop[tikv] le(test.t7.a, 10) └─TableScan_12 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a = 10; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 10) +└─Selection_7 10.00 cop[tikv] eq(test.t7.a, 10) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a >= 10; id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] ge(Column#1, 10) +│ └─Selection_12 3333.33 cop[tikv] ge(test.t7.a, 10) │ └─TableScan_11 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] ge(Column#1, 10) +│ └─Selection_15 3333.33 cop[tikv] ge(test.t7.a, 10) │ └─TableScan_14 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] ge(Column#1, 10) +│ └─Selection_18 3333.33 cop[tikv] ge(test.t7.a, 10) │ └─TableScan_17 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] ge(Column#1, 10) + └─Selection_21 3333.33 cop[tikv] ge(test.t7.a, 10) └─TableScan_20 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a > 10; id count task operator info Union_10 13333.33 root ├─TableReader_13 3333.33 root data:Selection_12 -│ └─Selection_12 3333.33 cop[tikv] gt(Column#1, 10) +│ └─Selection_12 3333.33 cop[tikv] gt(test.t7.a, 10) │ └─TableScan_11 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 3333.33 root data:Selection_15 -│ └─Selection_15 3333.33 cop[tikv] gt(Column#1, 10) +│ └─Selection_15 3333.33 cop[tikv] gt(test.t7.a, 10) │ └─TableScan_14 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 3333.33 root data:Selection_18 -│ └─Selection_18 3333.33 cop[tikv] gt(Column#1, 10) +│ └─Selection_18 3333.33 cop[tikv] gt(test.t7.a, 10) │ └─TableScan_17 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 3333.33 root data:Selection_21 - └─Selection_21 3333.33 cop[tikv] gt(Column#1, 10) + └─Selection_21 3333.33 cop[tikv] gt(test.t7.a, 10) └─TableScan_20 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a < 89; id count task operator info Union_11 16616.67 root ├─TableReader_14 3323.33 root data:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] lt(Column#1, 89) +│ └─Selection_13 3323.33 cop[tikv] lt(test.t7.a, 89) │ └─TableScan_12 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3323.33 root data:Selection_16 -│ └─Selection_16 3323.33 cop[tikv] lt(Column#1, 89) +│ └─Selection_16 3323.33 cop[tikv] lt(test.t7.a, 89) │ └─TableScan_15 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3323.33 root data:Selection_19 -│ └─Selection_19 3323.33 cop[tikv] lt(Column#1, 89) +│ └─Selection_19 3323.33 cop[tikv] lt(test.t7.a, 89) │ └─TableScan_18 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3323.33 root data:Selection_22 -│ └─Selection_22 3323.33 cop[tikv] lt(Column#1, 89) +│ └─Selection_22 3323.33 cop[tikv] lt(test.t7.a, 89) │ └─TableScan_21 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3323.33 root data:Selection_25 - └─Selection_25 3323.33 cop[tikv] lt(Column#1, 89) + └─Selection_25 3323.33 cop[tikv] lt(test.t7.a, 89) └─TableScan_24 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a <= 89; id count task operator info Union_11 16616.67 root ├─TableReader_14 3323.33 root data:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] le(Column#1, 89) +│ └─Selection_13 3323.33 cop[tikv] le(test.t7.a, 89) │ └─TableScan_12 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3323.33 root data:Selection_16 -│ └─Selection_16 3323.33 cop[tikv] le(Column#1, 89) +│ └─Selection_16 3323.33 cop[tikv] le(test.t7.a, 89) │ └─TableScan_15 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3323.33 root data:Selection_19 -│ └─Selection_19 3323.33 cop[tikv] le(Column#1, 89) +│ └─Selection_19 3323.33 cop[tikv] le(test.t7.a, 89) │ └─TableScan_18 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3323.33 root data:Selection_22 -│ └─Selection_22 3323.33 cop[tikv] le(Column#1, 89) +│ └─Selection_22 3323.33 cop[tikv] le(test.t7.a, 89) │ └─TableScan_21 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3323.33 root data:Selection_25 - └─Selection_25 3323.33 cop[tikv] le(Column#1, 89) + └─Selection_25 3323.33 cop[tikv] le(test.t7.a, 89) └─TableScan_24 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a = 89; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 89) +└─Selection_7 10.00 cop[tikv] eq(test.t7.a, 89) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a > 89; id count task operator info @@ -3469,43 +3469,43 @@ TableDual_6 0.00 root rows:0 explain select * from t7 where a >= 89; id count task operator info TableReader_8 3333.33 root data:Selection_7 -└─Selection_7 3333.33 cop[tikv] ge(Column#1, 89) +└─Selection_7 3333.33 cop[tikv] ge(test.t7.a, 89) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a < 90; id count task operator info Union_11 16616.67 root ├─TableReader_14 3323.33 root data:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] lt(Column#1, 90) +│ └─Selection_13 3323.33 cop[tikv] lt(test.t7.a, 90) │ └─TableScan_12 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3323.33 root data:Selection_16 -│ └─Selection_16 3323.33 cop[tikv] lt(Column#1, 90) +│ └─Selection_16 3323.33 cop[tikv] lt(test.t7.a, 90) │ └─TableScan_15 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3323.33 root data:Selection_19 -│ └─Selection_19 3323.33 cop[tikv] lt(Column#1, 90) +│ └─Selection_19 3323.33 cop[tikv] lt(test.t7.a, 90) │ └─TableScan_18 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3323.33 root data:Selection_22 -│ └─Selection_22 3323.33 cop[tikv] lt(Column#1, 90) +│ └─Selection_22 3323.33 cop[tikv] lt(test.t7.a, 90) │ └─TableScan_21 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3323.33 root data:Selection_25 - └─Selection_25 3323.33 cop[tikv] lt(Column#1, 90) + └─Selection_25 3323.33 cop[tikv] lt(test.t7.a, 90) └─TableScan_24 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a <= 90; id count task operator info Union_11 16616.67 root ├─TableReader_14 3323.33 root data:Selection_13 -│ └─Selection_13 3323.33 cop[tikv] le(Column#1, 90) +│ └─Selection_13 3323.33 cop[tikv] le(test.t7.a, 90) │ └─TableScan_12 10000.00 cop[tikv] table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 3323.33 root data:Selection_16 -│ └─Selection_16 3323.33 cop[tikv] le(Column#1, 90) +│ └─Selection_16 3323.33 cop[tikv] le(test.t7.a, 90) │ └─TableScan_15 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3323.33 root data:Selection_19 -│ └─Selection_19 3323.33 cop[tikv] le(Column#1, 90) +│ └─Selection_19 3323.33 cop[tikv] le(test.t7.a, 90) │ └─TableScan_18 10000.00 cop[tikv] table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 3323.33 root data:Selection_22 -│ └─Selection_22 3323.33 cop[tikv] le(Column#1, 90) +│ └─Selection_22 3323.33 cop[tikv] le(test.t7.a, 90) │ └─TableScan_21 10000.00 cop[tikv] table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 3323.33 root data:Selection_25 - └─Selection_25 3323.33 cop[tikv] le(Column#1, 90) + └─Selection_25 3323.33 cop[tikv] le(test.t7.a, 90) └─TableScan_24 10000.00 cop[tikv] table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t7 where a = 90; id count task operator info @@ -3522,7 +3522,7 @@ TableDual_6 0.00 root rows:0 explain select * from t7 where a > 11 and a < 29; id count task operator info TableReader_8 250.00 root data:Selection_7 -└─Selection_7 250.00 cop[tikv] gt(Column#1, 11), lt(Column#1, 29) +└─Selection_7 250.00 cop[tikv] gt(test.t7.a, 11), lt(test.t7.a, 29) └─TableScan_6 10000.00 cop[tikv] table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo create table t8 (a date not null) partition by RANGE(YEAR(a)) ( partition p0 values less than (1980), @@ -3534,13 +3534,13 @@ explain select * from t8 where a < '1980-02-02'; id count task operator info Union_9 9970.00 root ├─TableReader_12 3323.33 root data:Selection_11 -│ └─Selection_11 3323.33 cop[tikv] lt(Column#1, 1980-02-02 00:00:00.000000) +│ └─Selection_11 3323.33 cop[tikv] lt(test.t8.a, 1980-02-02 00:00:00.000000) │ └─TableScan_10 10000.00 cop[tikv] table:t8, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 3323.33 root data:Selection_14 -│ └─Selection_14 3323.33 cop[tikv] lt(Column#1, 1980-02-02 00:00:00.000000) +│ └─Selection_14 3323.33 cop[tikv] lt(test.t8.a, 1980-02-02 00:00:00.000000) │ └─TableScan_13 10000.00 cop[tikv] table:t8, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] lt(Column#1, 1980-02-02 00:00:00.000000) + └─Selection_17 3323.33 cop[tikv] lt(test.t8.a, 1980-02-02 00:00:00.000000) └─TableScan_16 10000.00 cop[tikv] table:t8, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo create table t9 (a date not null) partition by RANGE(TO_DAYS(a)) ( partition p0 values less than (732299), -- 2004-12-19 @@ -3552,19 +3552,19 @@ explain select * from t9 where a < '2004-12-19'; id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] lt(Column#1, 2004-12-19 00:00:00.000000) +│ └─Selection_10 3323.33 cop[tikv] lt(test.t9.a, 2004-12-19 00:00:00.000000) │ └─TableScan_9 10000.00 cop[tikv] table:t9, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] lt(Column#1, 2004-12-19 00:00:00.000000) + └─Selection_13 3323.33 cop[tikv] lt(test.t9.a, 2004-12-19 00:00:00.000000) └─TableScan_12 10000.00 cop[tikv] table:t9, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t9 where a <= '2004-12-19'; id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] le(Column#1, 2004-12-19 00:00:00.000000) +│ └─Selection_10 3323.33 cop[tikv] le(test.t9.a, 2004-12-19 00:00:00.000000) │ └─TableScan_9 10000.00 cop[tikv] table:t9, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] le(Column#1, 2004-12-19 00:00:00.000000) + └─Selection_13 3323.33 cop[tikv] le(test.t9.a, 2004-12-19 00:00:00.000000) └─TableScan_12 10000.00 cop[tikv] table:t9, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo drop table t7,t8,t9; create table t1 ( @@ -3580,19 +3580,19 @@ explain select * from t1 where a1 > 3; id count task operator info Union_8 6666.67 root ├─TableReader_11 3333.33 root data:Selection_10 -│ └─Selection_10 3333.33 cop[tikv] gt(Column#1, 3) +│ └─Selection_10 3333.33 cop[tikv] gt(test.t1.a1, 3) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3333.33 root data:Selection_13 - └─Selection_13 3333.33 cop[tikv] gt(Column#1, 3) + └─Selection_13 3333.33 cop[tikv] gt(test.t1.a1, 3) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t1 where a1 >= 3; id count task operator info Union_8 6666.67 root ├─TableReader_11 3333.33 root data:Selection_10 -│ └─Selection_10 3333.33 cop[tikv] ge(Column#1, 3) +│ └─Selection_10 3333.33 cop[tikv] ge(test.t1.a1, 3) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3333.33 root data:Selection_13 - └─Selection_13 3333.33 cop[tikv] ge(Column#1, 3) + └─Selection_13 3333.33 cop[tikv] ge(test.t1.a1, 3) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t1 where a1 < 3 and a1 > 3; id count task operator info @@ -3641,16 +3641,16 @@ explain select * from t2 where a < 801 and a > 200; id count task operator info Union_10 1000.00 root ├─TableReader_13 250.00 root data:Selection_12 -│ └─Selection_12 250.00 cop[tikv] gt(Column#1, 200), lt(Column#1, 801) +│ └─Selection_12 250.00 cop[tikv] gt(test.t2.a, 200), lt(test.t2.a, 801) │ └─TableScan_11 10000.00 cop[tikv] table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 250.00 root data:Selection_15 -│ └─Selection_15 250.00 cop[tikv] gt(Column#1, 200), lt(Column#1, 801) +│ └─Selection_15 250.00 cop[tikv] gt(test.t2.a, 200), lt(test.t2.a, 801) │ └─TableScan_14 10000.00 cop[tikv] table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 250.00 root data:Selection_18 -│ └─Selection_18 250.00 cop[tikv] gt(Column#1, 200), lt(Column#1, 801) +│ └─Selection_18 250.00 cop[tikv] gt(test.t2.a, 200), lt(test.t2.a, 801) │ └─TableScan_17 10000.00 cop[tikv] table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 250.00 root data:Selection_21 - └─Selection_21 250.00 cop[tikv] gt(Column#1, 200), lt(Column#1, 801) + └─Selection_21 250.00 cop[tikv] gt(test.t2.a, 200), lt(test.t2.a, 801) └─TableScan_20 10000.00 cop[tikv] table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where a < 801 and a > 800; id count task operator info @@ -3659,55 +3659,55 @@ explain select * from t2 where a > 600; id count task operator info Union_8 6666.67 root ├─TableReader_11 3333.33 root data:Selection_10 -│ └─Selection_10 3333.33 cop[tikv] gt(Column#1, 600) +│ └─Selection_10 3333.33 cop[tikv] gt(test.t2.a, 600) │ └─TableScan_9 10000.00 cop[tikv] table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3333.33 root data:Selection_13 - └─Selection_13 3333.33 cop[tikv] gt(Column#1, 600) + └─Selection_13 3333.33 cop[tikv] gt(test.t2.a, 600) └─TableScan_12 10000.00 cop[tikv] table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where a > 600 and b = 1; id count task operator info Union_8 6.67 root ├─TableReader_11 3.33 root data:Selection_10 -│ └─Selection_10 3.33 cop[tikv] eq(Column#2, 1), gt(Column#1, 600) +│ └─Selection_10 3.33 cop[tikv] eq(test.t2.b, 1), gt(test.t2.a, 600) │ └─TableScan_9 10000.00 cop[tikv] table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3.33 root data:Selection_13 - └─Selection_13 3.33 cop[tikv] eq(Column#2, 1), gt(Column#1, 600) + └─Selection_13 3.33 cop[tikv] eq(test.t2.b, 1), gt(test.t2.a, 600) └─TableScan_12 10000.00 cop[tikv] table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where a > 600 and b = 4; id count task operator info Union_8 6.67 root ├─TableReader_11 3.33 root data:Selection_10 -│ └─Selection_10 3.33 cop[tikv] eq(Column#2, 4), gt(Column#1, 600) +│ └─Selection_10 3.33 cop[tikv] eq(test.t2.b, 4), gt(test.t2.a, 600) │ └─TableScan_9 10000.00 cop[tikv] table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3.33 root data:Selection_13 - └─Selection_13 3.33 cop[tikv] eq(Column#2, 4), gt(Column#1, 600) + └─Selection_13 3.33 cop[tikv] eq(test.t2.b, 4), gt(test.t2.a, 600) └─TableScan_12 10000.00 cop[tikv] table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where a > 600 and b = 5; id count task operator info Union_8 6.67 root ├─TableReader_11 3.33 root data:Selection_10 -│ └─Selection_10 3.33 cop[tikv] eq(Column#2, 5), gt(Column#1, 600) +│ └─Selection_10 3.33 cop[tikv] eq(test.t2.b, 5), gt(test.t2.a, 600) │ └─TableScan_9 10000.00 cop[tikv] table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3.33 root data:Selection_13 - └─Selection_13 3.33 cop[tikv] eq(Column#2, 5), gt(Column#1, 600) + └─Selection_13 3.33 cop[tikv] eq(test.t2.b, 5), gt(test.t2.a, 600) └─TableScan_12 10000.00 cop[tikv] table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where b = 5; id count task operator info Union_11 50.00 root ├─TableReader_14 10.00 root data:Selection_13 -│ └─Selection_13 10.00 cop[tikv] eq(Column#2, 5) +│ └─Selection_13 10.00 cop[tikv] eq(test.t2.b, 5) │ └─TableScan_12 10000.00 cop[tikv] table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_17 10.00 root data:Selection_16 -│ └─Selection_16 10.00 cop[tikv] eq(Column#2, 5) +│ └─Selection_16 10.00 cop[tikv] eq(test.t2.b, 5) │ └─TableScan_15 10000.00 cop[tikv] table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 10.00 root data:Selection_19 -│ └─Selection_19 10.00 cop[tikv] eq(Column#2, 5) +│ └─Selection_19 10.00 cop[tikv] eq(test.t2.b, 5) │ └─TableScan_18 10000.00 cop[tikv] table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_23 10.00 root data:Selection_22 -│ └─Selection_22 10.00 cop[tikv] eq(Column#2, 5) +│ └─Selection_22 10.00 cop[tikv] eq(test.t2.b, 5) │ └─TableScan_21 10000.00 cop[tikv] table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_26 10.00 root data:Selection_25 - └─Selection_25 10.00 cop[tikv] eq(Column#2, 5) + └─Selection_25 10.00 cop[tikv] eq(test.t2.b, 5) └─TableScan_24 10000.00 cop[tikv] table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo flush status; update t2 set b = 100 where b = 6; @@ -3766,38 +3766,38 @@ Union_10 50000.00 root explain select * from t2 where a = 101; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 101) +└─Selection_7 10.00 cop[tikv] eq(test.t2.a, 101) └─TableScan_6 10000.00 cop[tikv] table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where a = 550; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 550) +└─Selection_7 10.00 cop[tikv] eq(test.t2.a, 550) └─TableScan_6 10000.00 cop[tikv] table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where a = 833; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 833) +└─Selection_7 10.00 cop[tikv] eq(test.t2.a, 833) └─TableScan_6 10000.00 cop[tikv] table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where (a = 100 OR a = 900); id count task operator info Union_8 40.00 root ├─TableReader_11 20.00 root data:Selection_10 -│ └─Selection_10 20.00 cop[tikv] or(eq(Column#1, 100), eq(Column#1, 900)) +│ └─Selection_10 20.00 cop[tikv] or(eq(test.t2.a, 100), eq(test.t2.a, 900)) │ └─TableScan_9 10000.00 cop[tikv] table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 20.00 root data:Selection_13 - └─Selection_13 20.00 cop[tikv] or(eq(Column#1, 100), eq(Column#1, 900)) + └─Selection_13 20.00 cop[tikv] or(eq(test.t2.a, 100), eq(test.t2.a, 900)) └─TableScan_12 10000.00 cop[tikv] table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where (a > 100 AND a < 600); id count task operator info Union_9 750.00 root ├─TableReader_12 250.00 root data:Selection_11 -│ └─Selection_11 250.00 cop[tikv] gt(Column#1, 100), lt(Column#1, 600) +│ └─Selection_11 250.00 cop[tikv] gt(test.t2.a, 100), lt(test.t2.a, 600) │ └─TableScan_10 10000.00 cop[tikv] table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 250.00 root data:Selection_14 -│ └─Selection_14 250.00 cop[tikv] gt(Column#1, 100), lt(Column#1, 600) +│ └─Selection_14 250.00 cop[tikv] gt(test.t2.a, 100), lt(test.t2.a, 600) │ └─TableScan_13 10000.00 cop[tikv] table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 250.00 root data:Selection_17 - └─Selection_17 250.00 cop[tikv] gt(Column#1, 100), lt(Column#1, 600) + └─Selection_17 250.00 cop[tikv] gt(test.t2.a, 100), lt(test.t2.a, 600) └─TableScan_16 10000.00 cop[tikv] table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where b = 4; id count task operator info @@ -3893,19 +3893,19 @@ explain select * from t2 where b > 5; id count task operator info Union_11 16666.67 root ├─TableReader_14 3333.33 root data:Selection_13 -│ └─Selection_13 3333.33 cop[tikv] gt(Column#2, 5) +│ └─Selection_13 3333.33 cop[tikv] gt(test.t2.b, 5) │ └─TableScan_12 10000.00 cop[tikv] table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_20 3333.33 root data:Selection_19 -│ └─Selection_19 3333.33 cop[tikv] gt(Column#2, 5) +│ └─Selection_19 3333.33 cop[tikv] gt(test.t2.b, 5) │ └─TableScan_18 10000.00 cop[tikv] table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_26 3333.33 root data:Selection_25 -│ └─Selection_25 3333.33 cop[tikv] gt(Column#2, 5) +│ └─Selection_25 3333.33 cop[tikv] gt(test.t2.b, 5) │ └─TableScan_24 10000.00 cop[tikv] table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_32 3333.33 root data:Selection_31 -│ └─Selection_31 3333.33 cop[tikv] gt(Column#2, 5) +│ └─Selection_31 3333.33 cop[tikv] gt(test.t2.b, 5) │ └─TableScan_30 10000.00 cop[tikv] table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_38 3333.33 root data:Selection_37 - └─Selection_37 3333.33 cop[tikv] gt(Column#2, 5) + └─Selection_37 3333.33 cop[tikv] gt(test.t2.b, 5) └─TableScan_36 10000.00 cop[tikv] table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where b > 5 and b < 8; id count task operator info @@ -4010,10 +4010,10 @@ create table t1 (s1 int); explain select 1 from t1 union all select 2; id count task operator info Union_8 10001.00 root -├─Projection_9 10000.00 root 1 +├─Projection_9 10000.00 root 1->Column#5 │ └─TableReader_11 10000.00 root data:TableScan_10 │ └─TableScan_10 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo -└─Projection_12 1.00 root 2 +└─Projection_12 1.00 root 2->Column#5 └─TableDual_13 1.00 root rows:1 drop table t1; create table t1 (a int) @@ -4033,22 +4033,22 @@ insert into t2 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE); explain select * from t1 where a=0; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 0) +└─Selection_7 10.00 cop[tikv] eq(test.t1.a, 0) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where a=0; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 0) +└─Selection_7 10.00 cop[tikv] eq(test.t2.a, 0) └─TableScan_6 10000.00 cop[tikv] table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t1 where a=0xFE; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 254) +└─Selection_7 10.00 cop[tikv] eq(test.t1.a, 254) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where a=0xFE; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, 254) +└─Selection_7 10.00 cop[tikv] eq(test.t2.a, 254) └─TableScan_6 10000.00 cop[tikv] table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t1 where a > 0xFE AND a <= 0xFF; id count task operator info @@ -4057,68 +4057,68 @@ explain select * from t2 where a > 0xFE AND a <= 0xFF; id count task operator info Union_9 750.00 root ├─TableReader_12 250.00 root data:Selection_11 -│ └─Selection_11 250.00 cop[tikv] gt(Column#1, 254), le(Column#1, 255) +│ └─Selection_11 250.00 cop[tikv] gt(test.t2.a, 254), le(test.t2.a, 255) │ └─TableScan_10 10000.00 cop[tikv] table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 250.00 root data:Selection_14 -│ └─Selection_14 250.00 cop[tikv] gt(Column#1, 254), le(Column#1, 255) +│ └─Selection_14 250.00 cop[tikv] gt(test.t2.a, 254), le(test.t2.a, 255) │ └─TableScan_13 10000.00 cop[tikv] table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 250.00 root data:Selection_17 - └─Selection_17 250.00 cop[tikv] gt(Column#1, 254), le(Column#1, 255) + └─Selection_17 250.00 cop[tikv] gt(test.t2.a, 254), le(test.t2.a, 255) └─TableScan_16 10000.00 cop[tikv] table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t1 where a >= 0xFE AND a <= 0xFF; id count task operator info TableReader_8 250.00 root data:Selection_7 -└─Selection_7 250.00 cop[tikv] ge(Column#1, 254), le(Column#1, 255) +└─Selection_7 250.00 cop[tikv] ge(test.t1.a, 254), le(test.t1.a, 255) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where a >= 0xFE AND a <= 0xFF; id count task operator info Union_9 750.00 root ├─TableReader_12 250.00 root data:Selection_11 -│ └─Selection_11 250.00 cop[tikv] ge(Column#1, 254), le(Column#1, 255) +│ └─Selection_11 250.00 cop[tikv] ge(test.t2.a, 254), le(test.t2.a, 255) │ └─TableScan_10 10000.00 cop[tikv] table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 250.00 root data:Selection_14 -│ └─Selection_14 250.00 cop[tikv] ge(Column#1, 254), le(Column#1, 255) +│ └─Selection_14 250.00 cop[tikv] ge(test.t2.a, 254), le(test.t2.a, 255) │ └─TableScan_13 10000.00 cop[tikv] table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 250.00 root data:Selection_17 - └─Selection_17 250.00 cop[tikv] ge(Column#1, 254), le(Column#1, 255) + └─Selection_17 250.00 cop[tikv] ge(test.t2.a, 254), le(test.t2.a, 255) └─TableScan_16 10000.00 cop[tikv] table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t1 where a < 64 AND a >= 63; id count task operator info TableReader_8 250.00 root data:Selection_7 -└─Selection_7 250.00 cop[tikv] ge(Column#1, 63), lt(Column#1, 64) +└─Selection_7 250.00 cop[tikv] ge(test.t1.a, 63), lt(test.t1.a, 64) └─TableScan_6 10000.00 cop[tikv] table:t1, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where a < 64 AND a >= 63; id count task operator info Union_9 750.00 root ├─TableReader_12 250.00 root data:Selection_11 -│ └─Selection_11 250.00 cop[tikv] ge(Column#1, 63), lt(Column#1, 64) +│ └─Selection_11 250.00 cop[tikv] ge(test.t2.a, 63), lt(test.t2.a, 64) │ └─TableScan_10 10000.00 cop[tikv] table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 250.00 root data:Selection_14 -│ └─Selection_14 250.00 cop[tikv] ge(Column#1, 63), lt(Column#1, 64) +│ └─Selection_14 250.00 cop[tikv] ge(test.t2.a, 63), lt(test.t2.a, 64) │ └─TableScan_13 10000.00 cop[tikv] table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 250.00 root data:Selection_17 - └─Selection_17 250.00 cop[tikv] ge(Column#1, 63), lt(Column#1, 64) + └─Selection_17 250.00 cop[tikv] ge(test.t2.a, 63), lt(test.t2.a, 64) └─TableScan_16 10000.00 cop[tikv] table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t1 where a <= 64 AND a >= 63; id count task operator info Union_8 500.00 root ├─TableReader_11 250.00 root data:Selection_10 -│ └─Selection_10 250.00 cop[tikv] ge(Column#1, 63), le(Column#1, 64) +│ └─Selection_10 250.00 cop[tikv] ge(test.t1.a, 63), le(test.t1.a, 64) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 250.00 root data:Selection_13 - └─Selection_13 250.00 cop[tikv] ge(Column#1, 63), le(Column#1, 64) + └─Selection_13 250.00 cop[tikv] ge(test.t1.a, 63), le(test.t1.a, 64) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t2 where a <= 64 AND a >= 63; id count task operator info Union_9 750.00 root ├─TableReader_12 250.00 root data:Selection_11 -│ └─Selection_11 250.00 cop[tikv] ge(Column#1, 63), le(Column#1, 64) +│ └─Selection_11 250.00 cop[tikv] ge(test.t2.a, 63), le(test.t2.a, 64) │ └─TableScan_10 10000.00 cop[tikv] table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 250.00 root data:Selection_14 -│ └─Selection_14 250.00 cop[tikv] ge(Column#1, 63), le(Column#1, 64) +│ └─Selection_14 250.00 cop[tikv] ge(test.t2.a, 63), le(test.t2.a, 64) │ └─TableScan_13 10000.00 cop[tikv] table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 250.00 root data:Selection_17 - └─Selection_17 250.00 cop[tikv] ge(Column#1, 63), le(Column#1, 64) + └─Selection_17 250.00 cop[tikv] ge(test.t2.a, 63), le(test.t2.a, 64) └─TableScan_16 10000.00 cop[tikv] table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo drop table t1; drop table t2; @@ -4135,47 +4135,47 @@ a >= 2305561538531885056-10 and a <= 2305561538531885056-8; id count task operator info Union_10 1000.00 root ├─TableReader_13 250.00 root data:Selection_12 -│ └─Selection_12 250.00 cop[tikv] ge(Column#1, 2305561538531885046), le(Column#1, 2305561538531885048) +│ └─Selection_12 250.00 cop[tikv] ge(test.t1.a, 2305561538531885046), le(test.t1.a, 2305561538531885048) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 250.00 root data:Selection_15 -│ └─Selection_15 250.00 cop[tikv] ge(Column#1, 2305561538531885046), le(Column#1, 2305561538531885048) +│ └─Selection_15 250.00 cop[tikv] ge(test.t1.a, 2305561538531885046), le(test.t1.a, 2305561538531885048) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 250.00 root data:Selection_18 -│ └─Selection_18 250.00 cop[tikv] ge(Column#1, 2305561538531885046), le(Column#1, 2305561538531885048) +│ └─Selection_18 250.00 cop[tikv] ge(test.t1.a, 2305561538531885046), le(test.t1.a, 2305561538531885048) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 250.00 root data:Selection_21 - └─Selection_21 250.00 cop[tikv] ge(Column#1, 2305561538531885046), le(Column#1, 2305561538531885048) + └─Selection_21 250.00 cop[tikv] ge(test.t1.a, 2305561538531885046), le(test.t1.a, 2305561538531885048) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t1 where a > 0xFFFFFFFFFFFFFFEC and a < 0xFFFFFFFFFFFFFFEE; id count task operator info Union_10 1000.00 root ├─TableReader_13 250.00 root data:Selection_12 -│ └─Selection_12 250.00 cop[tikv] gt(Column#1, 18446744073709551596), lt(Column#1, 18446744073709551598) +│ └─Selection_12 250.00 cop[tikv] gt(test.t1.a, 18446744073709551596), lt(test.t1.a, 18446744073709551598) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 250.00 root data:Selection_15 -│ └─Selection_15 250.00 cop[tikv] gt(Column#1, 18446744073709551596), lt(Column#1, 18446744073709551598) +│ └─Selection_15 250.00 cop[tikv] gt(test.t1.a, 18446744073709551596), lt(test.t1.a, 18446744073709551598) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 250.00 root data:Selection_18 -│ └─Selection_18 250.00 cop[tikv] gt(Column#1, 18446744073709551596), lt(Column#1, 18446744073709551598) +│ └─Selection_18 250.00 cop[tikv] gt(test.t1.a, 18446744073709551596), lt(test.t1.a, 18446744073709551598) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 250.00 root data:Selection_21 - └─Selection_21 250.00 cop[tikv] gt(Column#1, 18446744073709551596), lt(Column#1, 18446744073709551598) + └─Selection_21 250.00 cop[tikv] gt(test.t1.a, 18446744073709551596), lt(test.t1.a, 18446744073709551598) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t1 where a>=0 and a <= 0xFFFFFFFFFFFFFFFF; id count task operator info Union_10 1000.00 root ├─TableReader_13 250.00 root data:Selection_12 -│ └─Selection_12 250.00 cop[tikv] ge(Column#1, 0), le(Column#1, 18446744073709551615) +│ └─Selection_12 250.00 cop[tikv] ge(test.t1.a, 0), le(test.t1.a, 18446744073709551615) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 250.00 root data:Selection_15 -│ └─Selection_15 250.00 cop[tikv] ge(Column#1, 0), le(Column#1, 18446744073709551615) +│ └─Selection_15 250.00 cop[tikv] ge(test.t1.a, 0), le(test.t1.a, 18446744073709551615) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 250.00 root data:Selection_18 -│ └─Selection_18 250.00 cop[tikv] ge(Column#1, 0), le(Column#1, 18446744073709551615) +│ └─Selection_18 250.00 cop[tikv] ge(test.t1.a, 0), le(test.t1.a, 18446744073709551615) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 250.00 root data:Selection_21 - └─Selection_21 250.00 cop[tikv] ge(Column#1, 0), le(Column#1, 18446744073709551615) + └─Selection_21 250.00 cop[tikv] ge(test.t1.a, 0), le(test.t1.a, 18446744073709551615) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo drop table t1; create table t1 (a bigint) partition by range(a+0) ( @@ -4189,16 +4189,16 @@ explain select * from t1 where a>-2 and a <=0; id count task operator info Union_10 1000.00 root ├─TableReader_13 250.00 root data:Selection_12 -│ └─Selection_12 250.00 cop[tikv] gt(Column#1, -2), le(Column#1, 0) +│ └─Selection_12 250.00 cop[tikv] gt(test.t1.a, -2), le(test.t1.a, 0) │ └─TableScan_11 10000.00 cop[tikv] table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_16 250.00 root data:Selection_15 -│ └─Selection_15 250.00 cop[tikv] gt(Column#1, -2), le(Column#1, 0) +│ └─Selection_15 250.00 cop[tikv] gt(test.t1.a, -2), le(test.t1.a, 0) │ └─TableScan_14 10000.00 cop[tikv] table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_19 250.00 root data:Selection_18 -│ └─Selection_18 250.00 cop[tikv] gt(Column#1, -2), le(Column#1, 0) +│ └─Selection_18 250.00 cop[tikv] gt(test.t1.a, -2), le(test.t1.a, 0) │ └─TableScan_17 10000.00 cop[tikv] table:t1, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_22 250.00 root data:Selection_21 - └─Selection_21 250.00 cop[tikv] gt(Column#1, -2), le(Column#1, 0) + └─Selection_21 250.00 cop[tikv] gt(test.t1.a, -2), le(test.t1.a, 0) └─TableScan_20 10000.00 cop[tikv] table:t1, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo drop table t1; CREATE TABLE t1 ( recdate DATETIME NOT NULL ) @@ -4214,10 +4214,10 @@ explain select * from t1 where recdate < '2007-03-08 00:00:00'; id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] lt(Column#1, 2007-03-08 00:00:00.000000) +│ └─Selection_10 3323.33 cop[tikv] lt(test.t1.recdate, 2007-03-08 00:00:00.000000) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] lt(Column#1, 2007-03-08 00:00:00.000000) + └─Selection_13 3323.33 cop[tikv] lt(test.t1.recdate, 2007-03-08 00:00:00.000000) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo drop table t1; CREATE TABLE t1 ( recdate DATETIME NOT NULL ) @@ -4233,10 +4233,10 @@ explain select * from t1 where recdate < '2006-01-01 00:00:00'; id count task operator info Union_8 6646.67 root ├─TableReader_11 3323.33 root data:Selection_10 -│ └─Selection_10 3323.33 cop[tikv] lt(Column#1, 2006-01-01 00:00:00.000000) +│ └─Selection_10 3323.33 cop[tikv] lt(test.t1.recdate, 2006-01-01 00:00:00.000000) │ └─TableScan_9 10000.00 cop[tikv] table:t1, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 3323.33 root data:Selection_13 - └─Selection_13 3323.33 cop[tikv] lt(Column#1, 2006-01-01 00:00:00.000000) + └─Selection_13 3323.33 cop[tikv] lt(test.t1.recdate, 2006-01-01 00:00:00.000000) └─TableScan_12 10000.00 cop[tikv] table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo drop table t1; create table t0 (a int); @@ -4252,25 +4252,25 @@ explain select * from t1 where a between 10 and 13; id count task operator info Union_9 750.00 root ├─TableReader_12 250.00 root data:Selection_11 -│ └─Selection_11 250.00 cop[tikv] ge(Column#1, 10), le(Column#1, 13) +│ └─Selection_11 250.00 cop[tikv] ge(test.t1.a, 10), le(test.t1.a, 13) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 250.00 root data:Selection_14 -│ └─Selection_14 250.00 cop[tikv] ge(Column#1, 10), le(Column#1, 13) +│ └─Selection_14 250.00 cop[tikv] ge(test.t1.a, 10), le(test.t1.a, 13) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 250.00 root data:Selection_17 - └─Selection_17 250.00 cop[tikv] ge(Column#1, 10), le(Column#1, 13) + └─Selection_17 250.00 cop[tikv] ge(test.t1.a, 10), le(test.t1.a, 13) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo explain select * from t1 where a between 10 and 10+33; id count task operator info Union_9 750.00 root ├─TableReader_12 250.00 root data:Selection_11 -│ └─Selection_11 250.00 cop[tikv] ge(Column#1, 10), le(Column#1, 43) +│ └─Selection_11 250.00 cop[tikv] ge(test.t1.a, 10), le(test.t1.a, 43) │ └─TableScan_10 10000.00 cop[tikv] table:t1, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo ├─TableReader_15 250.00 root data:Selection_14 -│ └─Selection_14 250.00 cop[tikv] ge(Column#1, 10), le(Column#1, 43) +│ └─Selection_14 250.00 cop[tikv] ge(test.t1.a, 10), le(test.t1.a, 43) │ └─TableScan_13 10000.00 cop[tikv] table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_18 250.00 root data:Selection_17 - └─Selection_17 250.00 cop[tikv] ge(Column#1, 10), le(Column#1, 43) + └─Selection_17 250.00 cop[tikv] ge(test.t1.a, 10), le(test.t1.a, 43) └─TableScan_16 10000.00 cop[tikv] table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo drop table t0, t1; drop table if exists t; @@ -4279,8 +4279,8 @@ explain select * from t where a between timestamp'2019-02-16 14:19:00' and times id count task operator info Union_8 500.00 root ├─TableReader_11 250.00 root data:Selection_10 -│ └─Selection_10 250.00 cop[tikv] ge(Column#1, 2019-02-16 14:19:00), le(Column#1, 2019-02-16 14:21:00) +│ └─Selection_10 250.00 cop[tikv] ge(test.t.a, 2019-02-16 14:19:00), le(test.t.a, 2019-02-16 14:21:00) │ └─TableScan_9 10000.00 cop[tikv] table:t, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_14 250.00 root data:Selection_13 - └─Selection_13 250.00 cop[tikv] ge(Column#1, 2019-02-16 14:19:00), le(Column#1, 2019-02-16 14:21:00) + └─Selection_13 250.00 cop[tikv] ge(test.t.a, 2019-02-16 14:19:00), le(test.t.a, 2019-02-16 14:21:00) └─TableScan_12 10000.00 cop[tikv] table:t, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/select.result b/cmd/explaintest/r/select.result index 1c642135fee1a..5a402db162b1d 100644 --- a/cmd/explaintest/r/select.result +++ b/cmd/explaintest/r/select.result @@ -241,9 +241,9 @@ insert into t1 values(7, 8, 9); insert into t1 values(9, 10, 11); explain select a, c from t1 use index(idx) order by a limit 5; id count task operator info -TopN_7 5.00 root Column#1:asc, offset:0, count:5 +TopN_7 5.00 root test.t1.a:asc, offset:0, count:5 └─IndexReader_15 5.00 root index:TopN_14 - └─TopN_14 5.00 cop[tikv] Column#1:asc, offset:0, count:5 + └─TopN_14 5.00 cop[tikv] test.t1.a:asc, offset:0, count:5 └─IndexScan_13 10000.00 cop[tikv] table:t1, index:b, c, range:[NULL,+inf], keep order:false, stats:pseudo select c, a from t1 use index(idx) order by a limit 5; c a @@ -256,9 +256,9 @@ drop table if exists t; create table t (a int, b int, c int, key idx(a, b, c)); explain select count(a) from t; id count task operator info -StreamAgg_20 1.00 root funcs:count(Column#13) +StreamAgg_20 1.00 root funcs:count(Column#13)->Column#5 └─TableReader_21 1.00 root data:StreamAgg_8 - └─StreamAgg_8 1.00 cop[tikv] funcs:count(Column#1) + └─StreamAgg_8 1.00 cop[tikv] funcs:count(test.t.a)->Column#13 └─TableScan_18 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo select count(a) from t; count(a) @@ -266,19 +266,19 @@ count(a) insert t values(0,0,0); explain select distinct b from t group by a; id count task operator info -HashAgg_7 8000.00 root group by:Column#2, funcs:firstrow(Column#2) -└─StreamAgg_22 8000.00 root group by:Column#1, funcs:firstrow(Column#9) +HashAgg_7 8000.00 root group by:test.t.b, funcs:firstrow(test.t.b)->test.t.b +└─StreamAgg_22 8000.00 root group by:test.t.a, funcs:firstrow(Column#9)->test.t.b └─IndexReader_23 8000.00 root index:StreamAgg_11 - └─StreamAgg_11 8000.00 cop[tikv] group by:Column#1, funcs:firstrow(Column#2) + └─StreamAgg_11 8000.00 cop[tikv] group by:test.t.a, funcs:firstrow(test.t.b)->Column#9 └─IndexScan_21 10000.00 cop[tikv] table:t, index:a, b, c, range:[NULL,+inf], keep order:true, stats:pseudo select distinct b from t group by a; b 0 explain select count(b) from t group by a; id count task operator info -StreamAgg_19 8000.00 root group by:Column#1, funcs:count(Column#10) +StreamAgg_19 8000.00 root group by:test.t.a, funcs:count(Column#10)->Column#5 └─IndexReader_20 8000.00 root index:StreamAgg_8 - └─StreamAgg_8 8000.00 cop[tikv] group by:Column#1, funcs:count(Column#2) + └─StreamAgg_8 8000.00 cop[tikv] group by:test.t.a, funcs:count(test.t.b)->Column#10 └─IndexScan_18 10000.00 cop[tikv] table:t, index:a, b, c, range:[NULL,+inf], keep order:true, stats:pseudo select count(b) from t group by a; count(b) @@ -286,10 +286,10 @@ count(b) insert t values(1,1,1),(3,3,6),(3,2,5),(2,1,4),(1,1,3),(1,1,2); explain select count(a) from t where b>0 group by a, b; id count task operator info -StreamAgg_25 2666.67 root group by:Column#1, Column#2, funcs:count(Column#10) +StreamAgg_25 2666.67 root group by:test.t.a, test.t.b, funcs:count(Column#10)->Column#5 └─IndexReader_26 2666.67 root index:StreamAgg_9 - └─StreamAgg_9 2666.67 cop[tikv] group by:Column#1, Column#2, funcs:count(Column#1) - └─Selection_24 3333.33 cop[tikv] gt(Column#2, 0) + └─StreamAgg_9 2666.67 cop[tikv] group by:test.t.a, test.t.b, funcs:count(test.t.a)->Column#10 + └─Selection_24 3333.33 cop[tikv] gt(test.t.b, 0) └─IndexScan_23 10000.00 cop[tikv] table:t, index:a, b, c, range:[NULL,+inf], keep order:true, stats:pseudo select count(a) from t where b>0 group by a, b; count(a) @@ -300,10 +300,10 @@ count(a) explain select count(a) from t where b>0 group by a, b order by a; id count task operator info Projection_7 2666.67 root Column#5 -└─StreamAgg_36 2666.67 root group by:Column#1, Column#2, funcs:count(Column#15), firstrow(Column#1) +└─StreamAgg_36 2666.67 root group by:test.t.a, test.t.b, funcs:count(Column#15)->Column#5, funcs:firstrow(test.t.a)->test.t.a └─IndexReader_37 2666.67 root index:StreamAgg_34 - └─StreamAgg_34 2666.67 cop[tikv] group by:Column#1, Column#2, funcs:count(Column#1) - └─Selection_28 3333.33 cop[tikv] gt(Column#2, 0) + └─StreamAgg_34 2666.67 cop[tikv] group by:test.t.a, test.t.b, funcs:count(test.t.a)->Column#15 + └─Selection_28 3333.33 cop[tikv] gt(test.t.b, 0) └─IndexScan_27 10000.00 cop[tikv] table:t, index:a, b, c, range:[NULL,+inf], keep order:true, stats:pseudo select count(a) from t where b>0 group by a, b order by a; count(a) @@ -315,10 +315,10 @@ explain select count(a) from t where b>0 group by a, b order by a limit 1; id count task operator info Projection_9 1.00 root Column#5 └─Limit_15 1.00 root offset:0, count:1 - └─StreamAgg_44 1.00 root group by:Column#1, Column#2, funcs:count(Column#16), firstrow(Column#1) + └─StreamAgg_44 1.00 root group by:test.t.a, test.t.b, funcs:count(Column#16)->Column#5, funcs:firstrow(test.t.a)->test.t.a └─IndexReader_45 1.00 root index:StreamAgg_40 - └─StreamAgg_40 1.00 cop[tikv] group by:Column#1, Column#2, funcs:count(Column#1) - └─Selection_43 1.25 cop[tikv] gt(Column#2, 0) + └─StreamAgg_40 1.00 cop[tikv] group by:test.t.a, test.t.b, funcs:count(test.t.a)->Column#16 + └─Selection_43 1.25 cop[tikv] gt(test.t.b, 0) └─IndexScan_42 3.75 cop[tikv] table:t, index:a, b, c, range:[NULL,+inf], keep order:true, stats:pseudo select count(a) from t where b>0 group by a, b order by a limit 1; count(a) @@ -327,18 +327,18 @@ drop table if exists t; create table t (id int primary key, a int, b int); explain select * from (t t1 left join t t2 on t1.a = t2.a) left join (t t3 left join t t4 on t3.a = t4.a) on t2.b = 1; id count task operator info -HashLeftJoin_10 155937656.25 root CARTESIAN left outer join, inner:HashLeftJoin_19, left cond:[eq(Column#6, 1)] -├─HashLeftJoin_12 12487.50 root left outer join, inner:TableReader_18, equal:[eq(Column#2, Column#5)] +HashLeftJoin_10 155937656.25 root CARTESIAN left outer join, inner:HashLeftJoin_19, left cond:[eq(test.t.b, 1)] +├─HashLeftJoin_12 12487.50 root left outer join, inner:TableReader_18, equal:[eq(test.t.a, test.t.a)] │ ├─TableReader_15 10000.00 root data:TableScan_14 │ │ └─TableScan_14 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo │ └─TableReader_18 9990.00 root data:Selection_17 -│ └─Selection_17 9990.00 cop[tikv] not(isnull(Column#5)) +│ └─Selection_17 9990.00 cop[tikv] not(isnull(test.t.a)) │ └─TableScan_16 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo -└─HashLeftJoin_19 12487.50 root left outer join, inner:TableReader_25, equal:[eq(Column#8, Column#11)] +└─HashLeftJoin_19 12487.50 root left outer join, inner:TableReader_25, equal:[eq(test.t.a, test.t.a)] ├─TableReader_22 10000.00 root data:TableScan_21 │ └─TableScan_21 10000.00 cop[tikv] table:t3, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_25 9990.00 root data:Selection_24 - └─Selection_24 9990.00 cop[tikv] not(isnull(Column#11)) + └─Selection_24 9990.00 cop[tikv] not(isnull(test.t.a)) └─TableScan_23 10000.00 cop[tikv] table:t4, range:[-inf,+inf], keep order:false, stats:pseudo drop table if exists t; create table t(a bigint primary key, b bigint); @@ -350,7 +350,7 @@ id count task operator info Point_Get_1 1.00 root table:t, handle:1 desc select sysdate(), sleep(1), sysdate(); id count task operator info -Projection_3 1.00 root sysdate(), sleep(1), sysdate() +Projection_3 1.00 root sysdate()->Column#1, sleep(1)->Column#2, sysdate()->Column#3 └─TableDual_4 1.00 root rows:1 drop table if exists th; set @@session.tidb_enable_table_partition = '1'; @@ -360,7 +360,7 @@ insert into th values (-1,-1),(-2,-2),(-3,-3),(-4,-4),(-5,-5),(-6,-6),(-7,-7),(- desc select * from th where a=-2; id count task operator info TableReader_8 10.00 root data:Selection_7 -└─Selection_7 10.00 cop[tikv] eq(Column#1, -2) +└─Selection_7 10.00 cop[tikv] eq(test.th.a, -2) └─TableScan_6 10000.00 cop[tikv] table:th, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo desc select * from th; id count task operator info @@ -382,22 +382,22 @@ drop table if exists t; create table t(a int, b int); explain select a != any (select a from t t2) from t t1; id count task operator info -Projection_8 10000.00 root and(or(or(gt(Column#8, 1), ne(Column#1, Column#7)), if(ne(Column#9, 0), NULL, 0)), and(ne(Column#10, 0), if(isnull(Column#1), NULL, 1))) +Projection_8 10000.00 root and(or(or(gt(Column#8, 1), ne(test.t.a, Column#7)), if(ne(Column#9, 0), , 0)), and(ne(Column#10, 0), if(isnull(test.t.a), , 1)))->Column#11 └─HashLeftJoin_9 10000.00 root CARTESIAN inner join, inner:StreamAgg_16 ├─TableReader_12 10000.00 root data:TableScan_11 │ └─TableScan_11 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo - └─StreamAgg_16 1.00 root funcs:firstrow(Column#13), count(distinct Column#14), sum(Column#15), count(1) - └─Projection_26 10000.00 root Column#4, Column#4, cast(isnull(Column#4)) + └─StreamAgg_16 1.00 root funcs:firstrow(Column#13)->Column#7, funcs:count(distinct Column#14)->Column#8, funcs:sum(Column#15)->Column#9, funcs:count(1)->Column#10 + └─Projection_26 10000.00 root test.t.a, test.t.a, cast(isnull(test.t.a))->Column#15 └─TableReader_23 10000.00 root data:TableScan_22 └─TableScan_22 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo explain select a = all (select a from t t2) from t t1; id count task operator info -Projection_8 10000.00 root or(and(and(le(Column#8, 1), eq(Column#1, Column#7)), if(ne(Column#9, 0), NULL, 1)), or(eq(Column#10, 0), if(isnull(Column#1), NULL, 0))) +Projection_8 10000.00 root or(and(and(le(Column#8, 1), eq(test.t.a, Column#7)), if(ne(Column#9, 0), , 1)), or(eq(Column#10, 0), if(isnull(test.t.a), , 0)))->Column#11 └─HashLeftJoin_9 10000.00 root CARTESIAN inner join, inner:StreamAgg_16 ├─TableReader_12 10000.00 root data:TableScan_11 │ └─TableScan_11 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo - └─StreamAgg_16 1.00 root funcs:firstrow(Column#13), count(distinct Column#14), sum(Column#15), count(1) - └─Projection_26 10000.00 root Column#4, Column#4, cast(isnull(Column#4)) + └─StreamAgg_16 1.00 root funcs:firstrow(Column#13)->Column#7, funcs:count(distinct Column#14)->Column#8, funcs:sum(Column#15)->Column#9, funcs:count(1)->Column#10 + └─Projection_26 10000.00 root test.t.a, test.t.a, cast(isnull(test.t.a))->Column#15 └─TableReader_23 10000.00 root data:TableScan_22 └─TableScan_22 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo drop table if exists t; @@ -407,17 +407,17 @@ create table s(a varchar(20), b varchar(20)); explain select a in (select a from s where s.b = t.b) from t; id count task operator info Projection_9 10000.00 root Column#7 -└─HashLeftJoin_10 10000.00 root left outer semi join, inner:Projection_14, equal:[eq(Column#8, Column#9)], other cond:eq(cast(Column#1), cast(Column#4)) - ├─Projection_11 10000.00 root Column#1, Column#2, cast(Column#2) +└─HashLeftJoin_10 10000.00 root left outer semi join, inner:Projection_14, equal:[eq(Column#8, Column#9)], other cond:eq(cast(test.t.a), cast(test.s.a)) + ├─Projection_11 10000.00 root test.t.a, test.t.b, cast(test.t.b)->Column#8 │ └─TableReader_13 10000.00 root data:TableScan_12 │ └─TableScan_12 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo - └─Projection_14 10000.00 root Column#4, Column#5, cast(Column#5) + └─Projection_14 10000.00 root test.s.a, test.s.b, cast(test.s.b)->Column#9 └─TableReader_16 10000.00 root data:TableScan_15 └─TableScan_15 10000.00 cop[tikv] table:s, range:[-inf,+inf], keep order:false, stats:pseudo explain select a in (select a+b from t t2 where t2.b = t1.b) from t t1; id count task operator info Projection_7 10000.00 root Column#8 -└─HashLeftJoin_8 10000.00 root left outer semi join, inner:TableReader_12, equal:[eq(Column#2, Column#5)], other cond:eq(Column#1, plus(Column#4, Column#5)) +└─HashLeftJoin_8 10000.00 root left outer semi join, inner:TableReader_12, equal:[eq(test.t.b, test.t.b)], other cond:eq(test.t.a, plus(test.t.a, test.t.b)) ├─TableReader_10 10000.00 root data:TableScan_9 │ └─TableScan_9 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_12 10000.00 root data:TableScan_11 @@ -427,23 +427,23 @@ create table t(a int not null, b int); explain select a in (select a from t t2 where t2.b = t1.b) from t t1; id count task operator info Projection_7 10000.00 root Column#7 -└─HashLeftJoin_8 10000.00 root left outer semi join, inner:TableReader_12, equal:[eq(Column#2, Column#5) eq(Column#1, Column#4)] +└─HashLeftJoin_8 10000.00 root left outer semi join, inner:TableReader_12, equal:[eq(test.t.b, test.t.b) eq(test.t.a, test.t.a)] ├─TableReader_10 10000.00 root data:TableScan_9 │ └─TableScan_9 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_12 10000.00 root data:TableScan_11 └─TableScan_11 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo explain select 1 from (select sleep(1)) t; id count task operator info -Projection_4 1.00 root 1 -└─Projection_5 1.00 root sleep(1) +Projection_4 1.00 root 1->Column#2 +└─Projection_5 1.00 root sleep(1)->Column#1 └─TableDual_6 1.00 root rows:1 drop table if exists t; create table t(a int, b int); explain select a from t order by rand(); id count task operator info -Projection_8 10000.00 root Column#1 +Projection_8 10000.00 root test.t.a └─Sort_4 10000.00 root Column#4:asc - └─Projection_9 10000.00 root Column#1, rand() + └─Projection_9 10000.00 root test.t.a, rand()->Column#4 └─TableReader_7 10000.00 root data:TableScan_6 └─TableScan_6 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select a, b from t order by abs(2); @@ -452,9 +452,9 @@ TableReader_8 10000.00 root data:TableScan_7 └─TableScan_7 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select a from t order by abs(rand())+1; id count task operator info -Projection_8 10000.00 root Column#1 +Projection_8 10000.00 root test.t.a └─Sort_4 10000.00 root Column#4:asc - └─Projection_9 10000.00 root Column#1, plus(abs(rand()), 1) + └─Projection_9 10000.00 root test.t.a, plus(abs(rand()), 1)->Column#4 └─TableReader_7 10000.00 root data:TableScan_6 └─TableScan_6 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo drop table if exists t1; @@ -463,12 +463,12 @@ drop table if exists t2; create table t2(a int, b int); explain select * from t1 where t1.a in (select t2.a as a from t2 where t2.b > t1.b order by t1.b); id count task operator info -HashLeftJoin_10 7984.01 root semi join, inner:TableReader_16, equal:[eq(Column#1, Column#4)], other cond:gt(Column#5, Column#2) +HashLeftJoin_10 7984.01 root semi join, inner:TableReader_16, equal:[eq(test.t1.a, test.t2.a)], other cond:gt(test.t2.b, test.t1.b) ├─TableReader_13 9980.01 root data:Selection_12 -│ └─Selection_12 9980.01 cop[tikv] not(isnull(Column#1)), not(isnull(Column#2)) +│ └─Selection_12 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b)) │ └─TableScan_11 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_16 9980.01 root data:Selection_15 - └─Selection_15 9980.01 cop[tikv] not(isnull(Column#4)), not(isnull(Column#5)) + └─Selection_15 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b)) └─TableScan_14 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo drop table t; CREATE TABLE t (id int(10) unsigned NOT NULL AUTO_INCREMENT, @@ -478,8 +478,8 @@ PRIMARY KEY (`id`) ); explain select row_number() over( partition by i ) - x as rnk from t; id count task operator info -Projection_7 10000.00 root minus(Column#5, Column#3) -└─Window_8 10000.00 root row_number() over(partition by Column#2) - └─Sort_11 10000.00 root Column#2:asc +Projection_7 10000.00 root minus(Column#5, test.t.x)->Column#7 +└─Window_8 10000.00 root row_number()->Column#5 over(partition by test.t.i) + └─Sort_11 10000.00 root test.t.i:asc └─TableReader_10 10000.00 root data:TableScan_9 └─TableScan_9 10000.00 cop[tikv] table:t, range:[0,+inf], keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/subquery.result b/cmd/explaintest/r/subquery.result index 19d55e364d1f0..6caeee116448e 100644 --- a/cmd/explaintest/r/subquery.result +++ b/cmd/explaintest/r/subquery.result @@ -6,7 +6,7 @@ set session tidb_hashagg_partial_concurrency = 1; set session tidb_hashagg_final_concurrency = 1; explain select * from t1 where t1.a in (select t1.b + t2.b from t2); id count task operator info -HashLeftJoin_8 8000.00 root CARTESIAN semi join, inner:TableReader_12, other cond:eq(Column#1, plus(Column#2, Column#5)) +HashLeftJoin_8 8000.00 root CARTESIAN semi join, inner:TableReader_12, other cond:eq(test.t1.a, plus(test.t1.b, test.t2.b)) ├─TableReader_10 10000.00 root data:TableScan_9 │ └─TableScan_9 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_12 10000.00 root data:TableScan_11 @@ -18,27 +18,27 @@ analyze table t; explain select t.c in (select count(*) from t s use index(idx), t t1 where s.b = 1 and s.c = 1 and s.d = t.a and s.a = t1.a) from t; id count task operator info Projection_11 5.00 root Column#14 -└─Apply_13 5.00 root CARTESIAN left outer semi join, inner:StreamAgg_22, other cond:eq(Column#3, Column#13) +└─Apply_13 5.00 root CARTESIAN left outer semi join, inner:StreamAgg_22, other cond:eq(test.t.c, Column#13) ├─TableReader_15 5.00 root data:TableScan_14 │ └─TableScan_14 5.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false - └─StreamAgg_22 1.00 root funcs:count(1) - └─IndexMergeJoin_29 0.50 root inner join, inner:TableReader_27, outer key:Column#5, inner key:Column#9 + └─StreamAgg_22 1.00 root funcs:count(1)->Column#13 + └─IndexMergeJoin_29 0.50 root inner join, inner:TableReader_27, outer key:test.t.a, inner key:test.t.a ├─IndexReader_35 1.00 root index:IndexScan_34 - │ └─IndexScan_34 1.00 cop[tikv] table:s, index:b, c, d, range: decided by [eq(Column#6, 1) eq(Column#7, 1) eq(Column#8, Column#1)], keep order:false + │ └─IndexScan_34 1.00 cop[tikv] table:s, index:b, c, d, range: decided by [eq(test.t.b, 1) eq(test.t.c, 1) eq(test.t.d, test.t.a)], keep order:false └─TableReader_27 1.00 root data:TableScan_26 - └─TableScan_26 1.00 cop[tikv] table:t1, range: decided by [Column#5], keep order:true + └─TableScan_26 1.00 cop[tikv] table:t1, range: decided by [test.t.a], keep order:true drop table if exists t; create table t(a int, b int, c int); explain select a from t t1 where t1.a = (select max(t2.a) from t t2 where t1.b=t2.b and t1.c=t2.b); id count task operator info -Projection_11 7992.00 root Column#1 -└─HashLeftJoin_12 7992.00 root inner join, inner:Selection_17, equal:[eq(Column#2, Column#6) eq(Column#3, Column#6) eq(Column#1, Column#9)] +Projection_11 7992.00 root test.t.a +└─HashLeftJoin_12 7992.00 root inner join, inner:Selection_17, equal:[eq(test.t.b, test.t.b) eq(test.t.c, test.t.b) eq(test.t.a, Column#9)] ├─TableReader_16 9970.03 root data:Selection_15 - │ └─Selection_15 9970.03 cop[tikv] not(isnull(Column#1)), not(isnull(Column#2)), not(isnull(Column#3)) + │ └─Selection_15 9970.03 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b)), not(isnull(test.t.c)) │ └─TableScan_14 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─Selection_17 6393.60 root not(isnull(Column#9)) - └─HashAgg_23 7992.00 root group by:Column#6, funcs:max(Column#10), firstrow(Column#6) + └─HashAgg_23 7992.00 root group by:test.t.b, funcs:max(Column#10)->Column#9, funcs:firstrow(test.t.b)->test.t.b └─TableReader_24 7992.00 root data:HashAgg_18 - └─HashAgg_18 7992.00 cop[tikv] group by:Column#6, funcs:max(Column#5) - └─Selection_22 9990.00 cop[tikv] not(isnull(Column#6)) + └─HashAgg_18 7992.00 cop[tikv] group by:test.t.b, funcs:max(test.t.a)->Column#10 + └─Selection_22 9990.00 cop[tikv] not(isnull(test.t.b)) └─TableScan_21 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/topn_push_down.result b/cmd/explaintest/r/topn_push_down.result index 0dbcf2b06760a..6f235c4cdf5d2 100644 --- a/cmd/explaintest/r/topn_push_down.result +++ b/cmd/explaintest/r/topn_push_down.result @@ -167,21 +167,21 @@ te.expect_time BETWEEN '2018-04-23 00:00:00.0' AND '2018-04-23 23:59:59.0' ORDER BY te.expect_time asc LIMIT 0, 5; id count task operator info -Projection_12 0.00 root Column#47 -└─TopN_15 0.00 root Column#47:asc, offset:0, count:5 - └─IndexJoin_24 0.00 root inner join, inner:IndexLookUp_23, outer key:Column#1, inner key:Column#41 +Projection_12 0.00 root test.te.expect_time +└─TopN_15 0.00 root test.te.expect_time:asc, offset:0, count:5 + └─IndexJoin_24 0.00 root inner join, inner:IndexLookUp_23, outer key:test.tr.id, inner key:test.te.trade_id ├─IndexLookUp_67 0.00 root - │ ├─Selection_65 0.00 cop[tikv] eq(Column#4, 18), eq(Column#5, 1) + │ ├─Selection_65 0.00 cop[tikv] eq(test.tr.business_type, 18), eq(test.tr.trade_type, 1) │ │ └─IndexScan_63 10.00 cop[tikv] table:tr, index:shop_identy, trade_status, business_type, trade_pay_status, trade_type, delivery_type, source, biz_date, range:[810094178,810094178], keep order:false, stats:pseudo - │ └─Selection_66 0.00 cop[tikv] eq(Column#21, 32314), eq(Column#3, 2) + │ └─Selection_66 0.00 cop[tikv] eq(test.tr.brand_identy, 32314), eq(test.tr.domain_type, 2) │ └─TableScan_64 0.00 cop[tikv] table:tr, keep order:false, stats:pseudo └─IndexLookUp_23 0.03 root - ├─IndexScan_20 1.25 cop[tikv] table:te, index:trade_id, range: decided by [eq(Column#41, Column#1)], keep order:false, stats:pseudo - └─Selection_22 0.03 cop[tikv] ge(Column#47, 2018-04-23 00:00:00.000000), le(Column#47, 2018-04-23 23:59:59.000000) + ├─IndexScan_20 1.25 cop[tikv] table:te, index:trade_id, range: decided by [eq(test.te.trade_id, test.tr.id)], keep order:false, stats:pseudo + └─Selection_22 0.03 cop[tikv] ge(test.te.expect_time, 2018-04-23 00:00:00.000000), le(test.te.expect_time, 2018-04-23 23:59:59.000000) └─TableScan_21 1.25 cop[tikv] table:te, keep order:false, stats:pseudo desc select 1 as a from dual order by a limit 1; id count task operator info -Projection_6 1.00 root 1 +Projection_6 1.00 root 1->Column#1 └─TableDual_7 1.00 root rows:1 drop table if exists t1; drop table if exists t2; @@ -189,52 +189,52 @@ create table t1(a bigint, b bigint); create table t2(a bigint, b bigint); desc select * from t1 where t1.a in (select t2.a as a from t2 where t2.b > t1.b order by t1.b limit 1); id count task operator info -Apply_15 9990.00 root semi join, inner:Selection_19, equal:[eq(Column#1, Column#4)] +Apply_15 9990.00 root semi join, inner:Selection_19, equal:[eq(test.t1.a, test.t2.a)] ├─TableReader_18 9990.00 root data:Selection_17 -│ └─Selection_17 9990.00 cop[tikv] not(isnull(Column#1)) +│ └─Selection_17 9990.00 cop[tikv] not(isnull(test.t1.a)) │ └─TableScan_16 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo -└─Selection_19 0.80 root not(isnull(Column#4)) +└─Selection_19 0.80 root not(isnull(test.t2.a)) └─Limit_20 1.00 root offset:0, count:1 └─TableReader_26 1.00 root data:Limit_25 └─Limit_25 1.00 cop[tikv] offset:0, count:1 - └─Selection_24 1.00 cop[tikv] gt(Column#5, Column#2) + └─Selection_24 1.00 cop[tikv] gt(test.t2.b, test.t1.b) └─TableScan_23 1.25 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo desc select * from t1 where t1.a in (select a from (select t2.a as a, t1.b as b from t2 where t2.b > t1.b) x order by b limit 1); id count task operator info -Apply_17 9990.00 root semi join, inner:Selection_21, equal:[eq(Column#1, Column#4)] +Apply_17 9990.00 root semi join, inner:Selection_21, equal:[eq(test.t1.a, test.t2.a)] ├─TableReader_20 9990.00 root data:Selection_19 -│ └─Selection_19 9990.00 cop[tikv] not(isnull(Column#1)) +│ └─Selection_19 9990.00 cop[tikv] not(isnull(test.t1.a)) │ └─TableScan_18 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo -└─Selection_21 0.80 root not(isnull(Column#4)) - └─Projection_22 1.00 root Column#4, Column#2 +└─Selection_21 0.80 root not(isnull(test.t2.a)) + └─Projection_22 1.00 root test.t2.a, test.t1.b └─Limit_23 1.00 root offset:0, count:1 └─TableReader_29 1.00 root data:Limit_28 └─Limit_28 1.00 cop[tikv] offset:0, count:1 - └─Selection_27 1.00 cop[tikv] gt(Column#5, Column#2) + └─Selection_27 1.00 cop[tikv] gt(test.t2.b, test.t1.b) └─TableScan_26 1.25 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo drop table if exists t; create table t(a int not null, index idx(a)); explain select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; id count task operator info Limit_11 5.00 root offset:0, count:5 -└─IndexJoin_15 5.00 root inner join, inner:IndexReader_14, outer key:Column#1, inner key:Column#3 +└─IndexJoin_15 5.00 root inner join, inner:IndexReader_14, outer key:test.t.a, inner key:test.t.a ├─TableReader_23 4.00 root data:TableScan_22 │ └─TableScan_22 4.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─IndexReader_14 1.25 root index:IndexScan_13 - └─IndexScan_13 1.25 cop[tikv] table:t2, index:a, range: decided by [eq(Column#3, Column#1)], keep order:false, stats:pseudo + └─IndexScan_13 1.25 cop[tikv] table:t2, index:a, range: decided by [eq(test.t.a, test.t.a)], keep order:false, stats:pseudo explain select /*+ TIDB_INLJ(t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; id count task operator info Limit_12 5.00 root offset:0, count:5 -└─Selection_13 5.00 root isnull(Column#3) - └─IndexJoin_17 5.00 root left outer join, inner:IndexReader_16, outer key:Column#1, inner key:Column#3 +└─Selection_13 5.00 root isnull(test.t.a) + └─IndexJoin_17 5.00 root left outer join, inner:IndexReader_16, outer key:test.t.a, inner key:test.t.a ├─TableReader_25 4.00 root data:TableScan_24 │ └─TableScan_24 4.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─IndexReader_16 1.25 root index:IndexScan_15 - └─IndexScan_15 1.25 cop[tikv] table:t2, index:a, range: decided by [eq(Column#3, Column#1)], keep order:false, stats:pseudo + └─IndexScan_15 1.25 cop[tikv] table:t2, index:a, range: decided by [eq(test.t.a, test.t.a)], keep order:false, stats:pseudo explain select /*+ TIDB_SMJ(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; id count task operator info Limit_11 5.00 root offset:0, count:5 -└─MergeJoin_12 5.00 root inner join, left key:Column#1, right key:Column#3 +└─MergeJoin_12 5.00 root inner join, left key:test.t.a, right key:test.t.a ├─IndexReader_15 4.00 root index:IndexScan_14 │ └─IndexScan_14 4.00 cop[tikv] table:t1, index:a, range:[NULL,+inf], keep order:true, stats:pseudo └─IndexReader_17 4.00 root index:IndexScan_16 @@ -242,8 +242,8 @@ Limit_11 5.00 root offset:0, count:5 explain select /*+ TIDB_SMJ(t1, t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; id count task operator info Limit_12 5.00 root offset:0, count:5 -└─Selection_13 5.00 root isnull(Column#3) - └─MergeJoin_14 5.00 root left outer join, left key:Column#1, right key:Column#3 +└─Selection_13 5.00 root isnull(test.t.a) + └─MergeJoin_14 5.00 root left outer join, left key:test.t.a, right key:test.t.a ├─IndexReader_17 4.00 root index:IndexScan_16 │ └─IndexScan_16 4.00 cop[tikv] table:t1, index:a, range:[NULL,+inf], keep order:true, stats:pseudo └─IndexReader_19 4.00 root index:IndexScan_18 @@ -251,7 +251,7 @@ Limit_12 5.00 root offset:0, count:5 explain select /*+ TIDB_HJ(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; id count task operator info Limit_11 5.00 root offset:0, count:5 -└─HashLeftJoin_31 5.00 root inner join, inner:TableReader_38, equal:[eq(Column#1, Column#3)] +└─HashLeftJoin_31 5.00 root inner join, inner:TableReader_38, equal:[eq(test.t.a, test.t.a)] ├─TableReader_34 4.00 root data:TableScan_33 │ └─TableScan_33 4.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_38 10000.00 root data:TableScan_37 @@ -259,8 +259,8 @@ Limit_11 5.00 root offset:0, count:5 explain select /*+ TIDB_HJ(t1, t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; id count task operator info Limit_12 5.00 root offset:0, count:5 -└─Selection_13 5.00 root isnull(Column#3) - └─HashLeftJoin_25 5.00 root left outer join, inner:TableReader_27 (REVERSED), equal:[eq(Column#1, Column#3)] +└─Selection_13 5.00 root isnull(test.t.a) + └─HashLeftJoin_25 5.00 root left outer join, inner:TableReader_27 (REVERSED), equal:[eq(test.t.a, test.t.a)] ├─TableReader_27 4.00 root data:TableScan_26 │ └─TableScan_26 4.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo └─TableReader_31 10000.00 root data:TableScan_30 diff --git a/cmd/explaintest/r/topn_pushdown.result b/cmd/explaintest/r/topn_pushdown.result index 4c0e0d0891811..47d876a60c149 100644 --- a/cmd/explaintest/r/topn_pushdown.result +++ b/cmd/explaintest/r/topn_pushdown.result @@ -2,7 +2,7 @@ explain select * from ((select 4 as a) union all (select 33 as a)) tmp order by id count task operator info TopN_17 1.00 root Column#3:desc, offset:0, count:1 └─Union_21 2.00 root - ├─Projection_22 1.00 root cast(4) + ├─Projection_22 1.00 root cast(4)->Column#3 │ └─TableDual_23 1.00 root rows:1 - └─Projection_24 1.00 root 33 + └─Projection_24 1.00 root 33->Column#3 └─TableDual_25 1.00 root rows:1 diff --git a/cmd/explaintest/r/tpch.result b/cmd/explaintest/r/tpch.result index 119b5cf7160d3..d42690c081802 100644 --- a/cmd/explaintest/r/tpch.result +++ b/cmd/explaintest/r/tpch.result @@ -119,12 +119,12 @@ order by l_returnflag, l_linestatus; id count task operator info -Sort_6 2.94 root Column#9:asc, Column#10:asc -└─Projection_8 2.94 root Column#9, Column#10, Column#18, Column#19, Column#20, Column#21, Column#22, Column#23, Column#24, Column#25 - └─HashAgg_14 2.94 root group by:Column#10, Column#9, funcs:sum(Column#26), sum(Column#27), sum(Column#28), sum(Column#29), avg(Column#30, Column#31), avg(Column#32, Column#33), avg(Column#34, Column#35), count(Column#36), firstrow(Column#9), firstrow(Column#10) +Sort_6 2.94 root tpch.lineitem.l_returnflag:asc, tpch.lineitem.l_linestatus:asc +└─Projection_8 2.94 root tpch.lineitem.l_returnflag, tpch.lineitem.l_linestatus, Column#18, Column#19, Column#20, Column#21, Column#22, Column#23, Column#24, Column#25 + └─HashAgg_14 2.94 root group by:tpch.lineitem.l_linestatus, tpch.lineitem.l_returnflag, funcs:sum(Column#26)->Column#18, funcs:sum(Column#27)->Column#19, funcs:sum(Column#28)->Column#20, funcs:sum(Column#29)->Column#21, funcs:avg(Column#30, Column#31)->Column#22, funcs:avg(Column#32, Column#33)->Column#23, funcs:avg(Column#34, Column#35)->Column#24, funcs:count(Column#36)->Column#25, funcs:firstrow(tpch.lineitem.l_returnflag)->tpch.lineitem.l_returnflag, funcs:firstrow(tpch.lineitem.l_linestatus)->tpch.lineitem.l_linestatus └─TableReader_15 2.94 root data:HashAgg_9 - └─HashAgg_9 2.94 cop[tikv] group by:Column#10, Column#9, funcs:sum(Column#5), sum(Column#6), sum(mul(Column#6, minus(1, Column#7))), sum(mul(mul(Column#6, minus(1, Column#7)), plus(1, Column#8))), count(Column#5), sum(Column#5), count(Column#6), sum(Column#6), count(Column#7), sum(Column#7), count(1) - └─Selection_13 293795345.00 cop[tikv] le(Column#11, 1998-08-15) + └─HashAgg_9 2.94 cop[tikv] group by:tpch.lineitem.l_linestatus, tpch.lineitem.l_returnflag, funcs:sum(tpch.lineitem.l_quantity)->Column#26, funcs:sum(tpch.lineitem.l_extendedprice)->Column#27, funcs:sum(mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount)))->Column#28, funcs:sum(mul(mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount)), plus(1, tpch.lineitem.l_tax)))->Column#29, funcs:count(tpch.lineitem.l_quantity)->Column#30, funcs:sum(tpch.lineitem.l_quantity)->Column#31, funcs:count(tpch.lineitem.l_extendedprice)->Column#32, funcs:sum(tpch.lineitem.l_extendedprice)->Column#33, funcs:count(tpch.lineitem.l_discount)->Column#34, funcs:sum(tpch.lineitem.l_discount)->Column#35, funcs:count(1)->Column#36 + └─Selection_13 293795345.00 cop[tikv] le(tpch.lineitem.l_shipdate, 1998-08-15) └─TableScan_12 300005811.00 cop[tikv] table:lineitem, range:[-inf,+inf], keep order:false /* Q2 Minimum Cost Supplier Query @@ -182,15 +182,15 @@ s_name, p_partkey limit 100; id count task operator info -Projection_37 100.00 root Column#15, Column#11, Column#24, Column#1, Column#3, Column#12, Column#14, Column#16 -└─TopN_40 100.00 root Column#15:desc, Column#24:asc, Column#11:asc, Column#1:asc, offset:0, count:100 - └─HashRightJoin_45 155496.00 root inner join, inner:IndexMergeJoin_55, equal:[eq(Column#1, Column#30) eq(Column#20, Column#50)] - ├─IndexMergeJoin_55 155496.00 root inner join, inner:TableReader_53, outer key:Column#17, inner key:Column#1 - │ ├─HashRightJoin_61 8155010.44 root inner join, inner:HashRightJoin_63, equal:[eq(Column#10, Column#18)] - │ │ ├─HashRightJoin_63 100000.00 root inner join, inner:HashRightJoin_76, equal:[eq(Column#23, Column#13)] - │ │ │ ├─HashRightJoin_76 5.00 root inner join, inner:TableReader_81, equal:[eq(Column#27, Column#25)] +Projection_37 100.00 root tpch.supplier.s_acctbal, tpch.supplier.s_name, tpch.nation.n_name, tpch.part.p_partkey, tpch.part.p_mfgr, tpch.supplier.s_address, tpch.supplier.s_phone, tpch.supplier.s_comment +└─TopN_40 100.00 root tpch.supplier.s_acctbal:desc, tpch.nation.n_name:asc, tpch.supplier.s_name:asc, tpch.part.p_partkey:asc, offset:0, count:100 + └─HashRightJoin_45 155496.00 root inner join, inner:IndexMergeJoin_55, equal:[eq(tpch.part.p_partkey, tpch.partsupp.ps_partkey) eq(tpch.partsupp.ps_supplycost, Column#50)] + ├─IndexMergeJoin_55 155496.00 root inner join, inner:TableReader_53, outer key:tpch.partsupp.ps_partkey, inner key:tpch.part.p_partkey + │ ├─HashRightJoin_61 8155010.44 root inner join, inner:HashRightJoin_63, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)] + │ │ ├─HashRightJoin_63 100000.00 root inner join, inner:HashRightJoin_76, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] + │ │ │ ├─HashRightJoin_76 5.00 root inner join, inner:TableReader_81, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)] │ │ │ │ ├─TableReader_81 1.00 root data:Selection_80 - │ │ │ │ │ └─Selection_80 1.00 cop[tikv] eq(Column#28, "ASIA") + │ │ │ │ │ └─Selection_80 1.00 cop[tikv] eq(tpch.region.r_name, "ASIA") │ │ │ │ │ └─TableScan_79 5.00 cop[tikv] table:region, range:[-inf,+inf], keep order:false │ │ │ │ └─TableReader_78 25.00 root data:TableScan_77 │ │ │ │ └─TableScan_77 25.00 cop[tikv] table:nation, range:[-inf,+inf], keep order:false @@ -199,15 +199,15 @@ Projection_37 100.00 root Column#15, Column#11, Column#24, Column#1, Column#3, C │ │ └─TableReader_85 40000000.00 root data:TableScan_84 │ │ └─TableScan_84 40000000.00 cop[tikv] table:partsupp, range:[-inf,+inf], keep order:false │ └─TableReader_53 0.02 root data:Selection_52 - │ └─Selection_52 0.02 cop[tikv] eq(Column#6, 30), like(Column#5, "%STEEL", 92) - │ └─TableScan_51 0.02 cop[tikv] table:part, range: decided by [Column#17], keep order:true + │ └─Selection_52 0.02 cop[tikv] eq(tpch.part.p_size, 30), like(tpch.part.p_type, "%STEEL", 92) + │ └─TableScan_51 0.02 cop[tikv] table:part, range: decided by [tpch.partsupp.ps_partkey], keep order:true └─Selection_89 6524008.35 root not(isnull(Column#50)) - └─HashAgg_92 8155010.44 root group by:Column#30, funcs:min(Column#33), firstrow(Column#30) - └─HashRightJoin_96 8155010.44 root inner join, inner:HashRightJoin_98, equal:[eq(Column#36, Column#31)] - ├─HashRightJoin_98 100000.00 root inner join, inner:HashRightJoin_111, equal:[eq(Column#43, Column#39)] - │ ├─HashRightJoin_111 5.00 root inner join, inner:TableReader_116, equal:[eq(Column#47, Column#45)] + └─HashAgg_92 8155010.44 root group by:tpch.partsupp.ps_partkey, funcs:min(tpch.partsupp.ps_supplycost)->Column#50, funcs:firstrow(tpch.partsupp.ps_partkey)->tpch.partsupp.ps_partkey + └─HashRightJoin_96 8155010.44 root inner join, inner:HashRightJoin_98, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)] + ├─HashRightJoin_98 100000.00 root inner join, inner:HashRightJoin_111, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] + │ ├─HashRightJoin_111 5.00 root inner join, inner:TableReader_116, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)] │ │ ├─TableReader_116 1.00 root data:Selection_115 - │ │ │ └─Selection_115 1.00 cop[tikv] eq(Column#48, "ASIA") + │ │ │ └─Selection_115 1.00 cop[tikv] eq(tpch.region.r_name, "ASIA") │ │ │ └─TableScan_114 5.00 cop[tikv] table:region, range:[-inf,+inf], keep order:false │ │ └─TableReader_113 25.00 root data:TableScan_112 │ │ └─TableScan_112 25.00 cop[tikv] table:nation, range:[-inf,+inf], keep order:false @@ -249,21 +249,21 @@ revenue desc, o_orderdate limit 10; id count task operator info -Projection_14 10.00 root Column#18, Column#35, Column#13, Column#16 -└─TopN_17 10.00 root Column#35:desc, Column#13:asc, offset:0, count:10 - └─HashAgg_23 40252367.98 root group by:Column#48, Column#49, Column#50, funcs:sum(Column#44), firstrow(Column#45), firstrow(Column#46), firstrow(Column#47) - └─Projection_81 91515927.49 root mul(Column#23, minus(1, Column#24)), Column#13, Column#16, Column#18, Column#18, Column#13, Column#16 - └─IndexHashJoin_38 91515927.49 root inner join, inner:IndexLookUp_28, outer key:Column#9, inner key:Column#18 - ├─HashRightJoin_71 22592975.51 root inner join, inner:TableReader_77, equal:[eq(Column#1, Column#10)] +Projection_14 10.00 root tpch.lineitem.l_orderkey, Column#35, tpch.orders.o_orderdate, tpch.orders.o_shippriority +└─TopN_17 10.00 root Column#35:desc, tpch.orders.o_orderdate:asc, offset:0, count:10 + └─HashAgg_23 40252367.98 root group by:Column#48, Column#49, Column#50, funcs:sum(Column#44)->Column#35, funcs:firstrow(Column#45)->tpch.orders.o_orderdate, funcs:firstrow(Column#46)->tpch.orders.o_shippriority, funcs:firstrow(Column#47)->tpch.lineitem.l_orderkey + └─Projection_81 91515927.49 root mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#44, tpch.orders.o_orderdate, tpch.orders.o_shippriority, tpch.lineitem.l_orderkey, tpch.lineitem.l_orderkey, tpch.orders.o_orderdate, tpch.orders.o_shippriority + └─IndexHashJoin_38 91515927.49 root inner join, inner:IndexLookUp_28, outer key:tpch.orders.o_orderkey, inner key:tpch.lineitem.l_orderkey + ├─HashRightJoin_71 22592975.51 root inner join, inner:TableReader_77, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] │ ├─TableReader_77 1498236.00 root data:Selection_76 - │ │ └─Selection_76 1498236.00 cop[tikv] eq(Column#7, "AUTOMOBILE") + │ │ └─Selection_76 1498236.00 cop[tikv] eq(tpch.customer.c_mktsegment, "AUTOMOBILE") │ │ └─TableScan_75 7500000.00 cop[tikv] table:customer, range:[-inf,+inf], keep order:false │ └─TableReader_74 36870000.00 root data:Selection_73 - │ └─Selection_73 36870000.00 cop[tikv] lt(Column#13, 1995-03-13 00:00:00.000000) + │ └─Selection_73 36870000.00 cop[tikv] lt(tpch.orders.o_orderdate, 1995-03-13 00:00:00.000000) │ └─TableScan_72 75000000.00 cop[tikv] table:orders, range:[-inf,+inf], keep order:false └─IndexLookUp_28 2.20 root - ├─IndexScan_25 4.05 cop[tikv] table:lineitem, index:L_ORDERKEY, L_LINENUMBER, range: decided by [eq(Column#18, Column#9)], keep order:false - └─Selection_27 2.20 cop[tikv] gt(Column#28, 1995-03-13 00:00:00.000000) + ├─IndexScan_25 4.05 cop[tikv] table:lineitem, index:L_ORDERKEY, L_LINENUMBER, range: decided by [eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)], keep order:false + └─Selection_27 2.20 cop[tikv] gt(tpch.lineitem.l_shipdate, 1995-03-13 00:00:00.000000) └─TableScan_26 4.05 cop[tikv] table:lineitem, keep order:false /* Q4 Order Priority Checking Query @@ -295,16 +295,16 @@ o_orderpriority order by o_orderpriority; id count task operator info -Sort_10 1.00 root Column#6:asc -└─Projection_12 1.00 root Column#6, Column#27 - └─HashAgg_15 1.00 root group by:Column#6, funcs:count(1), firstrow(Column#6) - └─IndexHashJoin_30 2340750.00 root semi join, inner:IndexLookUp_20, outer key:Column#1, inner key:Column#10 +Sort_10 1.00 root tpch.orders.o_orderpriority:asc +└─Projection_12 1.00 root tpch.orders.o_orderpriority, Column#27 + └─HashAgg_15 1.00 root group by:tpch.orders.o_orderpriority, funcs:count(1)->Column#27, funcs:firstrow(tpch.orders.o_orderpriority)->tpch.orders.o_orderpriority + └─IndexHashJoin_30 2340750.00 root semi join, inner:IndexLookUp_20, outer key:tpch.orders.o_orderkey, inner key:tpch.lineitem.l_orderkey ├─TableReader_42 2925937.50 root data:Selection_41 - │ └─Selection_41 2925937.50 cop[tikv] ge(Column#5, 1995-01-01 00:00:00.000000), lt(Column#5, 1995-04-01) + │ └─Selection_41 2925937.50 cop[tikv] ge(tpch.orders.o_orderdate, 1995-01-01 00:00:00.000000), lt(tpch.orders.o_orderdate, 1995-04-01) │ └─TableScan_40 75000000.00 cop[tikv] table:orders, range:[-inf,+inf], keep order:false └─IndexLookUp_20 3.24 root - ├─IndexScan_17 4.05 cop[tikv] table:lineitem, index:L_ORDERKEY, L_LINENUMBER, range: decided by [eq(Column#10, Column#1)], keep order:false - └─Selection_19 3.24 cop[tikv] lt(Column#21, Column#22) + ├─IndexScan_17 4.05 cop[tikv] table:lineitem, index:L_ORDERKEY, L_LINENUMBER, range: decided by [eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)], keep order:false + └─Selection_19 3.24 cop[tikv] lt(tpch.lineitem.l_commitdate, tpch.lineitem.l_receiptdate) └─TableScan_18 4.05 cop[tikv] table:lineitem, keep order:false /* Q5 Local Supplier Volume Query @@ -344,16 +344,16 @@ order by revenue desc; id count task operator info Sort_23 5.00 root Column#49:desc -└─Projection_25 5.00 root Column#43, Column#49 - └─HashAgg_28 5.00 root group by:Column#52, funcs:sum(Column#50), firstrow(Column#51) - └─Projection_86 11822812.50 root mul(Column#23, minus(1, Column#24)), Column#43, Column#43 - └─HashLeftJoin_38 11822812.50 root inner join, inner:TableReader_84, equal:[eq(Column#38, Column#4) eq(Column#10, Column#1)] - ├─IndexMergeJoin_49 11822812.50 root inner join, inner:TableReader_47, outer key:Column#18, inner key:Column#9 - │ ├─HashRightJoin_55 61163763.01 root inner join, inner:HashRightJoin_57, equal:[eq(Column#35, Column#20)] - │ │ ├─HashRightJoin_57 100000.00 root inner join, inner:HashRightJoin_70, equal:[eq(Column#42, Column#38)] - │ │ │ ├─HashRightJoin_70 5.00 root inner join, inner:TableReader_75, equal:[eq(Column#46, Column#44)] +└─Projection_25 5.00 root tpch.nation.n_name, Column#49 + └─HashAgg_28 5.00 root group by:Column#52, funcs:sum(Column#50)->Column#49, funcs:firstrow(Column#51)->tpch.nation.n_name + └─Projection_86 11822812.50 root mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#50, tpch.nation.n_name, tpch.nation.n_name + └─HashLeftJoin_38 11822812.50 root inner join, inner:TableReader_84, equal:[eq(tpch.supplier.s_nationkey, tpch.customer.c_nationkey) eq(tpch.orders.o_custkey, tpch.customer.c_custkey)] + ├─IndexMergeJoin_49 11822812.50 root inner join, inner:TableReader_47, outer key:tpch.lineitem.l_orderkey, inner key:tpch.orders.o_orderkey + │ ├─HashRightJoin_55 61163763.01 root inner join, inner:HashRightJoin_57, equal:[eq(tpch.supplier.s_suppkey, tpch.lineitem.l_suppkey)] + │ │ ├─HashRightJoin_57 100000.00 root inner join, inner:HashRightJoin_70, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] + │ │ │ ├─HashRightJoin_70 5.00 root inner join, inner:TableReader_75, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)] │ │ │ │ ├─TableReader_75 1.00 root data:Selection_74 - │ │ │ │ │ └─Selection_74 1.00 cop[tikv] eq(Column#47, "MIDDLE EAST") + │ │ │ │ │ └─Selection_74 1.00 cop[tikv] eq(tpch.region.r_name, "MIDDLE EAST") │ │ │ │ │ └─TableScan_73 5.00 cop[tikv] table:region, range:[-inf,+inf], keep order:false │ │ │ │ └─TableReader_72 25.00 root data:TableScan_71 │ │ │ │ └─TableScan_71 25.00 cop[tikv] table:nation, range:[-inf,+inf], keep order:false @@ -362,8 +362,8 @@ Sort_23 5.00 root Column#49:desc │ │ └─TableReader_79 300005811.00 root data:TableScan_78 │ │ └─TableScan_78 300005811.00 cop[tikv] table:lineitem, range:[-inf,+inf], keep order:false │ └─TableReader_47 0.15 root data:Selection_46 - │ └─Selection_46 0.15 cop[tikv] ge(Column#13, 1994-01-01 00:00:00.000000), lt(Column#13, 1995-01-01) - │ └─TableScan_45 0.19 cop[tikv] table:orders, range: decided by [Column#18], keep order:true + │ └─Selection_46 0.15 cop[tikv] ge(tpch.orders.o_orderdate, 1994-01-01 00:00:00.000000), lt(tpch.orders.o_orderdate, 1995-01-01) + │ └─TableScan_45 0.19 cop[tikv] table:orders, range: decided by [tpch.lineitem.l_orderkey], keep order:true └─TableReader_84 7500000.00 root data:TableScan_83 └─TableScan_83 7500000.00 cop[tikv] table:customer, range:[-inf,+inf], keep order:false /* @@ -388,10 +388,10 @@ and l_shipdate < date_add('1994-01-01', interval '1' year) and l_discount between 0.06 - 0.01 and 0.06 + 0.01 and l_quantity < 24; id count task operator info -StreamAgg_20 1.00 root funcs:sum(Column#20) +StreamAgg_20 1.00 root funcs:sum(Column#20)->Column#18 └─TableReader_21 1.00 root data:StreamAgg_9 - └─StreamAgg_9 1.00 cop[tikv] funcs:sum(mul(Column#6, Column#7)) - └─Selection_19 3713857.91 cop[tikv] ge(Column#11, 1994-01-01 00:00:00.000000), ge(Column#7, 0.05), le(Column#7, 0.07), lt(Column#11, 1995-01-01), lt(Column#5, 24) + └─StreamAgg_9 1.00 cop[tikv] funcs:sum(mul(tpch.lineitem.l_extendedprice, tpch.lineitem.l_discount))->Column#20 + └─Selection_19 3713857.91 cop[tikv] ge(tpch.lineitem.l_discount, 0.05), ge(tpch.lineitem.l_shipdate, 1994-01-01 00:00:00.000000), le(tpch.lineitem.l_discount, 0.07), lt(tpch.lineitem.l_quantity, 24), lt(tpch.lineitem.l_shipdate, 1995-01-01) └─TableScan_18 300005811.00 cop[tikv] table:lineitem, range:[-inf,+inf], keep order:false /* Q7 Volume Shipping Query @@ -444,29 +444,29 @@ supp_nation, cust_nation, l_year; id count task operator info -Sort_22 769.96 root Column#43:asc, Column#47:asc, Column#50:asc -└─Projection_24 769.96 root Column#43, Column#47, Column#50, Column#52 - └─HashAgg_27 769.96 root group by:Column#43, Column#47, Column#50, funcs:sum(Column#51), firstrow(Column#43), firstrow(Column#47), firstrow(Column#50) - └─Projection_28 1957240.42 root Column#43, Column#47, extract("YEAR", Column#18), mul(Column#13, minus(1, Column#14)) - └─HashLeftJoin_40 1957240.42 root inner join, inner:TableReader_94, equal:[eq(Column#37, Column#46)], other cond:or(and(eq(Column#43, "JAPAN"), eq(Column#47, "INDIA")), and(eq(Column#43, "INDIA"), eq(Column#47, "JAPAN"))) - ├─HashLeftJoin_51 24465505.20 root inner join, inner:TableReader_91, equal:[eq(Column#26, Column#34)] - │ ├─IndexMergeJoin_60 24465505.20 root inner join, inner:TableReader_58, outer key:Column#8, inner key:Column#25 - │ │ ├─HashRightJoin_66 24465505.20 root inner join, inner:HashRightJoin_79, equal:[eq(Column#1, Column#10)] - │ │ │ ├─HashRightJoin_79 40000.00 root inner join, inner:TableReader_84, equal:[eq(Column#42, Column#4)] +Sort_22 769.96 root tpch.nation.n_name:asc, tpch.nation.n_name:asc, Column#50:asc +└─Projection_24 769.96 root tpch.nation.n_name, tpch.nation.n_name, Column#50, Column#52 + └─HashAgg_27 769.96 root group by:Column#50, tpch.nation.n_name, tpch.nation.n_name, funcs:sum(Column#51)->Column#52, funcs:firstrow(tpch.nation.n_name)->tpch.nation.n_name, funcs:firstrow(tpch.nation.n_name)->tpch.nation.n_name, funcs:firstrow(Column#50)->Column#50 + └─Projection_28 1957240.42 root tpch.nation.n_name, tpch.nation.n_name, extract(YEAR, tpch.lineitem.l_shipdate)->Column#50, mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#51 + └─HashLeftJoin_40 1957240.42 root inner join, inner:TableReader_94, equal:[eq(tpch.customer.c_nationkey, tpch.nation.n_nationkey)], other cond:or(and(eq(tpch.nation.n_name, "JAPAN"), eq(tpch.nation.n_name, "INDIA")), and(eq(tpch.nation.n_name, "INDIA"), eq(tpch.nation.n_name, "JAPAN"))) + ├─HashLeftJoin_51 24465505.20 root inner join, inner:TableReader_91, equal:[eq(tpch.orders.o_custkey, tpch.customer.c_custkey)] + │ ├─IndexMergeJoin_60 24465505.20 root inner join, inner:TableReader_58, outer key:tpch.lineitem.l_orderkey, inner key:tpch.orders.o_orderkey + │ │ ├─HashRightJoin_66 24465505.20 root inner join, inner:HashRightJoin_79, equal:[eq(tpch.supplier.s_suppkey, tpch.lineitem.l_suppkey)] + │ │ │ ├─HashRightJoin_79 40000.00 root inner join, inner:TableReader_84, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] │ │ │ │ ├─TableReader_84 2.00 root data:Selection_83 - │ │ │ │ │ └─Selection_83 2.00 cop[tikv] or(eq(Column#43, "JAPAN"), eq(Column#43, "INDIA")) + │ │ │ │ │ └─Selection_83 2.00 cop[tikv] or(eq(tpch.nation.n_name, "JAPAN"), eq(tpch.nation.n_name, "INDIA")) │ │ │ │ │ └─TableScan_82 25.00 cop[tikv] table:n1, range:[-inf,+inf], keep order:false │ │ │ │ └─TableReader_81 500000.00 root data:TableScan_80 │ │ │ │ └─TableScan_80 500000.00 cop[tikv] table:supplier, range:[-inf,+inf], keep order:false │ │ │ └─TableReader_87 91446230.29 root data:Selection_86 - │ │ │ └─Selection_86 91446230.29 cop[tikv] ge(Column#18, 1995-01-01 00:00:00.000000), le(Column#18, 1996-12-31 00:00:00.000000) + │ │ │ └─Selection_86 91446230.29 cop[tikv] ge(tpch.lineitem.l_shipdate, 1995-01-01 00:00:00.000000), le(tpch.lineitem.l_shipdate, 1996-12-31 00:00:00.000000) │ │ │ └─TableScan_85 300005811.00 cop[tikv] table:lineitem, range:[-inf,+inf], keep order:false │ │ └─TableReader_58 1.00 root data:TableScan_57 - │ │ └─TableScan_57 1.00 cop[tikv] table:orders, range: decided by [Column#8], keep order:true + │ │ └─TableScan_57 1.00 cop[tikv] table:orders, range: decided by [tpch.lineitem.l_orderkey], keep order:true │ └─TableReader_91 7500000.00 root data:TableScan_90 │ └─TableScan_90 7500000.00 cop[tikv] table:customer, range:[-inf,+inf], keep order:false └─TableReader_94 2.00 root data:Selection_93 - └─Selection_93 2.00 cop[tikv] or(eq(Column#47, "INDIA"), eq(Column#47, "JAPAN")) + └─Selection_93 2.00 cop[tikv] or(eq(tpch.nation.n_name, "INDIA"), eq(tpch.nation.n_name, "JAPAN")) └─TableScan_92 25.00 cop[tikv] table:n2, range:[-inf,+inf], keep order:false /* Q8 National Market Share Query @@ -517,32 +517,32 @@ order by o_year; id count task operator info Sort_29 719.02 root Column#62:asc -└─Projection_31 719.02 root Column#62, div(Column#64, Column#65) - └─HashAgg_34 719.02 root group by:Column#78, funcs:sum(Column#75), sum(Column#76), firstrow(Column#77) - └─Projection_123 563136.02 root case(eq(Column#56, "INDIA"), Column#63, 0), Column#63, Column#62, Column#62 - └─Projection_35 563136.02 root extract("YEAR", Column#38), mul(Column#22, minus(1, Column#23)), Column#56 - └─HashLeftJoin_45 563136.02 root inner join, inner:TableReader_121, equal:[eq(Column#13, Column#55)] - ├─HashLeftJoin_56 563136.02 root inner join, inner:TableReader_119, equal:[eq(Column#19, Column#10)] - │ ├─HashLeftJoin_69 563136.02 root inner join, inner:TableReader_117, equal:[eq(Column#18, Column#1)] - │ │ ├─IndexHashJoin_83 90788402.51 root inner join, inner:IndexLookUp_74, outer key:Column#34, inner key:Column#17 - │ │ │ ├─HashRightJoin_87 22413367.93 root inner join, inner:HashRightJoin_89, equal:[eq(Column#43, Column#35)] - │ │ │ │ ├─HashRightJoin_89 1500000.00 root inner join, inner:HashRightJoin_102, equal:[eq(Column#51, Column#46)] - │ │ │ │ │ ├─HashRightJoin_102 5.00 root inner join, inner:TableReader_107, equal:[eq(Column#59, Column#53)] +└─Projection_31 719.02 root Column#62, div(Column#64, Column#65)->Column#66 + └─HashAgg_34 719.02 root group by:Column#78, funcs:sum(Column#75)->Column#64, funcs:sum(Column#76)->Column#65, funcs:firstrow(Column#77)->Column#62 + └─Projection_123 563136.02 root case(eq(tpch.nation.n_name, INDIA), Column#63, 0)->Column#75, Column#63, Column#62, Column#62 + └─Projection_35 563136.02 root extract(YEAR, tpch.orders.o_orderdate)->Column#62, mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#63, tpch.nation.n_name + └─HashLeftJoin_45 563136.02 root inner join, inner:TableReader_121, equal:[eq(tpch.supplier.s_nationkey, tpch.nation.n_nationkey)] + ├─HashLeftJoin_56 563136.02 root inner join, inner:TableReader_119, equal:[eq(tpch.lineitem.l_suppkey, tpch.supplier.s_suppkey)] + │ ├─HashLeftJoin_69 563136.02 root inner join, inner:TableReader_117, equal:[eq(tpch.lineitem.l_partkey, tpch.part.p_partkey)] + │ │ ├─IndexHashJoin_83 90788402.51 root inner join, inner:IndexLookUp_74, outer key:tpch.orders.o_orderkey, inner key:tpch.lineitem.l_orderkey + │ │ │ ├─HashRightJoin_87 22413367.93 root inner join, inner:HashRightJoin_89, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] + │ │ │ │ ├─HashRightJoin_89 1500000.00 root inner join, inner:HashRightJoin_102, equal:[eq(tpch.nation.n_nationkey, tpch.customer.c_nationkey)] + │ │ │ │ │ ├─HashRightJoin_102 5.00 root inner join, inner:TableReader_107, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)] │ │ │ │ │ │ ├─TableReader_107 1.00 root data:Selection_106 - │ │ │ │ │ │ │ └─Selection_106 1.00 cop[tikv] eq(Column#60, "ASIA") + │ │ │ │ │ │ │ └─Selection_106 1.00 cop[tikv] eq(tpch.region.r_name, "ASIA") │ │ │ │ │ │ │ └─TableScan_105 5.00 cop[tikv] table:region, range:[-inf,+inf], keep order:false │ │ │ │ │ │ └─TableReader_104 25.00 root data:TableScan_103 │ │ │ │ │ │ └─TableScan_103 25.00 cop[tikv] table:n1, range:[-inf,+inf], keep order:false │ │ │ │ │ └─TableReader_109 7500000.00 root data:TableScan_108 │ │ │ │ │ └─TableScan_108 7500000.00 cop[tikv] table:customer, range:[-inf,+inf], keep order:false │ │ │ │ └─TableReader_112 22413367.93 root data:Selection_111 - │ │ │ │ └─Selection_111 22413367.93 cop[tikv] ge(Column#38, 1995-01-01 00:00:00.000000), le(Column#38, 1996-12-31 00:00:00.000000) + │ │ │ │ └─Selection_111 22413367.93 cop[tikv] ge(tpch.orders.o_orderdate, 1995-01-01 00:00:00.000000), le(tpch.orders.o_orderdate, 1996-12-31 00:00:00.000000) │ │ │ │ └─TableScan_110 75000000.00 cop[tikv] table:orders, range:[-inf,+inf], keep order:false │ │ │ └─IndexLookUp_74 4.05 root - │ │ │ ├─IndexScan_72 4.05 cop[tikv] table:lineitem, index:L_ORDERKEY, L_LINENUMBER, range: decided by [eq(Column#17, Column#34)], keep order:false + │ │ │ ├─IndexScan_72 4.05 cop[tikv] table:lineitem, index:L_ORDERKEY, L_LINENUMBER, range: decided by [eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)], keep order:false │ │ │ └─TableScan_73 4.05 cop[tikv] table:lineitem, keep order:false │ │ └─TableReader_117 61674.00 root data:Selection_116 - │ │ └─Selection_116 61674.00 cop[tikv] eq(Column#5, "SMALL PLATED COPPER") + │ │ └─Selection_116 61674.00 cop[tikv] eq(tpch.part.p_type, "SMALL PLATED COPPER") │ │ └─TableScan_115 10000000.00 cop[tikv] table:part, range:[-inf,+inf], keep order:false │ └─TableReader_119 500000.00 root data:TableScan_118 │ └─TableScan_118 500000.00 cop[tikv] table:supplier, range:[-inf,+inf], keep order:false @@ -592,15 +592,15 @@ order by nation, o_year desc; id count task operator info -Sort_25 2406.00 root Column#50:asc, Column#53:desc -└─Projection_27 2406.00 root Column#50, Column#53, Column#55 - └─HashAgg_30 2406.00 root group by:Column#50, Column#53, funcs:sum(Column#54), firstrow(Column#50), firstrow(Column#53) - └─Projection_31 971049283.51 root Column#50, extract("YEAR", Column#44), minus(mul(Column#22, minus(1, Column#23)), mul(Column#37, Column#21)) - └─HashLeftJoin_44 971049283.51 root inner join, inner:TableReader_106, equal:[eq(Column#19, Column#35) eq(Column#18, Column#34)] - ├─HashLeftJoin_56 241379546.70 root inner join, inner:TableReader_104, equal:[eq(Column#17, Column#40)] - │ ├─HashLeftJoin_79 241379546.70 root inner join, inner:TableReader_102, equal:[eq(Column#18, Column#1)] - │ │ ├─HashRightJoin_82 300005811.00 root inner join, inner:HashRightJoin_93, equal:[eq(Column#10, Column#19)] - │ │ │ ├─HashRightJoin_93 500000.00 root inner join, inner:TableReader_97, equal:[eq(Column#49, Column#13)] +Sort_25 2406.00 root tpch.nation.n_name:asc, Column#53:desc +└─Projection_27 2406.00 root tpch.nation.n_name, Column#53, Column#55 + └─HashAgg_30 2406.00 root group by:Column#53, tpch.nation.n_name, funcs:sum(Column#54)->Column#55, funcs:firstrow(tpch.nation.n_name)->tpch.nation.n_name, funcs:firstrow(Column#53)->Column#53 + └─Projection_31 971049283.51 root tpch.nation.n_name, extract(YEAR, tpch.orders.o_orderdate)->Column#53, minus(mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount)), mul(tpch.partsupp.ps_supplycost, tpch.lineitem.l_quantity))->Column#54 + └─HashLeftJoin_44 971049283.51 root inner join, inner:TableReader_106, equal:[eq(tpch.lineitem.l_suppkey, tpch.partsupp.ps_suppkey) eq(tpch.lineitem.l_partkey, tpch.partsupp.ps_partkey)] + ├─HashLeftJoin_56 241379546.70 root inner join, inner:TableReader_104, equal:[eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)] + │ ├─HashLeftJoin_79 241379546.70 root inner join, inner:TableReader_102, equal:[eq(tpch.lineitem.l_partkey, tpch.part.p_partkey)] + │ │ ├─HashRightJoin_82 300005811.00 root inner join, inner:HashRightJoin_93, equal:[eq(tpch.supplier.s_suppkey, tpch.lineitem.l_suppkey)] + │ │ │ ├─HashRightJoin_93 500000.00 root inner join, inner:TableReader_97, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] │ │ │ │ ├─TableReader_97 25.00 root data:TableScan_96 │ │ │ │ │ └─TableScan_96 25.00 cop[tikv] table:nation, range:[-inf,+inf], keep order:false │ │ │ │ └─TableReader_95 500000.00 root data:TableScan_94 @@ -608,7 +608,7 @@ Sort_25 2406.00 root Column#50:asc, Column#53:desc │ │ │ └─TableReader_99 300005811.00 root data:TableScan_98 │ │ │ └─TableScan_98 300005811.00 cop[tikv] table:lineitem, range:[-inf,+inf], keep order:false │ │ └─TableReader_102 8000000.00 root data:Selection_101 - │ │ └─Selection_101 8000000.00 cop[tikv] like(Column#2, "%dim%", 92) + │ │ └─Selection_101 8000000.00 cop[tikv] like(tpch.part.p_name, "%dim%", 92) │ │ └─TableScan_100 10000000.00 cop[tikv] table:part, range:[-inf,+inf], keep order:false │ └─TableReader_104 75000000.00 root data:TableScan_103 │ └─TableScan_103 75000000.00 cop[tikv] table:orders, range:[-inf,+inf], keep order:false @@ -658,24 +658,24 @@ order by revenue desc limit 20; id count task operator info -Projection_17 20.00 root Column#1, Column#2, Column#39, Column#6, Column#36, Column#3, Column#5, Column#8 +Projection_17 20.00 root tpch.customer.c_custkey, tpch.customer.c_name, Column#39, tpch.customer.c_acctbal, tpch.nation.n_name, tpch.customer.c_address, tpch.customer.c_phone, tpch.customer.c_comment └─TopN_20 20.00 root Column#39:desc, offset:0, count:20 - └─HashAgg_26 3017307.69 root group by:Column#53, Column#54, Column#55, Column#56, Column#57, Column#58, Column#59, funcs:sum(Column#45), firstrow(Column#46), firstrow(Column#47), firstrow(Column#48), firstrow(Column#49), firstrow(Column#50), firstrow(Column#51), firstrow(Column#52) - └─Projection_67 12222016.17 root mul(Column#23, minus(1, Column#24)), Column#1, Column#2, Column#3, Column#5, Column#6, Column#8, Column#36, Column#1, Column#2, Column#6, Column#5, Column#36, Column#3, Column#8 - └─IndexMergeJoin_39 12222016.17 root inner join, inner:Projection_37, outer key:Column#9, inner key:Column#18 - ├─HashLeftJoin_44 3017307.69 root inner join, inner:TableReader_63, equal:[eq(Column#1, Column#10)] - │ ├─HashRightJoin_56 7500000.00 root inner join, inner:TableReader_60, equal:[eq(Column#35, Column#4)] + └─HashAgg_26 3017307.69 root group by:Column#53, Column#54, Column#55, Column#56, Column#57, Column#58, Column#59, funcs:sum(Column#45)->Column#39, funcs:firstrow(Column#46)->tpch.customer.c_custkey, funcs:firstrow(Column#47)->tpch.customer.c_name, funcs:firstrow(Column#48)->tpch.customer.c_address, funcs:firstrow(Column#49)->tpch.customer.c_phone, funcs:firstrow(Column#50)->tpch.customer.c_acctbal, funcs:firstrow(Column#51)->tpch.customer.c_comment, funcs:firstrow(Column#52)->tpch.nation.n_name + └─Projection_67 12222016.17 root mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#45, tpch.customer.c_custkey, tpch.customer.c_name, tpch.customer.c_address, tpch.customer.c_phone, tpch.customer.c_acctbal, tpch.customer.c_comment, tpch.nation.n_name, tpch.customer.c_custkey, tpch.customer.c_name, tpch.customer.c_acctbal, tpch.customer.c_phone, tpch.nation.n_name, tpch.customer.c_address, tpch.customer.c_comment + └─IndexMergeJoin_39 12222016.17 root inner join, inner:Projection_37, outer key:tpch.orders.o_orderkey, inner key:tpch.lineitem.l_orderkey + ├─HashLeftJoin_44 3017307.69 root inner join, inner:TableReader_63, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] + │ ├─HashRightJoin_56 7500000.00 root inner join, inner:TableReader_60, equal:[eq(tpch.nation.n_nationkey, tpch.customer.c_nationkey)] │ │ ├─TableReader_60 25.00 root data:TableScan_59 │ │ │ └─TableScan_59 25.00 cop[tikv] table:nation, range:[-inf,+inf], keep order:false │ │ └─TableReader_58 7500000.00 root data:TableScan_57 │ │ └─TableScan_57 7500000.00 cop[tikv] table:customer, range:[-inf,+inf], keep order:false │ └─TableReader_63 3017307.69 root data:Selection_62 - │ └─Selection_62 3017307.69 cop[tikv] ge(Column#13, 1993-08-01 00:00:00.000000), lt(Column#13, 1993-11-01) + │ └─Selection_62 3017307.69 cop[tikv] ge(tpch.orders.o_orderdate, 1993-08-01 00:00:00.000000), lt(tpch.orders.o_orderdate, 1993-11-01) │ └─TableScan_61 75000000.00 cop[tikv] table:orders, range:[-inf,+inf], keep order:false - └─Projection_37 1.00 root Column#18, Column#23, Column#24, Column#26 + └─Projection_37 1.00 root tpch.lineitem.l_orderkey, tpch.lineitem.l_extendedprice, tpch.lineitem.l_discount, tpch.lineitem.l_returnflag └─IndexLookUp_36 1.00 root - ├─IndexScan_33 4.05 cop[tikv] table:lineitem, index:L_ORDERKEY, L_LINENUMBER, range: decided by [eq(Column#18, Column#9)], keep order:true - └─Selection_35 1.00 cop[tikv] eq(Column#26, "R") + ├─IndexScan_33 4.05 cop[tikv] table:lineitem, index:L_ORDERKEY, L_LINENUMBER, range: decided by [eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)], keep order:true + └─Selection_35 1.00 cop[tikv] eq(tpch.lineitem.l_returnflag, "R") └─TableScan_34 4.05 cop[tikv] table:lineitem, keep order:false /* Q11 Important Stock Identification Query @@ -713,15 +713,15 @@ and n_name = 'MOZAMBIQUE' order by value desc; id count task operator info -Projection_57 1304801.67 root Column#1, Column#18 +Projection_57 1304801.67 root tpch.partsupp.ps_partkey, Column#18 └─Sort_58 1304801.67 root Column#18:desc └─Selection_60 1304801.67 root gt(Column#18, NULL) - └─HashAgg_63 1631002.09 root group by:Column#44, funcs:sum(Column#42), firstrow(Column#43) - └─Projection_89 1631002.09 root mul(Column#4, cast(Column#3)), Column#1, Column#1 - └─HashRightJoin_67 1631002.09 root inner join, inner:HashRightJoin_80, equal:[eq(Column#7, Column#2)] - ├─HashRightJoin_80 20000.00 root inner join, inner:TableReader_85, equal:[eq(Column#14, Column#10)] + └─HashAgg_63 1631002.09 root group by:Column#44, funcs:sum(Column#42)->Column#18, funcs:firstrow(Column#43)->tpch.partsupp.ps_partkey + └─Projection_89 1631002.09 root mul(tpch.partsupp.ps_supplycost, cast(tpch.partsupp.ps_availqty))->Column#42, tpch.partsupp.ps_partkey, tpch.partsupp.ps_partkey + └─HashRightJoin_67 1631002.09 root inner join, inner:HashRightJoin_80, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)] + ├─HashRightJoin_80 20000.00 root inner join, inner:TableReader_85, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] │ ├─TableReader_85 1.00 root data:Selection_84 - │ │ └─Selection_84 1.00 cop[tikv] eq(Column#15, "MOZAMBIQUE") + │ │ └─Selection_84 1.00 cop[tikv] eq(tpch.nation.n_name, "MOZAMBIQUE") │ │ └─TableScan_83 25.00 cop[tikv] table:nation, range:[-inf,+inf], keep order:false │ └─TableReader_82 500000.00 root data:TableScan_81 │ └─TableScan_81 500000.00 cop[tikv] table:supplier, range:[-inf,+inf], keep order:false @@ -767,16 +767,16 @@ l_shipmode order by l_shipmode; id count task operator info -Sort_9 1.00 root Column#24:asc -└─Projection_11 1.00 root Column#24, Column#27, Column#28 - └─HashAgg_14 1.00 root group by:Column#35, funcs:sum(Column#32), sum(Column#33), firstrow(Column#34) - └─Projection_40 10023369.01 root cast(case(or(eq(Column#6, "1-URGENT"), eq(Column#6, "2-HIGH")), 1, 0)), cast(case(and(ne(Column#6, "1-URGENT"), ne(Column#6, "2-HIGH")), 1, 0)), Column#24, Column#24 - └─IndexMergeJoin_22 10023369.01 root inner join, inner:TableReader_20, outer key:Column#10, inner key:Column#1 +Sort_9 1.00 root tpch.lineitem.l_shipmode:asc +└─Projection_11 1.00 root tpch.lineitem.l_shipmode, Column#27, Column#28 + └─HashAgg_14 1.00 root group by:Column#35, funcs:sum(Column#32)->Column#27, funcs:sum(Column#33)->Column#28, funcs:firstrow(Column#34)->tpch.lineitem.l_shipmode + └─Projection_40 10023369.01 root cast(case(or(eq(tpch.orders.o_orderpriority, 1-URGENT), eq(tpch.orders.o_orderpriority, 2-HIGH)), 1, 0))->Column#32, cast(case(and(ne(tpch.orders.o_orderpriority, 1-URGENT), ne(tpch.orders.o_orderpriority, 2-HIGH)), 1, 0))->Column#33, tpch.lineitem.l_shipmode, tpch.lineitem.l_shipmode + └─IndexMergeJoin_22 10023369.01 root inner join, inner:TableReader_20, outer key:tpch.lineitem.l_orderkey, inner key:tpch.orders.o_orderkey ├─TableReader_36 10023369.01 root data:Selection_35 - │ └─Selection_35 10023369.01 cop[tikv] ge(Column#22, 1997-01-01 00:00:00.000000), in(Column#24, "RAIL", "FOB"), lt(Column#20, Column#21), lt(Column#21, Column#22), lt(Column#22, 1998-01-01) + │ └─Selection_35 10023369.01 cop[tikv] ge(tpch.lineitem.l_receiptdate, 1997-01-01 00:00:00.000000), in(tpch.lineitem.l_shipmode, "RAIL", "FOB"), lt(tpch.lineitem.l_commitdate, tpch.lineitem.l_receiptdate), lt(tpch.lineitem.l_receiptdate, 1998-01-01), lt(tpch.lineitem.l_shipdate, tpch.lineitem.l_commitdate) │ └─TableScan_34 300005811.00 cop[tikv] table:lineitem, range:[-inf,+inf], keep order:false └─TableReader_20 1.00 root data:TableScan_19 - └─TableScan_19 1.00 cop[tikv] table:orders, range: decided by [Column#10], keep order:true + └─TableScan_19 1.00 cop[tikv] table:orders, range: decided by [tpch.lineitem.l_orderkey], keep order:true /* Q13 Customer Distribution Query This query seeks relationships between customers and the size of their orders. @@ -809,13 +809,13 @@ c_count desc; id count task operator info Sort_9 7500000.00 root Column#19:desc, Column#18:desc └─Projection_11 7500000.00 root Column#18, Column#19 - └─HashAgg_14 7500000.00 root group by:Column#18, funcs:count(1), firstrow(Column#18) - └─HashAgg_17 7500000.00 root group by:Column#1, funcs:count(Column#9) - └─HashLeftJoin_21 60000000.00 root left outer join, inner:TableReader_23 (REVERSED), equal:[eq(Column#1, Column#10)] + └─HashAgg_14 7500000.00 root group by:Column#18, funcs:count(1)->Column#19, funcs:firstrow(Column#18)->Column#18 + └─HashAgg_17 7500000.00 root group by:tpch.customer.c_custkey, funcs:count(tpch.orders.o_orderkey)->Column#18 + └─HashLeftJoin_21 60000000.00 root left outer join, inner:TableReader_23 (REVERSED), equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] ├─TableReader_23 7500000.00 root data:TableScan_22 │ └─TableScan_22 7500000.00 cop[tikv] table:customer, range:[-inf,+inf], keep order:false └─TableReader_26 60000000.00 root data:Selection_25 - └─Selection_25 60000000.00 cop[tikv] not(like(Column#17, "%pending%deposits%", 92)) + └─Selection_25 60000000.00 cop[tikv] not(like(tpch.orders.o_comment, "%pending%deposits%", 92)) └─TableScan_24 75000000.00 cop[tikv] table:orders, range:[-inf,+inf], keep order:false /* Q14 Promotion Effect Query @@ -839,15 +839,15 @@ l_partkey = p_partkey and l_shipdate >= '1996-12-01' and l_shipdate < date_add('1996-12-01', interval '1' month); id count task operator info -Projection_8 1.00 root div(mul(100.00, Column#27), Column#28) -└─StreamAgg_13 1.00 root funcs:sum(Column#31), sum(Column#32) - └─Projection_41 4121984.49 root case(like(Column#22, "PROMO%", 92), mul(Column#6, minus(1, Column#7)), 0), mul(Column#6, minus(1, Column#7)) - └─IndexMergeJoin_36 4121984.49 root inner join, inner:TableReader_34, outer key:Column#2, inner key:Column#18 +Projection_8 1.00 root div(mul(100.00, Column#27), Column#28)->Column#29 +└─StreamAgg_13 1.00 root funcs:sum(Column#31)->Column#27, funcs:sum(Column#32)->Column#28 + └─Projection_41 4121984.49 root case(like(tpch.part.p_type, PROMO%, 92), mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount)), 0)->Column#31, mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#32 + └─IndexMergeJoin_36 4121984.49 root inner join, inner:TableReader_34, outer key:tpch.lineitem.l_partkey, inner key:tpch.part.p_partkey ├─TableReader_27 4121984.49 root data:Selection_26 - │ └─Selection_26 4121984.49 cop[tikv] ge(Column#11, 1996-12-01 00:00:00.000000), lt(Column#11, 1997-01-01) + │ └─Selection_26 4121984.49 cop[tikv] ge(tpch.lineitem.l_shipdate, 1996-12-01 00:00:00.000000), lt(tpch.lineitem.l_shipdate, 1997-01-01) │ └─TableScan_25 300005811.00 cop[tikv] table:lineitem, range:[-inf,+inf], keep order:false └─TableReader_34 1.00 root data:TableScan_33 - └─TableScan_33 1.00 cop[tikv] table:part, range: decided by [Column#2], keep order:true + └─TableScan_33 1.00 cop[tikv] table:part, range: decided by [tpch.lineitem.l_partkey], keep order:true /* Q15 Top Supplier Query This query determines the top supplier so it can be rewarded, given more business, or identified for special recognition. @@ -928,18 +928,18 @@ p_brand, p_type, p_size; id count task operator info -Sort_13 3863988.24 root Column#23:desc, Column#10:asc, Column#11:asc, Column#12:asc -└─Projection_15 3863988.24 root Column#10, Column#11, Column#12, Column#23 - └─HashAgg_18 3863988.24 root group by:Column#10, Column#11, Column#12, funcs:count(distinct Column#2), firstrow(Column#10), firstrow(Column#11), firstrow(Column#12) - └─HashLeftJoin_30 3863988.24 root anti semi join, inner:TableReader_57, equal:[eq(Column#2, Column#16)] - ├─IndexMergeJoin_38 4829985.30 root inner join, inner:IndexReader_36, outer key:Column#7, inner key:Column#1 +Sort_13 3863988.24 root Column#23:desc, tpch.part.p_brand:asc, tpch.part.p_type:asc, tpch.part.p_size:asc +└─Projection_15 3863988.24 root tpch.part.p_brand, tpch.part.p_type, tpch.part.p_size, Column#23 + └─HashAgg_18 3863988.24 root group by:tpch.part.p_brand, tpch.part.p_size, tpch.part.p_type, funcs:count(distinct tpch.partsupp.ps_suppkey)->Column#23, funcs:firstrow(tpch.part.p_brand)->tpch.part.p_brand, funcs:firstrow(tpch.part.p_type)->tpch.part.p_type, funcs:firstrow(tpch.part.p_size)->tpch.part.p_size + └─HashLeftJoin_30 3863988.24 root anti semi join, inner:TableReader_57, equal:[eq(tpch.partsupp.ps_suppkey, tpch.supplier.s_suppkey)] + ├─IndexMergeJoin_38 4829985.30 root inner join, inner:IndexReader_36, outer key:tpch.part.p_partkey, inner key:tpch.partsupp.ps_partkey │ ├─TableReader_50 1200618.43 root data:Selection_49 - │ │ └─Selection_49 1200618.43 cop[tikv] in(Column#12, 48, 19, 12, 4, 41, 7, 21, 39), ne(Column#10, "Brand#34"), not(like(Column#11, "LARGE BRUSHED%", 92)) + │ │ └─Selection_49 1200618.43 cop[tikv] in(tpch.part.p_size, 48, 19, 12, 4, 41, 7, 21, 39), ne(tpch.part.p_brand, "Brand#34"), not(like(tpch.part.p_type, "LARGE BRUSHED%", 92)) │ │ └─TableScan_48 10000000.00 cop[tikv] table:part, range:[-inf,+inf], keep order:false │ └─IndexReader_36 4.02 root index:IndexScan_35 - │ └─IndexScan_35 4.02 cop[tikv] table:partsupp, index:PS_PARTKEY, PS_SUPPKEY, range: decided by [eq(Column#1, Column#7)], keep order:true + │ └─IndexScan_35 4.02 cop[tikv] table:partsupp, index:PS_PARTKEY, PS_SUPPKEY, range: decided by [eq(tpch.partsupp.ps_partkey, tpch.part.p_partkey)], keep order:true └─TableReader_57 400000.00 root data:Selection_56 - └─Selection_56 400000.00 cop[tikv] like(Column#22, "%Customer%Complaints%", 92) + └─Selection_56 400000.00 cop[tikv] like(tpch.supplier.s_comment, "%Customer%Complaints%", 92) └─TableScan_55 500000.00 cop[tikv] table:supplier, range:[-inf,+inf], keep order:false /* Q17 Small-Quantity-Order Revenue Query @@ -970,19 +970,19 @@ where l_partkey = p_partkey ); id count task operator info -Projection_16 1.00 root div(Column#46, 7.0) -└─StreamAgg_21 1.00 root funcs:sum(Column#6) - └─Projection_51 293773.83 root Column#2, Column#5, Column#6, Column#18, Column#21, Column#24, mul(0.2, Column#44) - └─HashRightJoin_53 293773.83 root inner join, inner:HashRightJoin_37, equal:[eq(Column#18, Column#28)], other cond:lt(Column#5, mul(0.2, Column#44)) - ├─HashRightJoin_37 293773.83 root inner join, inner:TableReader_42, equal:[eq(Column#18, Column#2)] +Projection_16 1.00 root div(Column#46, 7.0)->Column#47 +└─StreamAgg_21 1.00 root funcs:sum(tpch.lineitem.l_extendedprice)->Column#46 + └─Projection_51 293773.83 root tpch.lineitem.l_partkey, tpch.lineitem.l_quantity, tpch.lineitem.l_extendedprice, tpch.part.p_partkey, tpch.part.p_brand, tpch.part.p_container, mul(0.2, Column#44)->Column#45 + └─HashRightJoin_53 293773.83 root inner join, inner:HashRightJoin_37, equal:[eq(tpch.part.p_partkey, tpch.lineitem.l_partkey)], other cond:lt(tpch.lineitem.l_quantity, mul(0.2, Column#44)) + ├─HashRightJoin_37 293773.83 root inner join, inner:TableReader_42, equal:[eq(tpch.part.p_partkey, tpch.lineitem.l_partkey)] │ ├─TableReader_42 9736.49 root data:Selection_41 - │ │ └─Selection_41 9736.49 cop[tikv] eq(Column#21, "Brand#44"), eq(Column#24, "WRAP PKG") + │ │ └─Selection_41 9736.49 cop[tikv] eq(tpch.part.p_brand, "Brand#44"), eq(tpch.part.p_container, "WRAP PKG") │ │ └─TableScan_40 10000000.00 cop[tikv] table:part, range:[-inf,+inf], keep order:false │ └─TableReader_39 300005811.00 root data:TableScan_38 │ └─TableScan_38 300005811.00 cop[tikv] table:lineitem, range:[-inf,+inf], keep order:false - └─HashAgg_47 9943040.00 root group by:Column#28, funcs:avg(Column#50, Column#51), firstrow(Column#28) + └─HashAgg_47 9943040.00 root group by:tpch.lineitem.l_partkey, funcs:avg(Column#50, Column#51)->Column#44, funcs:firstrow(tpch.lineitem.l_partkey)->tpch.lineitem.l_partkey └─TableReader_48 9943040.00 root data:HashAgg_43 - └─HashAgg_43 9943040.00 cop[tikv] group by:Column#28, funcs:count(Column#31), sum(Column#31) + └─HashAgg_43 9943040.00 cop[tikv] group by:tpch.lineitem.l_partkey, funcs:count(tpch.lineitem.l_quantity)->Column#50, funcs:sum(tpch.lineitem.l_quantity)->Column#51 └─TableScan_46 300005811.00 cop[tikv] table:lineitem, range:[-inf,+inf], keep order:false /* Q18 Large Volume Customer Query @@ -1027,20 +1027,20 @@ o_totalprice desc, o_orderdate limit 100; id count task operator info -Projection_24 100.00 root Column#2, Column#1, Column#9, Column#13, Column#12, Column#54 -└─TopN_27 100.00 root Column#12:desc, Column#13:asc, offset:0, count:100 - └─HashAgg_33 59251097.60 root group by:Column#1, Column#12, Column#13, Column#2, Column#9, funcs:sum(Column#22), firstrow(Column#1), firstrow(Column#2), firstrow(Column#9), firstrow(Column#12), firstrow(Column#13) - └─HashRightJoin_48 240004648.80 root inner join, inner:HashLeftJoin_49, equal:[eq(Column#9, Column#18)] - ├─HashLeftJoin_49 59251097.60 root inner join, inner:Selection_66, equal:[eq(Column#9, Column#35)] - │ ├─HashRightJoin_61 75000000.00 root inner join, inner:TableReader_65, equal:[eq(Column#1, Column#10)] +Projection_24 100.00 root tpch.customer.c_name, tpch.customer.c_custkey, tpch.orders.o_orderkey, tpch.orders.o_orderdate, tpch.orders.o_totalprice, Column#54 +└─TopN_27 100.00 root tpch.orders.o_totalprice:desc, tpch.orders.o_orderdate:asc, offset:0, count:100 + └─HashAgg_33 59251097.60 root group by:tpch.customer.c_custkey, tpch.customer.c_name, tpch.orders.o_orderdate, tpch.orders.o_orderkey, tpch.orders.o_totalprice, funcs:sum(tpch.lineitem.l_quantity)->Column#54, funcs:firstrow(tpch.customer.c_custkey)->tpch.customer.c_custkey, funcs:firstrow(tpch.customer.c_name)->tpch.customer.c_name, funcs:firstrow(tpch.orders.o_orderkey)->tpch.orders.o_orderkey, funcs:firstrow(tpch.orders.o_totalprice)->tpch.orders.o_totalprice, funcs:firstrow(tpch.orders.o_orderdate)->tpch.orders.o_orderdate + └─HashRightJoin_48 240004648.80 root inner join, inner:HashLeftJoin_49, equal:[eq(tpch.orders.o_orderkey, tpch.lineitem.l_orderkey)] + ├─HashLeftJoin_49 59251097.60 root inner join, inner:Selection_66, equal:[eq(tpch.orders.o_orderkey, tpch.lineitem.l_orderkey)] + │ ├─HashRightJoin_61 75000000.00 root inner join, inner:TableReader_65, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] │ │ ├─TableReader_65 7500000.00 root data:TableScan_64 │ │ │ └─TableScan_64 7500000.00 cop[tikv] table:customer, range:[-inf,+inf], keep order:false │ │ └─TableReader_63 75000000.00 root data:TableScan_62 │ │ └─TableScan_62 75000000.00 cop[tikv] table:orders, range:[-inf,+inf], keep order:false │ └─Selection_66 59251097.60 root gt(Column#52, 314) - │ └─HashAgg_73 74063872.00 root group by:Column#35, funcs:sum(Column#60), firstrow(Column#35) + │ └─HashAgg_73 74063872.00 root group by:tpch.lineitem.l_orderkey, funcs:sum(Column#60)->Column#52, funcs:firstrow(tpch.lineitem.l_orderkey)->tpch.lineitem.l_orderkey │ └─TableReader_74 74063872.00 root data:HashAgg_67 - │ └─HashAgg_67 74063872.00 cop[tikv] group by:Column#35, funcs:sum(Column#39) + │ └─HashAgg_67 74063872.00 cop[tikv] group by:tpch.lineitem.l_orderkey, funcs:sum(tpch.lineitem.l_quantity)->Column#60 │ └─TableScan_72 300005811.00 cop[tikv] table:lineitem, range:[-inf,+inf], keep order:false └─TableReader_82 300005811.00 root data:TableScan_81 └─TableScan_81 300005811.00 cop[tikv] table:lineitem, range:[-inf,+inf], keep order:false @@ -1090,15 +1090,15 @@ and l_shipmode in ('AIR', 'AIR REG') and l_shipinstruct = 'DELIVER IN PERSON' ); id count task operator info -StreamAgg_13 1.00 root funcs:sum(Column#28) -└─Projection_46 6286493.79 root mul(Column#6, minus(1, Column#7)) - └─IndexMergeJoin_41 6286493.79 root inner join, inner:TableReader_39, outer key:Column#2, inner key:Column#18, other cond:or(and(and(eq(Column#21, "Brand#52"), in(Column#24, "SM CASE", "SM BOX", "SM PACK", "SM PKG")), and(ge(Column#5, 4), and(le(Column#5, 14), le(Column#23, 5)))), or(and(and(eq(Column#21, "Brand#11"), in(Column#24, "MED BAG", "MED BOX", "MED PKG", "MED PACK")), and(ge(Column#5, 18), and(le(Column#5, 28), le(Column#23, 10)))), and(and(eq(Column#21, "Brand#51"), in(Column#24, "LG CASE", "LG BOX", "LG PACK", "LG PKG")), and(ge(Column#5, 29), and(le(Column#5, 39), le(Column#23, 15)))))) +StreamAgg_13 1.00 root funcs:sum(Column#28)->Column#27 +└─Projection_46 6286493.79 root mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#28 + └─IndexMergeJoin_41 6286493.79 root inner join, inner:TableReader_39, outer key:tpch.lineitem.l_partkey, inner key:tpch.part.p_partkey, other cond:or(and(and(eq(tpch.part.p_brand, "Brand#52"), in(tpch.part.p_container, "SM CASE", "SM BOX", "SM PACK", "SM PKG")), and(ge(tpch.lineitem.l_quantity, 4), and(le(tpch.lineitem.l_quantity, 14), le(tpch.part.p_size, 5)))), or(and(and(eq(tpch.part.p_brand, "Brand#11"), in(tpch.part.p_container, "MED BAG", "MED BOX", "MED PKG", "MED PACK")), and(ge(tpch.lineitem.l_quantity, 18), and(le(tpch.lineitem.l_quantity, 28), le(tpch.part.p_size, 10)))), and(and(eq(tpch.part.p_brand, "Brand#51"), in(tpch.part.p_container, "LG CASE", "LG BOX", "LG PACK", "LG PKG")), and(ge(tpch.lineitem.l_quantity, 29), and(le(tpch.lineitem.l_quantity, 39), le(tpch.part.p_size, 15)))))) ├─TableReader_29 6286493.79 root data:Selection_28 - │ └─Selection_28 6286493.79 cop[tikv] eq(Column#14, "DELIVER IN PERSON"), in(Column#15, "AIR", "AIR REG"), or(and(ge(Column#5, 4), le(Column#5, 14)), or(and(ge(Column#5, 18), le(Column#5, 28)), and(ge(Column#5, 29), le(Column#5, 39)))) + │ └─Selection_28 6286493.79 cop[tikv] eq(tpch.lineitem.l_shipinstruct, "DELIVER IN PERSON"), in(tpch.lineitem.l_shipmode, "AIR", "AIR REG"), or(and(ge(tpch.lineitem.l_quantity, 4), le(tpch.lineitem.l_quantity, 14)), or(and(ge(tpch.lineitem.l_quantity, 18), le(tpch.lineitem.l_quantity, 28)), and(ge(tpch.lineitem.l_quantity, 29), le(tpch.lineitem.l_quantity, 39)))) │ └─TableScan_27 300005811.00 cop[tikv] table:lineitem, range:[-inf,+inf], keep order:false └─TableReader_39 0.80 root data:Selection_38 - └─Selection_38 0.80 cop[tikv] ge(Column#23, 1), or(and(eq(Column#21, "Brand#52"), and(in(Column#24, "SM CASE", "SM BOX", "SM PACK", "SM PKG"), le(Column#23, 5))), or(and(eq(Column#21, "Brand#11"), and(in(Column#24, "MED BAG", "MED BOX", "MED PKG", "MED PACK"), le(Column#23, 10))), and(eq(Column#21, "Brand#51"), and(in(Column#24, "LG CASE", "LG BOX", "LG PACK", "LG PKG"), le(Column#23, 15))))) - └─TableScan_37 1.00 cop[tikv] table:part, range: decided by [Column#2], keep order:true + └─Selection_38 0.80 cop[tikv] ge(tpch.part.p_size, 1), or(and(eq(tpch.part.p_brand, "Brand#52"), and(in(tpch.part.p_container, "SM CASE", "SM BOX", "SM PACK", "SM PKG"), le(tpch.part.p_size, 5))), or(and(eq(tpch.part.p_brand, "Brand#11"), and(in(tpch.part.p_container, "MED BAG", "MED BOX", "MED PKG", "MED PACK"), le(tpch.part.p_size, 10))), and(eq(tpch.part.p_brand, "Brand#51"), and(in(tpch.part.p_container, "LG CASE", "LG BOX", "LG PACK", "LG PKG"), le(tpch.part.p_size, 15))))) + └─TableScan_37 1.00 cop[tikv] table:part, range: decided by [tpch.lineitem.l_partkey], keep order:true /* Q20 Potential Part Promotion Query The Potential Part Promotion Query identifies suppliers in a particular nation having selected parts that may be candidates @@ -1146,29 +1146,29 @@ and n_name = 'ALGERIA' order by s_name; id count task operator info -Sort_28 20000.00 root Column#2:asc -└─Projection_30 20000.00 root Column#2, Column#3 - └─HashRightJoin_32 20000.00 root inner join, inner:HashRightJoin_45, equal:[eq(Column#1, Column#13)] - ├─HashRightJoin_45 20000.00 root inner join, inner:TableReader_50, equal:[eq(Column#8, Column#4)] +Sort_28 20000.00 root tpch.supplier.s_name:asc +└─Projection_30 20000.00 root tpch.supplier.s_name, tpch.supplier.s_address + └─HashRightJoin_32 20000.00 root inner join, inner:HashRightJoin_45, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)] + ├─HashRightJoin_45 20000.00 root inner join, inner:TableReader_50, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] │ ├─TableReader_50 1.00 root data:Selection_49 - │ │ └─Selection_49 1.00 cop[tikv] eq(Column#9, "ALGERIA") + │ │ └─Selection_49 1.00 cop[tikv] eq(tpch.nation.n_name, "ALGERIA") │ │ └─TableScan_48 25.00 cop[tikv] table:nation, range:[-inf,+inf], keep order:false │ └─TableReader_47 500000.00 root data:TableScan_46 │ └─TableScan_46 500000.00 cop[tikv] table:supplier, range:[-inf,+inf], keep order:false - └─HashAgg_53 64006.34 root group by:Column#13, funcs:firstrow(Column#13) - └─Projection_54 64006.34 root Column#12, Column#13, Column#14, Column#18, mul(0.5, Column#44) - └─Selection_55 64006.34 root gt(cast(Column#14), mul(0.5, Column#44)) - └─HashAgg_58 80007.93 root group by:Column#12, Column#13, funcs:firstrow(Column#12), firstrow(Column#13), firstrow(Column#14), firstrow(Column#18), sum(Column#31) - └─HashLeftJoin_62 9711455.06 root left outer join, inner:IndexHashJoin_75 (REVERSED), equal:[eq(Column#12, Column#28) eq(Column#13, Column#29)] - ├─IndexHashJoin_75 321865.05 root inner join, inner:IndexLookUp_66, outer key:Column#18, inner key:Column#12 + └─HashAgg_53 64006.34 root group by:tpch.partsupp.ps_suppkey, funcs:firstrow(tpch.partsupp.ps_suppkey)->tpch.partsupp.ps_suppkey + └─Projection_54 64006.34 root tpch.partsupp.ps_partkey, tpch.partsupp.ps_suppkey, tpch.partsupp.ps_availqty, tpch.part.p_partkey, mul(0.5, Column#44)->Column#45 + └─Selection_55 64006.34 root gt(cast(tpch.partsupp.ps_availqty), mul(0.5, Column#44)) + └─HashAgg_58 80007.93 root group by:tpch.partsupp.ps_partkey, tpch.partsupp.ps_suppkey, funcs:firstrow(tpch.partsupp.ps_partkey)->tpch.partsupp.ps_partkey, funcs:firstrow(tpch.partsupp.ps_suppkey)->tpch.partsupp.ps_suppkey, funcs:firstrow(tpch.partsupp.ps_availqty)->tpch.partsupp.ps_availqty, funcs:firstrow(tpch.part.p_partkey)->tpch.part.p_partkey, funcs:sum(tpch.lineitem.l_quantity)->Column#44 + └─HashLeftJoin_62 9711455.06 root left outer join, inner:IndexHashJoin_75 (REVERSED), equal:[eq(tpch.partsupp.ps_partkey, tpch.lineitem.l_partkey) eq(tpch.partsupp.ps_suppkey, tpch.lineitem.l_suppkey)] + ├─IndexHashJoin_75 321865.05 root inner join, inner:IndexLookUp_66, outer key:tpch.part.p_partkey, inner key:tpch.partsupp.ps_partkey │ ├─TableReader_87 80007.93 root data:Selection_86 - │ │ └─Selection_86 80007.93 cop[tikv] like(Column#19, "green%", 92) + │ │ └─Selection_86 80007.93 cop[tikv] like(tpch.part.p_name, "green%", 92) │ │ └─TableScan_85 10000000.00 cop[tikv] table:part, range:[-inf,+inf], keep order:false │ └─IndexLookUp_66 4.02 root - │ ├─IndexScan_64 4.02 cop[tikv] table:partsupp, index:PS_PARTKEY, PS_SUPPKEY, range: decided by [eq(Column#12, Column#18)], keep order:false + │ ├─IndexScan_64 4.02 cop[tikv] table:partsupp, index:PS_PARTKEY, PS_SUPPKEY, range: decided by [eq(tpch.partsupp.ps_partkey, tpch.part.p_partkey)], keep order:false │ └─TableScan_65 4.02 cop[tikv] table:partsupp, keep order:false └─TableReader_92 44189356.65 root data:Selection_91 - └─Selection_91 44189356.65 cop[tikv] ge(Column#37, 1993-01-01 00:00:00.000000), lt(Column#37, 1994-01-01) + └─Selection_91 44189356.65 cop[tikv] ge(tpch.lineitem.l_shipdate, 1993-01-01 00:00:00.000000), lt(tpch.lineitem.l_shipdate, 1994-01-01) └─TableScan_90 300005811.00 cop[tikv] table:lineitem, range:[-inf,+inf], keep order:false /* Q21 Suppliers Who Kept Orders Waiting Query @@ -1219,31 +1219,31 @@ numwait desc, s_name limit 100; id count task operator info -Projection_25 1.00 root Column#2, Column#72 -└─TopN_28 1.00 root Column#72:desc, Column#2:asc, offset:0, count:100 - └─HashAgg_34 1.00 root group by:Column#2, funcs:count(1), firstrow(Column#2) - └─IndexHashJoin_49 7828961.66 root anti semi join, inner:IndexLookUp_39, outer key:Column#8, inner key:Column#55, other cond:ne(Column#57, Column#10) - ├─IndexHashJoin_88 9786202.08 root semi join, inner:IndexLookUp_79, outer key:Column#8, inner key:Column#38, other cond:ne(Column#40, Column#1), ne(Column#40, Column#10) - │ ├─IndexMergeJoin_99 12232752.60 root inner join, inner:TableReader_97, outer key:Column#8, inner key:Column#25 - │ │ ├─HashRightJoin_105 12232752.60 root inner join, inner:HashRightJoin_118, equal:[eq(Column#1, Column#10)] - │ │ │ ├─HashRightJoin_118 20000.00 root inner join, inner:TableReader_123, equal:[eq(Column#34, Column#4)] +Projection_25 1.00 root tpch.supplier.s_name, Column#72 +└─TopN_28 1.00 root Column#72:desc, tpch.supplier.s_name:asc, offset:0, count:100 + └─HashAgg_34 1.00 root group by:tpch.supplier.s_name, funcs:count(1)->Column#72, funcs:firstrow(tpch.supplier.s_name)->tpch.supplier.s_name + └─IndexHashJoin_49 7828961.66 root anti semi join, inner:IndexLookUp_39, outer key:tpch.lineitem.l_orderkey, inner key:tpch.lineitem.l_orderkey, other cond:ne(tpch.lineitem.l_suppkey, tpch.lineitem.l_suppkey) + ├─IndexHashJoin_88 9786202.08 root semi join, inner:IndexLookUp_79, outer key:tpch.lineitem.l_orderkey, inner key:tpch.lineitem.l_orderkey, other cond:ne(tpch.lineitem.l_suppkey, tpch.lineitem.l_suppkey), ne(tpch.lineitem.l_suppkey, tpch.supplier.s_suppkey) + │ ├─IndexMergeJoin_99 12232752.60 root inner join, inner:TableReader_97, outer key:tpch.lineitem.l_orderkey, inner key:tpch.orders.o_orderkey + │ │ ├─HashRightJoin_105 12232752.60 root inner join, inner:HashRightJoin_118, equal:[eq(tpch.supplier.s_suppkey, tpch.lineitem.l_suppkey)] + │ │ │ ├─HashRightJoin_118 20000.00 root inner join, inner:TableReader_123, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] │ │ │ │ ├─TableReader_123 1.00 root data:Selection_122 - │ │ │ │ │ └─Selection_122 1.00 cop[tikv] eq(Column#35, "EGYPT") + │ │ │ │ │ └─Selection_122 1.00 cop[tikv] eq(tpch.nation.n_name, "EGYPT") │ │ │ │ │ └─TableScan_121 25.00 cop[tikv] table:nation, range:[-inf,+inf], keep order:false │ │ │ │ └─TableReader_120 500000.00 root data:TableScan_119 │ │ │ │ └─TableScan_119 500000.00 cop[tikv] table:supplier, range:[-inf,+inf], keep order:false │ │ │ └─TableReader_126 240004648.80 root data:Selection_125 - │ │ │ └─Selection_125 240004648.80 cop[tikv] gt(Column#20, Column#19) + │ │ │ └─Selection_125 240004648.80 cop[tikv] gt(tpch.lineitem.l_receiptdate, tpch.lineitem.l_commitdate) │ │ │ └─TableScan_124 300005811.00 cop[tikv] table:l1, range:[-inf,+inf], keep order:false │ │ └─TableReader_97 0.80 root data:Selection_96 - │ │ └─Selection_96 0.80 cop[tikv] eq(Column#27, "F") - │ │ └─TableScan_95 1.00 cop[tikv] table:orders, range: decided by [Column#8], keep order:true + │ │ └─Selection_96 0.80 cop[tikv] eq(tpch.orders.o_orderstatus, "F") + │ │ └─TableScan_95 1.00 cop[tikv] table:orders, range: decided by [tpch.lineitem.l_orderkey], keep order:true │ └─IndexLookUp_79 4.05 root - │ ├─IndexScan_77 4.05 cop[tikv] table:l2, index:L_ORDERKEY, L_LINENUMBER, range: decided by [eq(Column#38, Column#8)], keep order:false + │ ├─IndexScan_77 4.05 cop[tikv] table:l2, index:L_ORDERKEY, L_LINENUMBER, range: decided by [eq(tpch.lineitem.l_orderkey, tpch.lineitem.l_orderkey)], keep order:false │ └─TableScan_78 4.05 cop[tikv] table:l2, keep order:false └─IndexLookUp_39 3.24 root - ├─IndexScan_36 4.05 cop[tikv] table:l3, index:L_ORDERKEY, L_LINENUMBER, range: decided by [eq(Column#55, Column#8)], keep order:false - └─Selection_38 3.24 cop[tikv] gt(Column#67, Column#66) + ├─IndexScan_36 4.05 cop[tikv] table:l3, index:L_ORDERKEY, L_LINENUMBER, range: decided by [eq(tpch.lineitem.l_orderkey, tpch.lineitem.l_orderkey)], keep order:false + └─Selection_38 3.24 cop[tikv] gt(tpch.lineitem.l_receiptdate, tpch.lineitem.l_commitdate) └─TableScan_37 4.05 cop[tikv] table:l3, keep order:false /* Q22 Global Sales Opportunity Query @@ -1294,12 +1294,12 @@ cntrycode; id count task operator info Sort_32 1.00 root Column#27:asc └─Projection_34 1.00 root Column#27, Column#28, Column#29 - └─HashAgg_37 1.00 root group by:Column#27, funcs:count(1), sum(Column#6), firstrow(Column#27) - └─Projection_38 0.00 root substring(Column#5, 1, 2), Column#6 - └─HashLeftJoin_39 0.00 root anti semi join, inner:TableReader_45, equal:[eq(Column#1, Column#19)] - ├─Selection_40 0.00 root in(substring(Column#5, 1, 2), "20", "40", "22", "30", "39", "42", "21") + └─HashAgg_37 1.00 root group by:Column#27, funcs:count(1)->Column#28, funcs:sum(tpch.customer.c_acctbal)->Column#29, funcs:firstrow(Column#27)->Column#27 + └─Projection_38 0.00 root substring(tpch.customer.c_phone, 1, 2)->Column#27, tpch.customer.c_acctbal + └─HashLeftJoin_39 0.00 root anti semi join, inner:TableReader_45, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] + ├─Selection_40 0.00 root in(substring(tpch.customer.c_phone, 1, 2), "20", "40", "22", "30", "39", "42", "21") │ └─TableReader_43 0.00 root data:Selection_42 - │ └─Selection_42 0.00 cop[tikv] gt(Column#6, NULL) + │ └─Selection_42 0.00 cop[tikv] gt(tpch.customer.c_acctbal, NULL) │ └─TableScan_41 7500000.00 cop[tikv] table:customer, range:[-inf,+inf], keep order:false └─TableReader_45 75000000.00 root data:TableScan_44 └─TableScan_44 75000000.00 cop[tikv] table:orders, range:[-inf,+inf], keep order:false diff --git a/cmd/explaintest/r/window_function.result b/cmd/explaintest/r/window_function.result index 5791735771ced..fb13a4a5c15a8 100644 --- a/cmd/explaintest/r/window_function.result +++ b/cmd/explaintest/r/window_function.result @@ -5,47 +5,47 @@ set @@tidb_enable_window_function = 1; explain select sum(a) over() from t; id count task operator info Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(Column#1)) over() +└─Window_8 10000.00 root sum(cast(test.t.a))->Column#6 over() └─IndexReader_12 10000.00 root index:IndexScan_11 └─IndexScan_11 10000.00 cop[tikv] table:t, index:a, range:[NULL,+inf], keep order:false, stats:pseudo explain select sum(a) over(partition by a) from t; id count task operator info Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(Column#1)) over(partition by Column#1) +└─Window_8 10000.00 root sum(cast(test.t.a))->Column#6 over(partition by test.t.a) └─IndexReader_10 10000.00 root index:IndexScan_9 └─IndexScan_9 10000.00 cop[tikv] table:t, index:a, range:[NULL,+inf], keep order:true, stats:pseudo explain select sum(a) over(partition by a order by b) from t; id count task operator info Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(Column#1)) over(partition by Column#1 order by Column#2 asc range between unbounded preceding and current row) - └─Sort_11 10000.00 root Column#1:asc, Column#2:asc +└─Window_8 10000.00 root sum(cast(test.t.a))->Column#6 over(partition by test.t.a order by test.t.b asc range between unbounded preceding and current row) + └─Sort_11 10000.00 root test.t.a:asc, test.t.b:asc └─TableReader_10 10000.00 root data:TableScan_9 └─TableScan_9 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select sum(a) over(partition by a order by b rows unbounded preceding) from t; id count task operator info Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(Column#1)) over(partition by Column#1 order by Column#2 asc rows between unbounded preceding and current row) - └─Sort_11 10000.00 root Column#1:asc, Column#2:asc +└─Window_8 10000.00 root sum(cast(test.t.a))->Column#6 over(partition by test.t.a order by test.t.b asc rows between unbounded preceding and current row) + └─Sort_11 10000.00 root test.t.a:asc, test.t.b:asc └─TableReader_10 10000.00 root data:TableScan_9 └─TableScan_9 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select sum(a) over(partition by a order by b rows between 1 preceding and 1 following) from t; id count task operator info Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(Column#1)) over(partition by Column#1 order by Column#2 asc rows between 1 preceding and 1 following) - └─Sort_11 10000.00 root Column#1:asc, Column#2:asc +└─Window_8 10000.00 root sum(cast(test.t.a))->Column#6 over(partition by test.t.a order by test.t.b asc rows between 1 preceding and 1 following) + └─Sort_11 10000.00 root test.t.a:asc, test.t.b:asc └─TableReader_10 10000.00 root data:TableScan_9 └─TableScan_9 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select sum(a) over(partition by a order by b range between 1 preceding and 1 following) from t; id count task operator info Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(Column#1)) over(partition by Column#1 order by Column#2 asc range between 1 preceding and 1 following) - └─Sort_11 10000.00 root Column#1:asc, Column#2:asc +└─Window_8 10000.00 root sum(cast(test.t.a))->Column#6 over(partition by test.t.a order by test.t.b asc range between 1 preceding and 1 following) + └─Sort_11 10000.00 root test.t.a:asc, test.t.b:asc └─TableReader_10 10000.00 root data:TableScan_9 └─TableScan_9 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo explain select sum(a) over(partition by a order by c range between interval '2:30' minute_second preceding and interval '2:30' minute_second following) from t; id count task operator info Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(Column#1)) over(partition by Column#1 order by Column#3 asc range between interval "2:30" "MINUTE_SECOND" preceding and interval "2:30" "MINUTE_SECOND" following) - └─Sort_11 10000.00 root Column#1:asc, Column#3:asc +└─Window_8 10000.00 root sum(cast(test.t.a))->Column#6 over(partition by test.t.a order by test.t.c asc range between interval "2:30" "MINUTE_SECOND" preceding and interval "2:30" "MINUTE_SECOND" following) + └─Sort_11 10000.00 root test.t.a:asc, test.t.c:asc └─TableReader_10 10000.00 root data:TableScan_9 └─TableScan_9 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo diff --git a/executor/aggregate_test.go b/executor/aggregate_test.go index f6e495f15faa2..6962aec2c3c7a 100644 --- a/executor/aggregate_test.go +++ b/executor/aggregate_test.go @@ -19,10 +19,24 @@ import ( "github.com/pingcap/parser/terror" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/util/testutil" ) type testSuiteAgg struct { *baseTestSuite + testData testutil.TestData +} + +func (s *testSuiteAgg) SetUpSuite(c *C) { + s.baseTestSuite.SetUpSuite(c) + var err error + s.testData, err = testutil.LoadTestSuiteData("testdata", "agg_suite") + c.Assert(err, IsNil) +} + +func (s *testSuiteAgg) TearDownSuite(c *C) { + s.baseTestSuite.TearDownSuite(c) + c.Assert(s.testData.GenerateOutputIfNeeded(), IsNil) } func (s *testSuiteAgg) TestAggregation(c *C) { @@ -645,25 +659,17 @@ func (s *testSuiteAgg) TestInjectProjBelowTopN(c *C) { tk.MustExec("drop table if exists t;") tk.MustExec("create table t (i int);") tk.MustExec("insert into t values (1), (1), (1),(2),(3),(2),(3),(2),(3);") - tk.MustQuery("explain select * from t order by i + 1").Check(testkit.Rows( - "Projection_8 10000.00 root Column#1", - "└─Sort_4 10000.00 root Column#3:asc", - " └─Projection_9 10000.00 root Column#1, plus(Column#1, 1)", - " └─TableReader_7 10000.00 root data:TableScan_6", - " └─TableScan_6 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) - rs := tk.MustQuery("select * from t order by i + 1 ") - rs.Check(testkit.Rows( - "1", "1", "1", "2", "2", "2", "3", "3", "3")) - tk.MustQuery("explain select * from t order by i + 1 limit 2").Check(testkit.Rows( - "Projection_15 2.00 root Column#1", - "└─TopN_7 2.00 root Column#3:asc, offset:0, count:2", - " └─Projection_16 2.00 root Column#1, plus(Column#1, 1)", - " └─TableReader_12 2.00 root data:TopN_11", - " └─TopN_11 2.00 cop[tikv] plus(Column#1, 1):asc, offset:0, count:2", - " └─TableScan_10 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) - rs = tk.MustQuery("select * from t order by i + 1 limit 2") - rs.Check(testkit.Rows("1", "1")) - tk.MustQuery("select i, i, i from t order by i + 1").Check(testkit.Rows("1 1 1", "1 1 1", "1 1 1", "2 2 2", "2 2 2", "2 2 2", "3 3 3", "3 3 3", "3 3 3")) + var ( + input []string + output [][]string + ) + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i] = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + tk.MustQuery(tt).Check(testkit.Rows(output[i]...)) + } } func (s *testSuiteAgg) TestFirstRowEnum(c *C) { @@ -767,32 +773,15 @@ func (s *testSuiteAgg) TestIssue12759HashAggCalledByApply(c *C) { tk.MustExec("insert into test value(1);") tk.MustQuery("select /*+ hash_agg() */ sum(a), (select NULL from test where tt.a = test.a limit 1),(select NULL from test where tt.a = test.a limit 1),(select NULL from test where tt.a = test.a limit 1) from test tt;").Check(testkit.Rows("1 ")) - // make sure the plan is Apply -> Apply -> Apply -> HashAgg, and the count of Apply is equal to HashAggFinalConcurrency-1. - tk.MustQuery("explain select /*+ hash_agg() */ sum(a), (select NULL from test where tt.a = test.a limit 1),(select NULL from test where tt.a = test.a limit 1),(select NULL from test where tt.a = test.a limit 1) from test tt;").Check(testkit.Rows("" + - "Projection_28 1.00 root Column#3, Column#6, Column#9, Column#12]\n" + - "[└─Apply_30 1.00 root CARTESIAN left outer join, inner:Projection_65]\n" + - "[ ├─Apply_32 1.00 root CARTESIAN left outer join, inner:Projection_54]\n" + - "[ │ ├─Apply_34 1.00 root CARTESIAN left outer join, inner:Projection_43]\n" + - "[ │ │ ├─HashAgg_39 1.00 root funcs:sum(Column#22), firstrow(Column#23)]\n" + - "[ │ │ │ └─TableReader_40 1.00 root data:HashAgg_35]\n" + - "[ │ │ │ └─HashAgg_35 1.00 cop[tikv] funcs:sum(Column#1), firstrow(Column#1)]\n" + - "[ │ │ │ └─TableScan_38 10000.00 cop[tikv] table:tt, range:[-inf,+inf], keep order:false, stats:pseudo]\n" + - "[ │ │ └─Projection_43 1.00 root NULL]\n" + - "[ │ │ └─Limit_44 1.00 root offset:0, count:1]\n" + - "[ │ │ └─TableReader_50 1.00 root data:Limit_49]\n" + - "[ │ │ └─Limit_49 1.00 cop[tikv] offset:0, count:1]\n" + - "[ │ │ └─Selection_48 1.00 cop[tikv] eq(Column#1, Column#4)]\n" + - "[ │ │ └─TableScan_47 1000.00 cop[tikv] table:test, range:[-inf,+inf], keep order:false, stats:pseudo]\n" + - "[ │ └─Projection_54 1.00 root NULL]\n" + - "[ │ └─Limit_55 1.00 root offset:0, count:1]\n" + - "[ │ └─TableReader_61 1.00 root data:Limit_60]\n" + - "[ │ └─Limit_60 1.00 cop[tikv] offset:0, count:1]\n" + - "[ │ └─Selection_59 1.00 cop[tikv] eq(Column#1, Column#7)]\n" + - "[ │ └─TableScan_58 1000.00 cop[tikv] table:test, range:[-inf,+inf], keep order:false, stats:pseudo]\n" + - "[ └─Projection_65 1.00 root NULL]\n" + - "[ └─Limit_66 1.00 root offset:0, count:1]\n" + - "[ └─TableReader_72 1.00 root data:Limit_71]\n" + - "[ └─Limit_71 1.00 cop[tikv] offset:0, count:1]\n" + - "[ └─Selection_70 1.00 cop[tikv] eq(Column#1, Column#10)]\n" + - "[ └─TableScan_69 1000.00 cop[tikv] table:test, range:[-inf,+inf], keep order:false, stats:pseudo")) + var ( + input []string + output [][]string + ) + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i] = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + tk.MustQuery(tt).Check(testkit.Rows(output[i]...)) + } } diff --git a/executor/executor_test.go b/executor/executor_test.go index ae0e2283ca9cd..7fc12e6c08b7b 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -105,7 +105,7 @@ var _ = Suite(&testSuite5{&baseTestSuite{}}) var _ = Suite(&testSuiteJoin1{&baseTestSuite{}}) var _ = Suite(&testSuiteJoin2{&baseTestSuite{}}) var _ = Suite(&testSuiteJoin3{&baseTestSuite{}}) -var _ = Suite(&testSuiteAgg{&baseTestSuite{}}) +var _ = Suite(&testSuiteAgg{baseTestSuite: &baseTestSuite{}}) var _ = Suite(&testSuite6{&baseTestSuite{}}) var _ = Suite(&testSuite7{&baseTestSuite{}}) var _ = Suite(&testSuite8{&baseTestSuite{}}) diff --git a/executor/join_test.go b/executor/join_test.go index 35b2442b73fb0..ff566a1b23907 100644 --- a/executor/join_test.go +++ b/executor/join_test.go @@ -1136,41 +1136,41 @@ func (s *testSuiteJoin1) TestIndexLookupJoin(c *C) { tk.MustExec("analyze table s;") tk.MustQuery("desc select /*+ TIDB_INLJ(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows( - "HashAgg_9 1.00 root funcs:count(1)", - "└─IndexJoin_16 64.00 root inner join, inner:IndexReader_15, outer key:Column#1, inner key:Column#3, other cond:lt(Column#4, Column#2)", + "HashAgg_9 1.00 root funcs:count(1)->Column#6", + "└─IndexJoin_16 64.00 root inner join, inner:IndexReader_15, outer key:test.t.a, inner key:test.s.a, other cond:lt(test.s.b, test.t.b)", " ├─TableReader_26 64.00 root data:Selection_25", - " │ └─Selection_25 64.00 cop[tikv] not(isnull(Column#2))", + " │ └─Selection_25 64.00 cop[tikv] not(isnull(test.t.b))", " │ └─TableScan_24 64.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", " └─IndexReader_15 1.00 root index:Selection_14", - " └─Selection_14 1.00 cop[tikv] not(isnull(Column#3)), not(isnull(Column#4))", - " └─IndexScan_13 1.00 cop[tikv] table:s, index:a, b, range: decided by [eq(Column#3, Column#1) lt(Column#4, Column#2)], keep order:false")) + " └─Selection_14 1.00 cop[tikv] not(isnull(test.s.a)), not(isnull(test.s.b))", + " └─IndexScan_13 1.00 cop[tikv] table:s, index:a, b, range: decided by [eq(test.s.a, test.t.a) lt(test.s.b, test.t.b)], keep order:false")) tk.MustQuery("select /*+ TIDB_INLJ(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows("64")) tk.MustExec("set @@tidb_index_lookup_join_concurrency=1;") tk.MustQuery("select /*+ TIDB_INLJ(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows("64")) tk.MustQuery("desc select /*+ INL_MERGE_JOIN(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows( - "HashAgg_9 1.00 root funcs:count(1)", - "└─IndexMergeJoin_21 64.00 root inner join, inner:IndexReader_19, outer key:Column#1, inner key:Column#3, other cond:lt(Column#4, Column#2)", + "HashAgg_9 1.00 root funcs:count(1)->Column#6", + "└─IndexMergeJoin_21 64.00 root inner join, inner:IndexReader_19, outer key:test.t.a, inner key:test.s.a, other cond:lt(test.s.b, test.t.b)", " ├─TableReader_26 64.00 root data:Selection_25", - " │ └─Selection_25 64.00 cop[tikv] not(isnull(Column#2))", + " │ └─Selection_25 64.00 cop[tikv] not(isnull(test.t.b))", " │ └─TableScan_24 64.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", " └─IndexReader_19 1.00 root index:Selection_18", - " └─Selection_18 1.00 cop[tikv] not(isnull(Column#3)), not(isnull(Column#4))", - " └─IndexScan_17 1.00 cop[tikv] table:s, index:a, b, range: decided by [eq(Column#3, Column#1) lt(Column#4, Column#2)], keep order:true", + " └─Selection_18 1.00 cop[tikv] not(isnull(test.s.a)), not(isnull(test.s.b))", + " └─IndexScan_17 1.00 cop[tikv] table:s, index:a, b, range: decided by [eq(test.s.a, test.t.a) lt(test.s.b, test.t.b)], keep order:true", )) tk.MustQuery("select /*+ INL_MERGE_JOIN(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows("64")) tk.MustExec("set @@tidb_index_lookup_join_concurrency=1;") tk.MustQuery("select /*+ INL_MERGE_JOIN(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows("64")) tk.MustQuery("desc select /*+ INL_HASH_JOIN(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows( - "HashAgg_9 1.00 root funcs:count(1)", - "└─IndexHashJoin_23 64.00 root inner join, inner:IndexReader_15, outer key:Column#1, inner key:Column#3, other cond:lt(Column#4, Column#2)", + "HashAgg_9 1.00 root funcs:count(1)->Column#6", + "└─IndexHashJoin_23 64.00 root inner join, inner:IndexReader_15, outer key:test.t.a, inner key:test.s.a, other cond:lt(test.s.b, test.t.b)", " ├─TableReader_26 64.00 root data:Selection_25", - " │ └─Selection_25 64.00 cop[tikv] not(isnull(Column#2))", + " │ └─Selection_25 64.00 cop[tikv] not(isnull(test.t.b))", " │ └─TableScan_24 64.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", " └─IndexReader_15 1.00 root index:Selection_14", - " └─Selection_14 1.00 cop[tikv] not(isnull(Column#3)), not(isnull(Column#4))", - " └─IndexScan_13 1.00 cop[tikv] table:s, index:a, b, range: decided by [eq(Column#3, Column#1) lt(Column#4, Column#2)], keep order:false", + " └─Selection_14 1.00 cop[tikv] not(isnull(test.s.a)), not(isnull(test.s.b))", + " └─IndexScan_13 1.00 cop[tikv] table:s, index:a, b, range: decided by [eq(test.s.a, test.t.a) lt(test.s.b, test.t.b)], keep order:false", )) tk.MustQuery("select /*+ INL_HASH_JOIN(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows("64")) tk.MustExec("set @@tidb_index_lookup_join_concurrency=1;") @@ -1199,11 +1199,11 @@ func (s *testSuiteJoin1) TestIndexNestedLoopHashJoin(c *C) { tk.MustExec("analyze table s") // Test IndexNestedLoopHashJoin keepOrder. tk.MustQuery("explain select /*+ INL_HASH_JOIN(s) */ * from t left join s on t.a=s.a order by t.pk").Check(testkit.Rows( - "IndexHashJoin_28 100.00 root left outer join, inner:TableReader_22, outer key:Column#2, inner key:Column#3", + "IndexHashJoin_28 100.00 root left outer join, inner:TableReader_22, outer key:test.t.a, inner key:test.s.a", "├─TableReader_30 100.00 root data:TableScan_29", "│ └─TableScan_29 100.00 cop[tikv] table:t, range:[-inf,+inf], keep order:true", "└─TableReader_22 1.00 root data:TableScan_21", - " └─TableScan_21 1.00 cop[tikv] table:s, range: decided by [Column#2], keep order:false", + " └─TableScan_21 1.00 cop[tikv] table:s, range: decided by [test.t.a], keep order:false", )) rs := tk.MustQuery("select /*+ INL_HASH_JOIN(s) */ * from t left join s on t.a=s.a order by t.pk") for i, row := range rs.Rows() { @@ -1226,12 +1226,12 @@ func (s *testSuiteJoin3) TestIssue13449(c *C) { tk.MustExec("set @@tidb_index_join_batch_size=32;") tk.MustQuery("desc select /*+ INL_HASH_JOIN(s) */ * from t join s on t.a=s.a order by t.a;").Check(testkit.Rows( - "IndexHashJoin_35 12487.50 root inner join, inner:IndexReader_27, outer key:Column#1, inner key:Column#3", + "IndexHashJoin_35 12487.50 root inner join, inner:IndexReader_27, outer key:test.t.a, inner key:test.s.a", "├─IndexReader_37 9990.00 root index:IndexScan_36", "│ └─IndexScan_36 9990.00 cop[tikv] table:t, index:a, range:[-inf,+inf], keep order:true, stats:pseudo", "└─IndexReader_27 1.25 root index:Selection_26", - " └─Selection_26 1.25 cop[tikv] not(isnull(Column#3))", - " └─IndexScan_25 1.25 cop[tikv] table:s, index:a, range: decided by [eq(Column#3, Column#1)], keep order:false, stats:pseudo")) + " └─Selection_26 1.25 cop[tikv] not(isnull(test.s.a))", + " └─IndexScan_25 1.25 cop[tikv] table:s, index:a, range: decided by [eq(test.s.a, test.t.a)], keep order:false, stats:pseudo")) tk.MustQuery("select /*+ INL_HASH_JOIN(s) */ * from t join s on t.a=s.a order by t.a;").Check(testkit.Rows("1 1", "128 128")) } @@ -1245,7 +1245,7 @@ func (s *testSuiteJoin3) TestMergejoinOrder(c *C) { tk.MustExec("insert into t2 select a*100, b*100 from t1;") tk.MustQuery("explain select /*+ TIDB_SMJ(t2) */ * from t1 left outer join t2 on t1.a=t2.a and t1.a!=3 order by t1.a;").Check(testkit.Rows( - "MergeJoin_20 10000.00 root left outer join, left key:Column#1, right key:Column#3, left cond:[ne(Column#1, 3)]", + "MergeJoin_20 10000.00 root left outer join, left key:test.t1.a, right key:test.t2.a, left cond:[ne(test.t1.a, 3)]", "├─TableReader_12 10000.00 root data:TableScan_11", "│ └─TableScan_11 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:true, stats:pseudo", "└─TableReader_14 6666.67 root data:TableScan_13", diff --git a/executor/merge_join_test.go b/executor/merge_join_test.go index 5530a955a0b73..80614f0587a9c 100644 --- a/executor/merge_join_test.go +++ b/executor/merge_join_test.go @@ -328,7 +328,7 @@ func (s *testSuite2) TestMergeJoin(c *C) { tk.MustExec("create table t(a int)") tk.MustExec("insert into t value(1),(2)") tk.MustQuery("explain select /*+ TIDB_SMJ(t1, t2) */ * from t t1 join t t2 order by t1.a, t2.a").Check(testkit.Rows( - "Sort_6 100000000.00 root Column#1:asc, Column#3:asc", + "Sort_6 100000000.00 root test.t.a:asc, test.t.a:asc", "└─MergeJoin_9 100000000.00 root inner join", " ├─TableReader_11 10000.00 root data:TableScan_10", " │ └─TableScan_10 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", @@ -350,7 +350,7 @@ func (s *testSuite2) TestMergeJoin(c *C) { tk.MustExec("insert into s values(1,1)") tk.MustQuery("explain select /*+ TIDB_SMJ(t, s) */ a in (select a from s where s.b >= t.b) from t").Check(testkit.Rows( "Projection_7 10000.00 root Column#7", - "└─MergeJoin_8 10000.00 root left outer semi join, other cond:eq(Column#1, Column#4), ge(Column#5, Column#2)", + "└─MergeJoin_8 10000.00 root left outer semi join, other cond:eq(test.t.a, test.s.a), ge(test.s.b, test.t.b)", " ├─TableReader_10 10000.00 root data:TableScan_9", " │ └─TableScan_9 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo", " └─TableReader_12 10000.00 root data:TableScan_11", diff --git a/executor/testdata/agg_suite_in.json b/executor/testdata/agg_suite_in.json new file mode 100644 index 0000000000000..d6d251ea979f2 --- /dev/null +++ b/executor/testdata/agg_suite_in.json @@ -0,0 +1,19 @@ +[ + { + "name": "TestInjectProjBelowTopN", + "cases": [ + "explain select * from t order by i + 1", + "select * from t order by i + 1", + "explain select * from t order by i + 1 limit 2", + "select * from t order by i + 1 limit 2", + "select i, i, i from t order by i + 1" + ] + }, + { + "name": "TestIssue12759HashAggCalledByApply", + "cases": [ + // make sure the plan is Apply -> Apply -> Apply -> HashAgg, and the count of Apply is equal to HashAggFinalConcurrency-1. + "explain select /*+ hash_agg() */ sum(a), (select NULL from test where tt.a = test.a limit 1),(select NULL from test where tt.a = test.a limit 1),(select NULL from test where tt.a = test.a limit 1) from test tt" + ] + } +] \ No newline at end of file diff --git a/executor/testdata/agg_suite_out.json b/executor/testdata/agg_suite_out.json new file mode 100644 index 0000000000000..8b207a7a93df8 --- /dev/null +++ b/executor/testdata/agg_suite_out.json @@ -0,0 +1,81 @@ +[ + { + "Name": "TestInjectProjBelowTopN", + "Cases": [ + [ + "Projection_8 10000.00 root test.t.i", + "└─Sort_4 10000.00 root Column#3:asc", + " └─Projection_9 10000.00 root test.t.i, plus(test.t.i, 1)->Column#3", + " └─TableReader_7 10000.00 root data:TableScan_6", + " └─TableScan_6 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" + ], + [ + "1", + "1", + "1", + "2", + "2", + "2", + "3", + "3", + "3" + ], + [ + "Projection_15 2.00 root test.t.i", + "└─TopN_7 2.00 root Column#3:asc, offset:0, count:2", + " └─Projection_16 2.00 root test.t.i, plus(test.t.i, 1)->Column#3", + " └─TableReader_12 2.00 root data:TopN_11", + " └─TopN_11 2.00 cop[tikv] plus(test.t.i, 1):asc, offset:0, count:2", + " └─TableScan_10 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" + ], + [ + "1", + "1" + ], + [ + "1 1 1", + "1 1 1", + "1 1 1", + "2 2 2", + "2 2 2", + "2 2 2", + "3 3 3", + "3 3 3", + "3 3 3" + ] + ] + }, + { + "Name": "TestIssue12759HashAggCalledByApply", + "Cases": [ + [ + "Projection_28 1.00 root Column#3, Column#6, Column#9, Column#12", + "└─Apply_30 1.00 root CARTESIAN left outer join, inner:Projection_65", + " ├─Apply_32 1.00 root CARTESIAN left outer join, inner:Projection_54", + " │ ├─Apply_34 1.00 root CARTESIAN left outer join, inner:Projection_43", + " │ │ ├─HashAgg_39 1.00 root funcs:sum(Column#22)->Column#3, funcs:firstrow(Column#23)->test.test.a", + " │ │ │ └─TableReader_40 1.00 root data:HashAgg_35", + " │ │ │ └─HashAgg_35 1.00 cop[tikv] funcs:sum(test.test.a)->Column#22, funcs:firstrow(test.test.a)->Column#23", + " │ │ │ └─TableScan_38 10000.00 cop[tikv] table:tt, range:[-inf,+inf], keep order:false, stats:pseudo", + " │ │ └─Projection_43 1.00 root ->Column#6", + " │ │ └─Limit_44 1.00 root offset:0, count:1", + " │ │ └─TableReader_50 1.00 root data:Limit_49", + " │ │ └─Limit_49 1.00 cop[tikv] offset:0, count:1", + " │ │ └─Selection_48 1.00 cop[tikv] eq(test.test.a, test.test.a)", + " │ │ └─TableScan_47 1000.00 cop[tikv] table:test, range:[-inf,+inf], keep order:false, stats:pseudo", + " │ └─Projection_54 1.00 root ->Column#9", + " │ └─Limit_55 1.00 root offset:0, count:1", + " │ └─TableReader_61 1.00 root data:Limit_60", + " │ └─Limit_60 1.00 cop[tikv] offset:0, count:1", + " │ └─Selection_59 1.00 cop[tikv] eq(test.test.a, test.test.a)", + " │ └─TableScan_58 1000.00 cop[tikv] table:test, range:[-inf,+inf], keep order:false, stats:pseudo", + " └─Projection_65 1.00 root ->Column#12", + " └─Limit_66 1.00 root offset:0, count:1", + " └─TableReader_72 1.00 root data:Limit_71", + " └─Limit_71 1.00 cop[tikv] offset:0, count:1", + " └─Selection_70 1.00 cop[tikv] eq(test.test.a, test.test.a)", + " └─TableScan_69 1000.00 cop[tikv] table:test, range:[-inf,+inf], keep order:false, stats:pseudo" + ] + ] + } +] diff --git a/expression/builtin_compare_test.go b/expression/builtin_compare_test.go index bd61ad8cca7aa..a6841822926e9 100644 --- a/expression/builtin_compare_test.go +++ b/expression/builtin_compare_test.go @@ -32,34 +32,34 @@ func (s *testEvaluatorSuite) TestCompareFunctionWithRefine(c *C) { exprStr string result string }{ - {"a < '1.0'", "lt(Column#1, 1)"}, - {"a <= '1.0'", "le(Column#1, 1)"}, - {"a > '1'", "gt(Column#1, 1)"}, - {"a >= '1'", "ge(Column#1, 1)"}, - {"a = '1'", "eq(Column#1, 1)"}, - {"a <=> '1'", "nulleq(Column#1, 1)"}, - {"a != '1'", "ne(Column#1, 1)"}, - {"a < '1.1'", "lt(Column#1, 2)"}, - {"a <= '1.1'", "le(Column#1, 1)"}, - {"a > 1.1", "gt(Column#1, 1)"}, - {"a >= '1.1'", "ge(Column#1, 2)"}, + {"a < '1.0'", "lt(a, 1)"}, + {"a <= '1.0'", "le(a, 1)"}, + {"a > '1'", "gt(a, 1)"}, + {"a >= '1'", "ge(a, 1)"}, + {"a = '1'", "eq(a, 1)"}, + {"a <=> '1'", "nulleq(a, 1)"}, + {"a != '1'", "ne(a, 1)"}, + {"a < '1.1'", "lt(a, 2)"}, + {"a <= '1.1'", "le(a, 1)"}, + {"a > 1.1", "gt(a, 1)"}, + {"a >= '1.1'", "ge(a, 2)"}, {"a = '1.1'", "0"}, {"a <=> '1.1'", "0"}, - {"a != '1.1'", "ne(cast(Column#1), 1.1)"}, - {"'1' < a", "lt(1, Column#1)"}, - {"'1' <= a", "le(1, Column#1)"}, - {"'1' > a", "gt(1, Column#1)"}, - {"'1' >= a", "ge(1, Column#1)"}, - {"'1' = a", "eq(1, Column#1)"}, - {"'1' <=> a", "nulleq(1, Column#1)"}, - {"'1' != a", "ne(1, Column#1)"}, - {"'1.1' < a", "lt(1, Column#1)"}, - {"'1.1' <= a", "le(2, Column#1)"}, - {"'1.1' > a", "gt(2, Column#1)"}, - {"'1.1' >= a", "ge(1, Column#1)"}, + {"a != '1.1'", "ne(cast(a), 1.1)"}, + {"'1' < a", "lt(1, a)"}, + {"'1' <= a", "le(1, a)"}, + {"'1' > a", "gt(1, a)"}, + {"'1' >= a", "ge(1, a)"}, + {"'1' = a", "eq(1, a)"}, + {"'1' <=> a", "nulleq(1, a)"}, + {"'1' != a", "ne(1, a)"}, + {"'1.1' < a", "lt(1, a)"}, + {"'1.1' <= a", "le(2, a)"}, + {"'1.1' > a", "gt(2, a)"}, + {"'1.1' >= a", "ge(1, a)"}, {"'1.1' = a", "0"}, {"'1.1' <=> a", "0"}, - {"'1.1' != a", "ne(1.1, cast(Column#1))"}, + {"'1.1' != a", "ne(1.1, cast(a))"}, {"'123456789123456711111189' = a", "0"}, {"123456789123456789.12345 = a", "0"}, {"123456789123456789123456789.12345 > a", "1"}, @@ -68,7 +68,7 @@ func (s *testEvaluatorSuite) TestCompareFunctionWithRefine(c *C) { {"-123456789123456789123456789.12345 < a", "1"}, // This cast can not be eliminated, // since converting "aaaa" to an int will cause DataTruncate error. - {"'aaaa'=a", "eq(cast(aaaa), cast(Column#1))"}, + {"'aaaa'=a", "eq(cast(aaaa), cast(a))"}, } cols, names := ColumnInfos2ColumnsAndNames(s.ctx, model.NewCIStr(""), tblInfo.Name, tblInfo.Columns) schema := NewSchema(cols...) diff --git a/expression/column.go b/expression/column.go index 42191faea2569..8b0fa3f96d3b8 100644 --- a/expression/column.go +++ b/expression/column.go @@ -199,6 +199,8 @@ type Column struct { InOperand bool // VirtualExpr is used to save expression for virtual column VirtualExpr Expression + + OrigName string } // Equal implements Expression interface. @@ -314,6 +316,9 @@ const columnPrefix = "Column#" // String implements Stringer interface. func (col *Column) String() string { + if col.OrigName != "" { + return col.OrigName + } var builder strings.Builder fmt.Fprintf(&builder, "%s%d", columnPrefix, col.UniqueID) return builder.String() diff --git a/expression/constant_fold_test.go b/expression/constant_fold_test.go index 741bd7b83975c..991204e58ec33 100644 --- a/expression/constant_fold_test.go +++ b/expression/constant_fold_test.go @@ -25,7 +25,7 @@ func (s *testIntegrationSuite) TestFoldIfNull(c *C) { tk.MustExec(`create table t(a bigint, b bigint);`) tk.MustExec(`insert into t values(1, 1);`) tk.MustQuery(`desc select ifnull("aaaa", a) from t;`).Check(testkit.Rows( - `Projection_3 10000.00 root "aaaa"`, + `Projection_3 10000.00 root aaaa->Column#4`, `└─TableReader_5 10000.00 root data:TableScan_4`, ` └─TableScan_4 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo`, )) diff --git a/expression/explain.go b/expression/explain.go index 93eb01cd498f7..8250a260b6605 100644 --- a/expression/explain.go +++ b/expression/explain.go @@ -17,6 +17,7 @@ import ( "bytes" "fmt" "sort" + "strings" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -62,15 +63,20 @@ func (expr *Constant) format(dt types.Datum) string { } // ExplainExpressionList generates explain information for a list of expressions. -func ExplainExpressionList(exprs []Expression) []byte { - buffer := bytes.NewBufferString("") +func ExplainExpressionList(exprs []Expression, schema *Schema) string { + builder := &strings.Builder{} for i, expr := range exprs { - buffer.WriteString(expr.ExplainInfo()) + switch expr.(type) { + case *Column, *CorrelatedColumn: + builder.WriteString(expr.String()) + default: + fmt.Fprintf(builder, "%v->%v", expr.String(), schema.Columns[i]) + } if i+1 < len(exprs) { - buffer.WriteString(", ") + builder.WriteString(", ") } } - return buffer.Bytes() + return builder.String() } // SortedExplainExpressionList generates explain information for a list of expressions in order. diff --git a/expression/expression.go b/expression/expression.go index 334b8aef94eae..bfdc2741e273b 100644 --- a/expression/expression.go +++ b/expression/expression.go @@ -609,7 +609,7 @@ func TableInfo2SchemaAndNames(ctx sessionctx.Context, dbName model.CIStr, tbl *m func ColumnInfos2ColumnsAndNames(ctx sessionctx.Context, dbName, tblName model.CIStr, colInfos []*model.ColumnInfo) ([]*Column, types.NameSlice) { columns := make([]*Column, 0, len(colInfos)) names := make([]*types.FieldName, 0, len(colInfos)) - for _, col := range colInfos { + for i, col := range colInfos { if col.State != model.StatePublic { continue } @@ -625,6 +625,7 @@ func ColumnInfos2ColumnsAndNames(ctx sessionctx.Context, dbName, tblName model.C ID: col.ID, UniqueID: ctx.GetSessionVars().AllocPlanColumnID(), Index: col.Offset, + OrigName: names[i].String(), } columns = append(columns, newCol) } diff --git a/expression/integration_test.go b/expression/integration_test.go index 6d3f4f16385d8..c6e1d3f98093a 100755 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -433,7 +433,7 @@ func (s *testIntegrationSuite2) TestMathBuiltin(c *C) { c.Assert(err, NotNil) terr = errors.Cause(err).(*terror.Error) c.Assert(terr.Code(), Equals, terror.ErrCode(mysql.ErrDataOutOfRange)) - c.Assert(err.Error(), Equals, "[types:1690]DOUBLE value is out of range in 'exp(Column#1)'") + c.Assert(err.Error(), Equals, "[types:1690]DOUBLE value is out of range in 'exp(test.t.a)'") c.Assert(rs.Close(), IsNil) // for conv @@ -3062,7 +3062,7 @@ func (s *testIntegrationSuite) TestArithmeticBuiltin(c *C) { rows, err := session.GetRows4Test(ctx, tk.Se, rs) c.Assert(rows, IsNil) c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(Column#1 + Column#2)'") + c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(test.t.a + test.t.b)'") c.Assert(rs.Close(), IsNil) rs, err = tk.Exec("select cast(-3 as signed) + cast(2 as unsigned);") c.Assert(errors.ErrorStack(err), Equals, "") @@ -3100,7 +3100,7 @@ func (s *testIntegrationSuite) TestArithmeticBuiltin(c *C) { rows, err = session.GetRows4Test(ctx, tk.Se, rs) c.Assert(rows, IsNil) c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(Column#1 - Column#2)'") + c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(test.t.a - test.t.b)'") c.Assert(rs.Close(), IsNil) rs, err = tk.Exec("select cast(-1 as signed) - cast(-1 as unsigned);") c.Assert(errors.ErrorStack(err), Equals, "") @@ -3379,7 +3379,7 @@ func (s *testIntegrationSuite) TestCompareBuiltin(c *C) { tk.MustExec("create table t(a date)") result = tk.MustQuery("desc select a = a from t") result.Check(testkit.Rows( - "Projection_3 10000.00 root eq(Column#1, Column#1)", + "Projection_3 10000.00 root eq(test.t.a, test.t.a)->Column#3", "└─TableReader_5 10000.00 root data:TableScan_4", " └─TableScan_4 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo", )) @@ -3569,14 +3569,14 @@ func (s *testIntegrationSuite) TestAggregationBuiltinGroupConcat(c *C) { tk.MustExec("set @@group_concat_max_len=7") result = tk.MustQuery("select group_concat(a) from t") result.Check(testkit.Rows("hello,h")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning 1260 Some rows were cut by GROUPCONCAT(Column#1)")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning 1260 Some rows were cut by GROUPCONCAT(test.t.a)")) _, err := tk.Exec("insert into d select group_concat(a) from t") c.Assert(errors.Cause(err).(*terror.Error).Code(), Equals, terror.ErrCode(mysql.ErrCutValueGroupConcat)) tk.Exec("set sql_mode=''") tk.MustExec("insert into d select group_concat(a) from t") - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning 1260 Some rows were cut by GROUPCONCAT(Column#2)")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning 1260 Some rows were cut by GROUPCONCAT(test.t.a)")) tk.MustQuery("select * from d").Check(testkit.Rows("hello,h")) } @@ -4176,23 +4176,23 @@ func (s *testIntegrationSuite) TestFilterExtractFromDNF(c *C) { }{ { exprStr: "a = 1 or a = 1 or a = 1", - result: "[eq(Column#1, 1)]", + result: "[eq(test.t.a, 1)]", }, { exprStr: "a = 1 or a = 1 or (a = 1 and b = 1)", - result: "[eq(Column#1, 1)]", + result: "[eq(test.t.a, 1)]", }, { exprStr: "(a = 1 and a = 1) or a = 1 or b = 1", - result: "[or(or(and(eq(Column#1, 1), eq(Column#1, 1)), eq(Column#1, 1)), eq(Column#2, 1))]", + result: "[or(or(and(eq(test.t.a, 1), eq(test.t.a, 1)), eq(test.t.a, 1)), eq(test.t.b, 1))]", }, { exprStr: "(a = 1 and b = 2) or (a = 1 and b = 3) or (a = 1 and b = 4)", - result: "[eq(Column#1, 1) or(eq(Column#2, 2), or(eq(Column#2, 3), eq(Column#2, 4)))]", + result: "[eq(test.t.a, 1) or(eq(test.t.b, 2), or(eq(test.t.b, 3), eq(test.t.b, 4)))]", }, { exprStr: "(a = 1 and b = 1 and c = 1) or (a = 1 and b = 1) or (a = 1 and b = 1 and c > 2 and c < 3)", - result: "[eq(Column#1, 1) eq(Column#2, 1)]", + result: "[eq(test.t.a, 1) eq(test.t.b, 1)]", }, } @@ -4743,7 +4743,7 @@ func (s *testIntegrationSuite) TestTimestampDatumEncode(c *C) { tk.MustExec(`insert into t values (1, "2019-04-29 11:56:12")`) tk.MustQuery(`explain select * from t where b = (select max(b) from t)`).Check(testkit.Rows( "TableReader_43 10.00 root data:Selection_42", - "└─Selection_42 10.00 cop[tikv] eq(Column#2, 2019-04-29 11:56:12)", + "└─Selection_42 10.00 cop[tikv] eq(test.t.b, 2019-04-29 11:56:12)", " └─TableScan_41 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo", )) tk.MustQuery(`select * from t where b = (select max(b) from t)`).Check(testkit.Rows(`1 2019-04-29 11:56:12`)) diff --git a/expression/testdata/expression_suite_out.json b/expression/testdata/expression_suite_out.json index 96b04380bec42..06bdd29b256d0 100644 --- a/expression/testdata/expression_suite_out.json +++ b/expression/testdata/expression_suite_out.json @@ -5,11 +5,11 @@ { "SQL": "explain select * from t1 left join t2 on t1.a > t2.a and t1.a = 1", "Result": [ - "HashLeftJoin_6 33233333.33 root CARTESIAN left outer join, inner:TableReader_12, left cond:[eq(Column#2, 1)]", + "HashLeftJoin_6 33233333.33 root CARTESIAN left outer join, inner:TableReader_12, left cond:[eq(test.t1.a, 1)]", "├─TableReader_9 10000.00 root data:TableScan_8", "│ └─TableScan_8 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_12 3323.33 root data:Selection_11", - " └─Selection_11 3323.33 cop[tikv] gt(1, Column#5)", + " └─Selection_11 3323.33 cop[tikv] gt(1, test.t2.a)", " └─TableScan_10 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" ] }, @@ -18,33 +18,33 @@ "Result": [ "HashLeftJoin_8 33233.33 root CARTESIAN left outer join, inner:TableReader_11 (REVERSED)", "├─TableReader_11 10.00 root data:Selection_10", - "│ └─Selection_10 10.00 cop[tikv] eq(Column#2, 1)", + "│ └─Selection_10 10.00 cop[tikv] eq(test.t1.a, 1)", "│ └─TableScan_9 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_14 3323.33 root data:Selection_13", - " └─Selection_13 3323.33 cop[tikv] gt(1, Column#5)", + " └─Selection_13 3323.33 cop[tikv] gt(1, test.t2.a)", " └─TableScan_12 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" ] }, { "SQL": "explain select * from t1 left join t2 on t1.a = t2.a and t1.a > 1", "Result": [ - "HashLeftJoin_6 10000.00 root left outer join, inner:TableReader_12, equal:[eq(Column#2, Column#5)], left cond:[gt(Column#2, 1)]", + "HashLeftJoin_6 10000.00 root left outer join, inner:TableReader_12, equal:[eq(test.t1.a, test.t2.a)], left cond:[gt(test.t1.a, 1)]", "├─TableReader_9 10000.00 root data:TableScan_8", "│ └─TableScan_8 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_12 3333.33 root data:Selection_11", - " └─Selection_11 3333.33 cop[tikv] gt(Column#5, 1), not(isnull(Column#5))", + " └─Selection_11 3333.33 cop[tikv] gt(test.t2.a, 1), not(isnull(test.t2.a))", " └─TableScan_10 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" ] }, { "SQL": "explain select * from t1 left join t2 on t1.a = t2.a where t1.a > 1", "Result": [ - "HashLeftJoin_7 4166.67 root left outer join, inner:TableReader_14, equal:[eq(Column#2, Column#5)]", + "HashLeftJoin_7 4166.67 root left outer join, inner:TableReader_14, equal:[eq(test.t1.a, test.t2.a)]", "├─TableReader_11 3333.33 root data:Selection_10", - "│ └─Selection_10 3333.33 cop[tikv] gt(Column#2, 1)", + "│ └─Selection_10 3333.33 cop[tikv] gt(test.t1.a, 1)", "│ └─TableScan_9 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_14 3333.33 root data:Selection_13", - " └─Selection_13 3333.33 cop[tikv] gt(Column#5, 1), not(isnull(Column#5))", + " └─Selection_13 3333.33 cop[tikv] gt(test.t2.a, 1), not(isnull(test.t2.a))", " └─TableScan_12 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" ] }, @@ -53,31 +53,31 @@ "Result": [ "HashRightJoin_8 33333.33 root CARTESIAN right outer join, inner:TableReader_14 (REVERSED)", "├─TableReader_11 3333.33 root data:Selection_10", - "│ └─Selection_10 3333.33 cop[tikv] gt(Column#2, 1)", + "│ └─Selection_10 3333.33 cop[tikv] gt(test.t1.a, 1)", "│ └─TableScan_9 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_14 10.00 root data:Selection_13", - " └─Selection_13 10.00 cop[tikv] eq(Column#5, 1)", + " └─Selection_13 10.00 cop[tikv] eq(test.t2.a, 1)", " └─TableScan_12 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" ] }, { "SQL": "explain select * from t1 right join t2 on t1.a = t2.a where t2.a > 1", "Result": [ - "HashRightJoin_7 4166.67 root right outer join, inner:TableReader_11, equal:[eq(Column#2, Column#5)]", + "HashRightJoin_7 4166.67 root right outer join, inner:TableReader_11, equal:[eq(test.t1.a, test.t2.a)]", "├─TableReader_11 3333.33 root data:Selection_10", - "│ └─Selection_10 3333.33 cop[tikv] gt(Column#2, 1), not(isnull(Column#2))", + "│ └─Selection_10 3333.33 cop[tikv] gt(test.t1.a, 1), not(isnull(test.t1.a))", "│ └─TableScan_9 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_14 3333.33 root data:Selection_13", - " └─Selection_13 3333.33 cop[tikv] gt(Column#5, 1)", + " └─Selection_13 3333.33 cop[tikv] gt(test.t2.a, 1)", " └─TableScan_12 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" ] }, { "SQL": "explain select * from t1 right join t2 on t1.a = t2.a and t2.a > 1", "Result": [ - "HashRightJoin_6 10000.00 root right outer join, inner:TableReader_10, equal:[eq(Column#2, Column#5)], right cond:gt(Column#5, 1)", + "HashRightJoin_6 10000.00 root right outer join, inner:TableReader_10, equal:[eq(test.t1.a, test.t2.a)], right cond:gt(test.t2.a, 1)", "├─TableReader_10 3333.33 root data:Selection_9", - "│ └─Selection_9 3333.33 cop[tikv] gt(Column#2, 1), not(isnull(Column#2))", + "│ └─Selection_9 3333.33 cop[tikv] gt(test.t1.a, 1), not(isnull(test.t1.a))", "│ └─TableScan_8 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_12 10000.00 root data:TableScan_11", " └─TableScan_11 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" @@ -86,9 +86,9 @@ { "SQL": "explain select * from t1 right join t2 on t1.a > t2.a and t2.a = 1", "Result": [ - "HashRightJoin_6 33333333.33 root CARTESIAN right outer join, inner:TableReader_10, right cond:eq(Column#5, 1)", + "HashRightJoin_6 33333333.33 root CARTESIAN right outer join, inner:TableReader_10, right cond:eq(test.t2.a, 1)", "├─TableReader_10 3333.33 root data:Selection_9", - "│ └─Selection_9 3333.33 cop[tikv] gt(Column#2, 1)", + "│ └─Selection_9 3333.33 cop[tikv] gt(test.t1.a, 1)", "│ └─TableScan_8 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_12 10000.00 root data:TableScan_11", " └─TableScan_11 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" @@ -97,31 +97,31 @@ { "SQL": "explain select * from t1 left join t2 on t1.a = t2.a and t2.a > 1", "Result": [ - "HashLeftJoin_6 10000.00 root left outer join, inner:TableReader_12, equal:[eq(Column#2, Column#5)]", + "HashLeftJoin_6 10000.00 root left outer join, inner:TableReader_12, equal:[eq(test.t1.a, test.t2.a)]", "├─TableReader_9 10000.00 root data:TableScan_8", "│ └─TableScan_8 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_12 3333.33 root data:Selection_11", - " └─Selection_11 3333.33 cop[tikv] gt(Column#5, 1), not(isnull(Column#5))", + " └─Selection_11 3333.33 cop[tikv] gt(test.t2.a, 1), not(isnull(test.t2.a))", " └─TableScan_10 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" ] }, { "SQL": "explain select * from t1 left join t2 on t1.a > t2.a and t2.a = 1", "Result": [ - "HashLeftJoin_6 100000.00 root CARTESIAN left outer join, inner:TableReader_12, other cond:gt(Column#2, Column#5)", + "HashLeftJoin_6 100000.00 root CARTESIAN left outer join, inner:TableReader_12, other cond:gt(test.t1.a, test.t2.a)", "├─TableReader_9 10000.00 root data:TableScan_8", "│ └─TableScan_8 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_12 10.00 root data:Selection_11", - " └─Selection_11 10.00 cop[tikv] eq(Column#5, 1), not(isnull(Column#5))", + " └─Selection_11 10.00 cop[tikv] eq(test.t2.a, 1), not(isnull(test.t2.a))", " └─TableScan_10 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" ] }, { "SQL": "explain select * from t1 right join t2 on t1.a > t2.a and t1.a = 1", "Result": [ - "HashRightJoin_6 100000.00 root CARTESIAN right outer join, inner:TableReader_10, other cond:gt(Column#2, Column#5)", + "HashRightJoin_6 100000.00 root CARTESIAN right outer join, inner:TableReader_10, other cond:gt(test.t1.a, test.t2.a)", "├─TableReader_10 10.00 root data:Selection_9", - "│ └─Selection_9 10.00 cop[tikv] eq(Column#2, 1), not(isnull(Column#2))", + "│ └─Selection_9 10.00 cop[tikv] eq(test.t1.a, 1), not(isnull(test.t1.a))", "│ └─TableScan_8 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_12 10000.00 root data:TableScan_11", " └─TableScan_11 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" @@ -130,9 +130,9 @@ { "SQL": "explain select * from t1 right join t2 on t1.a = t2.a and t1.a > 1", "Result": [ - "HashRightJoin_6 10000.00 root right outer join, inner:TableReader_10, equal:[eq(Column#2, Column#5)]", + "HashRightJoin_6 10000.00 root right outer join, inner:TableReader_10, equal:[eq(test.t1.a, test.t2.a)]", "├─TableReader_10 3333.33 root data:Selection_9", - "│ └─Selection_9 3333.33 cop[tikv] gt(Column#2, 1), not(isnull(Column#2))", + "│ └─Selection_9 3333.33 cop[tikv] gt(test.t1.a, 1), not(isnull(test.t1.a))", "│ └─TableScan_8 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_12 10000.00 root data:TableScan_11", " └─TableScan_11 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" @@ -141,7 +141,7 @@ { "SQL": "explain select * from t1 left join t2 on t1.a = t1.b and t1.a > 1", "Result": [ - "HashLeftJoin_6 100000000.00 root CARTESIAN left outer join, inner:TableReader_11, left cond:[eq(Column#2, Column#3) gt(Column#2, 1)]", + "HashLeftJoin_6 100000000.00 root CARTESIAN left outer join, inner:TableReader_11, left cond:[eq(test.t1.a, test.t1.b) gt(test.t1.a, 1)]", "├─TableReader_9 10000.00 root data:TableScan_8", "│ └─TableScan_8 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_11 10000.00 root data:TableScan_10", @@ -155,7 +155,7 @@ "├─TableReader_9 10000.00 root data:TableScan_8", "│ └─TableScan_8 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_12 2666.67 root data:Selection_11", - " └─Selection_11 2666.67 cop[tikv] eq(Column#5, Column#6), gt(Column#5, 1)", + " └─Selection_11 2666.67 cop[tikv] eq(test.t2.a, test.t2.b), gt(test.t2.a, 1)", " └─TableScan_10 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" ] }, @@ -188,7 +188,7 @@ "Result": [ "HashLeftJoin_8 80000.00 root CARTESIAN left outer join, inner:TableReader_11 (REVERSED)", "├─TableReader_11 10.00 root data:Selection_10", - "│ └─Selection_10 10.00 cop[tikv] eq(Column#2, 1)", + "│ └─Selection_10 10.00 cop[tikv] eq(test.t1.a, 1)", "│ └─TableScan_9 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_13 10000.00 root data:TableScan_12", " └─TableScan_12 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" @@ -226,7 +226,7 @@ "Result": [ "HashLeftJoin_8 80000.00 root CARTESIAN left outer join, inner:TableReader_11 (REVERSED)", "├─TableReader_11 10.00 root data:Selection_10", - "│ └─Selection_10 10.00 cop[tikv] eq(Column#2, 2)", + "│ └─Selection_10 10.00 cop[tikv] eq(test.t1.a, 2)", "│ └─TableScan_9 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableDual_12 8000.00 root rows:0" ] @@ -238,14 +238,14 @@ "├─TableReader_9 10000.00 root data:TableScan_8", "│ └─TableScan_8 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_12 0.00 root data:Selection_11", - " └─Selection_11 0.00 cop[tikv] eq(Column#5, 1), eq(Column#5, 2)", + " └─Selection_11 0.00 cop[tikv] eq(test.t2.a, 1), eq(test.t2.a, 2)", " └─TableScan_10 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" ] }, { "SQL": "explain select * from t1 left join t2 on t1.a = 1 or (t1.a = 2 and t1.a = 3)", "Result": [ - "HashLeftJoin_6 100000000.00 root CARTESIAN left outer join, inner:TableReader_11, left cond:[or(eq(Column#2, 1), 0)]", + "HashLeftJoin_6 100000000.00 root CARTESIAN left outer join, inner:TableReader_11, left cond:[or(eq(test.t1.a, 1), 0)]", "├─TableReader_9 10000.00 root data:TableScan_8", "│ └─TableScan_8 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_11 10000.00 root data:TableScan_10", @@ -257,7 +257,7 @@ "Result": [ "HashLeftJoin_8 80000.00 root CARTESIAN left outer join, inner:TableReader_11 (REVERSED)", "├─TableReader_11 10.00 root data:Selection_10", - "│ └─Selection_10 10.00 cop[tikv] or(eq(Column#2, 1), 0)", + "│ └─Selection_10 10.00 cop[tikv] or(eq(test.t1.a, 1), 0)", "│ └─TableScan_9 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_13 10000.00 root data:TableScan_12", " └─TableScan_12 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" @@ -266,9 +266,9 @@ { "SQL": "explain select * from t1 where t1.b > 1 or t1.b in (select b from t2)", "Result": [ - "Projection_7 8000.00 root Column#1, Column#2, Column#3", - "└─Selection_8 8000.00 root or(gt(Column#3, 1), Column#7)", - " └─HashLeftJoin_9 10000.00 root CARTESIAN left outer semi join, inner:TableReader_13, other cond:eq(Column#3, Column#6)", + "Projection_7 8000.00 root test.t1.id, test.t1.a, test.t1.b", + "└─Selection_8 8000.00 root or(gt(test.t1.b, 1), Column#7)", + " └─HashLeftJoin_9 10000.00 root CARTESIAN left outer semi join, inner:TableReader_13, other cond:eq(test.t1.b, test.t2.b)", " ├─TableReader_11 10000.00 root data:TableScan_10", " │ └─TableScan_10 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", " └─TableReader_13 10000.00 root data:TableScan_12", diff --git a/planner/cascades/integration_test.go b/planner/cascades/integration_test.go index 6aa3b5a3984bb..564db6ef20da9 100644 --- a/planner/cascades/integration_test.go +++ b/planner/cascades/integration_test.go @@ -55,7 +55,7 @@ func (s *testIntegrationSuite) TestSimpleProjDual(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) tk.MustExec("set session tidb_enable_cascades_planner = 1") tk.MustQuery("explain select 1").Check(testkit.Rows( - "Projection_3 1.00 root 1", + "Projection_3 1.00 root 1->Column#1", "└─TableDual_4 1.00 root rows:1", )) tk.MustQuery("select 1").Check(testkit.Rows( diff --git a/planner/cascades/testdata/integration_suite_out.json b/planner/cascades/testdata/integration_suite_out.json index b4ad1efc100df..44d97bc7460d6 100644 --- a/planner/cascades/testdata/integration_suite_out.json +++ b/planner/cascades/testdata/integration_suite_out.json @@ -5,7 +5,7 @@ { "SQL": "select b from t where a > 1", "Plan": [ - "Projection_8 3333.33 root Column#2", + "Projection_8 3333.33 root test.t.b", "└─TableReader_9 3333.33 root data:TableScan_10", " └─TableScan_10 3333.33 cop[tikv] table:t, range:(1,+inf], keep order:false, stats:pseudo" ], @@ -17,7 +17,7 @@ { "SQL": "select b from t where a > 1 and a < 3", "Plan": [ - "Projection_8 2.00 root Column#2", + "Projection_8 2.00 root test.t.b", "└─TableReader_9 2.00 root data:TableScan_10", " └─TableScan_10 2.00 cop[tikv] table:t, range:(1,3), keep order:false, stats:pseudo" ], @@ -26,9 +26,9 @@ { "SQL": "select b from t where a > 1 and b < 6", "Plan": [ - "Projection_9 2666.67 root Column#2", + "Projection_9 2666.67 root test.t.b", "└─TableReader_10 2666.67 root data:Selection_11", - " └─Selection_11 2666.67 cop[tikv] lt(Column#2, 6)", + " └─Selection_11 2666.67 cop[tikv] lt(test.t.b, 6)", " └─TableScan_12 3333.33 cop[tikv] table:t, range:(1,+inf], keep order:false, stats:pseudo" ], "Result": [ @@ -38,9 +38,9 @@ { "SQL": "select a from t where a * 3 + 1 > 9 and a < 5", "Plan": [ - "Projection_9 4.00 root Column#1", + "Projection_9 4.00 root test.t.a", "└─TableReader_10 4.00 root data:Selection_11", - " └─Selection_11 4.00 cop[tikv] gt(plus(mul(Column#1, 3), 1), 9)", + " └─Selection_11 4.00 cop[tikv] gt(plus(mul(test.t.a, 3), 1), 9)", " └─TableScan_12 5.00 cop[tikv] table:t, range:[-inf,5), keep order:false, stats:pseudo" ], "Result": [ @@ -50,12 +50,12 @@ { "SQL": "select a from t group by a having sum(b) > 4", "Plan": [ - "Projection_11 6400.00 root Column#1", - "└─Projection_12 6400.00 root Column#1, Column#3", + "Projection_11 6400.00 root test.t.a", + "└─Projection_12 6400.00 root test.t.a, Column#3", " └─Selection_13 6400.00 root gt(Column#3, 4)", - " └─HashAgg_18 8000.00 root group by:Column#1, funcs:sum(Column#5), firstrow(Column#1)", + " └─HashAgg_18 8000.00 root group by:test.t.a, funcs:sum(Column#5)->Column#3, funcs:firstrow(test.t.a)->test.t.a", " └─TableReader_19 8000.00 root data:HashAgg_20", - " └─HashAgg_20 8000.00 cop[tikv] group by:Column#1, funcs:sum(Column#2)", + " └─HashAgg_20 8000.00 cop[tikv] group by:test.t.a, funcs:sum(test.t.b)->Column#5", " └─TableScan_16 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" ], "Result": [ @@ -70,7 +70,7 @@ { "SQL": "select a from t order by a", "Plan": [ - "Projection_7 10000.00 root Column#1", + "Projection_7 10000.00 root test.t.a", "└─TableReader_8 10000.00 root data:TableScan_9", " └─TableScan_9 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:true, stats:pseudo" ], @@ -84,8 +84,8 @@ { "SQL": "select b from t order by b", "Plan": [ - "Projection_7 10000.00 root Column#2", - "└─Sort_12 10000.00 root Column#2:asc", + "Projection_7 10000.00 root test.t.b", + "└─Sort_12 10000.00 root test.t.b:asc", " └─TableReader_10 10000.00 root data:TableScan_11", " └─TableScan_11 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" ], @@ -99,11 +99,11 @@ { "SQL": "select b from t order by a+b", "Plan": [ - "Projection_7 10000.00 root Column#2", - "└─Projection_12 10000.00 root Column#2, Column#1", + "Projection_7 10000.00 root test.t.b", + "└─Projection_12 10000.00 root test.t.b, test.t.a", " └─Sort_8 10000.00 root Column#4:asc", - " └─Projection_13 10000.00 root Column#2, Column#1, plus(Column#1, Column#2)", - " └─Projection_9 10000.00 root Column#2, Column#1", + " └─Projection_13 10000.00 root test.t.b, test.t.a, plus(test.t.a, test.t.b)->Column#4", + " └─Projection_9 10000.00 root test.t.b, test.t.a", " └─TableReader_10 10000.00 root data:TableScan_11", " └─TableScan_11 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" ], @@ -117,11 +117,11 @@ { "SQL": "select b from t order by b, a+b, a", "Plan": [ - "Projection_7 10000.00 root Column#2", - "└─Projection_12 10000.00 root Column#2, Column#1", - " └─Sort_8 10000.00 root Column#2:asc, Column#4:asc, Column#1:asc", - " └─Projection_13 10000.00 root Column#2, Column#1, plus(Column#1, Column#2)", - " └─Projection_9 10000.00 root Column#2, Column#1", + "Projection_7 10000.00 root test.t.b", + "└─Projection_12 10000.00 root test.t.b, test.t.a", + " └─Sort_8 10000.00 root test.t.b:asc, Column#4:asc, test.t.a:asc", + " └─Projection_13 10000.00 root test.t.b, test.t.a, plus(test.t.a, test.t.b)->Column#4", + " └─Projection_9 10000.00 root test.t.b, test.t.a", " └─TableReader_10 10000.00 root data:TableScan_11", " └─TableScan_11 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" ], @@ -141,9 +141,9 @@ "SQL": "select sum(a) from t", "Plan": [ "Projection_8 1.00 root Column#3", - "└─HashAgg_13 1.00 root funcs:sum(Column#4)", + "└─HashAgg_13 1.00 root funcs:sum(Column#4)->Column#3", " └─TableReader_14 1.00 root data:HashAgg_15", - " └─HashAgg_15 1.00 cop[tikv] funcs:sum(Column#1)", + " └─HashAgg_15 1.00 cop[tikv] funcs:sum(test.t.a)->Column#4", " └─TableScan_11 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" ], "Result": [ @@ -154,9 +154,9 @@ "SQL": "select max(a), min(b) from t", "Plan": [ "Projection_8 1.00 root Column#3, Column#4", - "└─HashAgg_12 1.00 root funcs:max(Column#5), min(Column#6)", + "└─HashAgg_12 1.00 root funcs:max(Column#5)->Column#3, funcs:min(Column#6)->Column#4", " └─TableReader_13 1.00 root data:HashAgg_14", - " └─HashAgg_14 1.00 cop[tikv] funcs:max(Column#1), min(Column#2)", + " └─HashAgg_14 1.00 cop[tikv] funcs:max(test.t.a)->Column#5, funcs:min(test.t.b)->Column#6", " └─TableScan_11 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" ], "Result": [ @@ -166,10 +166,10 @@ { "SQL": "select b, avg(a) from t group by b order by b", "Plan": [ - "Projection_10 8000.00 root Column#2, Column#3", - "└─Sort_19 8000.00 root Column#2:asc", - " └─HashAgg_12 8000.00 root group by:Column#9, funcs:avg(Column#7), firstrow(Column#8)", - " └─Projection_15 10000.00 root cast(Column#1), Column#2, Column#2", + "Projection_10 8000.00 root test.t.b, Column#3", + "└─Sort_19 8000.00 root test.t.b:asc", + " └─HashAgg_12 8000.00 root group by:Column#9, funcs:avg(Column#7)->Column#3, funcs:firstrow(Column#8)->test.t.b", + " └─Projection_15 10000.00 root cast(test.t.a)->Column#7, test.t.b, test.t.b", " └─TableReader_13 10000.00 root data:TableScan_14", " └─TableScan_14 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" ], @@ -183,11 +183,11 @@ { "SQL": "select b, sum(a) from t group by b order by b", "Plan": [ - "Projection_10 8000.00 root Column#2, Column#3", - "└─Sort_19 8000.00 root Column#2:asc", - " └─HashAgg_16 8000.00 root group by:Column#2, funcs:sum(Column#4), firstrow(Column#2)", + "Projection_10 8000.00 root test.t.b, Column#3", + "└─Sort_19 8000.00 root test.t.b:asc", + " └─HashAgg_16 8000.00 root group by:test.t.b, funcs:sum(Column#4)->Column#3, funcs:firstrow(test.t.b)->test.t.b", " └─TableReader_17 8000.00 root data:HashAgg_18", - " └─HashAgg_18 8000.00 cop[tikv] group by:Column#2, funcs:sum(Column#1)", + " └─HashAgg_18 8000.00 cop[tikv] group by:test.t.b, funcs:sum(test.t.a)->Column#4", " └─TableScan_14 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" ], "Result": [ @@ -200,12 +200,12 @@ { "SQL": "select b, avg(a) from t group by b having sum(a) > 1 order by b", "Plan": [ - "Projection_12 6400.00 root Column#2, Column#3", - "└─Projection_14 6400.00 root Column#2, Column#3, Column#4", - " └─Sort_27 6400.00 root Column#2:asc", + "Projection_12 6400.00 root test.t.b, Column#3", + "└─Projection_14 6400.00 root test.t.b, Column#3, Column#4", + " └─Sort_27 6400.00 root test.t.b:asc", " └─Selection_26 6400.00 root gt(Column#4, 1)", - " └─HashAgg_17 8000.00 root group by:Column#14, funcs:avg(Column#11), sum(Column#12), firstrow(Column#13)", - " └─Projection_20 10000.00 root cast(Column#1), cast(Column#1), Column#2, Column#2", + " └─HashAgg_17 8000.00 root group by:Column#14, funcs:avg(Column#11)->Column#3, funcs:sum(Column#12)->Column#4, funcs:firstrow(Column#13)->test.t.b", + " └─Projection_20 10000.00 root cast(test.t.a)->Column#11, cast(test.t.a)->Column#12, test.t.b, test.t.b", " └─TableReader_18 10000.00 root data:TableScan_19", " └─TableScan_19 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" ], @@ -219,9 +219,9 @@ "SQL": "select max(a+b) from t", "Plan": [ "Projection_8 1.00 root Column#3", - "└─HashAgg_13 1.00 root funcs:max(Column#4)", + "└─HashAgg_13 1.00 root funcs:max(Column#4)->Column#3", " └─TableReader_14 1.00 root data:HashAgg_15", - " └─HashAgg_15 1.00 cop[tikv] funcs:max(plus(Column#1, Column#2))", + " └─HashAgg_15 1.00 cop[tikv] funcs:max(plus(test.t.a, test.t.b))->Column#4", " └─TableScan_11 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" ], "Result": [ @@ -232,10 +232,10 @@ "SQL": "select sum(a) from t group by a, a+b order by a", "Plan": [ "Projection_10 8000.00 root Column#3", - "└─Projection_12 8000.00 root Column#3, Column#1", - " └─Sort_21 8000.00 root Column#1:asc", - " └─HashAgg_14 8000.00 root group by:Column#10, Column#11, funcs:sum(Column#8), firstrow(Column#9)", - " └─Projection_17 10000.00 root cast(Column#1), Column#1, Column#1, plus(Column#1, Column#2)", + "└─Projection_12 8000.00 root Column#3, test.t.a", + " └─Sort_21 8000.00 root test.t.a:asc", + " └─HashAgg_14 8000.00 root group by:Column#10, Column#11, funcs:sum(Column#8)->Column#3, funcs:firstrow(Column#9)->test.t.a", + " └─Projection_17 10000.00 root cast(test.t.a)->Column#8, test.t.a, test.t.a, plus(test.t.a, test.t.b)->Column#11", " └─TableReader_15 10000.00 root data:TableScan_16", " └─TableScan_16 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" ], @@ -255,7 +255,7 @@ "SQL": "select a from t limit 2", "Plan": [ "Limit_6 2.00 root offset:0, count:2", - "└─Projection_7 2.00 root Column#1", + "└─Projection_7 2.00 root test.t.a", " └─TableReader_8 2.00 root data:TableScan_9", " └─TableScan_9 2.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" ], @@ -268,7 +268,7 @@ "SQL": "select a from t limit 1 offset 2", "Plan": [ "Limit_6 1.00 root offset:2, count:1", - "└─Projection_7 3.00 root Column#1", + "└─Projection_7 3.00 root test.t.a", " └─TableReader_8 3.00 root data:TableScan_9", " └─TableScan_9 3.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" ], @@ -279,8 +279,8 @@ { "SQL": "select b from t order by b limit 3", "Plan": [ - "TopN_8 3.00 root Column#2:asc, offset:0, count:3", - "└─Projection_10 10000.00 root Column#2", + "TopN_8 3.00 root test.t.b:asc, offset:0, count:3", + "└─Projection_10 10000.00 root test.t.b", " └─TableReader_11 10000.00 root data:TableScan_12", " └─TableScan_12 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" ], @@ -294,7 +294,7 @@ "SQL": "select a from t order by a limit 1 offset 2", "Plan": [ "Limit_9 1.00 root offset:2, count:1", - "└─Projection_13 3.00 root Column#1", + "└─Projection_13 3.00 root test.t.a", " └─TableReader_14 3.00 root data:TableScan_15", " └─TableScan_15 3.00 cop[tikv] table:t, range:[-inf,+inf], keep order:true, stats:pseudo" ], @@ -310,8 +310,8 @@ { "SQL": "select t1.a, t1.b from t1, t2 where t1.a = t2.a and t1.a > 2", "Plan": [ - "Projection_16 4166.67 root Column#1, Column#2", - "└─HashRightJoin_17 4166.67 root inner join, inner:TableReader_19, equal:[eq(Column#1, Column#3)]", + "Projection_16 4166.67 root test.t1.a, test.t1.b", + "└─HashRightJoin_17 4166.67 root inner join, inner:TableReader_19, equal:[eq(test.t1.a, test.t2.a)]", " ├─TableReader_19 3333.33 root data:TableScan_20", " │ └─TableScan_20 3333.33 cop[tikv] table:t1, range:(2,+inf], keep order:false, stats:pseudo", " └─TableReader_21 3333.33 root data:TableScan_22", @@ -324,12 +324,12 @@ { "SQL": "select t1.a, t1.b from t1, t2 where t1.a > t2.a and t2.b > 200", "Plan": [ - "Projection_12 80000000.00 root Column#1, Column#2", - "└─HashLeftJoin_14 80000000.00 root CARTESIAN inner join, inner:TableReader_17, other cond:gt(Column#1, Column#3)", + "Projection_12 80000000.00 root test.t1.a, test.t1.b", + "└─HashLeftJoin_14 80000000.00 root CARTESIAN inner join, inner:TableReader_17, other cond:gt(test.t1.a, test.t2.a)", " ├─TableReader_15 10000.00 root data:TableScan_16", " │ └─TableScan_16 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", " └─TableReader_17 8000.00 root data:Selection_18", - " └─Selection_18 8000.00 cop[tikv] gt(Column#4, 200)", + " └─Selection_18 8000.00 cop[tikv] gt(test.t2.b, 200)", " └─TableScan_19 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" ], "Result": [ diff --git a/planner/cascades/testdata/stringer_suite_out.json b/planner/cascades/testdata/stringer_suite_out.json index 08fc32039d2d0..1e6da38cd12e9 100644 --- a/planner/cascades/testdata/stringer_suite_out.json +++ b/planner/cascades/testdata/stringer_suite_out.json @@ -5,21 +5,21 @@ { "SQL": "select b from t where a > 1 and b < 1", "Result": [ - "Group#0 Schema:[Column#2]", - " Projection_3 input:[Group#1], Column#2", - "Group#1 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.b]", + " Projection_3 input:[Group#1], test.t.b", + "Group#1 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", " TableGather_5 input:[Group#2]", - "Group#2 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " Selection_8 input:[Group#3], lt(Column#2, 1)", - "Group#3 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " TableScan_7 table:t, pk col:Column#1, cond:[gt(Column#1, 1)]" + "Group#2 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " Selection_8 input:[Group#3], lt(test.t.b, 1)", + "Group#3 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " TableScan_7 table:t, pk col:test.t.a, cond:[gt(test.t.a, 1)]" ] }, { "SQL": "select 3 * 10 + 1", "Result": [ "Group#0 Schema:[Column#1]", - " Projection_2 input:[Group#1], 31", + " Projection_2 input:[Group#1], 31->Column#1", "Group#1 Schema:[]", " TableDual_1 rowcount:1" ] @@ -27,20 +27,20 @@ { "SQL": "select t1.b from t t1, t t2 where t2.a=t1.b and t1.a > 10", "Result": [ - "Group#0 Schema:[Column#2]", - " Projection_5 input:[Group#1], Column#2", - "Group#1 Schema:[Column#1,Column#2,Column#13]", - " Selection_4 input:[Group#2], eq(Column#13, Column#2), gt(Column#1, 10)", - "Group#2 Schema:[Column#1,Column#2,Column#13]", + "Group#0 Schema:[test.t.b]", + " Projection_5 input:[Group#1], test.t.b", + "Group#1 Schema:[test.t.a,test.t.b,test.t.a]", + " Selection_4 input:[Group#2], eq(test.t.a, test.t.b), gt(test.t.a, 10)", + "Group#2 Schema:[test.t.a,test.t.b,test.t.a]", " Join_3 input:[Group#3,Group#4], inner join", - "Group#3 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", + "Group#3 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", " TableGather_7 input:[Group#5]", - "Group#5 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " TableScan_6 table:t1, pk col:Column#1", - "Group#4 Schema:[Column#13], UniqueKey:[Column#13]", + "Group#5 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " TableScan_6 table:t1, pk col:test.t.a", + "Group#4 Schema:[test.t.a], UniqueKey:[test.t.a]", " TableGather_9 input:[Group#6]", - "Group#6 Schema:[Column#13], UniqueKey:[Column#13]", - " TableScan_8 table:t2, pk col:Column#13" + "Group#6 Schema:[test.t.a], UniqueKey:[test.t.a]", + " TableScan_8 table:t2, pk col:test.t.a" ] }, { @@ -49,13 +49,13 @@ "Group#0 Schema:[Column#13,Column#14]", " Projection_4 input:[Group#1], Column#13, Column#14", "Group#1 Schema:[Column#13,Column#14]", - " Aggregation_3 input:[Group#2], group by:Column#4, funcs:max(Column#2), sum(Column#1)", - "Group#2 Schema:[Column#1,Column#2,Column#3,Column#4], UniqueKey:[Column#1]", + " Aggregation_3 input:[Group#2], group by:test.t.d, funcs:max(test.t.b), sum(test.t.a)", + "Group#2 Schema:[test.t.a,test.t.b,test.t.c,test.t.d], UniqueKey:[test.t.a]", " TableGather_6 input:[Group#3]", - "Group#3 Schema:[Column#1,Column#2,Column#3,Column#4], UniqueKey:[Column#1]", - " Selection_7 input:[Group#4], gt(Column#3, 10)", - "Group#4 Schema:[Column#1,Column#2,Column#3,Column#4], UniqueKey:[Column#1]", - " TableScan_5 table:t, pk col:Column#1" + "Group#3 Schema:[test.t.a,test.t.b,test.t.c,test.t.d], UniqueKey:[test.t.a]", + " Selection_7 input:[Group#4], gt(test.t.c, 10)", + "Group#4 Schema:[test.t.a,test.t.b,test.t.c,test.t.d], UniqueKey:[test.t.a]", + " TableScan_5 table:t, pk col:test.t.a" ] }, { @@ -64,34 +64,34 @@ "Group#0 Schema:[Column#13]", " Projection_4 input:[Group#1], Column#13", "Group#1 Schema:[Column#13]", - " Aggregation_3 input:[Group#2], funcs:avg(Column#2)", - "Group#2 Schema:[Column#2]", + " Aggregation_3 input:[Group#2], funcs:avg(test.t.b)", + "Group#2 Schema:[test.t.b]", " TableGather_6 input:[Group#3]", - "Group#3 Schema:[Column#2]", - " Selection_7 input:[Group#4], gt(Column#2, 10)", - "Group#4 Schema:[Column#2]", + "Group#3 Schema:[test.t.b]", + " Selection_7 input:[Group#4], gt(test.t.b, 10)", + "Group#4 Schema:[test.t.b]", " TableScan_5 table:t" ] }, { "SQL": "select a from t t1 where exists(select 1 from t t2 where t2.a < t1.b) and a < 5", "Result": [ - "Group#0 Schema:[Column#1], UniqueKey:[Column#1]", - " Projection_7 input:[Group#1], Column#1", - "Group#1 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " Selection_2 input:[Group#2], lt(Column#1, 5)", - "Group#2 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.a], UniqueKey:[test.t.a]", + " Projection_7 input:[Group#1], test.t.a", + "Group#1 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " Selection_2 input:[Group#2], lt(test.t.a, 5)", + "Group#2 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", " Apply_6 input:[Group#3,Group#4], semi join", - "Group#3 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", + "Group#3 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", " TableGather_9 input:[Group#5]", - "Group#5 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " TableScan_8 table:t1, pk col:Column#1", - "Group#4 Schema:[Column#13], UniqueKey:[Column#13]", + "Group#5 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " TableScan_8 table:t1, pk col:test.t.a", + "Group#4 Schema:[test.t.a], UniqueKey:[test.t.a]", " TableGather_11 input:[Group#6]", - "Group#6 Schema:[Column#13], UniqueKey:[Column#13]", - " Selection_12 input:[Group#7], lt(Column#13, Column#2)", - "Group#7 Schema:[Column#13], UniqueKey:[Column#13]", - " TableScan_10 table:t2, pk col:Column#13" + "Group#6 Schema:[test.t.a], UniqueKey:[test.t.a]", + " Selection_12 input:[Group#7], lt(test.t.a, test.t.b)", + "Group#7 Schema:[test.t.a], UniqueKey:[test.t.a]", + " TableScan_10 table:t2, pk col:test.t.a" ] }, { @@ -100,49 +100,49 @@ "Group#0 Schema:[Column#25]", " Projection_6 input:[Group#1], Column#25", "Group#1 Schema:[Column#25]", - " Aggregation_5 input:[Group#2], funcs:sum(Column#1)", - "Group#2 Schema:[Column#1,Column#14]", - " Selection_4 input:[Group#3], eq(Column#1, Column#14)", - "Group#3 Schema:[Column#1,Column#14]", + " Aggregation_5 input:[Group#2], funcs:sum(test.t.a)", + "Group#2 Schema:[test.t.a,test.t.b]", + " Selection_4 input:[Group#3], eq(test.t.a, test.t.b)", + "Group#3 Schema:[test.t.a,test.t.b]", " Join_3 input:[Group#4,Group#5], inner join", - "Group#4 Schema:[Column#1], UniqueKey:[Column#1]", + "Group#4 Schema:[test.t.a], UniqueKey:[test.t.a]", " TableGather_8 input:[Group#6]", - "Group#6 Schema:[Column#1], UniqueKey:[Column#1]", - " TableScan_7 table:t1, pk col:Column#1", - "Group#5 Schema:[Column#14]", + "Group#6 Schema:[test.t.a], UniqueKey:[test.t.a]", + " TableScan_7 table:t1, pk col:test.t.a", + "Group#5 Schema:[test.t.b]", " TableGather_10 input:[Group#7]", - "Group#7 Schema:[Column#14]", + "Group#7 Schema:[test.t.b]", " TableScan_9 table:t2" ] }, { "SQL": "select a from t where a > 10 limit 3", "Result": [ - "Group#0 Schema:[Column#1], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.a], UniqueKey:[test.t.a]", " Limit_4 input:[Group#1], offset:0, count:3", - "Group#1 Schema:[Column#1], UniqueKey:[Column#1]", - " Projection_3 input:[Group#2], Column#1", - "Group#2 Schema:[Column#1], UniqueKey:[Column#1]", + "Group#1 Schema:[test.t.a], UniqueKey:[test.t.a]", + " Projection_3 input:[Group#2], test.t.a", + "Group#2 Schema:[test.t.a], UniqueKey:[test.t.a]", " TableGather_6 input:[Group#3]", - "Group#3 Schema:[Column#1], UniqueKey:[Column#1]", - " TableScan_8 table:t, pk col:Column#1, cond:[gt(Column#1, 10)]" + "Group#3 Schema:[test.t.a], UniqueKey:[test.t.a]", + " TableScan_8 table:t, pk col:test.t.a, cond:[gt(test.t.a, 10)]" ] }, { "SQL": "select a from t where b > 1 order by c", "Result": [ - "Group#0 Schema:[Column#13], UniqueKey:[Column#13]", - " Projection_5 input:[Group#1], Column#1", - "Group#1 Schema:[Column#1,Column#3], UniqueKey:[Column#1]", - " Sort_4 input:[Group#2], Column#3:asc", - "Group#2 Schema:[Column#1,Column#3], UniqueKey:[Column#1]", - " Projection_3 input:[Group#3], Column#1, Column#3", - "Group#3 Schema:[Column#1,Column#2,Column#3], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.a], UniqueKey:[test.t.a]", + " Projection_5 input:[Group#1], test.t.a", + "Group#1 Schema:[test.t.a,test.t.c], UniqueKey:[test.t.a]", + " Sort_4 input:[Group#2], test.t.c:asc", + "Group#2 Schema:[test.t.a,test.t.c], UniqueKey:[test.t.a]", + " Projection_3 input:[Group#3], test.t.a, test.t.c", + "Group#3 Schema:[test.t.a,test.t.b,test.t.c], UniqueKey:[test.t.a]", " TableGather_7 input:[Group#4]", - "Group#4 Schema:[Column#1,Column#2,Column#3], UniqueKey:[Column#1]", - " Selection_8 input:[Group#5], gt(Column#2, 1)", - "Group#5 Schema:[Column#1,Column#2,Column#3], UniqueKey:[Column#1]", - " TableScan_6 table:t, pk col:Column#1" + "Group#4 Schema:[test.t.a,test.t.b,test.t.c], UniqueKey:[test.t.a]", + " Selection_8 input:[Group#5], gt(test.t.b, 1)", + "Group#5 Schema:[test.t.a,test.t.b,test.t.c], UniqueKey:[test.t.a]", + " TableScan_6 table:t, pk col:test.t.a" ] }, { @@ -155,20 +155,20 @@ "Group#3 Schema:[Column#26]", " Projection_6 input:[Group#4], Column#26", "Group#4 Schema:[Column#26]", - " Aggregation_5 input:[Group#5], funcs:avg(Column#14)", - "Group#5 Schema:[Column#14], UniqueKey:[Column#14]", + " Aggregation_5 input:[Group#5], funcs:avg(test.t.a)", + "Group#5 Schema:[test.t.a], UniqueKey:[test.t.a]", " TableGather_11 input:[Group#6]", - "Group#6 Schema:[Column#14], UniqueKey:[Column#14]", - " TableScan_10 table:t, pk col:Column#14", + "Group#6 Schema:[test.t.a], UniqueKey:[test.t.a]", + " TableScan_10 table:t, pk col:test.t.a", "Group#2 Schema:[Column#27]", " Projection_9 input:[Group#7], Column#13", "Group#7 Schema:[Column#13]", " Projection_3 input:[Group#8], Column#13", "Group#8 Schema:[Column#13]", - " Aggregation_2 input:[Group#9], funcs:avg(Column#2)", - "Group#9 Schema:[Column#2]", + " Aggregation_2 input:[Group#9], funcs:avg(test.t.b)", + "Group#9 Schema:[test.t.b]", " TableGather_13 input:[Group#10]", - "Group#10 Schema:[Column#2]", + "Group#10 Schema:[test.t.b]", " TableScan_12 table:t" ] } diff --git a/planner/cascades/testdata/transformation_rules_suite_out.json b/planner/cascades/testdata/transformation_rules_suite_out.json index cc5c64b149f0b..1f21428831d40 100644 --- a/planner/cascades/testdata/transformation_rules_suite_out.json +++ b/planner/cascades/testdata/transformation_rules_suite_out.json @@ -5,137 +5,137 @@ { "SQL": "select a, b from (select a, b from t as t1 order by a) as t2 where t2.b > 10", "Result": [ - "Group#0 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " Projection_5 input:[Group#1], Column#1, Column#2", - "Group#1 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " Sort_3 input:[Group#2], Column#1:asc", - "Group#2 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " Projection_2 input:[Group#3], Column#1, Column#2", - "Group#3 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " Projection_5 input:[Group#1], test.t.a, test.t.b", + "Group#1 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " Sort_3 input:[Group#2], test.t.a:asc", + "Group#2 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " Projection_2 input:[Group#3], test.t.a, test.t.b", + "Group#3 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", " TableGather_7 input:[Group#4]", - "Group#4 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " Selection_9 input:[Group#5], gt(Column#2, 10)", - "Group#5 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " TableScan_6 table:t1, pk col:Column#1" + "Group#4 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " Selection_9 input:[Group#5], gt(test.t.b, 10)", + "Group#5 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " TableScan_6 table:t1, pk col:test.t.a" ] }, { "SQL": "select a, b from (select a, b from t as t1 order by a) as t2 where t2.a > 10", "Result": [ - "Group#0 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " Projection_5 input:[Group#1], Column#1, Column#2", - "Group#1 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " Sort_3 input:[Group#2], Column#1:asc", - "Group#2 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " Projection_2 input:[Group#3], Column#1, Column#2", - "Group#3 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " Projection_5 input:[Group#1], test.t.a, test.t.b", + "Group#1 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " Sort_3 input:[Group#2], test.t.a:asc", + "Group#2 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " Projection_2 input:[Group#3], test.t.a, test.t.b", + "Group#3 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", " TableGather_7 input:[Group#4]", - "Group#4 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " TableScan_10 table:t1, pk col:Column#1, cond:[gt(Column#1, 10)]" + "Group#4 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " TableScan_10 table:t1, pk col:test.t.a, cond:[gt(test.t.a, 10)]" ] }, { "SQL": "select a, b from (select a, b, a+b as a_b from t as t1) as t2 where a_b > 10 and b = 1", "Result": [ - "Group#0 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " Projection_4 input:[Group#1], Column#1, Column#2", - "Group#1 Schema:[Column#1,Column#2,Column#13], UniqueKey:[Column#1]", - " Projection_2 input:[Group#2], Column#1, Column#2, plus(Column#1, Column#2)", - "Group#2 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " Projection_4 input:[Group#1], test.t.a, test.t.b", + "Group#1 Schema:[test.t.a,test.t.b,Column#13], UniqueKey:[test.t.a]", + " Projection_2 input:[Group#2], test.t.a, test.t.b, plus(test.t.a, test.t.b)->Column#13", + "Group#2 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", " TableGather_6 input:[Group#3]", - "Group#3 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " Selection_8 input:[Group#4], eq(Column#2, 1), gt(plus(Column#1, Column#2), 10)", - "Group#4 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " TableScan_5 table:t1, pk col:Column#1" + "Group#3 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " Selection_8 input:[Group#4], eq(test.t.b, 1), gt(plus(test.t.a, test.t.b), 10)", + "Group#4 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " TableScan_5 table:t1, pk col:test.t.a" ] }, { "SQL": "select a, @i:=@i+1 as ii from (select a, @i:=0 from t as t1) as t2 where @i < 10", "Result": [ - "Group#0 Schema:[Column#1,Column#14], UniqueKey:[Column#1]", - " Projection_4 input:[Group#1], Column#1, setvar(\"i\", cast(plus(cast(getvar(\"i\")), 1)))", - "Group#1 Schema:[Column#1,Column#13], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.a,Column#14], UniqueKey:[test.t.a]", + " Projection_4 input:[Group#1], test.t.a, setvar(i, cast(plus(cast(getvar(i)), 1)))->Column#14", + "Group#1 Schema:[test.t.a,Column#13], UniqueKey:[test.t.a]", " Selection_3 input:[Group#2], lt(cast(getvar(\"i\")), 10)", - "Group#2 Schema:[Column#1,Column#13], UniqueKey:[Column#1]", - " Projection_2 input:[Group#3], Column#1, setvar(\"i\", \"0\")", - "Group#3 Schema:[Column#1], UniqueKey:[Column#1]", + "Group#2 Schema:[test.t.a,Column#13], UniqueKey:[test.t.a]", + " Projection_2 input:[Group#3], test.t.a, setvar(i, 0)->Column#13", + "Group#3 Schema:[test.t.a], UniqueKey:[test.t.a]", " TableGather_6 input:[Group#4]", - "Group#4 Schema:[Column#1], UniqueKey:[Column#1]", - " TableScan_5 table:t1, pk col:Column#1" + "Group#4 Schema:[test.t.a], UniqueKey:[test.t.a]", + " TableScan_5 table:t1, pk col:test.t.a" ] }, { "SQL": "select a, @i:=@i+1 as ii from (select a, @i:=0 from t as t1) as t2 where @i < 10 and a > 10", "Result": [ - "Group#0 Schema:[Column#1,Column#14], UniqueKey:[Column#1]", - " Projection_4 input:[Group#1], Column#1, setvar(\"i\", cast(plus(cast(getvar(\"i\")), 1)))", - "Group#1 Schema:[Column#1,Column#13], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.a,Column#14], UniqueKey:[test.t.a]", + " Projection_4 input:[Group#1], test.t.a, setvar(i, cast(plus(cast(getvar(i)), 1)))->Column#14", + "Group#1 Schema:[test.t.a,Column#13], UniqueKey:[test.t.a]", " Selection_8 input:[Group#2], lt(cast(getvar(\"i\")), 10)", - "Group#2 Schema:[Column#1,Column#13], UniqueKey:[Column#1]", - " Projection_2 input:[Group#3], Column#1, setvar(\"i\", \"0\")", - "Group#3 Schema:[Column#1], UniqueKey:[Column#1]", + "Group#2 Schema:[test.t.a,Column#13], UniqueKey:[test.t.a]", + " Projection_2 input:[Group#3], test.t.a, setvar(i, 0)->Column#13", + "Group#3 Schema:[test.t.a], UniqueKey:[test.t.a]", " TableGather_6 input:[Group#4]", - "Group#4 Schema:[Column#1], UniqueKey:[Column#1]", - " TableScan_10 table:t1, pk col:Column#1, cond:[gt(Column#1, 10)]" + "Group#4 Schema:[test.t.a], UniqueKey:[test.t.a]", + " TableScan_10 table:t1, pk col:test.t.a, cond:[gt(test.t.a, 10)]" ] }, { "SQL": "select a, max(b) from t group by a having a > 1", "Result": [ - "Group#0 Schema:[Column#1,Column#13], UniqueKey:[Column#1,Column#1]", - " Projection_3 input:[Group#1], Column#1, Column#13", - "Group#1 Schema:[Column#13,Column#1], UniqueKey:[Column#1,Column#1]", - " Aggregation_2 input:[Group#2], group by:Column#1, funcs:max(Column#2), firstrow(Column#1)", - "Group#2 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.a,Column#13], UniqueKey:[test.t.a,test.t.a]", + " Projection_3 input:[Group#1], test.t.a, Column#13", + "Group#1 Schema:[Column#13,test.t.a], UniqueKey:[test.t.a,test.t.a]", + " Aggregation_2 input:[Group#2], group by:test.t.a, funcs:max(test.t.b), firstrow(test.t.a)", + "Group#2 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", " TableGather_6 input:[Group#3]", - "Group#3 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " TableScan_10 table:t, pk col:Column#1, cond:[gt(Column#1, 1)]" + "Group#3 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " TableScan_10 table:t, pk col:test.t.a, cond:[gt(test.t.a, 1)]" ] }, { "SQL": "select a, avg(b) from t group by a having a > 1 and max(b) > 10", "Result": [ - "Group#0 Schema:[Column#15,Column#16], UniqueKey:[Column#15,Column#15]", - " Projection_5 input:[Group#1], Column#1, Column#13", - "Group#1 Schema:[Column#1,Column#13,Column#14], UniqueKey:[Column#1,Column#1]", - " Projection_3 input:[Group#2], Column#1, Column#13, Column#14", - "Group#2 Schema:[Column#13,Column#14,Column#1], UniqueKey:[Column#1,Column#1]", + "Group#0 Schema:[test.t.a,Column#16], UniqueKey:[test.t.a,test.t.a]", + " Projection_5 input:[Group#1], test.t.a, Column#13", + "Group#1 Schema:[test.t.a,Column#13,Column#14], UniqueKey:[test.t.a,test.t.a]", + " Projection_3 input:[Group#2], test.t.a, Column#13, Column#14", + "Group#2 Schema:[Column#13,Column#14,test.t.a], UniqueKey:[test.t.a,test.t.a]", " Selection_10 input:[Group#3], gt(Column#14, 10)", - "Group#3 Schema:[Column#13,Column#14,Column#1], UniqueKey:[Column#1,Column#1]", - " Aggregation_2 input:[Group#4], group by:Column#1, funcs:avg(Column#2), max(Column#2), firstrow(Column#1)", - "Group#4 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", + "Group#3 Schema:[Column#13,Column#14,test.t.a], UniqueKey:[test.t.a,test.t.a]", + " Aggregation_2 input:[Group#4], group by:test.t.a, funcs:avg(test.t.b), max(test.t.b), firstrow(test.t.a)", + "Group#4 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", " TableGather_7 input:[Group#5]", - "Group#5 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " TableScan_12 table:t, pk col:Column#1, cond:[gt(Column#1, 1)]" + "Group#5 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " TableScan_12 table:t, pk col:test.t.a, cond:[gt(test.t.a, 1)]" ] }, { "SQL": "select t1.a, t1.b, t2.b from t t1, t t2 where t1.a = t2.a and t2.b = t1.b and t1.a > 10 and t2.b > 10 and t1.a > t2.b", "Result": [ - "Group#0 Schema:[Column#1,Column#2,Column#14]", - " Projection_5 input:[Group#1], Column#1, Column#2, Column#14", - "Group#1 Schema:[Column#1,Column#2,Column#13,Column#14]", - " Join_3 input:[Group#2,Group#3], inner join, equal:[eq(Column#1, Column#13) eq(Column#2, Column#14)], other cond:gt(Column#1, Column#14)", - "Group#2 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.a,test.t.b,test.t.b]", + " Projection_5 input:[Group#1], test.t.a, test.t.b, test.t.b", + "Group#1 Schema:[test.t.a,test.t.b,test.t.a,test.t.b]", + " Join_3 input:[Group#2,Group#3], inner join, equal:[eq(test.t.a, test.t.a) eq(test.t.b, test.t.b)], other cond:gt(test.t.a, test.t.b)", + "Group#2 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", " TableGather_7 input:[Group#4]", - "Group#4 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " Selection_14 input:[Group#5], gt(Column#1, Column#2), gt(Column#2, 10)", - "Group#5 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " TableScan_13 table:t1, pk col:Column#1, cond:[gt(Column#1, 10)]", - "Group#3 Schema:[Column#13,Column#14], UniqueKey:[Column#13]", + "Group#4 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " Selection_14 input:[Group#5], gt(test.t.a, test.t.b), gt(test.t.b, 10)", + "Group#5 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " TableScan_13 table:t1, pk col:test.t.a, cond:[gt(test.t.a, 10)]", + "Group#3 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", " TableGather_9 input:[Group#6]", - "Group#6 Schema:[Column#13,Column#14], UniqueKey:[Column#13]", - " Selection_17 input:[Group#7], gt(Column#13, Column#14), gt(Column#14, 10)", - "Group#7 Schema:[Column#13,Column#14], UniqueKey:[Column#13]", - " TableScan_16 table:t2, pk col:Column#13, cond:[gt(Column#13, 10)]" + "Group#6 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " Selection_17 input:[Group#7], gt(test.t.a, test.t.b), gt(test.t.b, 10)", + "Group#7 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " TableScan_16 table:t2, pk col:test.t.a, cond:[gt(test.t.a, 10)]" ] }, { "SQL": "select t1.a, t1.b from t t1, t t2 where t1.a = t2.a and t1.a = 10 and t2.a = 5", "Result": [ - "Group#0 Schema:[Column#1,Column#2]", - " Projection_5 input:[Group#1], Column#1, Column#2", - "Group#1 Schema:[Column#1,Column#2,Column#13]", + "Group#0 Schema:[test.t.a,test.t.b]", + " Projection_5 input:[Group#1], test.t.a, test.t.b", + "Group#1 Schema:[test.t.a,test.t.b,test.t.a]", " TableDual_10 rowcount:0" ] } @@ -147,50 +147,50 @@ { "SQL": "select a, sum(b) from t group by a", "Result": [ - "Group#0 Schema:[Column#1,Column#13], UniqueKey:[Column#1,Column#1]", - " Projection_3 input:[Group#1], Column#1, Column#13", - "Group#1 Schema:[Column#13,Column#1], UniqueKey:[Column#1,Column#1]", - " Aggregation_2 input:[Group#2], group by:Column#1, funcs:sum(Column#2), firstrow(Column#1)", - " Aggregation_7 input:[Group#3], group by:Column#1, funcs:sum(Column#14), firstrow(Column#1)", - "Group#2 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.a,Column#13], UniqueKey:[test.t.a,test.t.a]", + " Projection_3 input:[Group#1], test.t.a, Column#13", + "Group#1 Schema:[Column#13,test.t.a], UniqueKey:[test.t.a,test.t.a]", + " Aggregation_2 input:[Group#2], group by:test.t.a, funcs:sum(test.t.b), firstrow(test.t.a)", + " Aggregation_7 input:[Group#3], group by:test.t.a, funcs:sum(Column#14), firstrow(test.t.a)", + "Group#2 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", " TableGather_5 input:[Group#4]", - "Group#4 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " TableScan_4 table:t, pk col:Column#1", - "Group#3 Schema:[Column#14,Column#1]", + "Group#4 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " TableScan_4 table:t, pk col:test.t.a", + "Group#3 Schema:[Column#14,test.t.a]", " TableGather_5 input:[Group#5]", - "Group#5 Schema:[Column#14,Column#1]", - " Aggregation_6 input:[Group#4], group by:Column#1, funcs:sum(Column#2)" + "Group#5 Schema:[Column#14,test.t.a]", + " Aggregation_6 input:[Group#4], group by:test.t.a, funcs:sum(test.t.b)" ] }, { "SQL": "select a, sum(b) from t group by a+c, a", "Result": [ - "Group#0 Schema:[Column#1,Column#13], UniqueKey:[Column#1]", - " Projection_3 input:[Group#1], Column#1, Column#13", - "Group#1 Schema:[Column#13,Column#1], UniqueKey:[Column#1]", - " Aggregation_2 input:[Group#2], group by:Column#1, plus(Column#1, Column#3), funcs:sum(Column#2), firstrow(Column#1)", - " Aggregation_7 input:[Group#3], group by:Column#1, Column#16, funcs:sum(Column#14), firstrow(Column#1)", - "Group#2 Schema:[Column#1,Column#2,Column#3], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.a,Column#13], UniqueKey:[test.t.a]", + " Projection_3 input:[Group#1], test.t.a, Column#13", + "Group#1 Schema:[Column#13,test.t.a], UniqueKey:[test.t.a]", + " Aggregation_2 input:[Group#2], group by:plus(test.t.a, test.t.c), test.t.a, funcs:sum(test.t.b), firstrow(test.t.a)", + " Aggregation_7 input:[Group#3], group by:Column#16, test.t.a, funcs:sum(Column#14), firstrow(test.t.a)", + "Group#2 Schema:[test.t.a,test.t.b,test.t.c], UniqueKey:[test.t.a]", " TableGather_5 input:[Group#4]", - "Group#4 Schema:[Column#1,Column#2,Column#3], UniqueKey:[Column#1]", - " TableScan_4 table:t, pk col:Column#1", - "Group#3 Schema:[Column#14,Column#16,Column#1]", + "Group#4 Schema:[test.t.a,test.t.b,test.t.c], UniqueKey:[test.t.a]", + " TableScan_4 table:t, pk col:test.t.a", + "Group#3 Schema:[Column#14,Column#16,test.t.a]", " TableGather_5 input:[Group#5]", - "Group#5 Schema:[Column#14,Column#16,Column#1]", - " Aggregation_6 input:[Group#4], group by:Column#1, plus(Column#1, Column#3), funcs:sum(Column#2)" + "Group#5 Schema:[Column#14,Column#16,test.t.a]", + " Aggregation_6 input:[Group#4], group by:plus(test.t.a, test.t.c), test.t.a, funcs:sum(test.t.b)" ] }, { "SQL": "select a, sum(b) from t group by sin(a)+sin(c)", "Result": [ - "Group#0 Schema:[Column#1,Column#13], UniqueKey:[Column#1]", - " Projection_3 input:[Group#1], Column#1, Column#13", - "Group#1 Schema:[Column#13,Column#1], UniqueKey:[Column#1]", - " Aggregation_2 input:[Group#2], group by:plus(sin(cast(Column#1)), sin(cast(Column#3))), funcs:sum(Column#2), firstrow(Column#1)", - "Group#2 Schema:[Column#1,Column#2,Column#3], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.a,Column#13], UniqueKey:[test.t.a]", + " Projection_3 input:[Group#1], test.t.a, Column#13", + "Group#1 Schema:[Column#13,test.t.a], UniqueKey:[test.t.a]", + " Aggregation_2 input:[Group#2], group by:plus(sin(cast(test.t.a)), sin(cast(test.t.c))), funcs:sum(test.t.b), firstrow(test.t.a)", + "Group#2 Schema:[test.t.a,test.t.b,test.t.c], UniqueKey:[test.t.a]", " TableGather_5 input:[Group#3]", - "Group#3 Schema:[Column#1,Column#2,Column#3], UniqueKey:[Column#1]", - " TableScan_4 table:t, pk col:Column#1" + "Group#3 Schema:[test.t.a,test.t.b,test.t.c], UniqueKey:[test.t.a]", + " TableScan_4 table:t, pk col:test.t.a" ] } ] @@ -201,16 +201,16 @@ { "SQL": "select b from t order by a limit 2", "Result": [ - "Group#0 Schema:[Column#13]", - " Projection_5 input:[Group#1], Column#2", - "Group#1 Schema:[Column#2,Column#1], UniqueKey:[Column#1]", - " TopN_8 input:[Group#2], Column#1:asc, offset:0, count:2", - "Group#2 Schema:[Column#2,Column#1], UniqueKey:[Column#1]", - " Projection_2 input:[Group#3], Column#2, Column#1", - "Group#3 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", + "Group#0 Schema:[test.t.b]", + " Projection_5 input:[Group#1], test.t.b", + "Group#1 Schema:[test.t.b,test.t.a], UniqueKey:[test.t.a]", + " TopN_8 input:[Group#2], test.t.a:asc, offset:0, count:2", + "Group#2 Schema:[test.t.b,test.t.a], UniqueKey:[test.t.a]", + " Projection_2 input:[Group#3], test.t.b, test.t.a", + "Group#3 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", " TableGather_7 input:[Group#4]", - "Group#4 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " TableScan_6 table:t, pk col:Column#1" + "Group#4 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " TableScan_6 table:t, pk col:test.t.a" ] }, { @@ -218,14 +218,14 @@ "Result": [ "Group#0 Schema:[Column#14]", " Projection_5 input:[Group#1], Column#13", - "Group#1 Schema:[Column#13,Column#1], UniqueKey:[Column#1]", - " TopN_8 input:[Group#2], Column#1:asc, offset:2, count:1", - "Group#2 Schema:[Column#13,Column#1], UniqueKey:[Column#1]", - " Projection_2 input:[Group#3], plus(Column#1, Column#2), Column#1", - "Group#3 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", + "Group#1 Schema:[Column#13,test.t.a], UniqueKey:[test.t.a]", + " TopN_8 input:[Group#2], test.t.a:asc, offset:2, count:1", + "Group#2 Schema:[Column#13,test.t.a], UniqueKey:[test.t.a]", + " Projection_2 input:[Group#3], plus(test.t.a, test.t.b)->Column#13, test.t.a", + "Group#3 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", " TableGather_7 input:[Group#4]", - "Group#4 Schema:[Column#1,Column#2], UniqueKey:[Column#1]", - " TableScan_6 table:t, pk col:Column#1" + "Group#4 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", + " TableScan_6 table:t, pk col:test.t.a" ] } ] diff --git a/planner/core/cbo_test.go b/planner/core/cbo_test.go index e584baad4d5da..bf3f591dd8c63 100644 --- a/planner/core/cbo_test.go +++ b/planner/core/cbo_test.go @@ -123,12 +123,12 @@ func (s *testAnalyzeSuite) TestCBOWithoutAnalyze(c *C) { c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) c.Assert(h.Update(dom.InfoSchema()), IsNil) testKit.MustQuery("explain select * from t1, t2 where t1.a = t2.a").Check(testkit.Rows( - "HashLeftJoin_8 7.49 root inner join, inner:TableReader_15, equal:[eq(Column#1, Column#3)]", + "HashLeftJoin_8 7.49 root inner join, inner:TableReader_15, equal:[eq(test.t1.a, test.t2.a)]", "├─TableReader_12 5.99 root data:Selection_11", - "│ └─Selection_11 5.99 cop[tikv] not(isnull(Column#1))", + "│ └─Selection_11 5.99 cop[tikv] not(isnull(test.t1.a))", "│ └─TableScan_10 6.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_15 5.99 root data:Selection_14", - " └─Selection_14 5.99 cop[tikv] not(isnull(Column#3))", + " └─Selection_14 5.99 cop[tikv] not(isnull(test.t2.a))", " └─TableScan_13 6.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", )) } @@ -148,50 +148,15 @@ func (s *testAnalyzeSuite) TestStraightJoin(c *C) { testKit.MustExec(fmt.Sprintf("create table %s (a int)", tblName)) c.Assert(h.HandleDDLEvent(<-h.DDLEventCh()), IsNil) } - - testKit.MustQuery("explain select straight_join * from t1, t2, t3, t4").Check(testkit.Rows( - "HashLeftJoin_10 10000000000000000.00 root CARTESIAN inner join, inner:TableReader_23", - "├─HashLeftJoin_12 1000000000000.00 root CARTESIAN inner join, inner:TableReader_21", - "│ ├─HashLeftJoin_14 100000000.00 root CARTESIAN inner join, inner:TableReader_19", - "│ │ ├─TableReader_17 10000.00 root data:TableScan_16", - "│ │ │ └─TableScan_16 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", - "│ │ └─TableReader_19 10000.00 root data:TableScan_18", - "│ │ └─TableScan_18 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", - "│ └─TableReader_21 10000.00 root data:TableScan_20", - "│ └─TableScan_20 10000.00 cop[tikv] table:t3, range:[-inf,+inf], keep order:false, stats:pseudo", - "└─TableReader_23 10000.00 root data:TableScan_22", - " └─TableScan_22 10000.00 cop[tikv] table:t4, range:[-inf,+inf], keep order:false, stats:pseudo", - )) - - testKit.MustQuery("explain select * from t1 straight_join t2 straight_join t3 straight_join t4").Check(testkit.Rows( - "HashLeftJoin_10 10000000000000000.00 root CARTESIAN inner join, inner:TableReader_23", - "├─HashLeftJoin_12 1000000000000.00 root CARTESIAN inner join, inner:TableReader_21", - "│ ├─HashLeftJoin_14 100000000.00 root CARTESIAN inner join, inner:TableReader_19", - "│ │ ├─TableReader_17 10000.00 root data:TableScan_16", - "│ │ │ └─TableScan_16 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", - "│ │ └─TableReader_19 10000.00 root data:TableScan_18", - "│ │ └─TableScan_18 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", - "│ └─TableReader_21 10000.00 root data:TableScan_20", - "│ └─TableScan_20 10000.00 cop[tikv] table:t3, range:[-inf,+inf], keep order:false, stats:pseudo", - "└─TableReader_23 10000.00 root data:TableScan_22", - " └─TableScan_22 10000.00 cop[tikv] table:t4, range:[-inf,+inf], keep order:false, stats:pseudo", - )) - - testKit.MustQuery("explain select straight_join * from t1, t2, t3, t4 where t1.a=t4.a;").Check(testkit.Rows( - "HashLeftJoin_11 1248750000000.00 root inner join, inner:TableReader_26, equal:[eq(Column#1, Column#7)]", - "├─HashLeftJoin_13 999000000000.00 root CARTESIAN inner join, inner:TableReader_23", - "│ ├─HashRightJoin_16 99900000.00 root CARTESIAN inner join, inner:TableReader_19", - "│ │ ├─TableReader_19 9990.00 root data:Selection_18", - "│ │ │ └─Selection_18 9990.00 cop[tikv] not(isnull(Column#1))", - "│ │ │ └─TableScan_17 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", - "│ │ └─TableReader_21 10000.00 root data:TableScan_20", - "│ │ └─TableScan_20 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", - "│ └─TableReader_23 10000.00 root data:TableScan_22", - "│ └─TableScan_22 10000.00 cop[tikv] table:t3, range:[-inf,+inf], keep order:false, stats:pseudo", - "└─TableReader_26 9990.00 root data:Selection_25", - " └─Selection_25 9990.00 cop[tikv] not(isnull(Column#7))", - " └─TableScan_24 10000.00 cop[tikv] table:t4, range:[-inf,+inf], keep order:false, stats:pseudo", - )) + var input []string + var output [][]string + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) + }) + testKit.MustQuery(tt).Check(testkit.Rows(output[i]...)) + } } func (s *testAnalyzeSuite) TestTableDual(c *C) { @@ -248,9 +213,9 @@ func (s *testAnalyzeSuite) TestEstimation(c *C) { c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) c.Assert(h.Update(dom.InfoSchema()), IsNil) testKit.MustQuery("explain select count(*) from t group by a").Check(testkit.Rows( - "HashAgg_9 2.00 root group by:Column#1, funcs:count(Column#4)", + "HashAgg_9 2.00 root group by:test.t.a, funcs:count(Column#4)->Column#3", "└─TableReader_10 2.00 root data:HashAgg_5", - " └─HashAgg_5 2.00 cop[tikv] group by:Column#1, funcs:count(1)", + " └─HashAgg_5 2.00 cop[tikv] group by:test.t.a, funcs:count(1)->Column#4", " └─TableScan_8 8.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", )) } @@ -294,100 +259,11 @@ func (s *testAnalyzeSuite) TestIndexRead(c *C) { } testKit.MustExec("analyze table t1") ctx := testKit.Se.(sessionctx.Context) - tests := []struct { - sql string - best string - }{ - { - sql: "select count(*) from t group by e", - best: "IndexReader(Index(t.e)[[NULL,+inf]])->HashAgg", - }, - { - sql: "select count(*) from t where e <= 10 group by e", - best: "IndexReader(Index(t.e)[[-inf,10]]->StreamAgg)->StreamAgg", - }, - { - sql: "select count(*) from t where e <= 50", - best: "IndexReader(Index(t.e)[[-inf,50]]->StreamAgg)->StreamAgg", - }, - { - sql: "select count(*) from t where c > '1' group by b", - best: "IndexReader(Index(t.b_c)[[NULL,+inf]]->Sel([gt(Column#3, 1)]))->HashAgg", - }, - { - sql: "select count(*) from t where e = 1 group by b", - best: "IndexLookUp(Index(t.e)[[1,1]], Table(t))->HashAgg", - }, - { - sql: "select count(*) from t where e > 1 group by b", - best: "TableReader(Table(t)->Sel([gt(Column#5, 1)])->HashAgg)->HashAgg", - }, - { - sql: "select count(e) from t where t.b <= 20", - best: "IndexLookUp(Index(t.b)[[-inf,20]], Table(t)->HashAgg)->HashAgg", - }, - { - sql: "select count(e) from t where t.b <= 30", - best: "TableReader(Table(t)->Sel([le(Column#2, 30)])->StreamAgg)->StreamAgg", - }, - { - sql: "select count(e) from t where t.b <= 40", - best: "TableReader(Table(t)->Sel([le(Column#2, 40)])->StreamAgg)->StreamAgg", - }, - { - sql: "select count(e) from t where t.b <= 50", - best: "TableReader(Table(t)->Sel([le(Column#2, 50)])->StreamAgg)->StreamAgg", - }, - { - sql: "select count(e) from t where t.b <= 100000000000", - best: "TableReader(Table(t)->Sel([le(Column#2, 100000000000)])->StreamAgg)->StreamAgg", - }, - { - sql: "select * from t where t.b <= 40", - best: "TableReader(Table(t)->Sel([le(Column#2, 40)]))", - }, - { - sql: "select * from t where t.b <= 50", - best: "TableReader(Table(t)->Sel([le(Column#2, 50)]))", - }, - { - sql: "select * from t where t.b <= 10000000000", - best: "TableReader(Table(t)->Sel([le(Column#2, 10000000000)]))", - }, - // test panic - { - sql: "select * from t where 1 and t.b <= 50", - best: "TableReader(Table(t)->Sel([le(Column#2, 50)]))", - }, - { - sql: "select * from t where t.b <= 100 order by t.a limit 1", - best: "TableReader(Table(t)->Sel([le(Column#2, 100)])->Limit)->Limit", - }, - { - sql: "select * from t where t.b <= 1 order by t.a limit 10", - best: "IndexLookUp(Index(t.b)[[-inf,1]]->TopN([Column#1],0,10), Table(t))->TopN([Column#1],0,10)", - }, - { - sql: "select * from t use index(b) where b = 1 order by a", - best: "IndexLookUp(Index(t.b)[[1,1]], Table(t))", - }, - // test datetime - { - sql: "select * from t where d < cast('1991-09-05' as datetime)", - best: "IndexLookUp(Index(t.d)[[-inf,1991-09-05 00:00:00)], Table(t))", - }, - // test timestamp - { - sql: "select * from t where ts < '1991-09-05'", - best: "IndexLookUp(Index(t.ts)[[-inf,1991-09-05 00:00:00)], Table(t))", - }, - { - sql: "select sum(a) from t1 use index(idx) where a = 3 and b = 100000 group by a limit 1", - best: "IndexLookUp(Index(t1.idx)[[3,3]], Table(t1)->Sel([eq(Column#2, 100000)]))->Projection->Projection->StreamAgg->Limit", - }, - } - for _, tt := range tests { - stmts, err := session.Parse(ctx, tt.sql) + var input, output []string + s.testData.GetTestCases(c, &input, &output) + + for i, tt := range input { + stmts, err := session.Parse(ctx, tt) c.Assert(err, IsNil) c.Assert(stmts, HasLen, 1) stmt := stmts[0] @@ -396,7 +272,11 @@ func (s *testAnalyzeSuite) TestIndexRead(c *C) { c.Assert(err, IsNil) p, _, err := planner.Optimize(context.TODO(), ctx, stmt, is) c.Assert(err, IsNil) - c.Assert(core.ToString(p), Equals, tt.best, Commentf("for %s", tt.sql)) + planString := core.ToString(p) + s.testData.OnRecord(func() { + output[i] = planString + }) + c.Assert(planString, Equals, output[i], Commentf("for %s", tt)) } } @@ -414,30 +294,11 @@ func (s *testAnalyzeSuite) TestEmptyTable(c *C) { testKit.MustExec("create table t (c1 int)") testKit.MustExec("create table t1 (c1 int)") testKit.MustExec("analyze table t, t1") - tests := []struct { - sql string - best string - }{ - { - sql: "select * from t where t.c1 <= 50", - best: "TableReader(Table(t)->Sel([le(Column#1, 50)]))", - }, - { - sql: "select * from t where c1 in (select c1 from t1)", - best: "LeftHashJoin{TableReader(Table(t)->Sel([not(isnull(Column#1))]))->TableReader(Table(t1)->Sel([not(isnull(Column#3))]))->HashAgg}(Column#1,Column#3)->Projection", - }, - { - sql: "select * from t, t1 where t.c1 = t1.c1", - best: "LeftHashJoin{TableReader(Table(t)->Sel([not(isnull(Column#1))]))->TableReader(Table(t1)->Sel([not(isnull(Column#3))]))}(Column#1,Column#3)", - }, - { - sql: "select * from t limit 0", - best: "Dual", - }, - } - for _, tt := range tests { + var input, output []string + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { ctx := testKit.Se.(sessionctx.Context) - stmts, err := session.Parse(ctx, tt.sql) + stmts, err := session.Parse(ctx, tt) c.Assert(err, IsNil) c.Assert(stmts, HasLen, 1) stmt := stmts[0] @@ -446,7 +307,11 @@ func (s *testAnalyzeSuite) TestEmptyTable(c *C) { c.Assert(err, IsNil) p, _, err := planner.Optimize(context.TODO(), ctx, stmt, is) c.Assert(err, IsNil) - c.Assert(core.ToString(p), Equals, tt.best, Commentf("for %s", tt.sql)) + planString := core.ToString(p) + s.testData.OnRecord(func() { + output[i] = planString + }) + c.Assert(planString, Equals, output[i], Commentf("for %s", tt)) } } @@ -492,68 +357,12 @@ func (s *testAnalyzeSuite) TestAnalyze(c *C) { c.Assert(err.Error(), Equals, "analyze v is not supported now.") testKit.MustExec("drop view v") - tests := []struct { - sql string - best string - }{ - { - sql: "analyze table t3", - best: "Analyze{Index(a),Table(a, b)}", - }, - // Test analyze full table. - { - sql: "select * from t where t.a <= 2", - best: "TableReader(Table(t)->Sel([le(Column#1, 2)]))", - }, - { - sql: "select b from t where t.b < 2", - best: "IndexReader(Index(t.b)[[-inf,2)])", - }, - { - sql: "select * from t where t.a = 1 and t.b <= 2", - best: "TableReader(Table(t)->Sel([eq(Column#1, 1) le(Column#2, 2)]))", - }, - // Test not analyzed table. - { - sql: "select * from t1 where t1.a <= 2", - best: "TableReader(Table(t1)->Sel([le(Column#1, 2)]))", - }, - { - sql: "select * from t1 where t1.a = 1 and t1.b <= 2", - best: "IndexLookUp(Index(t1.a)[[1,1]], Table(t1)->Sel([le(Column#2, 2)]))", - }, - // Test analyze single index. - { - sql: "select * from t2 where t2.a <= 2", - best: "TableReader(Table(t2)->Sel([le(Column#1, 2)]))", - }, - // Test analyze all index. - { - sql: "analyze table t2 index", - best: "Analyze{Index(a),Index(b)}", - }, - // Test partitioned table. - { - sql: "select * from t4 where t4.a <= 2", - best: "UnionAll{TableReader(Table(t4)->Sel([le(Column#1, 2)]))->TableReader(Table(t4)->Sel([le(Column#1, 2)]))}", - }, - { - sql: "select b from t4 where t4.b < 2", - best: "UnionAll{IndexReader(Index(t4.b)[[-inf,2)])->IndexReader(Index(t4.b)[[-inf,2)])}", - }, - { - sql: "select * from t4 where t4.a = 1 and t4.b <= 2", - best: "TableReader(Table(t4)->Sel([eq(Column#1, 1) le(Column#2, 2)]))", - }, - // TODO: Refine these tests in the future. - //{ - // sql: "select * from t2 where t2.a = 1 and t2.b <= 2", - // best: "IndexLookUp(Index(t2.b)[[-inf,2]], Table(t2)->Sel([eq(test.t2.a, 1)]))", - //}, - } - for _, tt := range tests { + var input, output []string + s.testData.GetTestCases(c, &input, &output) + + for i, tt := range input { ctx := testKit.Se.(sessionctx.Context) - stmts, err := session.Parse(ctx, tt.sql) + stmts, err := session.Parse(ctx, tt) c.Assert(err, IsNil) c.Assert(stmts, HasLen, 1) stmt := stmts[0] @@ -562,7 +371,11 @@ func (s *testAnalyzeSuite) TestAnalyze(c *C) { c.Assert(err, IsNil) p, _, err := planner.Optimize(context.TODO(), ctx, stmt, is) c.Assert(err, IsNil) - c.Assert(core.ToString(p), Equals, tt.best, Commentf("for %s", tt.sql)) + planString := core.ToString(p) + s.testData.OnRecord(func() { + output[i] = planString + }) + c.Assert(planString, Equals, output[i], Commentf("for %s", tt)) } } @@ -592,13 +405,13 @@ func (s *testAnalyzeSuite) TestOutdatedAnalyze(c *C) { statistics.RatioOfPseudoEstimate.Store(10.0) testKit.MustQuery("explain select * from t where a <= 5 and b <= 5").Check(testkit.Rows( "TableReader_7 35.91 root data:Selection_6", - "└─Selection_6 35.91 cop[tikv] le(Column#1, 5), le(Column#2, 5)", + "└─Selection_6 35.91 cop[tikv] le(test.t.a, 5), le(test.t.b, 5)", " └─TableScan_5 80.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", )) statistics.RatioOfPseudoEstimate.Store(0.7) testKit.MustQuery("explain select * from t where a <= 5 and b <= 5").Check(testkit.Rows( "TableReader_7 8.84 root data:Selection_6", - "└─Selection_6 8.84 cop[tikv] le(Column#1, 5), le(Column#2, 5)", + "└─Selection_6 8.84 cop[tikv] le(test.t.a, 5), le(test.t.b, 5)", " └─TableScan_5 80.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo", )) } @@ -659,29 +472,24 @@ func (s *testAnalyzeSuite) TestNullCount(c *C) { testKit.MustExec("create table t (a int, b int, index idx(a))") testKit.MustExec("insert into t values (null, null), (null, null)") testKit.MustExec("analyze table t") - testKit.MustQuery("explain select * from t where a is null").Check(testkit.Rows( - "TableReader_7 2.00 root data:Selection_6", - "└─Selection_6 2.00 cop[tikv] isnull(Column#1)", - " └─TableScan_5 2.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", - )) - testKit.MustQuery("explain select * from t use index(idx) where a is null").Check(testkit.Rows( - "IndexLookUp_7 2.00 root ", - "├─IndexScan_5 2.00 cop[tikv] table:t, index:a, range:[NULL,NULL], keep order:false", - "└─TableScan_6 2.00 cop[tikv] table:t, keep order:false", - )) + var input []string + var output [][]string + s.testData.GetTestCases(c, &input, &output) + for i := 0; i < 2; i++ { + s.testData.OnRecord(func() { + output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) + }) + testKit.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) + } h := dom.StatsHandle() h.Clear() c.Assert(h.Update(dom.InfoSchema()), IsNil) - testKit.MustQuery("explain select * from t where b = 1").Check(testkit.Rows( - "TableReader_7 0.00 root data:Selection_6", - "└─Selection_6 0.00 cop[tikv] eq(Column#2, 1)", - " └─TableScan_5 2.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", - )) - testKit.MustQuery("explain select * from t where b < 1").Check(testkit.Rows( - "TableReader_7 0.00 root data:Selection_6", - "└─Selection_6 0.00 cop[tikv] lt(Column#2, 1)", - " └─TableScan_5 2.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", - )) + for i := 2; i < 4; i++ { + s.testData.OnRecord(func() { + output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) + }) + testKit.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) + } } func (s *testAnalyzeSuite) TestCorrelatedEstimation(c *C) { @@ -698,33 +506,18 @@ func (s *testAnalyzeSuite) TestCorrelatedEstimation(c *C) { tk.MustExec("create table t(a int, b int, c int, index idx(c,b,a))") tk.MustExec("insert into t values(1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5), (6,6,6), (7,7,7), (8,8,8), (9,9,9),(10,10,10)") tk.MustExec("analyze table t") - tk.MustQuery("explain select t.c in (select count(*) from t s , t t1 where s.a = t.a and s.a = t1.a) from t;"). - Check(testkit.Rows( - "Projection_11 10.00 root Column#14", - "└─Apply_13 10.00 root CARTESIAN left outer semi join, inner:StreamAgg_22, other cond:eq(Column#3, Column#13)", - " ├─TableReader_15 10.00 root data:TableScan_14", - " │ └─TableScan_14 10.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", - " └─StreamAgg_22 1.00 root funcs:count(1)", - " └─HashLeftJoin_23 1.00 root inner join, inner:TableReader_33, equal:[eq(Column#5, Column#9)]", - " ├─TableReader_27 1.00 root data:Selection_26", - " │ └─Selection_26 1.00 cop[tikv] eq(Column#5, Column#1), not(isnull(Column#5))", - " │ └─TableScan_25 10.00 cop[tikv] table:s, range:[-inf,+inf], keep order:false", - " └─TableReader_33 1.00 root data:Selection_32", - " └─Selection_32 1.00 cop[tikv] eq(Column#9, Column#1), not(isnull(Column#9))", - " └─TableScan_31 10.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false", - )) - tk.MustQuery("explain select (select concat(t1.a, \",\", t1.b) from t t1 where t1.a=t.a and t1.c=t.c) from t"). - Check(testkit.Rows( - "Projection_8 10.00 root Column#9", - "└─Apply_10 10.00 root CARTESIAN left outer join, inner:MaxOneRow_15", - " ├─TableReader_12 10.00 root data:TableScan_11", - " │ └─TableScan_11 10.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", - " └─MaxOneRow_15 1.00 root ", - " └─Projection_16 0.10 root concat(cast(Column#5), \",\", cast(Column#6))", - " └─IndexReader_19 0.10 root index:Selection_18", - " └─Selection_18 0.10 cop[tikv] eq(Column#5, Column#1)", - " └─IndexScan_17 1.00 cop[tikv] table:t1, index:c, b, a, range: decided by [eq(Column#7, Column#3)], keep order:false", - )) + var ( + input []string + output [][]string + ) + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + rs := tk.MustQuery(tt) + s.testData.OnRecord(func() { + output[i] = s.testData.ConvertRowsToStrings(rs.Rows()) + }) + rs.Check(testkit.Rows(output[i]...)) + } } func (s *testAnalyzeSuite) TestInconsistentEstimation(c *C) { @@ -753,7 +546,7 @@ func (s *testAnalyzeSuite) TestInconsistentEstimation(c *C) { Check(testkit.Rows( "IndexLookUp_8 10.00 root ", "├─IndexScan_5 12.50 cop[tikv] table:t, index:a, b, range:[5,5], keep order:false", - "└─Selection_7 10.00 cop[tikv] eq(Column#3, 5)", + "└─Selection_7 10.00 cop[tikv] eq(test.t.c, 5)", " └─TableScan_6 12.50 cop[tikv] table:t, keep order:false", )) } @@ -1038,22 +831,21 @@ func (s *testAnalyzeSuite) TestTiFlashCostModel(c *C) { // Set the hacked TiFlash replica for explain tests. tbl.Meta().TiFlashReplica = &model.TiFlashReplicaInfo{Count: 1, Available: true} - tk.MustQuery("desc select * from t").Check(testkit.Rows( - "TableReader_7 10000.00 root data:TableScan_6", - "└─TableScan_6 10000.00 cop[tiflash] table:t, range:[-inf,+inf], keep order:false, stats:pseudo", - )) - tk.MustQuery("desc select /*+ read_from_storage(tikv[t]) */ * from t").Check(testkit.Rows( - "TableReader_5 10000.00 root data:TableScan_4", - "└─TableScan_4 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo", - )) - tk.MustQuery("desc select * from t where t.a = 1 or t.a = 2").Check(testkit.Rows( - "TableReader_6 2.00 root data:TableScan_5", - "└─TableScan_5 2.00 cop[tikv] table:t, range:[1,1], [2,2], keep order:false, stats:pseudo", - )) - tk.MustExec("set @@session.tidb_isolation_read_engines='tiflash'") - tk.MustQuery("desc select * from t where t.a = 1 or t.a = 2").Check(testkit.Rows( - "TableReader_7 2.00 root data:Selection_6", - "└─Selection_6 2.00 cop[tiflash] or(eq(Column#1, 1), eq(Column#1, 2))", - " └─TableScan_5 2.00 cop[tiflash] table:t, range:[-inf,+inf], keep order:false, stats:pseudo", - )) + var input, output [][]string + s.testData.GetTestCases(c, &input, &output) + for i, ts := range input { + for j, tt := range ts { + if j != len(ts)-1 { + tk.MustExec(tt) + } + s.testData.OnRecord(func() { + if j == len(ts)-1 { + output[i] = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + } + }) + if j == len(ts)-1 { + tk.MustQuery(tt).Check(testkit.Rows(output[i]...)) + } + } + } } diff --git a/planner/core/explain.go b/planner/core/explain.go index 4d603644b8908..d53cb3c104d10 100644 --- a/planner/core/explain.go +++ b/planner/core/explain.go @@ -16,6 +16,7 @@ package core import ( "bytes" "fmt" + "strings" "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/expression" @@ -172,7 +173,7 @@ func (p *PhysicalSelection) ExplainInfo() string { // ExplainInfo implements Plan interface. func (p *PhysicalProjection) ExplainInfo() string { - return string(expression.ExplainExpressionList(p.Exprs)) + return expression.ExplainExpressionList(p.Exprs, p.schema) } // ExplainInfo implements Plan interface. @@ -193,21 +194,19 @@ func (p *PhysicalLimit) ExplainInfo() string { // ExplainInfo implements Plan interface. func (p *basePhysicalAgg) ExplainInfo() string { - buffer := bytes.NewBufferString("") + builder := &strings.Builder{} if len(p.GroupByItems) > 0 { - fmt.Fprintf(buffer, "group by:%s, ", + fmt.Fprintf(builder, "group by:%s, ", expression.SortedExplainExpressionList(p.GroupByItems)) } - if len(p.AggFuncs) > 0 { - buffer.WriteString("funcs:") - for i, agg := range p.AggFuncs { - buffer.WriteString(aggregation.ExplainAggFunc(agg)) - if i+1 < len(p.AggFuncs) { - buffer.WriteString(", ") - } + for i := 0; i < len(p.AggFuncs); i++ { + builder.WriteString("funcs:") + fmt.Fprintf(builder, "%v->%v", aggregation.ExplainAggFunc(p.AggFuncs[i]), p.schema.Columns[i]) + if i+1 < len(p.AggFuncs) { + builder.WriteString(", ") } } - return buffer.String() + return builder.String() } // ExplainInfo implements Plan interface. @@ -335,7 +334,7 @@ func (p *PhysicalWindow) formatFrameBound(buffer *bytes.Buffer, bound *FrameBoun // ExplainInfo implements Plan interface. func (p *PhysicalWindow) ExplainInfo() string { buffer := bytes.NewBufferString("") - formatWindowFuncDescs(buffer, p.WindowFuncDescs) + formatWindowFuncDescs(buffer, p.WindowFuncDescs, p.schema) buffer.WriteString(" over(") isFirst := true if len(p.PartitionBy) > 0 { @@ -383,12 +382,13 @@ func (p *PhysicalWindow) ExplainInfo() string { return buffer.String() } -func formatWindowFuncDescs(buffer *bytes.Buffer, descs []*aggregation.WindowFuncDesc) *bytes.Buffer { +func formatWindowFuncDescs(buffer *bytes.Buffer, descs []*aggregation.WindowFuncDesc, schema *expression.Schema) *bytes.Buffer { + winFuncStartIdx := len(schema.Columns) - len(descs) for i, desc := range descs { if i != 0 { buffer.WriteString(", ") } - buffer.WriteString(desc.String()) + fmt.Fprintf(buffer, "%v->%v", desc, schema.Columns[winFuncStartIdx+i]) } return buffer } @@ -435,7 +435,7 @@ func (p *LogicalAggregation) ExplainInfo() string { // ExplainInfo implements Plan interface. func (p *LogicalProjection) ExplainInfo() string { - return string(expression.ExplainExpressionList(p.Exprs)) + return expression.ExplainExpressionList(p.Exprs, p.schema) } // ExplainInfo implements Plan interface. diff --git a/planner/core/indexmerge_test.go b/planner/core/indexmerge_test.go index 5979c3df8436e..bdbc86001c58f 100644 --- a/planner/core/indexmerge_test.go +++ b/planner/core/indexmerge_test.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/testleak" + "github.com/pingcap/tidb/util/testutil" ) var _ = Suite(&testIndexMergeSuite{}) @@ -31,12 +32,21 @@ type testIndexMergeSuite struct { is infoschema.InfoSchema ctx sessionctx.Context + + testdata testutil.TestData } func (s *testIndexMergeSuite) SetUpSuite(c *C) { s.is = infoschema.MockInfoSchema([]*model.TableInfo{MockSignedTable(), MockView()}) s.ctx = MockContext() s.Parser = parser.New() + var err error + s.testdata, err = testutil.LoadTestSuiteData("testdata", "index_merge_suite") + c.Assert(err, IsNil) +} + +func (s *testIndexMergeSuite) TearDownSuite(c *C) { + c.Assert(s.testdata.GenerateOutputIfNeeded(), IsNil) } func getIndexMergePathDigest(paths []*accessPath, startIndex int) string { @@ -69,51 +79,23 @@ func getIndexMergePathDigest(paths []*accessPath, startIndex int) string { return idxMergeDisgest } -func (s *testIndexMergeSuite) TestIndexMergePathGenerateion(c *C) { +func (s *testIndexMergeSuite) TestIndexMergePathGeneration(c *C) { defer testleak.AfterTest(c)() - tests := []struct { - sql string - idxMergeDigest string - }{ - { - sql: "select * from t", - idxMergeDigest: "[]", - }, - { - sql: "select * from t where c < 1", - idxMergeDigest: "[]", - }, - { - sql: "select * from t where c < 1 or f > 2", - idxMergeDigest: "[{Idxs:[c_d_e,f_g],TbFilters:[]}]", - }, - { - sql: "select * from t where (c < 1 or f > 2) and (c > 5 or f < 7)", - idxMergeDigest: "[{Idxs:[c_d_e,f_g],TbFilters:[or(gt(Column#3, 5), lt(Column#9, 7))]}," + - "{Idxs:[c_d_e,f_g],TbFilters:[or(lt(Column#3, 1), gt(Column#9, 2))]}]", - }, - { - sql: "select * from t where (c < 1 or f > 2) and (c > 5 or f < 7) and (c < 1 or g > 2)", - idxMergeDigest: "[{Idxs:[c_d_e,f_g],TbFilters:[or(gt(Column#3, 5), lt(Column#9, 7)),or(lt(Column#3, 1), gt(Column#10, 2))]}," + - "{Idxs:[c_d_e,f_g],TbFilters:[or(lt(Column#3, 1), gt(Column#9, 2)),or(lt(Column#3, 1), gt(Column#10, 2))]}," + - "{Idxs:[c_d_e,g],TbFilters:[or(lt(Column#3, 1), gt(Column#9, 2)),or(gt(Column#3, 5), lt(Column#9, 7))]}]", - }, - { - sql: "select * from t where (c < 1 or f > 2) and (c > 5 or f < 7) and (e < 1 or f > 2)", - idxMergeDigest: "[{Idxs:[c_d_e,f_g],TbFilters:[or(gt(Column#3, 5), lt(Column#9, 7)),or(lt(Column#5, 1), gt(Column#9, 2))]}," + - "{Idxs:[c_d_e,f_g],TbFilters:[or(lt(Column#3, 1), gt(Column#9, 2)),or(lt(Column#5, 1), gt(Column#9, 2))]}]", - }, - } + var input, output []string + s.testdata.GetTestCases(c, &input, &output) ctx := context.TODO() - for i, tc := range tests { - comment := Commentf("case:%v sql:%s", i, tc.sql) - stmt, err := s.ParseOneStmt(tc.sql, "", "") + for i, tc := range input { + comment := Commentf("case:%v sql:%s", i, tc) + stmt, err := s.ParseOneStmt(tc, "", "") c.Assert(err, IsNil, comment) Preprocess(s.ctx, stmt, s.is) builder := NewPlanBuilder(MockContext(), s.is, &BlockHintProcessor{}) p, err := builder.Build(ctx, stmt) if err != nil { - c.Assert(err.Error(), Equals, tc.idxMergeDigest, comment) + s.testdata.OnRecord(func() { + output[i] = err.Error() + }) + c.Assert(err.Error(), Equals, output[i], comment) continue } c.Assert(err, IsNil) @@ -134,6 +116,10 @@ func (s *testIndexMergeSuite) TestIndexMergePathGenerateion(c *C) { idxMergeStartIndex := len(ds.possibleAccessPaths) _, err = lp.recursiveDeriveStats() c.Assert(err, IsNil) - c.Assert(getIndexMergePathDigest(ds.possibleAccessPaths, idxMergeStartIndex), Equals, tc.idxMergeDigest, comment) + result := getIndexMergePathDigest(ds.possibleAccessPaths, idxMergeStartIndex) + s.testdata.OnRecord(func() { + output[i] = result + }) + c.Assert(result, Equals, output[i], comment) } } diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 2b262d45dfe1d..25477a1998877 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -2435,6 +2435,7 @@ func (ds *DataSource) newExtraHandleSchemaCol() *expression.Column { RetType: types.NewFieldType(mysql.TypeLonglong), UniqueID: ds.ctx.GetSessionVars().AllocPlanColumnID(), ID: model.ExtraHandleID, + OrigName: fmt.Sprintf("%v.%v.%v", ds.DBName, ds.tableInfo.Name, model.ExtraHandleName), } } @@ -2569,7 +2570,7 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as var handleCol *expression.Column schema := expression.NewSchema(make([]*expression.Column, 0, len(columns))...) names := make([]*types.FieldName, 0, len(columns)) - for _, col := range columns { + for i, col := range columns { ds.Columns = append(ds.Columns, col.ToInfo()) names = append(names, &types.FieldName{ DBName: dbName, @@ -2582,6 +2583,7 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as UniqueID: b.ctx.GetSessionVars().AllocPlanColumnID(), ID: col.ID, RetType: &col.FieldType, + OrigName: names[i].String(), } if tableInfo.PKIsHandle && mysql.HasPriKeyFlag(col.Flag) { diff --git a/planner/core/logical_plan_test.go b/planner/core/logical_plan_test.go index 43130441ea04b..79a1dd565c86f 100644 --- a/planner/core/logical_plan_test.go +++ b/planner/core/logical_plan_test.go @@ -89,90 +89,19 @@ func (s *testPlanSuite) TestPredicatePushDown(c *C) { func (s *testPlanSuite) TestJoinPredicatePushDown(c *C) { defer testleak.AfterTest(c)() - tests := []struct { - sql string - left string - right string - }{ - // issue #7628, inner join - { - sql: "select * from t as t1 join t as t2 on t1.b = t2.b where t1.a > t2.a", - left: "[]", - right: "[]", - }, - { - sql: "select * from t as t1 join t as t2 on t1.b = t2.b where t1.a=1 or t2.a=1", - left: "[]", - right: "[]", - }, - { - sql: "select * from t as t1 join t as t2 on t1.b = t2.b where (t1.a=1 and t2.a=1) or (t1.a=2 and t2.a=2)", - left: "[or(eq(Column#1, 1), eq(Column#1, 2))]", - right: "[or(eq(Column#13, 1), eq(Column#13, 2))]", - }, - { - sql: "select * from t as t1 join t as t2 on t1.b = t2.b where (t1.c=1 and (t1.a=3 or t2.a=3)) or (t1.a=2 and t2.a=2)", - left: "[or(eq(Column#3, 1), eq(Column#1, 2))]", - right: "[]", - }, - { - sql: "select * from t as t1 join t as t2 on t1.b = t2.b where (t1.c=1 and ((t1.a=3 and t2.a=3) or (t1.a=4 and t2.a=4)))", - left: "[eq(Column#3, 1) or(eq(Column#1, 3), eq(Column#1, 4))]", - right: "[or(eq(Column#13, 3), eq(Column#13, 4))]", - }, - { - sql: "select * from t as t1 join t as t2 on t1.b = t2.b where (t1.a>1 and t1.a < 3 and t2.a=1) or (t1.a=2 and t2.a=2)", - left: "[or(and(gt(Column#1, 1), lt(Column#1, 3)), eq(Column#1, 2))]", - right: "[or(eq(Column#13, 1), eq(Column#13, 2))]", - }, - { - sql: "select * from t as t1 join t as t2 on t1.b = t2.b and ((t1.a=1 and t2.a=1) or (t1.a=2 and t2.a=2))", - left: "[or(eq(Column#1, 1), eq(Column#1, 2))]", - right: "[or(eq(Column#13, 1), eq(Column#13, 2))]", - }, - // issue #7628, left join - { - sql: "select * from t as t1 left join t as t2 on t1.b = t2.b and ((t1.a=1 and t2.a=1) or (t1.a=2 and t2.a=2))", - left: "[]", - right: "[or(eq(Column#13, 1), eq(Column#13, 2))]", - }, - { - sql: "select * from t as t1 left join t as t2 on t1.b = t2.b and t1.a > t2.a", - left: "[]", - right: "[]", - }, - { - sql: "select * from t as t1 left join t as t2 on t1.b = t2.b and (t1.a=1 or t2.a=1)", - left: "[]", - right: "[]", - }, - { - sql: "select * from t as t1 left join t as t2 on t1.b = t2.b and ((t1.c=1 and (t1.a=3 or t2.a=3)) or (t1.a=2 and t2.a=2))", - left: "[]", - right: "[]", - }, - { - sql: "select * from t as t1 left join t as t2 on t1.b = t2.b and ((t2.c=1 and (t1.a=3 or t2.a=3)) or (t1.a=2 and t2.a=2))", - left: "[]", - right: "[or(eq(Column#15, 1), eq(Column#13, 2))]", - }, - { - sql: "select * from t as t1 left join t as t2 on t1.b = t2.b and ((t1.c=1 and ((t1.a=3 and t2.a=3) or (t1.a=4 and t2.a=4))) or (t1.a=2 and t2.a=2))", - left: "[]", - right: "[or(or(eq(Column#13, 3), eq(Column#13, 4)), eq(Column#13, 2))]", - }, - // Duplicate condition would be removed. - { - sql: "select * from t t1 join t t2 on t1.a > 1 and t1.a > 1", - left: "[gt(Column#1, 1)]", - right: "[]", - }, - } + var ( + input []string + output []struct { + Left string + Right string + } + ) + s.testData.GetTestCases(c, &input, &output) ctx := context.Background() - for _, ca := range tests { - comment := Commentf("for %s", ca.sql) - stmt, err := s.ParseOneStmt(ca.sql, "", "") + for i, ca := range input { + comment := Commentf("for %s", ca) + stmt, err := s.ParseOneStmt(ca, "", "") c.Assert(err, IsNil, comment) p, _, err := BuildLogicalPlan(ctx, s.ctx, stmt, s.is) c.Assert(err, IsNil, comment) @@ -188,44 +117,30 @@ func (s *testPlanSuite) TestJoinPredicatePushDown(c *C) { c.Assert(ok, IsTrue, comment) leftCond := fmt.Sprintf("%s", leftPlan.pushedDownConds) rightCond := fmt.Sprintf("%s", rightPlan.pushedDownConds) - c.Assert(leftCond, Equals, ca.left, comment) - c.Assert(rightCond, Equals, ca.right, comment) + s.testData.OnRecord(func() { + output[i].Left, output[i].Right = leftCond, rightCond + }) + c.Assert(leftCond, Equals, output[i].Left, comment) + c.Assert(rightCond, Equals, output[i].Right, comment) } } func (s *testPlanSuite) TestOuterWherePredicatePushDown(c *C) { defer testleak.AfterTest(c)() - tests := []struct { - sql string - sel string - left string - right string - }{ - // issue #7628, left join with where condition - { - sql: "select * from t as t1 left join t as t2 on t1.b = t2.b where (t1.a=1 and t2.a is null) or (t1.a=2 and t2.a=2)", - sel: "[or(and(eq(Column#1, 1), isnull(Column#13)), and(eq(Column#1, 2), eq(Column#13, 2)))]", - left: "[or(eq(Column#1, 1), eq(Column#1, 2))]", - right: "[]", - }, - { - sql: "select * from t as t1 left join t as t2 on t1.b = t2.b where (t1.c=1 and (t1.a=3 or t2.a=3)) or (t1.a=2 and t2.a=2)", - sel: "[or(and(eq(Column#3, 1), or(eq(Column#1, 3), eq(Column#13, 3))), and(eq(Column#1, 2), eq(Column#13, 2)))]", - left: "[or(eq(Column#3, 1), eq(Column#1, 2))]", - right: "[]", - }, - { - sql: "select * from t as t1 left join t as t2 on t1.b = t2.b where (t1.c=1 and ((t1.a=3 and t2.a=3) or (t1.a=4 and t2.a=4))) or (t1.a=2 and t2.a is null)", - sel: "[or(and(eq(Column#3, 1), or(and(eq(Column#1, 3), eq(Column#13, 3)), and(eq(Column#1, 4), eq(Column#13, 4)))), and(eq(Column#1, 2), isnull(Column#13)))]", - left: "[or(and(eq(Column#3, 1), or(eq(Column#1, 3), eq(Column#1, 4))), eq(Column#1, 2))]", - right: "[]", - }, - } + var ( + input []string + output []struct { + Sel string + Left string + Right string + } + ) + s.testData.GetTestCases(c, &input, &output) ctx := context.Background() - for _, ca := range tests { - comment := Commentf("for %s", ca.sql) - stmt, err := s.ParseOneStmt(ca.sql, "", "") + for i, ca := range input { + comment := Commentf("for %s", ca) + stmt, err := s.ParseOneStmt(ca, "", "") c.Assert(err, IsNil, comment) p, _, err := BuildLogicalPlan(ctx, s.ctx, stmt, s.is) c.Assert(err, IsNil, comment) @@ -236,7 +151,10 @@ func (s *testPlanSuite) TestOuterWherePredicatePushDown(c *C) { selection, ok := proj.children[0].(*LogicalSelection) c.Assert(ok, IsTrue, comment) selCond := fmt.Sprintf("%s", selection.Conditions) - c.Assert(selCond, Equals, ca.sel, comment) + s.testData.OnRecord(func() { + output[i].Sel = selCond + }) + c.Assert(selCond, Equals, output[i].Sel, comment) join, ok := selection.children[0].(*LogicalJoin) c.Assert(ok, IsTrue, comment) leftPlan, ok := join.children[0].(*DataSource) @@ -245,66 +163,48 @@ func (s *testPlanSuite) TestOuterWherePredicatePushDown(c *C) { c.Assert(ok, IsTrue, comment) leftCond := fmt.Sprintf("%s", leftPlan.pushedDownConds) rightCond := fmt.Sprintf("%s", rightPlan.pushedDownConds) - c.Assert(leftCond, Equals, ca.left, comment) - c.Assert(rightCond, Equals, ca.right, comment) + s.testData.OnRecord(func() { + output[i].Left, output[i].Right = leftCond, rightCond + }) + c.Assert(leftCond, Equals, output[i].Left, comment) + c.Assert(rightCond, Equals, output[i].Right, comment) } } func (s *testPlanSuite) TestSimplifyOuterJoin(c *C) { defer testleak.AfterTest(c)() - tests := []struct { - sql string - best string - joinType string - }{ - { - sql: "select * from t t1 left join t t2 on t1.b = t2.b where t1.c > 1 or t2.c > 1;", - best: "Join{DataScan(t1)->DataScan(t2)}(Column#2,Column#14)->Sel([or(gt(Column#3, 1), gt(Column#15, 1))])->Projection", - joinType: "left outer join", - }, - { - sql: "select * from t t1 left join t t2 on t1.b = t2.b where t1.c > 1 and t2.c > 1;", - best: "Join{DataScan(t1)->DataScan(t2)}(Column#2,Column#14)->Projection", - joinType: "inner join", - }, - { - sql: "select * from t t1 left join t t2 on t1.b = t2.b where not (t1.c > 1 or t2.c > 1);", - best: "Join{DataScan(t1)->DataScan(t2)}(Column#2,Column#14)->Projection", - joinType: "inner join", - }, - { - sql: "select * from t t1 left join t t2 on t1.b = t2.b where not (t1.c > 1 and t2.c > 1);", - best: "Join{DataScan(t1)->DataScan(t2)}(Column#2,Column#14)->Sel([not(and(gt(Column#3, 1), gt(Column#15, 1)))])->Projection", - joinType: "left outer join", - }, - { - sql: "select * from t t1 left join t t2 on t1.b > 1 where t1.c = t2.c;", - best: "Join{DataScan(t1)->DataScan(t2)}(Column#3,Column#15)->Projection", - joinType: "inner join", - }, - { - sql: "select * from t t1 left join t t2 on true where t1.b <=> t2.b;", - best: "Join{DataScan(t1)->DataScan(t2)}->Sel([nulleq(Column#2, Column#14)])->Projection", - joinType: "left outer join", - }, - } + var ( + input []string + output []struct { + Best string + JoinType string + } + ) + s.testData.GetTestCases(c, &input, &output) ctx := context.Background() - for _, ca := range tests { - comment := Commentf("for %s", ca.sql) - stmt, err := s.ParseOneStmt(ca.sql, "", "") + for i, ca := range input { + comment := Commentf("for %s", ca) + stmt, err := s.ParseOneStmt(ca, "", "") c.Assert(err, IsNil, comment) p, _, err := BuildLogicalPlan(ctx, s.ctx, stmt, s.is) c.Assert(err, IsNil, comment) p, err = logicalOptimize(context.TODO(), flagPredicatePushDown|flagPrunColumns, p.(LogicalPlan)) c.Assert(err, IsNil, comment) - c.Assert(ToString(p), Equals, ca.best, comment) + planString := ToString(p) + s.testData.OnRecord(func() { + output[i].Best = planString + }) + c.Assert(planString, Equals, output[i].Best, comment) join, ok := p.(LogicalPlan).Children()[0].(*LogicalJoin) if !ok { join, ok = p.(LogicalPlan).Children()[0].Children()[0].(*LogicalJoin) c.Assert(ok, IsTrue, comment) } - c.Assert(join.JoinType.String(), Equals, ca.joinType, comment) + s.testData.OnRecord(func() { + output[i].JoinType = join.JoinType.String() + }) + c.Assert(join.JoinType.String(), Equals, output[i].JoinType, comment) } } @@ -317,7 +217,7 @@ func (s *testPlanSuite) TestAntiSemiJoinConstFalse(c *C) { }{ { sql: "select a from t t1 where not exists (select a from t t2 where t1.a = t2.a and t2.b = 1 and t2.b = 2)", - best: "Join{DataScan(t1)->DataScan(t2)}(Column#1,Column#13)->Projection", + best: "Join{DataScan(t1)->DataScan(t2)}(test.t.a,test.t.a)->Projection", joinType: "anti semi join", }, } @@ -339,111 +239,39 @@ func (s *testPlanSuite) TestAntiSemiJoinConstFalse(c *C) { func (s *testPlanSuite) TestDeriveNotNullConds(c *C) { defer testleak.AfterTest(c)() - tests := []struct { - sql string - plan string - left string - right string - }{ - { - sql: "select * from t t1 inner join t t2 on t1.e = t2.e", - plan: "Join{DataScan(t1)->DataScan(t2)}(Column#5,Column#17)->Projection", - left: "[not(isnull(Column#5))]", - right: "[not(isnull(Column#17))]", - }, - { - sql: "select * from t t1 inner join t t2 on t1.e > t2.e", - plan: "Join{DataScan(t1)->DataScan(t2)}->Projection", - left: "[not(isnull(Column#5))]", - right: "[not(isnull(Column#17))]", - }, - { - sql: "select * from t t1 inner join t t2 on t1.e = t2.e and t1.e is not null", - plan: "Join{DataScan(t1)->DataScan(t2)}(Column#5,Column#17)->Projection", - left: "[not(isnull(Column#5))]", - right: "[not(isnull(Column#17))]", - }, - { - sql: "select * from t t1 left join t t2 on t1.e = t2.e", - plan: "Join{DataScan(t1)->DataScan(t2)}(Column#5,Column#17)->Projection", - left: "[]", - right: "[not(isnull(Column#17))]", - }, - { - sql: "select * from t t1 left join t t2 on t1.e > t2.e", - plan: "Join{DataScan(t1)->DataScan(t2)}->Projection", - left: "[]", - right: "[not(isnull(Column#17))]", - }, - { - sql: "select * from t t1 left join t t2 on t1.e = t2.e and t2.e is not null", - plan: "Join{DataScan(t1)->DataScan(t2)}(Column#5,Column#17)->Projection", - left: "[]", - right: "[not(isnull(Column#17))]", - }, - { - sql: "select * from t t1 right join t t2 on t1.e = t2.e and t1.e is not null", - plan: "Join{DataScan(t1)->DataScan(t2)}(Column#5,Column#17)->Projection", - left: "[not(isnull(Column#5))]", - right: "[]", - }, - { - sql: "select * from t t1 inner join t t2 on t1.e <=> t2.e", - plan: "Join{DataScan(t1)->DataScan(t2)}->Projection", - left: "[]", - right: "[]", - }, - { - sql: "select * from t t1 left join t t2 on t1.e <=> t2.e", - plan: "Join{DataScan(t1)->DataScan(t2)}->Projection", - left: "[]", - right: "[]", - }, - // Not deriving if column has NotNull flag already. - { - sql: "select * from t t1 inner join t t2 on t1.b = t2.b", - plan: "Join{DataScan(t1)->DataScan(t2)}(Column#2,Column#14)->Projection", - left: "[]", - right: "[]", - }, - { - sql: "select * from t t1 left join t t2 on t1.b = t2.b", - plan: "Join{DataScan(t1)->DataScan(t2)}(Column#2,Column#14)->Projection", - left: "[]", - right: "[]", - }, - { - sql: "select * from t t1 left join t t2 on t1.b > t2.b", - plan: "Join{DataScan(t1)->DataScan(t2)}->Projection", - left: "[]", - right: "[]", - }, - // Not deriving for AntiSemiJoin - { - sql: "select * from t t1 where not exists (select * from t t2 where t2.e = t1.e)", - plan: "Join{DataScan(t1)->DataScan(t2)}(Column#5,Column#17)->Projection", - left: "[]", - right: "[]", - }, - } + var ( + input []string + output []struct { + Plan string + Left string + Right string + } + ) + s.testData.GetTestCases(c, &input, &output) ctx := context.Background() - for _, ca := range tests { - comment := Commentf("for %s", ca.sql) - stmt, err := s.ParseOneStmt(ca.sql, "", "") + for i, ca := range input { + comment := Commentf("for %s", ca) + stmt, err := s.ParseOneStmt(ca, "", "") c.Assert(err, IsNil, comment) p, _, err := BuildLogicalPlan(ctx, s.ctx, stmt, s.is) c.Assert(err, IsNil, comment) p, err = logicalOptimize(context.TODO(), flagPredicatePushDown|flagPrunColumns|flagDecorrelate, p.(LogicalPlan)) c.Assert(err, IsNil, comment) - c.Assert(ToString(p), Equals, ca.plan, comment) + s.testData.OnRecord(func() { + output[i].Plan = ToString(p) + }) + c.Assert(ToString(p), Equals, output[i].Plan, comment) join := p.(LogicalPlan).Children()[0].(*LogicalJoin) left := join.Children()[0].(*DataSource) right := join.Children()[1].(*DataSource) leftConds := fmt.Sprintf("%s", left.pushedDownConds) rightConds := fmt.Sprintf("%s", right.pushedDownConds) - c.Assert(leftConds, Equals, ca.left, comment) - c.Assert(rightConds, Equals, ca.right, comment) + s.testData.OnRecord(func() { + output[i].Left, output[i].Right = leftConds, rightConds + }) + c.Assert(leftConds, Equals, output[i].Left, comment) + c.Assert(rightConds, Equals, output[i].Right, comment) } } @@ -530,7 +358,7 @@ func (s *testPlanSuite) TestDupRandJoinCondsPushDown(c *C) { c.Assert(ok, IsTrue, comment) leftCond := fmt.Sprintf("%s", leftPlan.Conditions) // Condition with mutable function cannot be de-duplicated when push down join conds. - c.Assert(leftCond, Equals, "[gt(cast(Column#1), rand()) gt(cast(Column#1), rand())]", comment) + c.Assert(leftCond, Equals, "[gt(cast(test.t.a), rand()) gt(cast(test.t.a), rand())]", comment) } func (s *testPlanSuite) TestTablePartition(c *C) { @@ -567,81 +395,34 @@ func (s *testPlanSuite) TestTablePartition(c *C) { definitions1 := make([]model.PartitionDefinition, len(definitions)-1) copy(definitions1, definitions) is1 := MockPartitionInfoSchema(definitions1) + isChoices := []infoschema.InfoSchema{is, is1} - tests := []struct { - sql string - first string - best string - is infoschema.InfoSchema - }{ - { - sql: "select * from t", - best: "UnionAll{Partition(41)->Partition(42)->Partition(43)->Partition(44)->Partition(45)}->Projection", - is: is, - }, - { - sql: "select * from t where t.ptn < 31", - best: "UnionAll{Partition(41)->Partition(42)}->Projection", - is: is, - }, - { - sql: "select * from t where t.ptn < 61", - best: "UnionAll{Partition(41)->Partition(42)->Partition(43)}->Projection", - is: is, - }, - { - sql: "select * from t where t.ptn > 17 and t.ptn < 61", - best: "UnionAll{Partition(42)->Partition(43)}->Projection", - is: is, - }, - { - sql: "select * from t where t.ptn > 17 and t.ptn < 61 union all select * from t where t.ptn > 17 and t.ptn < 61 ", - best: "UnionAll{UnionAll{Partition(42)->Partition(43)}->Projection->Projection->UnionAll{Partition(42)->Partition(43)}->Projection->Projection}", - is: is, - }, - { - sql: "select ptn from t where t.ptn > 17 and t.ptn < 61 union all select ptn from t where t.ptn > 17 and t.ptn < 61 ", - best: "UnionAll{UnionAll{Partition(42)->Partition(43)}->Projection->Projection->UnionAll{Partition(42)->Partition(43)}->Projection->Projection}", - is: is, - }, - { - sql: "select * from t where t.ptn < 8", - best: "Partition(41)->Projection", - is: is, - }, - { - sql: "select * from t where t.ptn > 128", - best: "Partition(45)->Projection", - is: is, - }, - { - sql: "select * from t where t.ptn > 128", - best: "Dual->Projection", - is: is1, - }, - { - // NULL will be located in the first partition. - sql: "select * from t where t.ptn is null", - best: "Partition(41)->Projection", - is: is, - }, - { - sql: "select * from t where t.ptn is null or t.ptn > 70", - best: "UnionAll{Partition(41)->Partition(44)}->Projection", - is: is1, - }, - } + var ( + input []struct { + SQL string + IsIdx int + } + output []string + ) + s.testData.GetTestCases(c, &input, &output) ctx := context.Background() - for _, ca := range tests { - comment := Commentf("for %s", ca.sql) - stmt, err := s.ParseOneStmt(ca.sql, "", "") + for i, ca := range input { + comment := Commentf("for %s", ca.SQL) + stmt, err := s.ParseOneStmt(ca.SQL, "", "") c.Assert(err, IsNil, comment) - p, _, err := BuildLogicalPlan(ctx, s.ctx, stmt, ca.is) + s.testData.OnRecord(func() { + + }) + p, _, err := BuildLogicalPlan(ctx, s.ctx, stmt, isChoices[ca.IsIdx]) c.Assert(err, IsNil) p, err = logicalOptimize(context.TODO(), flagDecorrelate|flagPrunColumns|flagPredicatePushDown|flagPartitionProcessor, p.(LogicalPlan)) c.Assert(err, IsNil) - c.Assert(ToString(p), Equals, ca.best, Commentf("for %s", ca.sql)) + planString := ToString(p) + s.testData.OnRecord(func() { + output[i] = planString + }) + c.Assert(ToString(p), Equals, output[i], Commentf("for %s", ca)) } } @@ -697,47 +478,24 @@ func (s *testPlanSuite) TestPlanBuilder(c *C) { func (s *testPlanSuite) TestJoinReOrder(c *C) { defer testleak.AfterTest(c)() - tests := []struct { - sql string - best string - }{ - { - sql: "select * from t t1, t t2, t t3, t t4, t t5, t t6 where t1.a = t2.b and t2.a = t3.b and t3.c = t4.a and t4.d = t2.c and t5.d = t6.d", - best: "Join{Join{Join{Join{DataScan(t1)->DataScan(t2)}(Column#1,Column#14)->DataScan(t3)}(Column#13,Column#26)->DataScan(t4)}(Column#27,Column#37)(Column#15,Column#40)->Join{DataScan(t5)->DataScan(t6)}(Column#52,Column#64)}->Projection", - }, - { - sql: "select * from t t1, t t2, t t3, t t4, t t5, t t6, t t7, t t8 where t1.a = t8.a", - best: "Join{Join{Join{Join{DataScan(t1)->DataScan(t8)}(Column#1,Column#85)->DataScan(t2)}->Join{DataScan(t3)->DataScan(t4)}}->Join{Join{DataScan(t5)->DataScan(t6)}->DataScan(t7)}}->Projection", - }, - { - sql: "select * from t t1, t t2, t t3, t t4, t t5 where t1.a = t5.a and t5.a = t4.a and t4.a = t3.a and t3.a = t2.a and t2.a = t1.a and t1.a = t3.a and t2.a = t4.a and t5.b < 8", - best: "Join{Join{Join{Join{DataScan(t5)->DataScan(t1)}(Column#49,Column#1)->DataScan(t2)}(Column#1,Column#13)->DataScan(t3)}(Column#13,Column#25)(Column#1,Column#25)->DataScan(t4)}(Column#49,Column#37)(Column#25,Column#37)(Column#13,Column#37)->Projection", - }, - { - sql: "select * from t t1, t t2, t t3, t t4, t t5 where t1.a = t5.a and t5.a = t4.a and t4.a = t3.a and t3.a = t2.a and t2.a = t1.a and t1.a = t3.a and t2.a = t4.a and t3.b = 1 and t4.a = 1", - best: "Join{Join{Join{DataScan(t3)->DataScan(t1)}->Join{DataScan(t2)->DataScan(t4)}}->DataScan(t5)}->Projection", - }, - { - sql: "select * from t o where o.b in (select t3.c from t t1, t t2, t t3 where t1.a = t3.a and t2.a = t3.a and t2.a = o.a)", - best: "Apply{DataScan(o)->Join{Join{DataScan(t1)->DataScan(t3)}(Column#13,Column#37)->DataScan(t2)}(Column#37,Column#25)->Projection}->Projection", - }, - { - sql: "select * from t o where o.b in (select t3.c from t t1, t t2, t t3 where t1.a = t3.a and t2.a = t3.a and t2.a = o.a and t1.a = 1)", - best: "Apply{DataScan(o)->Join{Join{DataScan(t1)->DataScan(t2)}->DataScan(t3)}->Projection}->Projection", - }, - } + var input, output []string + s.testData.GetTestCases(c, &input, &output) ctx := context.Background() - for _, tt := range tests { - comment := Commentf("for %s", tt.sql) - stmt, err := s.ParseOneStmt(tt.sql, "", "") + for i, tt := range input { + comment := Commentf("for %s", tt) + stmt, err := s.ParseOneStmt(tt, "", "") c.Assert(err, IsNil, comment) p, _, err := BuildLogicalPlan(ctx, s.ctx, stmt, s.is) c.Assert(err, IsNil) p, err = logicalOptimize(context.TODO(), flagPredicatePushDown|flagJoinReOrder, p.(LogicalPlan)) c.Assert(err, IsNil) - c.Assert(ToString(p), Equals, tt.best, Commentf("for %s", tt.sql)) + planString := ToString(p) + s.testData.OnRecord(func() { + output[i] = planString + }) + c.Assert(planString, Equals, output[i], Commentf("for %s", tt)) } } @@ -767,160 +525,26 @@ func (s *testPlanSuite) TestEagerAggregation(c *C) { func (s *testPlanSuite) TestColumnPruning(c *C) { defer testleak.AfterTest(c)() - tests := []struct { - sql string - ans map[int][]string - }{ - { - sql: "select count(*) from t group by a", - ans: map[int][]string{ - 1: {"Column#1"}, - }, - }, - { - sql: "select count(*) from t", - ans: map[int][]string{ - 1: {"Column#1"}, - }, - }, - { - sql: "select count(*) from t a join t b where a.a < 1", - ans: map[int][]string{ - 1: {"Column#1"}, - 2: {"Column#13"}, - }, - }, - { - sql: "select count(*) from t a join t b on a.a = b.d", - ans: map[int][]string{ - 1: {"Column#1"}, - 2: {"Column#16"}, - }, - }, - { - sql: "select count(*) from t a join t b on a.a = b.d order by sum(a.d)", - ans: map[int][]string{ - 1: {"Column#1", "Column#4"}, - 2: {"Column#16"}, - }, - }, - { - sql: "select count(b.a) from t a join t b on a.a = b.d group by b.b order by sum(a.d)", - ans: map[int][]string{ - 1: {"Column#1", "Column#4"}, - 2: {"Column#13", "Column#14", "Column#16"}, - }, - }, - { - sql: "select * from (select count(b.a) from t a join t b on a.a = b.d group by b.b having sum(a.d) < 0) tt", - ans: map[int][]string{ - 1: {"Column#1", "Column#4"}, - 2: {"Column#13", "Column#14", "Column#16"}, - }, - }, - { - sql: "select (select count(a) from t where b = k.a) from t k", - ans: map[int][]string{ - 1: {"Column#1"}, - 3: {"Column#13", "Column#14"}, - }, - }, - { - sql: "select exists (select count(*) from t where b = k.a) from t k", - ans: map[int][]string{ - 1: {"Column#1"}, - }, - }, - { - sql: "select b = (select count(*) from t where b = k.a) from t k", - ans: map[int][]string{ - 1: {"Column#1", "Column#2"}, - 3: {"Column#14"}, - }, - }, - { - sql: "select exists (select count(a) from t where b = k.a group by b) from t k", - ans: map[int][]string{ - 1: {"Column#1"}, - 3: {"Column#14"}, - }, - }, - { - sql: "select a as c1, b as c2 from t order by 1, c1 + c2 + c", - ans: map[int][]string{ - 1: {"Column#1", "Column#2", "Column#3"}, - }, - }, - { - sql: "select a from t where b < any (select c from t)", - ans: map[int][]string{ - 1: {"Column#1", "Column#2"}, - 3: {"Column#15"}, - }, - }, - { - sql: "select a from t where (b,a) != all (select c,d from t)", - ans: map[int][]string{ - 1: {"Column#1", "Column#2"}, - 3: {"Column#15", "Column#16"}, - }, - }, - { - sql: "select a from t where (b,a) in (select c,d from t)", - ans: map[int][]string{ - 1: {"Column#1", "Column#2"}, - 3: {"Column#15", "Column#16"}, - }, - }, - { - sql: "select a from t where a in (select a from t s group by t.b)", - ans: map[int][]string{ - 1: {"Column#1"}, - 3: {"Column#13"}, - }, - }, - { - sql: "select t01.a from (select a from t t21 union all select a from t t22) t2 join t t01 on 1 left outer join t t3 on 1 join t t4 on 1", - ans: map[int][]string{ - 1: {"Column#1"}, - 3: {"Column#13"}, - 5: {"Column#25"}, - 8: {"Column#26"}, - 10: {"Column#38"}, - 12: {"Column#50"}, - }, - }, - { - sql: "select 1 from (select count(b) as cnt from t) t1;", - ans: map[int][]string{ - 1: {"Column#1"}, - }, - }, - { - sql: "select count(1) from (select count(b) as cnt from t) t1;", - ans: map[int][]string{ - 1: {"Column#1"}, - }, - }, - { - sql: "select count(1) from (select count(b) as cnt from t group by c) t1;", - ans: map[int][]string{ - 1: {"Column#3"}, - }, - }, - } + var ( + input []string + output []map[int][]string + ) + s.testData.GetTestCases(c, &input, &output) ctx := context.Background() - for _, tt := range tests { - comment := Commentf("for %s", tt.sql) - stmt, err := s.ParseOneStmt(tt.sql, "", "") + for i, tt := range input { + comment := Commentf("for %s", tt) + stmt, err := s.ParseOneStmt(tt, "", "") c.Assert(err, IsNil, comment) p, _, err := BuildLogicalPlan(ctx, s.ctx, stmt, s.is) c.Assert(err, IsNil) lp, err := logicalOptimize(ctx, flagPredicatePushDown|flagPrunColumns, p.(LogicalPlan)) c.Assert(err, IsNil) - checkDataSourceCols(lp, c, tt.ans, comment) + s.testData.OnRecord(func() { + output[i] = make(map[int][]string) + }) + s.checkDataSourceCols(lp, c, output[i], comment) } } @@ -957,25 +581,37 @@ func (s *testPlanSuite) TestAllocID(c *C) { c.Assert(pA.id+1, Equals, pB.id) } -func checkDataSourceCols(p LogicalPlan, c *C, ans map[int][]string, comment CommentInterface) { +func (s *testPlanSuite) checkDataSourceCols(p LogicalPlan, c *C, ans map[int][]string, comment CommentInterface) { switch p.(type) { case *DataSource: + s.testData.OnRecord(func() { + ans[p.ID()] = make([]string, p.Schema().Len()) + }) colList, ok := ans[p.ID()] c.Assert(ok, IsTrue, Commentf("For %v DataSource ID %d Not found", comment, p.ID())) c.Assert(len(p.Schema().Columns), Equals, len(colList), comment) - for i, colName := range colList { - c.Assert(p.Schema().Columns[i].String(), Equals, colName, comment) + for i, col := range p.Schema().Columns { + s.testData.OnRecord(func() { + colList[i] = col.String() + }) + c.Assert(col.String(), Equals, colList[i], comment) } case *LogicalUnionAll: + s.testData.OnRecord(func() { + ans[p.ID()] = make([]string, p.Schema().Len()) + }) colList, ok := ans[p.ID()] c.Assert(ok, IsTrue, Commentf("For %v UnionAll ID %d Not found", comment, p.ID())) c.Assert(len(p.Schema().Columns), Equals, len(colList), comment) - for i, colName := range colList { - c.Assert(p.Schema().Columns[i].String(), Equals, colName, comment) + for i, col := range p.Schema().Columns { + s.testData.OnRecord(func() { + colList[i] = col.String() + }) + c.Assert(col.String(), Equals, colList[i], comment) } } for _, child := range p.Children() { - checkDataSourceCols(child, c, ans, comment) + s.checkDataSourceCols(child, c, ans, comment) } } @@ -1202,40 +838,13 @@ func (s *testPlanSuite) TestUniqueKeyInfo(c *C) { func (s *testPlanSuite) TestAggPrune(c *C) { defer testleak.AfterTest(c)() - tests := []struct { - sql string - best string - }{ - { - sql: "select a, count(b) from t group by a", - best: "DataScan(t)->Projection", - }, - { - sql: "select sum(b) from t group by c, d, e", - best: "DataScan(t)->Aggr(sum(Column#2))->Projection", - }, - { - sql: "select tt.a, sum(tt.b) from (select a, b from t) tt group by tt.a", - best: "DataScan(t)->Projection", - }, - { - sql: "select count(1) from (select count(1), a as b from t group by a) tt group by b", - best: "DataScan(t)->Projection", - }, - { - sql: "select a, count(b) from t group by a", - best: "DataScan(t)->Projection", - }, - { - sql: "select a, count(distinct a, b) from t group by a", - best: "DataScan(t)->Projection", - }, - } + var input, output []string + s.testData.GetTestCases(c, &input, &output) ctx := context.Background() - for _, tt := range tests { - comment := Commentf("for %s", tt.sql) - stmt, err := s.ParseOneStmt(tt.sql, "", "") + for i, tt := range input { + comment := Commentf("for %s", tt) + stmt, err := s.ParseOneStmt(tt, "", "") c.Assert(err, IsNil, comment) p, _, err := BuildLogicalPlan(ctx, s.ctx, stmt, s.is) @@ -1243,7 +852,11 @@ func (s *testPlanSuite) TestAggPrune(c *C) { p, err = logicalOptimize(context.TODO(), flagPredicatePushDown|flagPrunColumns|flagBuildKeyInfo|flagEliminateAgg|flagEliminateProjection, p.(LogicalPlan)) c.Assert(err, IsNil) - c.Assert(ToString(p), Equals, tt.best, comment) + planString := ToString(p) + s.testData.OnRecord(func() { + output[i] = planString + }) + c.Assert(planString, Equals, output[i], comment) } } @@ -1619,68 +1232,13 @@ func (s *testPlanSuite) TestNameResolver(c *C) { func (s *testPlanSuite) TestOuterJoinEliminator(c *C) { defer testleak.AfterTest(c)() - tests := []struct { - sql string - best string - }{ - // Test left outer join + distinct - { - sql: "select distinct t1.a, t1.b from t t1 left outer join t t2 on t1.b = t2.b", - best: "DataScan(t1)->Aggr(firstrow(Column#1),firstrow(Column#2))", - }, - // Test right outer join + distinct - { - sql: "select distinct t2.a, t2.b from t t1 right outer join t t2 on t1.b = t2.b", - best: "DataScan(t2)->Aggr(firstrow(Column#13),firstrow(Column#14))", - }, - // Test duplicate agnostic agg functions on join - { - sql: "select max(t1.a), min(test.t1.b) from t t1 left join t t2 on t1.b = t2.b", - best: "DataScan(t1)->Aggr(max(Column#1),min(Column#2))->Projection", - }, - { - sql: "select sum(distinct t1.a) from t t1 left join t t2 on t1.a = t2.a and t1.b = t2.b", - best: "DataScan(t1)->Aggr(sum(Column#1))->Projection", - }, - { - sql: "select count(distinct t1.a, t1.b) from t t1 left join t t2 on t1.b = t2.b", - best: "DataScan(t1)->Aggr(count(Column#1, Column#2))->Projection", - }, - // Test left outer join - { - sql: "select t1.b from t t1 left outer join t t2 on t1.a = t2.a", - best: "DataScan(t1)->Projection", - }, - // Test right outer join - { - sql: "select t2.b from t t1 right outer join t t2 on t1.a = t2.a", - best: "DataScan(t2)->Projection", - }, - // For complex join query - { - sql: "select max(t3.b) from (t t1 left join t t2 on t1.a = t2.a) right join t t3 on t1.b = t3.b", - best: "Join{Join{DataScan(t1)->DataScan(t2)}(Column#1,Column#13)->DataScan(t3)->TopN([Column#26 true],0,1)}(Column#2,Column#26)->TopN([Column#26 true],0,1)->Aggr(max(Column#26))->Projection", - }, - { - sql: "select t1.a ta, t1.b tb from t t1 left join t t2 on t1.a = t2.a", - best: "DataScan(t1)->Projection", - }, - { - // Because the `order by` uses t2.a, the `join` can't be eliminated. - sql: "select t1.a, t1.b from t t1 left join t t2 on t1.a = t2.a order by t2.a", - best: "Join{DataScan(t1)->DataScan(t2)}(Column#1,Column#13)->Sort->Projection", - }, - // For issue 11167 - { - sql: "select a.a from t a natural left join t b natural left join t c", - best: "DataScan(a)->Projection", - }, - } + var input, output []string + s.testData.GetTestCases(c, &input, &output) ctx := context.TODO() - for i, tt := range tests { - comment := Commentf("case:%v sql:%s", i, tt.sql) - stmt, err := s.ParseOneStmt(tt.sql, "", "") + for i, tt := range input { + comment := Commentf("case:%v sql:%s", i, tt) + stmt, err := s.ParseOneStmt(tt, "", "") c.Assert(err, IsNil, comment) Preprocess(s.ctx, stmt, s.is) builder := NewPlanBuilder(MockContext(), s.is, &BlockHintProcessor{}) @@ -1688,7 +1246,11 @@ func (s *testPlanSuite) TestOuterJoinEliminator(c *C) { c.Assert(err, IsNil) p, err = logicalOptimize(ctx, builder.optFlag, p.(LogicalPlan)) c.Assert(err, IsNil) - c.Assert(ToString(p), Equals, tt.best, comment) + planString := ToString(p) + s.testData.OnRecord(func() { + output[i] = planString + }) + c.Assert(planString, Equals, output[i], comment) } } @@ -1936,7 +1498,7 @@ func (s *testPlanSuite) TestUpdateEQCond(c *C) { }{ { sql: "select t1.a from t t1, t t2 where t1.a = t2.a+1", - best: "Join{DataScan(t1)->DataScan(t2)->Projection}(Column#1,Column#25)->Projection", + best: "Join{DataScan(t1)->DataScan(t2)->Projection}(test.t.a,Column#25)->Projection", }, } ctx := context.TODO() diff --git a/planner/core/physical_plan_test.go b/planner/core/physical_plan_test.go index 5ddd92ca54124..2d082470b26f7 100644 --- a/planner/core/physical_plan_test.go +++ b/planner/core/physical_plan_test.go @@ -445,7 +445,7 @@ func (s *testPlanSuite) TestRequestTypeSupportedOff(c *C) { c.Assert(err, IsNil) sql := "select * from t where a in (1, 10, 20)" - expect := "TableReader(Table(t))->Sel([in(Column#1, 1, 10, 20)])" + expect := "TableReader(Table(t))->Sel([in(test.t.a, 1, 10, 20)])" stmt, err := s.ParseOneStmt(sql, "", "") c.Assert(err, IsNil) @@ -514,7 +514,7 @@ func (s *testPlanSuite) TestIndexJoinUnionScan(c *C) { // Index Join + Union Scan + Union All is not supported now. { sql: "select /*+ TIDB_INLJ(t2) */ * from t t1, t t2 where t1.a = t2.a", - best: "LeftHashJoin{UnionAll{TableReader(Table(t))->UnionScan([])->TableReader(Table(t))->UnionScan([])}->UnionAll{TableReader(Table(t))->UnionScan([])->TableReader(Table(t))->UnionScan([])}}(Column#1,Column#14)", + best: "LeftHashJoin{UnionAll{TableReader(Table(t))->UnionScan([])->TableReader(Table(t))->UnionScan([])}->UnionAll{TableReader(Table(t))->UnionScan([])->TableReader(Table(t))->UnionScan([])}}(test.t.a,test.t.a)", }, } for i, tt := range tests { @@ -825,49 +825,43 @@ func (s *testPlanSuite) TestAggToCopHint(c *C) { _, err = se.Execute(context.Background(), "admin reload opt_rule_blacklist") c.Assert(err, IsNil) - tests := []struct { - sql string - best string - warning string - }{ - { - sql: "select /*+ AGG_TO_COP(), HASH_AGG(), USE_INDEX(t) */ sum(a) from t group by a", - best: "TableReader(Table(t)->HashAgg)->HashAgg", - }, - { - sql: "select /*+ AGG_TO_COP(), USE_INDEX(t) */ sum(b) from t group by b", - best: "TableReader(Table(t)->HashAgg)->HashAgg", - }, - { - sql: "select /*+ AGG_TO_COP(), HASH_AGG(), USE_INDEX(t) */ distinct a from t group by a", - best: "TableReader(Table(t)->HashAgg)->HashAgg->HashAgg", - warning: "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable", - }, - { - sql: "select /*+ AGG_TO_COP(), HASH_AGG(), HASH_JOIN(t1), USE_INDEX(t1), USE_INDEX(t2) */ sum(t1.a) from t t1, t t2 where t1.a = t2.b group by t1.a", - best: "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#14)->Projection->HashAgg", - warning: "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable", - }, - } + var ( + input []string + output []struct { + Best string + Warning string + } + ) + s.testData.GetTestCases(c, &input, &output) + ctx := context.Background() - for i, test := range tests { + for i, test := range input { comment := Commentf("case:%v sql:%s", i, test) se.GetSessionVars().StmtCtx.SetWarnings(nil) - stmt, err := s.ParseOneStmt(test.sql, "", "") + stmt, err := s.ParseOneStmt(test, "", "") c.Assert(err, IsNil, comment) p, _, err := planner.Optimize(ctx, se, stmt, s.is) c.Assert(err, IsNil) - c.Assert(core.ToString(p), Equals, test.best, comment) + planString := core.ToString(p) + s.testData.OnRecord(func() { + output[i].Best = planString + }) + c.Assert(planString, Equals, output[i].Best, comment) warnings := se.GetSessionVars().StmtCtx.GetWarnings() - if test.warning == "" { + s.testData.OnRecord(func() { + if len(warnings) > 0 { + output[i].Warning = warnings[0].Err.Error() + } + }) + if output[i].Warning == "" { c.Assert(len(warnings), Equals, 0, comment) } else { c.Assert(len(warnings), Equals, 1, comment) c.Assert(warnings[0].Level, Equals, stmtctx.WarnLevelWarning, comment) - c.Assert(warnings[0].Err.Error(), Equals, test.warning, comment) + c.Assert(warnings[0].Err.Error(), Equals, output[i].Warning, comment) } } } diff --git a/planner/core/stringer.go b/planner/core/stringer.go index 6091aab37f756..b410cdb6d60e5 100644 --- a/planner/core/stringer.go +++ b/planner/core/stringer.go @@ -254,7 +254,7 @@ func toString(in Plan, strs []string, idxs []int) ([]string, []int) { } case *LogicalWindow: buffer := bytes.NewBufferString("") - formatWindowFuncDescs(buffer, x.WindowFuncDescs) + formatWindowFuncDescs(buffer, x.WindowFuncDescs, x.schema) str = fmt.Sprintf("Window(%s)", buffer.String()) case *PhysicalWindow: str = fmt.Sprintf("Window(%s)", x.ExplainInfo()) diff --git a/planner/core/testdata/analyze_suite_in.json b/planner/core/testdata/analyze_suite_in.json index 90473cdee2739..d64c73062a158 100644 --- a/planner/core/testdata/analyze_suite_in.json +++ b/planner/core/testdata/analyze_suite_in.json @@ -73,5 +73,108 @@ "explain select * from t t1 join t t2 where t1.b = t2.b and t2.b is null" ] ] + }, + { + "name": "TestTiFlashCostModel", + "cases": [ + [ + "desc select * from t" + ], + [ + "desc select /*+ read_from_storage(tikv[t]) */ * from t" + ], + [ + "desc select * from t where t.a = 1 or t.a = 2" + ], + [ + "set @@session.tidb_isolation_read_engines='tiflash'", + "desc select * from t where t.a = 1 or t.a = 2" + ] + ] + }, + { + "name": "TestStraightJoin", + "cases": [ + "explain select straight_join * from t1, t2, t3, t4", + "explain select * from t1 straight_join t2 straight_join t3 straight_join t4", + "explain select straight_join * from t1, t2, t3, t4 where t1.a=t4.a" + ] + }, + { + "name": "TestNullCount", + "cases": [ + "explain select * from t where a is null", + "explain select * from t use index(idx) where a is null", + "explain select * from t where b = 1", + "explain select * from t where b < 1" + ] + }, + { + "name": "TestCorrelatedEstimation", + "cases": [ + "explain select t.c in (select count(*) from t s , t t1 where s.a = t.a and s.a = t1.a) from t", + "explain select (select concat(t1.a, \",\", t1.b) from t t1 where t1.a=t.a and t1.c=t.c) from t" + ] + }, + { + "name": "TestEmptyTable", + "cases": [ + "select * from t where t.c1 <= 50", + "select * from t where c1 in (select c1 from t1)", + "select * from t, t1 where t.c1 = t1.c1", + "select * from t limit 0" + ] + }, + { + "name": "TestIndexRead", + "cases": [ + "select count(*) from t group by e", + "select count(*) from t where e <= 10 group by e", + "select count(*) from t where e <= 50", + "select count(*) from t where c > '1' group by b", + "select count(*) from t where e = 1 group by b", + "select count(*) from t where e > 1 group by b", + "select count(e) from t where t.b <= 20", + "select count(e) from t where t.b <= 30", + "select count(e) from t where t.b <= 40", + "select count(e) from t where t.b <= 50", + "select count(e) from t where t.b <= 100000000000", + "select * from t where t.b <= 40", + "select * from t where t.b <= 50", + "select * from t where t.b <= 10000000000", + // test panic + "select * from t where 1 and t.b <= 50", + "select * from t where t.b <= 100 order by t.a limit 1", + "select * from t where t.b <= 1 order by t.a limit 10", + "select * from t use index(b) where b = 1 order by a", + // test datetime + "select * from t where d < cast('1991-09-05' as datetime)", + // test timestamp + "select * from t where ts < '1991-09-05'", + "select sum(a) from t1 use index(idx) where a = 3 and b = 100000 group by a limit 1" + ] + }, + { + "name": "TestAnalyze", + "cases": [ + "analyze table t3", + // Test analyze full table. + "select * from t where t.a <= 2", + "select b from t where t.b < 2", + "select * from t where t.a = 1 and t.b <= 2", + // Test not analyzed table. + "select * from t1 where t1.a <= 2", + "select * from t1 where t1.a = 1 and t1.b <= 2", + // Test analyze single index. + "select * from t2 where t2.a <= 2", + // Test analyze all index. + "analyze table t2 index", + // Test partitioned table. + "select * from t4 where t4.a <= 2", + "select b from t4 where t4.b < 2", + "select * from t4 where t4.a = 1 and t4.b <= 2" + // TODO: Refine these tests in the future. + // "select * from t2 where t2.a = 1 and t2.b <= 2", + ] } ] diff --git a/planner/core/testdata/analyze_suite_out.json b/planner/core/testdata/analyze_suite_out.json index 1a8f07f43ab6f..770b84cefa5d2 100644 --- a/planner/core/testdata/analyze_suite_out.json +++ b/planner/core/testdata/analyze_suite_out.json @@ -8,9 +8,9 @@ "EXPLAIN SELECT * FROM t WHERE b = 2 ORDER BY a limit 1;" ], "Plan": [ - "TopN_8 1.00 root Column#1:asc, offset:0, count:1", + "TopN_8 1.00 root test.t.a:asc, offset:0, count:1", "└─IndexReader_16 1.00 root index:TopN_15", - " └─TopN_15 1.00 cop[tikv] Column#1:asc, offset:0, count:1", + " └─TopN_15 1.00 cop[tikv] test.t.a:asc, offset:0, count:1", " └─IndexScan_14 10.00 cop[tikv] table:t, index:b, c, range:[2,2], keep order:false, stats:pseudo" ] }, @@ -21,9 +21,9 @@ "EXPLAIN SELECT * FROM t WHERE b = 2 ORDER BY a limit 1" ], "Plan": [ - "TopN_8 1.00 root Column#1:asc, offset:0, count:1", + "TopN_8 1.00 root test.t.a:asc, offset:0, count:1", "└─IndexReader_16 1.00 root index:TopN_15", - " └─TopN_15 1.00 cop[tikv] Column#1:asc, offset:0, count:1", + " └─TopN_15 1.00 cop[tikv] test.t.a:asc, offset:0, count:1", " └─IndexScan_14 6.00 cop[tikv] table:t, index:b, c, range:[2,2], keep order:false" ] }, @@ -35,9 +35,9 @@ "EXPLAIN SELECT * FROM t WHERE b <= 6 ORDER BY a limit 1" ], "Plan": [ - "TopN_8 1.00 root Column#1:asc, offset:0, count:1", + "TopN_8 1.00 root test.t.a:asc, offset:0, count:1", "└─IndexReader_16 1.00 root index:TopN_15", - " └─TopN_15 1.00 cop[tikv] Column#1:asc, offset:0, count:1", + " └─TopN_15 1.00 cop[tikv] test.t.a:asc, offset:0, count:1", " └─IndexScan_14 6.00 cop[tikv] table:t, index:b, c, range:[-inf,6], keep order:false" ] }, @@ -47,13 +47,13 @@ ], "Plan": [ "Limit_17 1.00 root offset:0, count:1", - "└─IndexMergeJoin_70 1.00 root left outer semi join, inner:IndexReader_68, outer key:Column#1, inner key:Column#5", - " ├─TopN_29 1.00 root Column#1:asc, offset:0, count:1", + "└─IndexMergeJoin_70 1.00 root left outer semi join, inner:IndexReader_68, outer key:test.t.a, inner key:test.t.b", + " ├─TopN_29 1.00 root test.t.a:asc, offset:0, count:1", " │ └─IndexReader_37 1.00 root index:TopN_36", - " │ └─TopN_36 1.00 cop[tikv] Column#1:asc, offset:0, count:1", + " │ └─TopN_36 1.00 cop[tikv] test.t.a:asc, offset:0, count:1", " │ └─IndexScan_35 6.00 cop[tikv] table:t1, index:b, c, range:[-inf,6], keep order:false", " └─IndexReader_68 1.04 root index:IndexScan_67", - " └─IndexScan_67 1.04 cop[tikv] table:t2, index:b, c, range: decided by [eq(Column#5, Column#1)], keep order:true" + " └─IndexScan_67 1.04 cop[tikv] table:t2, index:b, c, range: decided by [eq(test.t.b, test.t.a)], keep order:true" ] }, { @@ -64,9 +64,9 @@ "EXPLAIN SELECT * FROM t WHERE b = 1 ORDER BY a desc limit 1" ], "Plan": [ - "TopN_8 1.00 root Column#1:desc, offset:0, count:1", + "TopN_8 1.00 root test.t.a:desc, offset:0, count:1", "└─IndexReader_16 1.00 root index:TopN_15", - " └─TopN_15 1.00 cop[tikv] Column#1:desc, offset:0, count:1", + " └─TopN_15 1.00 cop[tikv] test.t.a:desc, offset:0, count:1", " └─IndexScan_14 6.00 cop[tikv] table:t, index:b, c, range:[1,1], keep order:false" ] }, @@ -81,7 +81,7 @@ "Limit_11 1.00 root offset:0, count:1", "└─TableReader_22 1.00 root data:Limit_21", " └─Limit_21 1.00 cop[tikv] offset:0, count:1", - " └─Selection_20 1.00 cop[tikv] eq(Column#2, 2)", + " └─Selection_20 1.00 cop[tikv] eq(test.t.b, 2)", " └─TableScan_19 4.17 cop[tikv] table:t, range:[-inf,+inf], keep order:true" ] }, @@ -91,9 +91,9 @@ "EXPLAIN SELECT * FROM t WHERE b = 2 ORDER BY a limit 1" ], "Plan": [ - "TopN_8 1.00 root Column#1:asc, offset:0, count:1", + "TopN_8 1.00 root test.t.a:asc, offset:0, count:1", "└─IndexReader_16 1.00 root index:TopN_15", - " └─TopN_15 1.00 cop[tikv] Column#1:asc, offset:0, count:1", + " └─TopN_15 1.00 cop[tikv] test.t.a:asc, offset:0, count:1", " └─IndexScan_14 6.00 cop[tikv] table:t, index:b, c, range:[2,2], keep order:false" ] }, @@ -106,10 +106,10 @@ "EXPLAIN SELECT * FROM t WHERE b = 2 and a > 0 ORDER BY a limit 1" ], "Plan": [ - "TopN_8 1.00 root Column#1:asc, offset:0, count:1", + "TopN_8 1.00 root test.t.a:asc, offset:0, count:1", "└─IndexReader_19 1.00 root index:TopN_18", - " └─TopN_18 1.00 cop[tikv] Column#1:asc, offset:0, count:1", - " └─Selection_17 6.00 cop[tikv] gt(Column#1, 0)", + " └─TopN_18 1.00 cop[tikv] test.t.a:asc, offset:0, count:1", + " └─Selection_17 6.00 cop[tikv] gt(test.t.a, 0)", " └─IndexScan_16 6.00 cop[tikv] table:t, index:b, c, range:[2,2], keep order:false" ] }, @@ -122,11 +122,11 @@ "EXPLAIN SELECT a FROM t WHERE b = 2 and c > 0 ORDER BY a limit 1" ], "Plan": [ - "Projection_7 1.00 root Column#1", - "└─TopN_8 1.00 root Column#1:asc, offset:0, count:1", + "Projection_7 1.00 root test.t.a", + "└─TopN_8 1.00 root test.t.a:asc, offset:0, count:1", " └─IndexReader_17 1.00 root index:TopN_16", - " └─TopN_16 1.00 cop[tikv] Column#1:asc, offset:0, count:1", - " └─Selection_15 6.00 cop[tikv] gt(Column#3, 0)", + " └─TopN_16 1.00 cop[tikv] test.t.a:asc, offset:0, count:1", + " └─Selection_15 6.00 cop[tikv] gt(test.t.c, 0)", " └─IndexScan_14 6.00 cop[tikv] table:t, index:b, d, a, c, range:[2,2], keep order:false" ] } @@ -142,13 +142,13 @@ "explain select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t2.a=t1.a and t2.b>t1.b-1 and t2.bColumn#13", + " └─HashLeftJoin_23 1.00 root inner join, inner:TableReader_33, equal:[eq(test.t.a, test.t.a)]", + " ├─TableReader_27 1.00 root data:Selection_26", + " │ └─Selection_26 1.00 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a))", + " │ └─TableScan_25 10.00 cop[tikv] table:s, range:[-inf,+inf], keep order:false", + " └─TableReader_33 1.00 root data:Selection_32", + " └─Selection_32 1.00 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a))", + " └─TableScan_31 10.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false" + ], + [ + "Projection_8 10.00 root Column#9", + "└─Apply_10 10.00 root CARTESIAN left outer join, inner:MaxOneRow_15", + " ├─TableReader_12 10.00 root data:TableScan_11", + " │ └─TableScan_11 10.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", + " └─MaxOneRow_15 1.00 root ", + " └─Projection_16 0.10 root concat(cast(test.t.a), ,, cast(test.t.b))->Column#9", + " └─IndexReader_19 0.10 root index:Selection_18", + " └─Selection_18 0.10 cop[tikv] eq(test.t.a, test.t.a)", + " └─IndexScan_17 1.00 cop[tikv] table:t1, index:c, b, a, range: decided by [eq(test.t.c, test.t.c)], keep order:false" + ] + ] + }, + { + "Name": "TestEmptyTable", + "Cases": [ + "TableReader(Table(t)->Sel([le(test.t.c1, 50)]))", + "LeftHashJoin{TableReader(Table(t)->Sel([not(isnull(test.t.c1))]))->TableReader(Table(t1)->Sel([not(isnull(test.t1.c1))]))->HashAgg}(test.t.c1,test.t1.c1)->Projection", + "LeftHashJoin{TableReader(Table(t)->Sel([not(isnull(test.t.c1))]))->TableReader(Table(t1)->Sel([not(isnull(test.t1.c1))]))}(test.t.c1,test.t1.c1)", + "Dual" + ] + }, + { + "Name": "TestIndexRead", + "Cases": [ + "IndexReader(Index(t.e)[[NULL,+inf]])->HashAgg", + "IndexReader(Index(t.e)[[-inf,10]]->StreamAgg)->StreamAgg", + "IndexReader(Index(t.e)[[-inf,50]]->StreamAgg)->StreamAgg", + "IndexReader(Index(t.b_c)[[NULL,+inf]]->Sel([gt(test.t.c, 1)]))->HashAgg", + "IndexLookUp(Index(t.e)[[1,1]], Table(t))->HashAgg", + "TableReader(Table(t)->Sel([gt(test.t.e, 1)])->HashAgg)->HashAgg", + "IndexLookUp(Index(t.b)[[-inf,20]], Table(t)->HashAgg)->HashAgg", + "TableReader(Table(t)->Sel([le(test.t.b, 30)])->StreamAgg)->StreamAgg", + "TableReader(Table(t)->Sel([le(test.t.b, 40)])->StreamAgg)->StreamAgg", + "TableReader(Table(t)->Sel([le(test.t.b, 50)])->StreamAgg)->StreamAgg", + "TableReader(Table(t)->Sel([le(test.t.b, 100000000000)])->StreamAgg)->StreamAgg", + "TableReader(Table(t)->Sel([le(test.t.b, 40)]))", + "TableReader(Table(t)->Sel([le(test.t.b, 50)]))", + "TableReader(Table(t)->Sel([le(test.t.b, 10000000000)]))", + "TableReader(Table(t)->Sel([le(test.t.b, 50)]))", + "TableReader(Table(t)->Sel([le(test.t.b, 100)])->Limit)->Limit", + "IndexLookUp(Index(t.b)[[-inf,1]]->TopN([test.t.a],0,10), Table(t))->TopN([test.t.a],0,10)", + "IndexLookUp(Index(t.b)[[1,1]], Table(t))", + "IndexLookUp(Index(t.d)[[-inf,1991-09-05 00:00:00)], Table(t))", + "IndexLookUp(Index(t.ts)[[-inf,1991-09-05 00:00:00)], Table(t))", + "IndexLookUp(Index(t1.idx)[[3,3]], Table(t1)->Sel([eq(test.t1.b, 100000)]))->Projection->Projection->StreamAgg->Limit" + ] + }, + { + "Name": "TestAnalyze", + "Cases": [ + "Analyze{Index(a),Table(a, b)}", + "TableReader(Table(t)->Sel([le(test.t.a, 2)]))", + "IndexReader(Index(t.b)[[-inf,2)])", + "TableReader(Table(t)->Sel([eq(test.t.a, 1) le(test.t.b, 2)]))", + "TableReader(Table(t1)->Sel([le(test.t1.a, 2)]))", + "IndexLookUp(Index(t1.a)[[1,1]], Table(t1)->Sel([le(test.t1.b, 2)]))", + "TableReader(Table(t2)->Sel([le(test.t2.a, 2)]))", + "Analyze{Index(a),Index(b)}", + "UnionAll{TableReader(Table(t4)->Sel([le(test.t4.a, 2)]))->TableReader(Table(t4)->Sel([le(test.t4.a, 2)]))}", + "UnionAll{IndexReader(Index(t4.b)[[-inf,2)])->IndexReader(Index(t4.b)[[-inf,2)])}", + "TableReader(Table(t4)->Sel([eq(test.t4.a, 1) le(test.t4.b, 2)]))" + ] } ] diff --git a/planner/core/testdata/index_merge_suite_in.json b/planner/core/testdata/index_merge_suite_in.json new file mode 100644 index 0000000000000..55c9c1cca1f7c --- /dev/null +++ b/planner/core/testdata/index_merge_suite_in.json @@ -0,0 +1,13 @@ +[ + { + "name": "TestIndexMergePathGeneration", + "cases": [ + "select * from t", + "select * from t where c < 1", + "select * from t where c < 1 or f > 2", + "select * from t where (c < 1 or f > 2) and (c > 5 or f < 7)", + "select * from t where (c < 1 or f > 2) and (c > 5 or f < 7) and (c < 1 or g > 2)", + "select * from t where (c < 1 or f > 2) and (c > 5 or f < 7) and (e < 1 or f > 2)" + ] + } +] \ No newline at end of file diff --git a/planner/core/testdata/index_merge_suite_out.json b/planner/core/testdata/index_merge_suite_out.json new file mode 100644 index 0000000000000..c8bdfd58581a7 --- /dev/null +++ b/planner/core/testdata/index_merge_suite_out.json @@ -0,0 +1,13 @@ +[ + { + "Name": "TestIndexMergePathGeneration", + "Cases": [ + "[]", + "[]", + "[{Idxs:[c_d_e,f_g],TbFilters:[]}]", + "[{Idxs:[c_d_e,f_g],TbFilters:[or(gt(test.t.c, 5), lt(test.t.f, 7))]},{Idxs:[c_d_e,f_g],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2))]}]", + "[{Idxs:[c_d_e,f_g],TbFilters:[or(gt(test.t.c, 5), lt(test.t.f, 7)),or(lt(test.t.c, 1), gt(test.t.g, 2))]},{Idxs:[c_d_e,f_g],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2)),or(lt(test.t.c, 1), gt(test.t.g, 2))]},{Idxs:[c_d_e,g],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2)),or(gt(test.t.c, 5), lt(test.t.f, 7))]}]", + "[{Idxs:[c_d_e,f_g],TbFilters:[or(gt(test.t.c, 5), lt(test.t.f, 7)),or(lt(test.t.e, 1), gt(test.t.f, 2))]},{Idxs:[c_d_e,f_g],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2)),or(lt(test.t.e, 1), gt(test.t.f, 2))]}]" + ] + } +] diff --git a/planner/core/testdata/integration_suite_out.json b/planner/core/testdata/integration_suite_out.json index 31bcc66a96b3c..32441f7b05f0d 100644 --- a/planner/core/testdata/integration_suite_out.json +++ b/planner/core/testdata/integration_suite_out.json @@ -14,7 +14,7 @@ { "SQL": "explain select * from tbl use index(idx_b_c) where b > 1 order by b desc limit 2,1", "Plan": [ - "Projection_25 1.00 root Column#1, Column#2, Column#3", + "Projection_25 1.00 root test.tbl.a, test.tbl.b, test.tbl.c", "└─IndexLookUp_24 1.00 root limit embedded(offset:2, count:1)", " ├─Limit_23 3.00 cop[tikv] offset:0, count:3", " │ └─IndexScan_21 3.00 cop[tikv] table:tbl, index:b, c, range:(1,+inf], keep order:true, desc", @@ -26,7 +26,7 @@ "Plan": [ "IndexLookUp_15 1.00 root limit embedded(offset:2, count:1)", "├─Limit_14 3.00 cop[tikv] offset:0, count:3", - "│ └─Selection_13 3.00 cop[tikv] gt(Column#3, 1)", + "│ └─Selection_13 3.00 cop[tikv] gt(test.tbl.c, 1)", "│ └─IndexScan_11 3.75 cop[tikv] table:tbl, index:b, c, range:(1,+inf], keep order:false", "└─TableScan_12 1.00 cop[tikv] table:tbl, keep order:false, stats:pseudo" ] @@ -38,7 +38,7 @@ "└─IndexLookUp_15 3.00 root ", " ├─IndexScan_11 3.75 cop[tikv] table:tbl, index:b, c, range:(1,+inf], keep order:false", " └─Limit_14 3.00 cop[tikv] offset:0, count:3", - " └─Selection_13 3.00 cop[tikv] gt(Column#1, 1)", + " └─Selection_13 3.00 cop[tikv] gt(test.tbl.a, 1)", " └─TableScan_12 3.75 cop[tikv] table:tbl, keep order:false" ] } @@ -50,13 +50,13 @@ { "SQL": "explain select * from t t1 left join t t2 on t1.a=t2.a where from_unixtime(t2.b);", "Plan": [ - "HashLeftJoin_8 9990.00 root inner join, inner:Selection_13, equal:[eq(Column#1, Column#4)]", + "HashLeftJoin_8 9990.00 root inner join, inner:Selection_13, equal:[eq(test.t.a, test.t.a)]", "├─TableReader_12 9990.00 root data:Selection_11", - "│ └─Selection_11 9990.00 cop[tikv] not(isnull(Column#1))", + "│ └─Selection_11 9990.00 cop[tikv] not(isnull(test.t.a))", "│ └─TableScan_10 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", - "└─Selection_13 7992.00 root from_unixtime(cast(Column#5))", + "└─Selection_13 7992.00 root from_unixtime(cast(test.t.b))", " └─TableReader_16 9990.00 root data:Selection_15", - " └─Selection_15 9990.00 cop[tikv] not(isnull(Column#4))", + " └─Selection_15 9990.00 cop[tikv] not(isnull(test.t.a))", " └─TableScan_14 10000.00 cop[tikv] table:t2, range:[-inf,+inf], keep order:false, stats:pseudo" ] } @@ -68,8 +68,8 @@ { "SQL": "explain select * from t t1 left join t t2 on t1.a = t2.a where cast(t1.b as date) >= '2019-01-01'", "Plan": [ - "HashLeftJoin_9 10000.00 root left outer join, inner:Selection_10 (REVERSED), equal:[eq(Column#1, Column#4)]", - "├─Selection_10 8000.00 root ge(cast(Column#2), 2019-01-01 00:00:00.000000)", + "HashLeftJoin_9 10000.00 root left outer join, inner:Selection_10 (REVERSED), equal:[eq(test.t.a, test.t.a)]", + "├─Selection_10 8000.00 root ge(cast(test.t.b), 2019-01-01 00:00:00.000000)", "│ └─TableReader_12 10000.00 root data:TableScan_11", "│ └─TableScan_11 10000.00 cop[tikv] table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", "└─TableReader_14 10000.00 root data:TableScan_13", @@ -84,7 +84,7 @@ { "SQL": "explain select * from t order by a", "Result": [ - "Sort_8 10005.00 root Column#1:asc", + "Sort_8 10005.00 root test.t.a:asc", "└─Union_11 10005.00 root ", " ├─TableReader_13 10000.00 root data:TableScan_12", " │ └─TableScan_12 10000.00 cop[tikv] table:t, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo", @@ -107,18 +107,18 @@ { "SQL": "explain select * from t order by a limit 3", "Result": [ - "TopN_16 3.00 root Column#1:asc, offset:0, count:3", + "TopN_16 3.00 root test.t.a:asc, offset:0, count:3", "└─Union_20 7.00 root ", - " ├─TopN_21 3.00 root Column#1:asc, offset:0, count:3", + " ├─TopN_21 3.00 root test.t.a:asc, offset:0, count:3", " │ └─TableReader_29 3.00 root data:TopN_28", - " │ └─TopN_28 3.00 cop[tikv] Column#1:asc, offset:0, count:3", + " │ └─TopN_28 3.00 cop[tikv] test.t.a:asc, offset:0, count:3", " │ └─TableScan_27 10000.00 cop[tikv] table:t, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo", - " ├─TopN_34 1.00 root Column#1:asc, offset:0, count:3", + " ├─TopN_34 1.00 root test.t.a:asc, offset:0, count:3", " │ └─TableReader_42 1.00 root data:TableScan_41", " │ └─TableScan_41 1.00 cop[tikv] table:t, partition:p1, range:[-inf,+inf], keep order:false", - " └─TopN_43 3.00 root Column#1:asc, offset:0, count:3", + " └─TopN_43 3.00 root test.t.a:asc, offset:0, count:3", " └─TableReader_51 3.00 root data:TopN_50", - " └─TopN_50 3.00 cop[tikv] Column#1:asc, offset:0, count:3", + " └─TopN_50 3.00 cop[tikv] test.t.a:asc, offset:0, count:3", " └─TableScan_49 4.00 cop[tikv] table:t, partition:p2, range:[-inf,+inf], keep order:false" ] }, diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index 287d60a4b07ce..72ad1abe598b7 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -506,5 +506,14 @@ "select /*+ INL_HASH_JOIN(t1) */ * from t1 join t2 on t1.a = t2.a;", "select /*+ INL_MERGE_JOIN(t1) */ * from t1 join t2 on t1.a = t2.a;" ] + }, + { + "name": "TestAggToCopHint", + "cases": [ + "select /*+ AGG_TO_COP(), HASH_AGG(), USE_INDEX(t) */ sum(a) from t group by a", + "select /*+ AGG_TO_COP(), USE_INDEX(t) */ sum(b) from t group by b", + "select /*+ AGG_TO_COP(), HASH_AGG(), USE_INDEX(t) */ distinct a from t group by a", + "select /*+ AGG_TO_COP(), HASH_AGG(), HASH_JOIN(t1), USE_INDEX(t1), USE_INDEX(t2) */ sum(t1.a) from t t1, t t2 where t1.a = t2.b group by t1.a" + ] } ] diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index c04ef02c13d17..43699aa955a48 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -4,71 +4,71 @@ "Cases": [ { "SQL": "select /*+ SM_JOIN(t1) */ t1.a, t1.b from t t1, (select /*+ INL_JOIN(t3) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Best": "MergeInnerJoin{TableReader(Table(t))->IndexJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#1,Column#13)->Projection" + "Best": "MergeInnerJoin{TableReader(Table(t))->IndexJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ SM_JOIN(test.t1) */ t1.a, t1.b from t t1, (select /*+ INL_JOIN(test.t3) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Best": "MergeInnerJoin{TableReader(Table(t))->IndexJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#1,Column#13)->Projection" + "Best": "MergeInnerJoin{TableReader(Table(t))->IndexJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ SM_JOIN(t1) */ t1.a, t1.b from t t1, (select /*+ HASH_JOIN(t2) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Best": "MergeInnerJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)->Sort}(Column#1,Column#13)->Projection" + "Best": "MergeInnerJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)->Sort}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ INL_JOIN(t1) */ t1.a, t1.b from t t1, (select /*+ HASH_JOIN(t2) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Best": "IndexJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#13,Column#1)->Projection" + "Best": "IndexJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ INL_JOIN(test.t1) */ t1.a, t1.b from t t1, (select /*+ HASH_JOIN(test.t2) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Best": "IndexJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#13,Column#1)->Projection" + "Best": "IndexJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ INL_JOIN(t1) */ t1.a, t1.b from t t1, (select /*+ SM_JOIN(t2) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Best": "IndexJoin{TableReader(Table(t))->MergeInnerJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#13,Column#1)->Projection" + "Best": "IndexJoin{TableReader(Table(t))->MergeInnerJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ HASH_JOIN(t1) */ t1.a, t1.b from t t1, (select /*+ SM_JOIN(t2) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Best": "RightHashJoin{TableReader(Table(t))->MergeInnerJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#1,Column#13)->Projection" + "Best": "RightHashJoin{TableReader(Table(t))->MergeInnerJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ HASH_JOIN(test.t1) */ t1.a, t1.b from t t1, (select /*+ SM_JOIN(test.t2) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Best": "RightHashJoin{TableReader(Table(t))->MergeInnerJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#1,Column#13)->Projection" + "Best": "RightHashJoin{TableReader(Table(t))->MergeInnerJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ HASH_JOIN(t1) */ t1.a, t1.b from t t1, (select /*+ INL_JOIN(t2) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Best": "RightHashJoin{TableReader(Table(t))->IndexJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#27,Column#13)}(Column#1,Column#13)->Projection" + "Best": "RightHashJoin{TableReader(Table(t))->IndexJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.c,test.t.a)}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ SM_JOIN(t1) */ t1.a, t1.b from t t1, (select t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Best": "MergeInnerJoin{TableReader(Table(t))->MergeInnerJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#1,Column#13)->Projection" + "Best": "MergeInnerJoin{TableReader(Table(t))->MergeInnerJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ INL_JOIN(t1) */ t1.a, t1.b from t t1, (select t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Best": "IndexJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#13,Column#1)->Projection" + "Best": "IndexJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ HASH_JOIN(t1) */ t1.a, t1.b from t t1, (select t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Best": "RightHashJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#1,Column#13)->Projection" + "Best": "RightHashJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ HASH_JOIN(@sel_2 t1@sel_2, t2@sel_2), SM_JOIN(@sel_1 t1@sel_1, t2@sel_1) */ * from (select t1.a, t1.b from t t1, t t2 where t1.a = t2.a) t1, t t2 where t1.b = t2.b", - "Best": "MergeInnerJoin{LeftHashJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(Column#1,Column#13)->Sort->TableReader(Table(t))->Sort}(Column#2,Column#26)->Projection" + "Best": "MergeInnerJoin{LeftHashJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(test.t.a,test.t.a)->Sort->TableReader(Table(t))->Sort}(test.t.b,test.t.b)->Projection" }, { "SQL": "select /*+ STREAM_AGG() */ s, count(s) from (select /*+ HASH_AGG() */ sum(t1.a) as s from t t1, t t2 where t1.a = t2.b group by t1.a) p group by s", - "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->TableReader(Table(t))}(Column#1,Column#14)->Projection->HashAgg->Sort->StreamAgg->Projection" + "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->TableReader(Table(t))}(test.t.a,test.t.b)->Projection->HashAgg->Sort->StreamAgg->Projection" }, { "SQL": "select /*+ HASH_AGG() */ s, count(s) from (select /*+ STREAM_AGG() */ sum(t1.a) as s from t t1, t t2 where t1.a = t2.b group by t1.a) p group by s", - "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->TableReader(Table(t))}(Column#1,Column#14)->Sort->Projection->StreamAgg->HashAgg->Projection" + "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->TableReader(Table(t))}(test.t.a,test.t.b)->Sort->Projection->StreamAgg->HashAgg->Projection" }, { "SQL": "select /*+ HASH_AGG() */ s, count(s) from (select sum(t1.a) as s from t t1, t t2 where t1.a = t2.b group by t1.a) p group by s", - "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->TableReader(Table(t))}(Column#1,Column#14)->Projection->HashAgg->HashAgg->Projection" + "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->TableReader(Table(t))}(test.t.a,test.t.b)->Projection->HashAgg->HashAgg->Projection" }, { "SQL": "select /*+ STREAM_AGG() */ s, count(s) from (select sum(t1.a) as s from t t1, t t2 where t1.a = t2.b group by t1.a) p group by s", - "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->TableReader(Table(t))}(Column#1,Column#14)->Projection->HashAgg->Sort->StreamAgg->Projection" + "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->TableReader(Table(t))}(test.t.a,test.t.b)->Projection->HashAgg->Sort->StreamAgg->Projection" } ] }, @@ -125,13 +125,13 @@ }, { "SQL": "select /*+ USE_INDEX(t1, c_d_e), USE_INDEX(t2, f) */ * from t t1, t t2 where t1.a = t2.b", - "Best": "LeftHashJoin{IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))->IndexLookUp(Index(t.f)[[NULL,+inf]], Table(t))}(Column#1,Column#14)", + "Best": "LeftHashJoin{IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))->IndexLookUp(Index(t.f)[[NULL,+inf]], Table(t))}(test.t.a,test.t.b)", "HasWarn": false, "Hints": "USE_INDEX(@`sel_1` `test`.`t1` `c_d_e`), USE_INDEX(@`sel_1` `test`.`t2` `f`), HASH_JOIN(@`sel_1` `test`.`t1`)" }, { "SQL": "select /*+ IGNORE_INDEX(t1, c_d_e), IGNORE_INDEX(t2, f), HASH_JOIN(t1) */ * from t t1, t t2 where t1.a = t2.b", - "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#14)", + "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.b)", "HasWarn": false, "Hints": "USE_INDEX(@`sel_1` `test`.`t1` ), USE_INDEX(@`sel_1` `test`.`t2` ), HASH_JOIN(@`sel_1` `test`.`t1`)" }, @@ -143,7 +143,7 @@ }, { "SQL": "select /*+ USE_INDEX(t) */ f from t where f > 10", - "Best": "TableReader(Table(t)->Sel([gt(Column#9, 10)]))", + "Best": "TableReader(Table(t)->Sel([gt(test.t.f, 10)]))", "HasWarn": false, "Hints": "USE_INDEX(@`sel_1` `test`.`t` )" }, @@ -208,7 +208,7 @@ }, { "SQL": "select /*+ NO_INDEX_MERGE(), USE_INDEX_MERGE(t, primary, f_g, c_d_e) */ * from t where a < 1 or f > 2", - "Best": "TableReader(Table(t)->Sel([or(lt(Column#1, 1), gt(Column#9, 2))]))", + "Best": "TableReader(Table(t)->Sel([or(lt(test.t.a, 1), gt(test.t.f, 2))]))", "HasWarn": true, "Hints": "USE_INDEX(@`sel_1` `test`.`t` )" } @@ -223,7 +223,7 @@ }, { "SQL": "select f from t use index() where f = 1", - "Best": "TableReader(Table(t)->Sel([eq(Column#9, 1)]))" + "Best": "TableReader(Table(t)->Sel([eq(test.t.f, 1)]))" }, { "SQL": "select a from t where a between 1 and 2 order by c", @@ -239,7 +239,7 @@ }, { "SQL": "select * from t where t.c = 1 and t.e = 1 order by t.b limit 1", - "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([eq(Column#5, 1)]), Table(t))->TopN([Column#2],0,1)" + "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([eq(test.t.e, 1)]), Table(t))->TopN([test.t.b],0,1)" }, { "SQL": "select * from t where t.e_str is null", @@ -251,15 +251,15 @@ }, { "SQL": "select * from t where t.c = 1 and t.e = 1 order by t.e limit 1", - "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([eq(Column#5, 1)]), Table(t))->TopN([Column#5],0,1)" + "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([eq(test.t.e, 1)]), Table(t))->TopN([test.t.e],0,1)" }, { "SQL": "select * from t where t.c = 1 and t.e = 1 order by t.d limit 1", - "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([eq(Column#5, 1)])->Limit, Table(t))" + "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([eq(test.t.e, 1)])->Limit, Table(t))" }, { "SQL": "select c from t where t.c = 1 and t.e = 1 order by t.d limit 1", - "Best": "IndexReader(Index(t.c_d_e)[[1,1]]->Sel([eq(Column#5, 1)])->Limit)->Limit->Projection" + "Best": "IndexReader(Index(t.c_d_e)[[1,1]]->Sel([eq(test.t.e, 1)])->Limit)->Limit->Projection" }, { "SQL": "select c from t order by t.a limit 1", @@ -267,7 +267,7 @@ }, { "SQL": "select c from t order by t.a + t.b limit 1", - "Best": "TableReader(Table(t)->TopN([plus(Column#1, Column#2)],0,1))->Projection->TopN([Column#14],0,1)->Projection->Projection" + "Best": "TableReader(Table(t)->TopN([plus(test.t.a, test.t.b)],0,1))->Projection->TopN([Column#14],0,1)->Projection->Projection" }, { "SQL": "select c from t limit 1", @@ -295,7 +295,7 @@ }, { "SQL": "select c, b from t where c = 1 and e = 1 and b = 1 limit 1", - "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([eq(Column#5, 1)]), Table(t)->Sel([eq(Column#2, 1)])->Limit)->Limit->Projection" + "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([eq(test.t.e, 1)]), Table(t)->Sel([eq(test.t.b, 1)])->Limit)->Limit->Projection" }, { "SQL": "select c from t where c = 1 order by d, c", @@ -307,19 +307,19 @@ }, { "SQL": "select c from t where t.c = 1 and t.a > 1 order by t.d limit 1", - "Best": "IndexReader(Index(t.c_d_e)[[1,1]]->Sel([gt(Column#1, 1)])->Limit)->Limit->Projection" + "Best": "IndexReader(Index(t.c_d_e)[[1,1]]->Sel([gt(test.t.a, 1)])->Limit)->Limit->Projection" }, { "SQL": "select c from t where t.c = 1 and t.d = 1 order by t.a limit 1", - "Best": "IndexReader(Index(t.c_d_e)[[1 1,1 1]])->TopN([Column#1],0,1)->Projection" + "Best": "IndexReader(Index(t.c_d_e)[[1 1,1 1]])->TopN([test.t.a],0,1)->Projection" }, { "SQL": "select * from t where t.c = 1 and t.a > 1 order by t.d limit 1", - "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([gt(Column#1, 1)])->Limit, Table(t))" + "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([gt(test.t.a, 1)])->Limit, Table(t))" }, { "SQL": "select * from t use index(e_d_c_str_prefix) where t.c_str = 'abcdefghijk' and t.d_str = 'd' and t.e_str = 'e'", - "Best": "IndexLookUp(Index(t.e_d_c_str_prefix)[[\"e\" \"d\" \"abcdefghij\",\"e\" \"d\" \"abcdefghij\"]], Table(t)->Sel([eq(Column#6, abcdefghijk)]))" + "Best": "IndexLookUp(Index(t.e_d_c_str_prefix)[[\"e\" \"d\" \"abcdefghij\",\"e\" \"d\" \"abcdefghij\"]], Table(t)->Sel([eq(test.t.c_str, abcdefghijk)]))" }, { "SQL": "select * from t use index(e_d_c_str_prefix) where t.e_str = b'1110000'", @@ -327,7 +327,7 @@ }, { "SQL": "select * from (select * from t use index() order by b) t left join t t1 on t.a=t1.a limit 10", - "Best": "IndexMergeJoin{TableReader(Table(t)->TopN([Column#2],0,10))->TopN([Column#2],0,10)->TableReader(Table(t))}(Column#1,Column#13)->Limit" + "Best": "IndexMergeJoin{TableReader(Table(t)->TopN([test.t.b],0,10))->TopN([test.t.b],0,10)->TableReader(Table(t))}(test.t.a,test.t.a)->Limit" }, { "SQL": "select * from ((SELECT 1 a,3 b) UNION (SELECT 2,1) ORDER BY (SELECT 2)) t order by a,b", @@ -343,15 +343,15 @@ }, { "SQL": "select lead(a, 1) over (partition by null) as c from t", - "Best": "IndexReader(Index(t.f)[[NULL,+inf]])->Window(lead(Column#1, 1) over())->Projection" + "Best": "IndexReader(Index(t.f)[[NULL,+inf]])->Window(lead(test.t.a, 1)->Column#14 over())->Projection" }, { "SQL": "select * from t use index(f) where f = 1 and a = 1", - "Best": "IndexLookUp(Index(t.f)[[1,1]]->Sel([eq(Column#1, 1)]), Table(t))" + "Best": "IndexLookUp(Index(t.f)[[1,1]]->Sel([eq(test.t.a, 1)]), Table(t))" }, { "SQL": "select * from t2 use index(b) where b = 1 and a = 1", - "Best": "IndexLookUp(Index(t2.b)[[1,1]]->Sel([eq(Column#1, 1)]), Table(t2))" + "Best": "IndexLookUp(Index(t2.b)[[1,1]]->Sel([eq(test.t2.a, 1)]), Table(t2))" } ] }, @@ -364,179 +364,179 @@ }, { "SQL": "select * from t t1 join t t2 on t1.b = t2.a", - "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#2,Column#13)" + "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.b,test.t.a)" }, { "SQL": "select * from t t1 join t t2 on t1.a = t2.a join t t3 on t1.a = t3.a", - "Best": "LeftHashJoin{MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)->TableReader(Table(t))}(Column#1,Column#25)" + "Best": "LeftHashJoin{MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->TableReader(Table(t))}(test.t.a,test.t.a)" }, { "SQL": "select * from t t1 join t t2 on t1.a = t2.a join t t3 on t1.b = t3.a", - "Best": "LeftHashJoin{MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)->TableReader(Table(t))}(Column#2,Column#25)" + "Best": "LeftHashJoin{MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->TableReader(Table(t))}(test.t.b,test.t.a)" }, { "SQL": "select * from t t1 join t t2 on t1.b = t2.a order by t1.a", - "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#2,Column#13)" + "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.b,test.t.a)" }, { "SQL": "select * from t t1 join t t2 on t1.b = t2.a order by t1.a limit 1", - "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#2,Column#13)->Limit" + "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.b,test.t.a)->Limit" }, { "SQL": "select /*+ TIDB_HJ(t1, t2) */ * from t t1 join t t2 on t1.b = t2.a order by t1.a limit 1", - "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#2,Column#13)->TopN([Column#1],0,1)" + "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.b,test.t.a)->TopN([test.t.a],0,1)" }, { "SQL": "select * from t t1 left join t t2 on t1.b = t2.a where 1 = 1 limit 1", - "Best": "IndexMergeJoin{TableReader(Table(t)->Limit)->Limit->TableReader(Table(t))}(Column#2,Column#13)->Limit" + "Best": "IndexMergeJoin{TableReader(Table(t)->Limit)->Limit->TableReader(Table(t))}(test.t.b,test.t.a)->Limit" }, { "SQL": "select * from t t1 join t t2 on t1.b = t2.a and t1.c = 1 and t1.d = 1 and t1.e = 1 order by t1.a limit 1", - "Best": "IndexMergeJoin{IndexLookUp(Index(t.c_d_e)[[1 1 1,1 1 1]], Table(t))->TableReader(Table(t))}(Column#2,Column#13)->TopN([Column#1],0,1)" + "Best": "IndexMergeJoin{IndexLookUp(Index(t.c_d_e)[[1 1 1,1 1 1]], Table(t))->TableReader(Table(t))}(test.t.b,test.t.a)->TopN([test.t.a],0,1)" }, { "SQL": "select * from t t1 join t t2 on t1.b = t2.b join t t3 on t1.b = t3.b", - "Best": "LeftHashJoin{LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#2,Column#14)->TableReader(Table(t))}(Column#2,Column#26)" + "Best": "LeftHashJoin{LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.b,test.t.b)->TableReader(Table(t))}(test.t.b,test.t.b)" }, { "SQL": "select * from t t1 join t t2 on t1.a = t2.a order by t1.a", - "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)" + "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)" }, { "SQL": "select * from t t1 left outer join t t2 on t1.a = t2.a right outer join t t3 on t1.a = t3.a", - "Best": "RightHashJoin{MergeLeftOuterJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)->TableReader(Table(t))}(Column#1,Column#25)" + "Best": "RightHashJoin{MergeLeftOuterJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->TableReader(Table(t))}(test.t.a,test.t.a)" }, { "SQL": "select * from t t1 join t t2 on t1.a = t2.a join t t3 on t1.a = t3.a and t1.b = 1 and t3.c = 1", - "Best": "IndexMergeJoin{IndexMergeJoin{TableReader(Table(t)->Sel([eq(Column#2, 1)]))->IndexLookUp(Index(t.c_d_e)[[1,1]], Table(t))}(Column#25,Column#1)->TableReader(Table(t))}(Column#1,Column#13)->Projection" + "Best": "IndexMergeJoin{IndexMergeJoin{TableReader(Table(t)->Sel([eq(test.t.b, 1)]))->IndexLookUp(Index(t.c_d_e)[[1,1]], Table(t))}(test.t.a,test.t.a)->TableReader(Table(t))}(test.t.a,test.t.a)->Projection" }, { "SQL": "select * from t where t.c in (select b from t s where s.a = t.a)", - "Best": "MergeSemiJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)" + "Best": "MergeSemiJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)" }, { "SQL": "select t.c in (select b from t s where s.a = t.a) from t", - "Best": "LeftHashJoin{IndexReader(Index(t.c_d_e)[[NULL,+inf]])->TableReader(Table(t))}(Column#1,Column#13)(Column#3,Column#14)->Projection" + "Best": "LeftHashJoin{IndexReader(Index(t.c_d_e)[[NULL,+inf]])->TableReader(Table(t))}(test.t.a,test.t.a)(test.t.c,test.t.b)->Projection" }, { "SQL": "select /*+ TIDB_SMJ(t1,t2)*/ * from t t1, t t2 where t1.a = t2.b", - "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))->Sort}(Column#1,Column#14)" + "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))->Sort}(test.t.a,test.t.b)" }, { "SQL": "select /*+ TIDB_SMJ(t1,t2)*/ * from t t1, t t2 where t1.a = t2.a", - "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)" + "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)" }, { "SQL": "select /*+ TIDB_SMJ(t1,t2)*/ * from t t1, t t2 where t1.a = t2.a order by t2.a", - "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)" + "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)" }, { "SQL": "select /*+ TIDB_SMJ(t1,t2)*/ * from t t1, t t2 where t1.b = t2.b order by t2.a", - "Best": "MergeInnerJoin{TableReader(Table(t))->Sort->TableReader(Table(t))->Sort}(Column#2,Column#14)->Sort" + "Best": "MergeInnerJoin{TableReader(Table(t))->Sort->TableReader(Table(t))->Sort}(test.t.b,test.t.b)->Sort" }, { "SQL": "select /*+ TIDB_SMJ(t1,t2)*/ * from t t1, t t2 where t1.a = t2.a order by t2.a desc", - "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)" + "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)" }, { "SQL": "select /*+ TIDB_SMJ(t1,t2)*/ * from t t1, t t2 where t1.b = t2.b order by t2.b desc", - "Best": "MergeInnerJoin{TableReader(Table(t))->Sort->TableReader(Table(t))->Sort}(Column#2,Column#14)" + "Best": "MergeInnerJoin{TableReader(Table(t))->Sort->TableReader(Table(t))->Sort}(test.t.b,test.t.b)" }, { "SQL": "select /*+ TIDB_SMJ(t1,t2,t3)*/ * from t t1, t t2, t t3 where t1.a = t2.a and t2.a = t3.a", - "Best": "MergeInnerJoin{MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)->TableReader(Table(t))}(Column#13,Column#25)" + "Best": "MergeInnerJoin{MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->TableReader(Table(t))}(test.t.a,test.t.a)" }, { "SQL": "select /*+ TIDB_SMJ(t1,t2,t3)*/ * from t t1, t t2, t t3 where t1.a = t2.b and t2.a = t3.b", - "Best": "MergeInnerJoin{MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))->Sort}(Column#1,Column#14)->Sort->TableReader(Table(t))->Sort}(Column#13,Column#26)" + "Best": "MergeInnerJoin{MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))->Sort}(test.t.a,test.t.b)->Sort->TableReader(Table(t))->Sort}(test.t.a,test.t.b)" }, { "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))}(Column#3,Column#15)(Column#4,Column#16)->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(Column#3,Column#27)(Column#4,Column#28)" + "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)" }, { "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))}(Column#3,Column#15)(Column#4,Column#16)->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(Column#3,Column#27)(Column#4,Column#28)" + "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)" }, { "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", - "Best": "MergeLeftOuterJoin{MergeLeftOuterJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)->TableReader(Table(t))}(Column#13,Column#25)" + "Best": "MergeLeftOuterJoin{MergeLeftOuterJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->TableReader(Table(t))}(test.t.a,test.t.a)" }, { "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 t1.a = t3.a", - "Best": "MergeLeftOuterJoin{MergeLeftOuterJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)->TableReader(Table(t))}(Column#1,Column#25)" + "Best": "MergeLeftOuterJoin{MergeLeftOuterJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->TableReader(Table(t))}(test.t.a,test.t.a)" }, { "SQL": "select /*+ TIDB_INLJ(t1, t2) */ * from t t1, t t2 where t1.a = t2.a", - "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)" + "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)" }, { "SQL": "select /*+ TIDB_INLJ(t2) */ * from t t1, t t2 where t1.a = t2.c", - "Best": "IndexJoin{TableReader(Table(t))->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(Column#1,Column#15)" + "Best": "IndexJoin{TableReader(Table(t))->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(test.t.a,test.t.c)" }, { "SQL": "select /*+ TIDB_INLJ(t2) */ t1.a , t2.a from t t1, t t2 where t1.a = t2.c", - "Best": "IndexJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#1,Column#15)->Projection" + "Best": "IndexJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)->Projection" }, { "SQL": "select /*+ TIDB_INLJ(t1, t2) */ t1.a, t2.a from t t1, t t2 where t1.a = t2.a order by t1.c", - "Best": "IndexJoin{IndexReader(Index(t.c_d_e)[[NULL,+inf]])->TableReader(Table(t))}(Column#1,Column#13)->Projection" + "Best": "IndexJoin{IndexReader(Index(t.c_d_e)[[NULL,+inf]])->TableReader(Table(t))}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ TIDB_INLJ(t1, t2) */ t1.a, t2.a from t t1, t t2 where t1.a = t2.a order by t2.c", - "Best": "IndexJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#1)->Projection" + "Best": "IndexJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ TIDB_INLJ(t1) */ t1.a , t2.a from t t1, t t2 where t1.a = t2.c", - "Best": "IndexJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#15,Column#1)->Projection" + "Best": "IndexJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.c,test.t.a)->Projection" }, { "SQL": "select /*+ TIDB_INLJ(t1, t2) */ * from t t1 left outer join t t2 on t1.a = t2.a and t2.b < 1", - "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t)->Sel([lt(Column#14, 1)]))}(Column#1,Column#13)" + "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t)->Sel([lt(test.t.b, 1)]))}(test.t.a,test.t.a)" }, { "SQL": "select /*+ TIDB_INLJ(t1, t2) */ * from t t1 join t t2 on t1.d=t2.d and t2.c = 1", - "Best": "IndexJoin{TableReader(Table(t))->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(Column#4,Column#16)" + "Best": "IndexJoin{TableReader(Table(t))->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(test.t.d,test.t.d)" }, { "SQL": "select /*+ TIDB_INLJ(t1, t2) */ * from t t1 left outer join t t2 on t1.a = t2.b", - "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#14)" + "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.b)" }, { "SQL": "select /*+ TIDB_INLJ(t2) */ * from t t1 right outer join t t2 on t1.a = t2.b", - "Best": "RightHashJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#14)" + "Best": "RightHashJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.b)" }, { "SQL": "select /*+ TIDB_INLJ(t2) */ * from t t1 where t1.a in (select a from t t2)", - "Best": "LeftHashJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(Column#1,Column#13)->Projection" + "Best": "LeftHashJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ TIDB_INLJ(t1) */ * from t t1 where t1.a in (select a from t t2)", - "Best": "IndexJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(Column#13,Column#1)->Projection" + "Best": "IndexJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(test.t.a,test.t.a)->Projection" }, { "SQL": "select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t1.c=t2.c and t1.f=t2.f", - "Best": "IndexJoin{TableReader(Table(t))->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(Column#3,Column#15)" + "Best": "IndexJoin{TableReader(Table(t))->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(test.t.c,test.t.c)" }, { "SQL": "select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t1.a = t2.a and t1.f=t2.f", - "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)" + "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)" }, { "SQL": "select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t1.f=t2.f and t1.a=t2.a", - "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)" + "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)" }, { "SQL": "select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t1.a=t2.a and t2.a in (1, 2)", - "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t)->Sel([in(Column#13, 1, 2)]))}(Column#1,Column#13)" + "Best": "IndexJoin{TableReader(Table(t))->TableReader(Table(t)->Sel([in(test.t.a, 1, 2)]))}(test.t.a,test.t.a)" }, { "SQL": "select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t1.b=t2.c and t1.b=1 and t2.d > t1.d-10 and t2.d < t1.d+10", - "Best": "IndexJoin{TableReader(Table(t)->Sel([eq(Column#2, 1)]))->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}" + "Best": "IndexJoin{TableReader(Table(t)->Sel([eq(test.t.b, 1)]))->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}" }, { "SQL": "select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t1.b=t2.b and t1.c=1 and t2.c=1 and t2.d > t1.d-10 and t2.d < t1.d+10", - "Best": "LeftHashJoin{IndexLookUp(Index(t.c_d_e)[[1,1]], Table(t))->IndexLookUp(Index(t.c_d_e)[[1,1]], Table(t))}(Column#2,Column#14)" + "Best": "LeftHashJoin{IndexLookUp(Index(t.c_d_e)[[1,1]], Table(t))->IndexLookUp(Index(t.c_d_e)[[1,1]], Table(t))}(test.t.b,test.t.b)" }, { "SQL": "select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t2.c > t1.d-10 and t2.c < t1.d+10", @@ -544,7 +544,7 @@ }, { "SQL": "select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t1.b = t2.c and t2.c=1 and t2.d=2 and t2.e=4", - "Best": "LeftHashJoin{TableReader(Table(t)->Sel([eq(Column#2, 1)]))->IndexLookUp(Index(t.c_d_e)[[1 2 4,1 2 4]], Table(t))}" + "Best": "LeftHashJoin{TableReader(Table(t)->Sel([eq(test.t.b, 1)]))->IndexLookUp(Index(t.c_d_e)[[1 2 4,1 2 4]], Table(t))}" }, { "SQL": "select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t2.c=1 and t2.d=1 and t2.e > 10 and t2.e < 20", @@ -565,27 +565,27 @@ }, { "SQL": "select * from t where a in (select s.a from t s) order by t.a", - "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)->Projection" + "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->Projection" }, { "SQL": "select * from t where exists (select s.a from t s where s.c in (select c from t as k where k.d = s.d) having sum(s.a) = t.a )", - "Best": "LeftHashJoin{TableReader(Table(t))->Projection->MergeSemiJoin{IndexReader(Index(t.c_d_e)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#15,Column#27)(Column#16,Column#28)->Projection->StreamAgg}(Column#39,Column#37)->Projection" + "Best": "LeftHashJoin{TableReader(Table(t))->Projection->MergeSemiJoin{IndexReader(Index(t.c_d_e)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.c,test.t.c)(test.t.d,test.t.d)->Projection->StreamAgg}(Column#39,Column#37)->Projection" }, { "SQL": "select * from t where a in (select a from t) order by b", - "Best": "LeftHashJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(Column#1,Column#13)->Projection->Sort" + "Best": "LeftHashJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(test.t.a,test.t.a)->Projection->Sort" }, { "SQL": "select t.c in (select count(*) from t s, t t1 where s.a = t.a and s.a = t1.a) from t", - "Best": "Apply{IndexReader(Index(t.c_d_e)[[NULL,+inf]])->MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#13,Column#25)->StreamAgg}->Projection" + "Best": "Apply{IndexReader(Index(t.c_d_e)[[NULL,+inf]])->MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->StreamAgg}->Projection" }, { "SQL": "select (select count(*) from t s, t t1 where s.a = t.a and s.a = t1.a) from t", - "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]])}(Column#13,Column#25)->HashAgg}(Column#1,Column#13)->Projection" + "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]])}(test.t.a,test.t.a)->HashAgg}(test.t.a,test.t.a)->Projection" }, { "SQL": "select (select count(*) from t s, t t1 where s.a = t.a and s.a = t1.a) from t order by t.a", - "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]])}(Column#13,Column#25)->HashAgg}(Column#1,Column#13)->Projection->Sort->Projection" + "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]])}(test.t.a,test.t.a)->HashAgg}(test.t.a,test.t.a)->Projection->Sort->Projection" } ] }, @@ -594,19 +594,19 @@ "Cases": [ { "SQL": "select * from t t1 left join t t2 on t1.b = t2.b left join t t3 on t2.b = t3.b order by t1.a limit 1", - "Best": "LeftHashJoin{LeftHashJoin{TableReader(Table(t)->Limit)->Limit->TableReader(Table(t))}(Column#2,Column#14)->TopN([Column#1],0,1)->TableReader(Table(t))}(Column#14,Column#26)->TopN([Column#1],0,1)" + "Best": "LeftHashJoin{LeftHashJoin{TableReader(Table(t)->Limit)->Limit->TableReader(Table(t))}(test.t.b,test.t.b)->TopN([test.t.a],0,1)->TableReader(Table(t))}(test.t.b,test.t.b)->TopN([test.t.a],0,1)" }, { "SQL": "select * from t t1 left join t t2 on t1.b = t2.b left join t t3 on t2.b = t3.b order by t1.b limit 1", - "Best": "LeftHashJoin{LeftHashJoin{TableReader(Table(t)->TopN([Column#2],0,1))->TopN([Column#2],0,1)->TableReader(Table(t))}(Column#2,Column#14)->TopN([Column#2],0,1)->TableReader(Table(t))}(Column#14,Column#26)->TopN([Column#2],0,1)" + "Best": "LeftHashJoin{LeftHashJoin{TableReader(Table(t)->TopN([test.t.b],0,1))->TopN([test.t.b],0,1)->TableReader(Table(t))}(test.t.b,test.t.b)->TopN([test.t.b],0,1)->TableReader(Table(t))}(test.t.b,test.t.b)->TopN([test.t.b],0,1)" }, { "SQL": "select * from t t1 left join t t2 on t1.b = t2.b left join t t3 on t2.b = t3.b limit 1", - "Best": "LeftHashJoin{LeftHashJoin{TableReader(Table(t)->Limit)->Limit->TableReader(Table(t))}(Column#2,Column#14)->Limit->TableReader(Table(t))}(Column#14,Column#26)->Limit" + "Best": "LeftHashJoin{LeftHashJoin{TableReader(Table(t)->Limit)->Limit->TableReader(Table(t))}(test.t.b,test.t.b)->Limit->TableReader(Table(t))}(test.t.b,test.t.b)->Limit" }, { "SQL": "select * from t where b = 1 and c = 1 order by c limit 1", - "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]], Table(t)->Sel([eq(Column#2, 1)]))->Limit" + "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]], Table(t)->Sel([eq(test.t.b, 1)]))->Limit" }, { "SQL": "select * from t where c = 1 order by c limit 1", @@ -627,12 +627,12 @@ "Cases": [ { "SQL": "select * from t order by b limit 1 for update", - "Best": "TableReader(Table(t))->Lock->TopN([Column#2],0,1)", + "Best": "TableReader(Table(t))->Lock->TopN([test.t.b],0,1)", "Hints": "USE_INDEX(@`sel_1` `test`.`t` )" }, { "SQL": "update t set a = 5 where b < 1 order by d limit 1", - "Best": "TableReader(Table(t)->Sel([lt(Column#2, 1)])->TopN([Column#4],0,1))->TopN([Column#4],0,1)->Update", + "Best": "TableReader(Table(t)->Sel([lt(test.t.b, 1)])->TopN([test.t.d],0,1))->TopN([test.t.d],0,1)->Update", "Hints": "USE_INDEX(@`upd_1` `test`.`t` )" }, { @@ -642,27 +642,27 @@ }, { "SQL": "delete /*+ TIDB_INLJ(t1, t2) */ t1 from t t1, t t2 where t1.c=t2.c", - "Best": "IndexJoin{TableReader(Table(t))->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(Column#3,Column#15)->Delete", + "Best": "IndexJoin{TableReader(Table(t))->IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t))}(test.t.c,test.t.c)->Delete", "Hints": "USE_INDEX(@`del_1` `test`.`t1` ), USE_INDEX(@`del_1` `test`.`t2` `c_d_e`), INL_JOIN(@`del_1` `test`.`t2`)" }, { "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))}(Column#3,Column#15)->Delete", + "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": "USE_INDEX(@`del_1` `test`.`t1` `c_d_e`), USE_INDEX(@`del_1` `test`.`t2` `c_d_e`), SM_JOIN(@`del_1` `test`.`t1`)" }, { "SQL": "update /*+ TIDB_SMJ(t1, t2) */ t t1, t t2 set t1.a=1, t2.a=1 where t1.a=t2.a", - "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)->Update", + "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->Update", "Hints": "USE_INDEX(@`upd_1` `test`.`t1` ), USE_INDEX(@`upd_1` `test`.`t2` ), SM_JOIN(@`upd_1` `test`.`t1`)" }, { "SQL": "update /*+ TIDB_HJ(t1, t2) */ t t1, t t2 set t1.a=1, t2.a=1 where t1.a=t2.a", - "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)->Update", + "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->Update", "Hints": "USE_INDEX(@`upd_1` `test`.`t1` ), USE_INDEX(@`upd_1` `test`.`t2` ), HASH_JOIN(@`upd_1` `test`.`t1`)" }, { "SQL": "delete from t where b < 1 order by d limit 1", - "Best": "TableReader(Table(t)->Sel([lt(Column#2, 1)])->TopN([Column#4],0,1))->TopN([Column#4],0,1)->Delete", + "Best": "TableReader(Table(t)->Sel([lt(test.t.b, 1)])->TopN([test.t.d],0,1))->TopN([test.t.d],0,1)->Delete", "Hints": "USE_INDEX(@`del_1` `test`.`t` )" }, { @@ -672,12 +672,12 @@ }, { "SQL": "delete from t use index(c_d_e) where b = 1", - "Best": "IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t)->Sel([eq(Column#2, 1)]))->Delete", + "Best": "IndexLookUp(Index(t.c_d_e)[[NULL,+inf]], Table(t)->Sel([eq(test.t.b, 1)]))->Delete", "Hints": "USE_INDEX(@`del_1` `test`.`t` `c_d_e`)" }, { "SQL": "insert into t select * from t where b < 1 order by d limit 1", - "Best": "TableReader(Table(t)->Sel([lt(Column#14, 1)])->TopN([Column#16],0,1))->TopN([Column#16],0,1)->Insert", + "Best": "TableReader(Table(t)->Sel([lt(test.t.b, 1)])->TopN([test.t.d],0,1))->TopN([test.t.d],0,1)->Insert", "Hints": "" }, { @@ -764,19 +764,19 @@ }, { "SQL": "select sum(e), avg(b + c) from t where c = 1 and e = 1 group by d", - "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([eq(Column#5, 1)]), Table(t))->Projection->HashAgg" + "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([eq(test.t.e, 1)]), Table(t))->Projection->HashAgg" }, { "SQL": "select sum(e), avg(b + c) from t where c = 1 and b = 1", - "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]], Table(t)->Sel([eq(Column#2, 1)]))->Projection->StreamAgg" + "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]], Table(t)->Sel([eq(test.t.b, 1)]))->Projection->StreamAgg" }, { "SQL": "select sum(e) as k, avg(b + c) from t where c = 1 and b = 1 and e = 1 group by d order by k", - "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([eq(Column#5, 1)]), Table(t)->Sel([eq(Column#2, 1)]))->Projection->Projection->StreamAgg->Sort" + "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([eq(test.t.e, 1)]), Table(t)->Sel([eq(test.t.b, 1)]))->Projection->Projection->StreamAgg->Sort" }, { "SQL": "select sum(e) as k, avg(b + c) from t where c = 1 and b = 1 and e = 1 group by c order by k", - "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([eq(Column#5, 1)]), Table(t)->Sel([eq(Column#2, 1)]))->Projection->Projection->StreamAgg->Sort" + "Best": "IndexLookUp(Index(t.c_d_e)[[1,1]]->Sel([eq(test.t.e, 1)]), Table(t)->Sel([eq(test.t.b, 1)]))->Projection->Projection->StreamAgg->Sort" }, { "SQL": "select sum(to_base64(e)) from t where c = 1", @@ -784,7 +784,7 @@ }, { "SQL": "select (select count(1) k from t s where s.a = t.a having k != 0) from t", - "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]]->Sel([1]))->Projection}(Column#1,Column#13)->Projection" + "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]]->Sel([1]))->Projection}(test.t.a,test.t.a)->Projection" }, { "SQL": "select sum(to_base64(e)) from t group by e,d,c order by c", @@ -820,7 +820,7 @@ }, { "SQL": "select count(*) from t group by b order by b limit 10", - "Best": "TableReader(Table(t)->HashAgg)->HashAgg->TopN([Column#2],0,10)->Projection" + "Best": "TableReader(Table(t)->HashAgg)->HashAgg->TopN([test.t.b],0,10)->Projection" }, { "SQL": "select count(*) from t group by b order by b", @@ -832,15 +832,15 @@ }, { "SQL": "select sum(a.g), sum(b.g) from t a join t b on a.g = b.g group by a.g", - "Best": "MergeInnerJoin{IndexReader(Index(t.g)[[NULL,+inf]])->IndexReader(Index(t.g)[[NULL,+inf]])}(Column#10,Column#22)->Projection->StreamAgg" + "Best": "MergeInnerJoin{IndexReader(Index(t.g)[[NULL,+inf]])->IndexReader(Index(t.g)[[NULL,+inf]])}(test.t.g,test.t.g)->Projection->StreamAgg" }, { "SQL": "select /*+ tidb_inlj(a,b) */ sum(a.g), sum(b.g) from t a join t b on a.g = b.g and a.g > 60 group by a.g order by a.g limit 1", - "Best": "IndexJoin{IndexReader(Index(t.g)[(60,+inf]])->IndexReader(Index(t.g)[[NULL,+inf]]->Sel([gt(Column#22, 60)]))}(Column#10,Column#22)->Projection->StreamAgg->Limit->Projection" + "Best": "IndexJoin{IndexReader(Index(t.g)[(60,+inf]])->IndexReader(Index(t.g)[[NULL,+inf]]->Sel([gt(test.t.g, 60)]))}(test.t.g,test.t.g)->Projection->StreamAgg->Limit->Projection" }, { "SQL": "select sum(a.g), sum(b.g) from t a join t b on a.g = b.g and a.a>5 group by a.g order by a.g limit 1", - "Best": "MergeInnerJoin{IndexReader(Index(t.g)[[NULL,+inf]]->Sel([gt(Column#1, 5)]))->IndexReader(Index(t.g)[[NULL,+inf]])}(Column#10,Column#22)->Projection->StreamAgg->Limit->Projection" + "Best": "MergeInnerJoin{IndexReader(Index(t.g)[[NULL,+inf]]->Sel([gt(test.t.a, 5)]))->IndexReader(Index(t.g)[[NULL,+inf]])}(test.t.g,test.t.g)->Projection->StreamAgg->Limit->Projection" }, { "SQL": "select sum(d) from t", @@ -873,7 +873,7 @@ }, { "SQL": "select a from t where c = 4 and e < 5", - "Best": "IndexReader(Index(t.c_d_e)[[4,4]]->Sel([lt(Column#5, 5)]))->Projection" + "Best": "IndexReader(Index(t.c_d_e)[[4,4]]->Sel([lt(test.t.e, 5)]))->Projection" }, { "SQL": "select a from t where c = 4 and d <= 5 and d > 3", @@ -881,7 +881,7 @@ }, { "SQL": "select a from t where d <= 5 and d > 3", - "Best": "IndexReader(Index(t.c_d_e)[[NULL,+inf]]->Sel([le(Column#4, 5) gt(Column#4, 3)]))->Projection" + "Best": "IndexReader(Index(t.c_d_e)[[NULL,+inf]]->Sel([le(test.t.d, 5) gt(test.t.d, 3)]))->Projection" }, { "SQL": "select a from t where c between 1 and 2", @@ -893,7 +893,7 @@ }, { "SQL": "select a from t where c <= 5 and c >= 3 and d = 1", - "Best": "IndexReader(Index(t.c_d_e)[[3,5]]->Sel([eq(Column#4, 1)]))->Projection" + "Best": "IndexReader(Index(t.c_d_e)[[3,5]]->Sel([eq(test.t.d, 1)]))->Projection" }, { "SQL": "select a from t where c = 1 or c = 2 or c = 3", @@ -909,11 +909,11 @@ }, { "SQL": "select a from t where c = 5 and b = 1", - "Best": "IndexLookUp(Index(t.c_d_e)[[5,5]], Table(t)->Sel([eq(Column#2, 1)]))->Projection" + "Best": "IndexLookUp(Index(t.c_d_e)[[5,5]], Table(t)->Sel([eq(test.t.b, 1)]))->Projection" }, { "SQL": "select a from t where not a", - "Best": "IndexReader(Index(t.f)[[NULL,+inf]]->Sel([not(Column#1)]))" + "Best": "IndexReader(Index(t.f)[[NULL,+inf]]->Sel([not(test.t.a)]))" }, { "SQL": "select a from t where c in (1)", @@ -949,7 +949,7 @@ }, { "SQL": "select a from t where d in (1, 2, 3)", - "Best": "IndexReader(Index(t.c_d_e)[[NULL,+inf]]->Sel([in(Column#4, 1, 2, 3)]))->Projection" + "Best": "IndexReader(Index(t.c_d_e)[[NULL,+inf]]->Sel([in(test.t.d, 1, 2, 3)]))->Projection" }, { "SQL": "select a from t where c not in (1)", @@ -977,7 +977,7 @@ }, { "SQL": "select a from t where c_str like '_abc'", - "Best": "IndexReader(Index(t.c_d_e_str)[[NULL,+inf]]->Sel([like(Column#6, _abc, 92)]))->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[[NULL,+inf]]->Sel([like(test.t.c_str, _abc, 92)]))->Projection" }, { "SQL": "select a from t where c_str like 'abc%'", @@ -985,11 +985,11 @@ }, { "SQL": "select a from t where c_str like 'abc_'", - "Best": "IndexReader(Index(t.c_d_e_str)[(\"abc\",\"abd\")]->Sel([like(Column#6, abc_, 92)]))->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[(\"abc\",\"abd\")]->Sel([like(test.t.c_str, abc_, 92)]))->Projection" }, { "SQL": "select a from t where c_str like 'abc%af'", - "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc\",\"abd\")]->Sel([like(Column#6, abc%af, 92)]))->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc\",\"abd\")]->Sel([like(test.t.c_str, abc%af, 92)]))->Projection" }, { "SQL": "select a from t where c_str like 'abc\\_' escape ''", @@ -1013,7 +1013,7 @@ }, { "SQL": "select a from t where c_str like 'abc\\__'", - "Best": "IndexReader(Index(t.c_d_e_str)[(\"abc_\",\"abc`\")]->Sel([like(Column#6, abc\\__, 92)]))->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[(\"abc_\",\"abc`\")]->Sel([like(test.t.c_str, abc\\__, 92)]))->Projection" }, { "SQL": "select a from t where c_str like 123", @@ -1045,7 +1045,7 @@ }, { "SQL": "select a from t where c = 'hanfei'", - "Best": "IndexReader(Index(t.c_d_e)[[NULL,+inf]])->Sel([eq(cast(Column#3), cast(hanfei))])->Projection" + "Best": "IndexReader(Index(t.c_d_e)[[NULL,+inf]])->Sel([eq(cast(test.t.c), cast(hanfei))])->Projection" } ] }, @@ -1070,7 +1070,7 @@ }, { "SQL": "select max(a+1) from t;", - "Best": "IndexReader(Index(t.f)[[NULL,+inf]]->Sel([not(isnull(plus(Column#1, 1)))])->TopN([plus(Column#1, 1) true],0,1))->Projection->TopN([Column#40 true],0,1)->Projection->Projection->StreamAgg" + "Best": "IndexReader(Index(t.f)[[NULL,+inf]]->Sel([not(isnull(plus(test.t.a, 1)))])->TopN([plus(test.t.a, 1) true],0,1))->Projection->TopN([Column#40 true],0,1)->Projection->Projection->StreamAgg" }, { "SQL": "select max(a), min(a) from t;", @@ -1098,7 +1098,7 @@ }, { "SQL": "select max(a), min(a) from t where a * 3 + 10 < 100", - "Best": "IndexReader(Index(t.f)[[NULL,+inf]]->Sel([lt(plus(mul(Column#1, 3), 10), 100)])->StreamAgg)->StreamAgg" + "Best": "IndexReader(Index(t.f)[[NULL,+inf]]->Sel([lt(plus(mul(test.t.a, 3), 10), 100)])->StreamAgg)->StreamAgg" }, { "SQL": "select max(a) from t group by b;", @@ -1106,7 +1106,7 @@ }, { "SQL": "select max(a) from (select t1.a from t t1 join t t2 on t1.a=t2.a) t", - "Best": "IndexMergeJoin{TableReader(Table(t))->TableReader(Table(t))}(Column#1,Column#13)->Limit->StreamAgg" + "Best": "IndexMergeJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->Limit->StreamAgg" } ] }, @@ -1140,25 +1140,25 @@ "Cases": [ { "SQL": "select /*+ TIDB_INLJ(t1) */ t1.a, t2.a, t3.a from t t1, t t2, t t3 where t1.a = t2.a and t2.a = t3.a;", - "Best": "RightHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(Column#13,Column#1)}(Column#25,Column#13)->Projection", + "Best": "RightHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(test.t.a,test.t.a)}(test.t.a,test.t.a)->Projection", "Warning": "", "Hints": "USE_INDEX(@`sel_1` `test`.`t3` `f`), USE_INDEX(@`sel_1` `test`.`t1` ), USE_INDEX(@`sel_1` `test`.`t2` `f`), INL_JOIN(@`sel_1` `test`.`t1`), HASH_JOIN(@`sel_1` `test`.`t3`)" }, { "SQL": "select /*+ TIDB_INLJ(test.t1) */ t1.a, t2.a, t3.a from t t1, t t2, t t3 where t1.a = t2.a and t2.a = t3.a;", - "Best": "RightHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(Column#13,Column#1)}(Column#25,Column#13)->Projection", + "Best": "RightHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(test.t.a,test.t.a)}(test.t.a,test.t.a)->Projection", "Warning": "", "Hints": "USE_INDEX(@`sel_1` `test`.`t3` `f`), USE_INDEX(@`sel_1` `test`.`t1` ), USE_INDEX(@`sel_1` `test`.`t2` `f`), INL_JOIN(@`sel_1` `test`.`t1`), HASH_JOIN(@`sel_1` `test`.`t3`)" }, { "SQL": "select /*+ TIDB_INLJ(t1) */ t1.b, t2.a from t t1, t t2 where t1.b = t2.a;", - "Best": "LeftHashJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(Column#2,Column#13)", + "Best": "LeftHashJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(test.t.b,test.t.a)", "Warning": "[planner:1815]Optimizer Hint /*+ INL_JOIN(t1) */ or /*+ TIDB_INLJ(t1) */ is inapplicable", "Hints": "USE_INDEX(@`sel_1` `test`.`t1` ), USE_INDEX(@`sel_1` `test`.`t2` `f`), HASH_JOIN(@`sel_1` `test`.`t1`)" }, { "SQL": "select /*+ TIDB_INLJ(t2) */ t1.b, t2.a from t2 t1, t2 t2 where t1.b=t2.b and t2.c=-1;", - "Best": "IndexJoin{IndexReader(Index(t2.b)[[NULL,+inf]])->TableReader(Table(t2)->Sel([eq(Column#6, -1)]))}(Column#5,Column#2)->Projection", + "Best": "IndexJoin{IndexReader(Index(t2.b)[[NULL,+inf]])->TableReader(Table(t2)->Sel([eq(test.t2.c, -1)]))}(test.t2.b,test.t2.b)->Projection", "Warning": "[planner:1815]Optimizer Hint /*+ INL_JOIN(t2) */ or /*+ TIDB_INLJ(t2) */ is inapplicable", "Hints": "USE_INDEX(@`sel_1` `test`.`t1` `b`), USE_INDEX(@`sel_1` `test`.`t2` ), INL_JOIN(@`sel_1` `test`.`t1`)" } @@ -1169,27 +1169,27 @@ "Cases": [ { "SQL": "select count(*) from t t1, t t2 where t1.a = t2.b", - "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->TableReader(Table(t))}(Column#1,Column#14)->StreamAgg", + "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->TableReader(Table(t))}(test.t.a,test.t.b)->StreamAgg", "Warning": "" }, { "SQL": "select count(t1.a) from t t1, t t2 where t1.a = t2.a*2 group by t1.a", - "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]])->Projection}(Column#1,Column#26)->HashAgg", + "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]])->Projection}(test.t.a,Column#26)->HashAgg", "Warning": "" }, { "SQL": "select /*+ HASH_AGG() */ count(*) from t t1, t t2 where t1.a = t2.b", - "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->TableReader(Table(t))}(Column#1,Column#14)->HashAgg", + "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->TableReader(Table(t))}(test.t.a,test.t.b)->HashAgg", "Warning": "" }, { "SQL": "select /*+ STREAM_AGG() */ count(t1.a) from t t1, t t2 where t1.a = t2.a*2 group by t1.a", - "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]])->Projection}(Column#1,Column#26)->Sort->StreamAgg", + "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]])->Projection}(test.t.a,Column#26)->Sort->StreamAgg", "Warning": "" }, { "SQL": "select /*+ HASH_AGG() STREAM_AGG() */ count(*) from t t1, t t2 where t1.a = t2.b", - "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->TableReader(Table(t))}(Column#1,Column#14)->StreamAgg", + "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->TableReader(Table(t))}(test.t.a,test.t.b)->StreamAgg", "Warning": "[planner:1815]Optimizer aggregation hints are conflicted" }, { @@ -1199,12 +1199,12 @@ }, { "SQL": "select /*+ HASH_AGG() */ t1.a from t t1 where t1.a < any(select t2.b from t t2)", - "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]]->Sel([if(isnull(Column#1), , 1)]))->TableReader(Table(t)->HashAgg)->HashAgg->Sel([ne(Column#27, 0)])}->Projection->Projection", + "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]]->Sel([if(isnull(test.t.a), , 1)]))->TableReader(Table(t)->HashAgg)->HashAgg->Sel([ne(Column#27, 0)])}->Projection->Projection", "Warning": "" }, { "SQL": "select /*+ hash_agg() */ t1.a from t t1 where t1.a != any(select t2.b from t t2)", - "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]]->Sel([if(isnull(Column#1), , 1)]))->TableReader(Table(t))->Projection->HashAgg->Sel([ne(Column#28, 0)])}->Projection->Projection", + "Best": "LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]]->Sel([if(isnull(test.t.a), , 1)]))->TableReader(Table(t))->Projection->HashAgg->Sel([ne(Column#28, 0)])}->Projection->Projection", "Warning": "" }, { @@ -1214,7 +1214,7 @@ }, { "SQL": "select /*+ STREAM_AGG() */ sum(t1.a) from t t1 join t t2 on t1.b = t2.b group by t1.b", - "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))->Sort->Projection->StreamAgg}(Column#14,Column#2)->HashAgg", + "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))->Sort->Projection->StreamAgg}(test.t.b,test.t.b)->HashAgg", "Warning": "[planner:1815]Optimizer Hint STREAM_AGG is inapplicable" }, { @@ -1229,57 +1229,57 @@ "Cases": [ { "SQL": "select /*+ SM_JOIN(@sel_1 t1), INL_JOIN(@sel_2 t3) */ t1.a, t1.b from t t1, (select t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Plan": "MergeInnerJoin{TableReader(Table(t))->IndexJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#1,Column#13)->Projection", + "Plan": "MergeInnerJoin{TableReader(Table(t))->IndexJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection", "Hints": "USE_INDEX(@`sel_1` `test`.`t1` ), USE_INDEX(@`sel_2` `test`.`t2` ), USE_INDEX(@`sel_2` `test`.`t3` `c_d_e`), INL_JOIN(@`sel_2` `test`.`t3`), SM_JOIN(@`sel_1` `test`.`t1`)" }, { "SQL": "select /*+ SM_JOIN(@sel_1 t1), INL_JOIN(@qb t3) */ t1.a, t1.b from t t1, (select /*+ QB_NAME(qb) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Plan": "MergeInnerJoin{TableReader(Table(t))->IndexJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#1,Column#13)->Projection", + "Plan": "MergeInnerJoin{TableReader(Table(t))->IndexJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection", "Hints": "USE_INDEX(@`sel_1` `test`.`t1` ), USE_INDEX(@`sel_2` `test`.`t2` ), USE_INDEX(@`sel_2` `test`.`t3` `c_d_e`), INL_JOIN(@`sel_2` `test`.`t3`), SM_JOIN(@`sel_1` `test`.`t1`)" }, { "SQL": "select /*+ HASH_JOIN(@sel_1 t1), SM_JOIN(@sel_2 t2) */ t1.a, t1.b from t t1, (select t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Plan": "RightHashJoin{TableReader(Table(t))->MergeInnerJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#1,Column#13)->Projection", + "Plan": "RightHashJoin{TableReader(Table(t))->MergeInnerJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection", "Hints": "USE_INDEX(@`sel_1` `test`.`t1` ), USE_INDEX(@`sel_2` `test`.`t2` ), USE_INDEX(@`sel_2` `test`.`t3` `c_d_e`), SM_JOIN(@`sel_2` `test`.`t2`), HASH_JOIN(@`sel_1` `test`.`t1`)" }, { "SQL": "select /*+ HASH_JOIN(@sel_1 t1), SM_JOIN(@qb t2) */ t1.a, t1.b from t t1, (select /*+ QB_NAME(qb) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Plan": "RightHashJoin{TableReader(Table(t))->MergeInnerJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#1,Column#13)->Projection", + "Plan": "RightHashJoin{TableReader(Table(t))->MergeInnerJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection", "Hints": "USE_INDEX(@`sel_1` `test`.`t1` ), USE_INDEX(@`sel_2` `test`.`t2` ), USE_INDEX(@`sel_2` `test`.`t3` `c_d_e`), SM_JOIN(@`sel_2` `test`.`t2`), HASH_JOIN(@`sel_1` `test`.`t1`)" }, { "SQL": "select /*+ INL_JOIN(@sel_1 t1), HASH_JOIN(@sel_2 t2) */ t1.a, t1.b from t t1, (select t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Plan": "IndexJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#13,Column#1)->Projection", + "Plan": "IndexJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection", "Hints": "USE_INDEX(@`sel_1` `test`.`t1` ), USE_INDEX(@`sel_2` `test`.`t2` `f`), USE_INDEX(@`sel_2` `test`.`t3` `c_d_e`), HASH_JOIN(@`sel_2` `test`.`t2`), INL_JOIN(@`sel_1` `test`.`t1`)" }, { "SQL": "select /*+ INL_JOIN(@sel_1 t1), HASH_JOIN(@qb t2) */ t1.a, t1.b from t t1, (select /*+ QB_NAME(qb) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a", - "Plan": "IndexJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(Column#13,Column#27)}(Column#13,Column#1)->Projection", + "Plan": "IndexJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])}(test.t.a,test.t.c)}(test.t.a,test.t.a)->Projection", "Hints": "USE_INDEX(@`sel_1` `test`.`t1` ), USE_INDEX(@`sel_2` `test`.`t2` `f`), USE_INDEX(@`sel_2` `test`.`t3` `c_d_e`), HASH_JOIN(@`sel_2` `test`.`t2`), INL_JOIN(@`sel_1` `test`.`t1`)" }, { "SQL": "select /*+ HASH_AGG(@sel_1), STREAM_AGG(@sel_2) */ count(*) from t t1 where t1.a < (select count(*) from t t2 where t1.a > t2.a)", - "Plan": "Apply{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]]->Sel([gt(Column#1, Column#13)])->StreamAgg)->StreamAgg->Sel([not(isnull(Column#25))])}->HashAgg", + "Plan": "Apply{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]]->Sel([gt(test.t.a, test.t.a)])->StreamAgg)->StreamAgg->Sel([not(isnull(Column#25))])}->HashAgg", "Hints": "USE_INDEX(@`sel_1` `test`.`t1` `f`), USE_INDEX(@`sel_2` `test`.`t2` `f`), STREAM_AGG(@`sel_2`), HASH_AGG(@`sel_1`)" }, { "SQL": "select /*+ STREAM_AGG(@sel_1), HASH_AGG(@qb) */ count(*) from t t1 where t1.a < (select /*+ QB_NAME(qb) */ count(*) from t t2 where t1.a > t2.a)", - "Plan": "Apply{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]]->Sel([gt(Column#1, Column#13)])->HashAgg)->HashAgg->Sel([not(isnull(Column#25))])}->StreamAgg", + "Plan": "Apply{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]]->Sel([gt(test.t.a, test.t.a)])->HashAgg)->HashAgg->Sel([not(isnull(Column#25))])}->StreamAgg", "Hints": "USE_INDEX(@`sel_1` `test`.`t1` `f`), USE_INDEX(@`sel_2` `test`.`t2` `f`), HASH_AGG(@`sel_2`), STREAM_AGG(@`sel_1`)" }, { "SQL": "select /*+ HASH_AGG(@sel_2) */ a, (select count(*) from t t1 where t1.b > t.a) from t where b > (select b from t t2 where t2.b = t.a limit 1)", - "Plan": "Apply{Apply{TableReader(Table(t))->TableReader(Table(t)->Sel([eq(Column#14, Column#1)])->Limit)->Limit}->TableReader(Table(t)->Sel([gt(Column#26, Column#1)])->HashAgg)->HashAgg}->Projection", + "Plan": "Apply{Apply{TableReader(Table(t))->TableReader(Table(t)->Sel([eq(test.t.b, test.t.a)])->Limit)->Limit}->TableReader(Table(t)->Sel([gt(test.t.b, test.t.a)])->HashAgg)->HashAgg}->Projection", "Hints": "USE_INDEX(@`sel_1` `test`.`t` ), USE_INDEX(@`sel_3` `test`.`t2` ), USE_INDEX(@`sel_2` `test`.`t1` ), HASH_AGG(@`sel_2`)" }, { "SQL": "select /*+ HASH_JOIN(@sel_1 t1), HASH_JOIN(@sel_2 t1) */ t1.b, t2.a, t2.aa from t t1, (select t1.a as a, t2.a as aa from t t1, t t2) t2 where t1.a = t2.aa;", - "Plan": "RightHashJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]])}}(Column#1,Column#25)->Projection", + "Plan": "RightHashJoin{TableReader(Table(t))->LeftHashJoin{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]])}}(test.t.a,test.t.a)->Projection", "Hints": "USE_INDEX(@`sel_1` `test`.`t1` ), USE_INDEX(@`sel_2` `test`.`t1` `f`), USE_INDEX(@`sel_2` `test`.`t2` `f`), HASH_JOIN(@`sel_2` `test`.`t1`), HASH_JOIN(@`sel_1` `test`.`t1`)" }, { "SQL": "select /*+ HASH_JOIN(@sel_2 t1@sel_2, t2@sel_2), SM_JOIN(@sel_1 t1@sel_1, t2@sel_1) */ * from (select t1.a, t1.b from t t1, t t2 where t1.a = t2.a) t1, t t2 where t1.b = t2.b", - "Plan": "MergeInnerJoin{LeftHashJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(Column#1,Column#13)->Sort->TableReader(Table(t))->Sort}(Column#2,Column#26)->Projection", + "Plan": "MergeInnerJoin{LeftHashJoin{TableReader(Table(t))->IndexReader(Index(t.f)[[NULL,+inf]])}(test.t.a,test.t.a)->Sort->TableReader(Table(t))->Sort}(test.t.b,test.t.b)->Projection", "Hints": "USE_INDEX(@`sel_2` `test`.`t1` ), USE_INDEX(@`sel_2` `test`.`t2` `f`), HASH_JOIN(@`sel_2` `test`.`t1`), USE_INDEX(@`sel_1` `test`.`t2` ), SM_JOIN(@`sel_1` `test`.`t1`)" } ] @@ -1289,15 +1289,15 @@ "Cases": [ { "SQL": "select /*+ TIDB_INLJ(t2) */ * from t t1, t t2 where t1.a = t2.a", - "Best": "IndexJoin{TableReader(Table(t))->UnionScan([])->TableReader(Table(t))->UnionScan([])}(Column#1,Column#13)" + "Best": "IndexJoin{TableReader(Table(t))->UnionScan([])->TableReader(Table(t))->UnionScan([])}(test.t.a,test.t.a)" }, { "SQL": "select /*+ TIDB_INLJ(t1, t2) */ * from t t1, t t2 where t1.a = t2.c", - "Best": "IndexJoin{TableReader(Table(t))->UnionScan([])->TableReader(Table(t))->UnionScan([])}(Column#15,Column#1)" + "Best": "IndexJoin{TableReader(Table(t))->UnionScan([])->TableReader(Table(t))->UnionScan([])}(test.t.c,test.t.a)" }, { "SQL": "select /*+ TIDB_INLJ(t1, t2) */ t1.a , t2.c from t t1, t t2 where t1.a = t2.c", - "Best": "IndexJoin{IndexReader(Index(t.f)[[NULL,+inf]])->UnionScan([])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])->UnionScan([])}(Column#1,Column#15)->Projection" + "Best": "IndexJoin{IndexReader(Index(t.f)[[NULL,+inf]])->UnionScan([])->IndexReader(Index(t.c_d_e)[[NULL,+inf]])->UnionScan([])}(test.t.a,test.t.c)->Projection" } ] }, @@ -1306,7 +1306,7 @@ "Cases": [ { "SQL": "select t1.a, (select count(t2.a) from t t2 where t2.g in (select t3.d from t t3 where t3.c = t1.a)) as agg_col from t t1;", - "Best": "Apply{IndexReader(Index(t.f)[[NULL,+inf]])->IndexMergeJoin{IndexReader(Index(t.c_d_e)[[NULL,+inf]]->HashAgg)->HashAgg->IndexReader(Index(t.g)[[NULL,+inf]])}(Column#28,Column#22)}->HashAgg" + "Best": "Apply{IndexReader(Index(t.f)[[NULL,+inf]])->IndexMergeJoin{IndexReader(Index(t.c_d_e)[[NULL,+inf]]->HashAgg)->HashAgg->IndexReader(Index(t.g)[[NULL,+inf]])}(test.t.d,test.t.g)}->HashAgg" } ] }, @@ -1315,15 +1315,36 @@ "Cases": [ { "SQL": "select /*+ INL_JOIN(t1) */ * from t1 join t2 on t1.a = t2.a;", - "Plan": "IndexJoin{IndexLookUp(Index(t1.idx_a)[[NULL,+inf]]->Sel([not(isnull(Column#1))]), Table(t1))->TableReader(Table(t2)->Sel([not(isnull(Column#4))]))}(Column#4,Column#1)" + "Plan": "IndexJoin{IndexLookUp(Index(t1.idx_a)[[NULL,+inf]]->Sel([not(isnull(test.t1.a))]), Table(t1))->TableReader(Table(t2)->Sel([not(isnull(test.t2.a))]))}(test.t2.a,test.t1.a)" }, { "SQL": "select /*+ INL_HASH_JOIN(t1) */ * from t1 join t2 on t1.a = t2.a;", - "Plan": "IndexHashJoin{IndexLookUp(Index(t1.idx_a)[[NULL,+inf]]->Sel([not(isnull(Column#1))]), Table(t1))->TableReader(Table(t2)->Sel([not(isnull(Column#4))]))}(Column#4,Column#1)" + "Plan": "IndexHashJoin{IndexLookUp(Index(t1.idx_a)[[NULL,+inf]]->Sel([not(isnull(test.t1.a))]), Table(t1))->TableReader(Table(t2)->Sel([not(isnull(test.t2.a))]))}(test.t2.a,test.t1.a)" }, { "SQL": "select /*+ INL_MERGE_JOIN(t1) */ * from t1 join t2 on t1.a = t2.a;", - "Plan": "IndexMergeJoin{IndexLookUp(Index(t1.idx_a)[[NULL,+inf]]->Sel([not(isnull(Column#1))]), Table(t1))->Projection->TableReader(Table(t2)->Sel([not(isnull(Column#4))]))}(Column#4,Column#1)" + "Plan": "IndexMergeJoin{IndexLookUp(Index(t1.idx_a)[[NULL,+inf]]->Sel([not(isnull(test.t1.a))]), Table(t1))->Projection->TableReader(Table(t2)->Sel([not(isnull(test.t2.a))]))}(test.t2.a,test.t1.a)" + } + ] + }, + { + "Name": "TestAggToCopHint", + "Cases": [ + { + "Best": "TableReader(Table(t)->HashAgg)->HashAgg", + "Warning": "" + }, + { + "Best": "TableReader(Table(t)->HashAgg)->HashAgg", + "Warning": "" + }, + { + "Best": "TableReader(Table(t)->HashAgg)->HashAgg->HashAgg", + "Warning": "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + }, + { + "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.b)->Projection->HashAgg", + "Warning": "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" } ] } diff --git a/planner/core/testdata/plan_suite_unexported_in.json b/planner/core/testdata/plan_suite_unexported_in.json index f4e4d1eddc8fc..84142d6cd213b 100644 --- a/planner/core/testdata/plan_suite_unexported_in.json +++ b/planner/core/testdata/plan_suite_unexported_in.json @@ -276,5 +276,187 @@ "select f from t having sum(a) > 0", "select * from t t1 left join t t2 on t1.a = t2.a" ] + }, + { + "name": "TestAggPrune", + "cases": [ + "select a, count(b) from t group by a", + "select sum(b) from t group by c, d, e", + "select tt.a, sum(tt.b) from (select a, b from t) tt group by tt.a", + "select count(1) from (select count(1), a as b from t group by a) tt group by b", + "select a, count(b) from t group by a", + "select a, count(distinct a, b) from t group by a" + ] + }, + { + "name": "TestColumnPruning", + "cases": [ + "select count(*) from t group by a", + "select count(*) from t", + "select count(*) from t a join t b where a.a < 1", + "select count(*) from t a join t b on a.a = b.d", + "select count(*) from t a join t b on a.a = b.d order by sum(a.d)", + "select count(b.a) from t a join t b on a.a = b.d group by b.b order by sum(a.d)", + "select * from (select count(b.a) from t a join t b on a.a = b.d group by b.b having sum(a.d) < 0) tt", + "select (select count(a) from t where b = k.a) from t k", + "select exists (select count(*) from t where b = k.a) from t k", + "select b = (select count(*) from t where b = k.a) from t k", + "select exists (select count(a) from t where b = k.a group by b) from t k", + "select a as c1, b as c2 from t order by 1, c1 + c2 + c", + "select a from t where b < any (select c from t)", + "select a from t where (b,a) != all (select c,d from t)", + "select a from t where (b,a) in (select c,d from t)", + "select a from t where a in (select a from t s group by t.b)", + "select t01.a from (select a from t t21 union all select a from t t22) t2 join t t01 on 1 left outer join t t3 on 1 join t t4 on 1", + "select 1 from (select count(b) as cnt from t) t1", + "select count(1) from (select count(b) as cnt from t) t1", + "select count(1) from (select count(b) as cnt from t group by c) t1" + ] + }, + { + "name": "TestDeriveNotNullConds", + "cases": [ + "select * from t t1 inner join t t2 on t1.e = t2.e", + "select * from t t1 inner join t t2 on t1.e > t2.e", + "select * from t t1 inner join t t2 on t1.e = t2.e and t1.e is not null", + "select * from t t1 left join t t2 on t1.e = t2.e", + "select * from t t1 left join t t2 on t1.e > t2.e", + "select * from t t1 left join t t2 on t1.e = t2.e and t2.e is not null", + "select * from t t1 right join t t2 on t1.e = t2.e and t1.e is not null", + "select * from t t1 inner join t t2 on t1.e <=> t2.e", + "select * from t t1 left join t t2 on t1.e <=> t2.e", + // Not deriving if column has NotNull flag already. + "select * from t t1 inner join t t2 on t1.b = t2.b", + "select * from t t1 left join t t2 on t1.b = t2.b", + "select * from t t1 left join t t2 on t1.b > t2.b", + "select * from t t1 where not exists (select * from t t2 where t2.e = t1.e)" + ] + }, + { + "name": "TestTablePartition", + "cases": [ + { + "SQL": "select * from t", + "IsIdx": 0 + }, + { + "SQL": "select * from t where t.ptn < 31", + "IsIdx": 0 + }, + { + "SQL": "select * from t where t.ptn < 61", + "IsIdx": 0 + }, + { + "SQL": "select * from t where t.ptn > 17 and t.ptn < 61", + "IsIdx": 0 + }, + { + "SQL": "select * from t where t.ptn > 17 and t.ptn < 61 union all select * from t where t.ptn > 17 and t.ptn < 61 ", + "IsIdx": 0 + }, + { + "SQL": "select ptn from t where t.ptn > 17 and t.ptn < 61 union all select ptn from t where t.ptn > 17 and t.ptn < 61 ", + "IsIdx": 0 + }, + { + "SQL": "select * from t where t.ptn < 8", + "IsIdx": 0 + }, + { + "SQL": "select * from t where t.ptn > 128", + "IsIdx": 0 + }, + { + "SQL": "select * from t where t.ptn > 128", + "IsIdx": 1 + }, + { + // NULL will be located in the first partition. + "SQL": "select * from t where t.ptn is null", + "IsIdx": 0 + }, + { + "SQL": "select * from t where t.ptn is null or t.ptn > 70", + "IsIdx": 1 + } + ] + }, + { + "name": "TestJoinPredicatePushDown", + "cases": [ + // issue #7628, inner join + "select * from t as t1 join t as t2 on t1.b = t2.b where t1.a > t2.a", + "select * from t as t1 join t as t2 on t1.b = t2.b where t1.a=1 or t2.a=1", + "select * from t as t1 join t as t2 on t1.b = t2.b where (t1.a=1 and t2.a=1) or (t1.a=2 and t2.a=2)", + "select * from t as t1 join t as t2 on t1.b = t2.b where (t1.c=1 and (t1.a=3 or t2.a=3)) or (t1.a=2 and t2.a=2)", + "select * from t as t1 join t as t2 on t1.b = t2.b where (t1.c=1 and ((t1.a=3 and t2.a=3) or (t1.a=4 and t2.a=4)))", + "select * from t as t1 join t as t2 on t1.b = t2.b where (t1.a>1 and t1.a < 3 and t2.a=1) or (t1.a=2 and t2.a=2)", + "select * from t as t1 join t as t2 on t1.b = t2.b and ((t1.a=1 and t2.a=1) or (t1.a=2 and t2.a=2))", + // issue #7628, left join + "select * from t as t1 left join t as t2 on t1.b = t2.b and ((t1.a=1 and t2.a=1) or (t1.a=2 and t2.a=2))", + "select * from t as t1 left join t as t2 on t1.b = t2.b and t1.a > t2.a", + "select * from t as t1 left join t as t2 on t1.b = t2.b and (t1.a=1 or t2.a=1)", + "select * from t as t1 left join t as t2 on t1.b = t2.b and ((t1.c=1 and (t1.a=3 or t2.a=3)) or (t1.a=2 and t2.a=2))", + "select * from t as t1 left join t as t2 on t1.b = t2.b and ((t2.c=1 and (t1.a=3 or t2.a=3)) or (t1.a=2 and t2.a=2))", + "select * from t as t1 left join t as t2 on t1.b = t2.b and ((t1.c=1 and ((t1.a=3 and t2.a=3) or (t1.a=4 and t2.a=4))) or (t1.a=2 and t2.a=2))", + // Duplicate condition would be removed. + "select * from t t1 join t t2 on t1.a > 1 and t1.a > 1" + ] + }, + { + "name": "TestJoinReOrder", + "cases": [ + "select * from t t1, t t2, t t3, t t4, t t5, t t6 where t1.a = t2.b and t2.a = t3.b and t3.c = t4.a and t4.d = t2.c and t5.d = t6.d", + "select * from t t1, t t2, t t3, t t4, t t5, t t6, t t7, t t8 where t1.a = t8.a", + "select * from t t1, t t2, t t3, t t4, t t5 where t1.a = t5.a and t5.a = t4.a and t4.a = t3.a and t3.a = t2.a and t2.a = t1.a and t1.a = t3.a and t2.a = t4.a and t5.b < 8", + "select * from t t1, t t2, t t3, t t4, t t5 where t1.a = t5.a and t5.a = t4.a and t4.a = t3.a and t3.a = t2.a and t2.a = t1.a and t1.a = t3.a and t2.a = t4.a and t3.b = 1 and t4.a = 1", + "select * from t o where o.b in (select t3.c from t t1, t t2, t t3 where t1.a = t3.a and t2.a = t3.a and t2.a = o.a)", + "select * from t o where o.b in (select t3.c from t t1, t t2, t t3 where t1.a = t3.a and t2.a = t3.a and t2.a = o.a and t1.a = 1)" + ] + }, + { + "name": "TestOuterJoinEliminator", + "cases": [ + // Test left outer join + distinct + "select distinct t1.a, t1.b from t t1 left outer join t t2 on t1.b = t2.b", + // Test right outer join + distinct + "select distinct t2.a, t2.b from t t1 right outer join t t2 on t1.b = t2.b", + // Test duplicate agnostic agg functions on join + "select max(t1.a), min(test.t1.b) from t t1 left join t t2 on t1.b = t2.b", + "select sum(distinct t1.a) from t t1 left join t t2 on t1.a = t2.a and t1.b = t2.b", + "select count(distinct t1.a, t1.b) from t t1 left join t t2 on t1.b = t2.b", + // Test left outer join + "select t1.b from t t1 left outer join t t2 on t1.a = t2.a", + // Test right outer join + "select t2.b from t t1 right outer join t t2 on t1.a = t2.a", + // For complex join query + "select max(t3.b) from (t t1 left join t t2 on t1.a = t2.a) right join t t3 on t1.b = t3.b", + "select t1.a ta, t1.b tb from t t1 left join t t2 on t1.a = t2.a", + // Because the `order by` uses t2.a, the `join` can't be eliminated. + "select t1.a, t1.b from t t1 left join t t2 on t1.a = t2.a order by t2.a", + // For issue 11167 + "select a.a from t a natural left join t b natural left join t c" + ] + }, + { + "name": "TestSimplifyOuterJoin", + "cases": [ + "select * from t t1 left join t t2 on t1.b = t2.b where t1.c > 1 or t2.c > 1;", + "select * from t t1 left join t t2 on t1.b = t2.b where t1.c > 1 and t2.c > 1;", + "select * from t t1 left join t t2 on t1.b = t2.b where not (t1.c > 1 or t2.c > 1);", + "select * from t t1 left join t t2 on t1.b = t2.b where not (t1.c > 1 and t2.c > 1);", + "select * from t t1 left join t t2 on t1.b > 1 where t1.c = t2.c;", + "select * from t t1 left join t t2 on true where t1.b <=> t2.b;" + ] + }, + { + "name": "TestOuterWherePredicatePushDown", + "cases": [ + // issue #7628, left join with where condition + "select * from t as t1 left join t as t2 on t1.b = t2.b where (t1.a=1 and t2.a is null) or (t1.a=2 and t2.a=2)", + "select * from t as t1 left join t as t2 on t1.b = t2.b where (t1.c=1 and (t1.a=3 or t2.a=3)) or (t1.a=2 and t2.a=2)", + "select * from t as t1 left join t as t2 on t1.b = t2.b where (t1.c=1 and ((t1.a=3 and t2.a=3) or (t1.a=4 and t2.a=4))) or (t1.a=2 and t2.a is null)" + ] } ] diff --git a/planner/core/testdata/plan_suite_unexported_out.json b/planner/core/testdata/plan_suite_unexported_out.json index 5ee455ab4950d..3b6697ccca304 100644 --- a/planner/core/testdata/plan_suite_unexported_out.json +++ b/planner/core/testdata/plan_suite_unexported_out.json @@ -2,26 +2,26 @@ { "Name": "TestEagerAggregation", "Cases": [ - "DataScan(t)->Aggr(sum(Column#1),sum(plus(Column#1, 1)),count(Column#1))->Projection", - "DataScan(t)->Aggr(sum(plus(Column#1, Column#2)),sum(plus(Column#1, Column#3)),count(Column#1))->Sel([gt(Column#13, 0)])->Projection->Sort->Projection", - "Join{DataScan(a)->Aggr(sum(Column#1),firstrow(Column#3))->DataScan(b)}(Column#3,Column#15)->Aggr(sum(Column#26))->Projection", - "Join{DataScan(a)->DataScan(b)->Aggr(sum(Column#13),firstrow(Column#15))}(Column#3,Column#15)->Aggr(sum(Column#26))->Projection", - "Join{DataScan(a)->DataScan(b)->Aggr(sum(Column#13),firstrow(Column#15))}(Column#3,Column#15)->Aggr(sum(Column#26),firstrow(Column#1))->Projection", - "Join{DataScan(a)->Aggr(sum(Column#1),firstrow(Column#3))->DataScan(b)}(Column#3,Column#15)->Aggr(sum(Column#26),firstrow(Column#13))->Projection", - "Join{DataScan(a)->DataScan(b)}(Column#3,Column#15)->Aggr(sum(Column#1),sum(Column#13))->Projection", - "Join{DataScan(a)->Aggr(sum(Column#1),firstrow(Column#3))->DataScan(b)}(Column#3,Column#15)->Aggr(sum(Column#27),max(Column#13))->Projection", - "Join{DataScan(a)->DataScan(b)->Aggr(sum(Column#13),firstrow(Column#15))}(Column#3,Column#15)->Aggr(max(Column#1),sum(Column#27))->Projection", - "Join{Join{DataScan(a)->DataScan(b)}(Column#3,Column#15)->DataScan(c)}(Column#15,Column#27)->Aggr(sum(Column#1))->Projection", - "Join{DataScan(a)->DataScan(b)->Aggr(sum(Column#13),firstrow(Column#15))}(Column#3,Column#15)->Aggr(sum(Column#26))->Projection", - "Join{DataScan(a)->Aggr(sum(Column#1),firstrow(Column#3))->DataScan(b)}(Column#3,Column#15)->Aggr(sum(Column#26))->Projection", - "Join{DataScan(a)->Aggr(sum(Column#1),firstrow(Column#3))->DataScan(b)}(Column#3,Column#15)->Aggr(sum(Column#26))->Projection", - "DataScan(t)->Aggr(sum(Column#1))->Projection", - "UnionAll{DataScan(a)->Projection->Aggr(sum(Column#27),firstrow(Column#28))->DataScan(b)->Projection->Aggr(sum(Column#13),firstrow(Column#14))->DataScan(c)->Projection->Aggr(sum(Column#2),firstrow(Column#5))}->Aggr(sum(Column#40))->Projection", - "Join{DataScan(a)->DataScan(b)->Aggr(max(Column#14),firstrow(Column#15))}(Column#3,Column#15)->Projection->Projection", - "Join{DataScan(a)->DataScan(b)}(Column#1,Column#13)->Aggr(max(Column#2),max(Column#14))->Projection", + "DataScan(t)->Aggr(sum(test.t.a),sum(plus(test.t.a, 1)),count(test.t.a))->Projection", + "DataScan(t)->Aggr(sum(plus(test.t.a, test.t.b)),sum(plus(test.t.a, test.t.c)),count(test.t.a))->Sel([gt(Column#13, 0)])->Projection->Sort->Projection", + "Join{DataScan(a)->Aggr(sum(test.t.a),firstrow(test.t.c))->DataScan(b)}(test.t.c,test.t.c)->Aggr(sum(Column#26))->Projection", + "Join{DataScan(a)->DataScan(b)->Aggr(sum(test.t.a),firstrow(test.t.c))}(test.t.c,test.t.c)->Aggr(sum(Column#26))->Projection", + "Join{DataScan(a)->DataScan(b)->Aggr(sum(test.t.a),firstrow(test.t.c))}(test.t.c,test.t.c)->Aggr(sum(Column#26),firstrow(test.t.a))->Projection", + "Join{DataScan(a)->Aggr(sum(test.t.a),firstrow(test.t.c))->DataScan(b)}(test.t.c,test.t.c)->Aggr(sum(Column#26),firstrow(test.t.a))->Projection", + "Join{DataScan(a)->DataScan(b)}(test.t.c,test.t.c)->Aggr(sum(test.t.a),sum(test.t.a))->Projection", + "Join{DataScan(a)->Aggr(sum(test.t.a),firstrow(test.t.c))->DataScan(b)}(test.t.c,test.t.c)->Aggr(sum(Column#27),max(test.t.a))->Projection", + "Join{DataScan(a)->DataScan(b)->Aggr(sum(test.t.a),firstrow(test.t.c))}(test.t.c,test.t.c)->Aggr(max(test.t.a),sum(Column#27))->Projection", + "Join{Join{DataScan(a)->DataScan(b)}(test.t.c,test.t.c)->DataScan(c)}(test.t.c,test.t.c)->Aggr(sum(test.t.a))->Projection", + "Join{DataScan(a)->DataScan(b)->Aggr(sum(test.t.a),firstrow(test.t.c))}(test.t.c,test.t.c)->Aggr(sum(Column#26))->Projection", + "Join{DataScan(a)->Aggr(sum(test.t.a),firstrow(test.t.c))->DataScan(b)}(test.t.c,test.t.c)->Aggr(sum(Column#26))->Projection", + "Join{DataScan(a)->Aggr(sum(test.t.a),firstrow(test.t.c))->DataScan(b)}(test.t.c,test.t.c)->Aggr(sum(Column#26))->Projection", + "DataScan(t)->Aggr(sum(test.t.a))->Projection", + "UnionAll{DataScan(a)->Projection->Aggr(sum(test.t.c),firstrow(test.t.d))->DataScan(b)->Projection->Aggr(sum(test.t.a),firstrow(test.t.b))->DataScan(c)->Projection->Aggr(sum(test.t.b),firstrow(test.t.e))}->Aggr(sum(Column#40))->Projection", + "Join{DataScan(a)->DataScan(b)->Aggr(max(test.t.b),firstrow(test.t.c))}(test.t.c,test.t.c)->Projection->Projection", + "Join{DataScan(a)->DataScan(b)}(test.t.a,test.t.a)->Aggr(max(test.t.b),max(test.t.b))->Projection", "UnionAll{DataScan(a)->Projection->Projection->Projection->DataScan(b)->Projection->Projection->Projection}->Aggr(max(Column#38))->Projection", - "Join{DataScan(a)->DataScan(b)}(Column#1,Column#13)(Column#2,Column#14)->Aggr(max(Column#3))->Projection", - "Join{DataScan(t1)->DataScan(t2)}(Column#1,Column#13)->Projection->Projection" + "Join{DataScan(a)->DataScan(b)}(test.t.a,test.t.a)(test.t.b,test.t.b)->Aggr(max(test.t.c))->Projection", + "Join{DataScan(t1)->DataScan(t2)}(test.t.a,test.t.a)->Projection->Projection" ] }, { @@ -45,99 +45,99 @@ "Dual->Projection", "Join{DataScan(t1)->DataScan(t2)}->Projection", "Join{DataScan(t1)->DataScan(t2)}->Projection", - "LeftHashJoin{LeftHashJoin{TableReader(Table(t))->IndexLookUp(Index(t.c_d_e)[[666,666]], Table(t))}(Column#1,Column#14)->IndexReader(Index(t.c_d_e)[[42,42]])}(Column#2,Column#26)->Sel([or(Column#25, Column#38)])->Projection->Delete", - "LeftHashJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])->HashAgg}(Column#2,Column#15)->Projection->Update" + "LeftHashJoin{LeftHashJoin{TableReader(Table(t))->IndexLookUp(Index(t.c_d_e)[[666,666]], Table(t))}(test.t.a,test.t.b)->IndexReader(Index(t.c_d_e)[[42,42]])}(test.t.b,test.t.a)->Sel([or(Column#25, Column#38)])->Projection->Delete", + "LeftHashJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])->HashAgg}(test.t.b,test.t.c)->Projection->Update" ] }, { "Name": "TestPredicatePushDown", "Cases": [ - "Join{DataScan(a)->DataScan(b)}(Column#1,Column#13)->Aggr(count(1))->Projection", + "Join{DataScan(a)->DataScan(b)}(test.t.a,test.t.a)->Aggr(count(1))->Projection", "DataScan(t)->Projection->Projection", "DataScan(t)->Projection->Projection", "DataScan(t)->Projection->Projection", "DataScan(t)->Projection->Projection", - "Join{DataScan(ta)->DataScan(tb)}(Column#4,Column#14)(Column#1,Column#15)->Projection", - "Join{DataScan(t1)->Sel([like(cast(Column#4), abc, 92)])->DataScan(t2)->Sel([like(cast(Column#16), abc, 92)])}(Column#1,Column#14)(Column#4,Column#16)->Projection", - "Join{DataScan(ta)->DataScan(tb)}(Column#4,Column#16)->Projection", - "Join{DataScan(ta)->DataScan(tb)}(Column#4,Column#16)->Projection", - "Join{DataScan(ta)->DataScan(tb)}(Column#4,Column#16)->Projection", - "Join{DataScan(ta)->DataScan(tb)}(Column#4,Column#16)->Projection", + "Join{DataScan(ta)->DataScan(tb)}(test.t.d,test.t.b)(test.t.a,test.t.c)->Projection", + "Join{DataScan(t1)->Sel([like(cast(test.t.d), abc, 92)])->DataScan(t2)->Sel([like(cast(test.t.d), abc, 92)])}(test.t.a,test.t.b)(test.t.d,test.t.d)->Projection", + "Join{DataScan(ta)->DataScan(tb)}(test.t.d,test.t.d)->Projection", + "Join{DataScan(ta)->DataScan(tb)}(test.t.d,test.t.d)->Projection", + "Join{DataScan(ta)->DataScan(tb)}(test.t.d,test.t.d)->Projection", + "Join{DataScan(ta)->DataScan(tb)}(test.t.d,test.t.d)->Projection", "Join{DataScan(ta)->DataScan(tb)}->Projection", "Join{DataScan(ta)->DataScan(tb)}->Projection", - "Join{DataScan(ta)->DataScan(tb)}(Column#4,Column#16)->Projection", - "Join{Join{DataScan(ta)->DataScan(tb)}(Column#1,Column#13)->DataScan(tc)}(Column#14,Column#26)->Projection", - "Join{Join{DataScan(ta)->DataScan(tb)}(Column#1,Column#13)->DataScan(tc)}(Column#2,Column#26)->Projection", - "Join{DataScan(ta)->Join{DataScan(tb)->DataScan(tc)}(Column#14,Column#26)}(Column#1,Column#13)->Projection", - "Join{Join{DataScan(ta)->DataScan(tb)}(Column#1,Column#13)->Join{DataScan(tc)->DataScan(td)}(Column#26,Column#38)}(Column#3,Column#39)->Projection", - "Join{DataScan(ta)->Join{DataScan(tb)->DataScan(tc)}(Column#14,Column#26)}(Column#1,Column#13)(Column#3,Column#27)->Sel([or(gt(Column#28, 0), gt(Column#4, 0))])->Projection", - "Join{DataScan(ta)->DataScan(tb)}(Column#4,Column#16)->Sel([or(ifnull(Column#16, 1), isnull(Column#16))])->Projection", + "Join{DataScan(ta)->DataScan(tb)}(test.t.d,test.t.d)->Projection", + "Join{Join{DataScan(ta)->DataScan(tb)}(test.t.a,test.t.a)->DataScan(tc)}(test.t.b,test.t.b)->Projection", + "Join{Join{DataScan(ta)->DataScan(tb)}(test.t.a,test.t.a)->DataScan(tc)}(test.t.b,test.t.b)->Projection", + "Join{DataScan(ta)->Join{DataScan(tb)->DataScan(tc)}(test.t.b,test.t.b)}(test.t.a,test.t.a)->Projection", + "Join{Join{DataScan(ta)->DataScan(tb)}(test.t.a,test.t.a)->Join{DataScan(tc)->DataScan(td)}(test.t.b,test.t.b)}(test.t.c,test.t.c)->Projection", + "Join{DataScan(ta)->Join{DataScan(tb)->DataScan(tc)}(test.t.b,test.t.b)}(test.t.a,test.t.a)(test.t.c,test.t.c)->Sel([or(gt(test.t.d, 0), gt(test.t.d, 0))])->Projection", + "Join{DataScan(ta)->DataScan(tb)}(test.t.d,test.t.d)->Sel([or(ifnull(test.t.d, 1), isnull(test.t.d))])->Projection", "UnionAll{DataScan(t)->Projection->Projection->DataScan(t)->Projection->Projection->DataScan(t)->Projection->Projection}->Projection", "Apply{DataScan(k)->DataScan(t)->Aggr(count(1))->Projection->MaxOneRow}->Projection", "Join{DataScan(t)->DataScan(x)}->Projection", - "Join{DataScan(t)->DataScan(x)}(Column#1,Column#13)->Projection", - "Join{DataScan(t)->DataScan(x)}(Column#1,Column#13)->Projection", - "Join{Join{DataScan(t)->DataScan(x)}(Column#1,Column#13)->DataScan(x)}(Column#1,Column#26)->Projection", - "DataScan(t)->Aggr(sum(Column#3),firstrow(Column#1),firstrow(Column#2))->Projection->Projection", - "DataScan(t)->Aggr(sum(Column#3),firstrow(Column#1),firstrow(Column#2))->Projection->Projection", - "DataScan(t)->Aggr(sum(Column#2),firstrow(Column#1))->Projection->Aggr(sum(Column#13),firstrow(Column#1))->Projection->Projection", - "DataScan(t)->Aggr(sum(Column#2),firstrow(Column#1))->Sel([gt(cast(Column#1), Column#13)])->Projection->Projection", - "DataScan(t)->Aggr(sum(Column#2),firstrow(Column#1))->Sel([gt(Column#1, 1)])->Projection->Projection", - "Dual->Sel([gt(Column#1, 1)])->Projection", - "DataScan(t)->Aggr(count(Column#1),firstrow(Column#1))->Sel([lt(Column#13, 1)])->Projection", - "Join{DataScan(t1)->DataScan(t2)}(Column#1,Column#13)->Projection", + "Join{DataScan(t)->DataScan(x)}(test.t.a,test.t.a)->Projection", + "Join{DataScan(t)->DataScan(x)}(test.t.a,test.t.a)->Projection", + "Join{Join{DataScan(t)->DataScan(x)}(test.t.a,test.t.a)->DataScan(x)}(test.t.a,test.t.a)->Projection", + "DataScan(t)->Aggr(sum(test.t.c),firstrow(test.t.a),firstrow(test.t.b))->Projection->Projection", + "DataScan(t)->Aggr(sum(test.t.c),firstrow(test.t.a),firstrow(test.t.b))->Projection->Projection", + "DataScan(t)->Aggr(sum(test.t.b),firstrow(test.t.a))->Projection->Aggr(sum(Column#13),firstrow(test.t.a))->Projection->Projection", + "DataScan(t)->Aggr(sum(test.t.b),firstrow(test.t.a))->Sel([gt(cast(test.t.a), Column#13)])->Projection->Projection", + "DataScan(t)->Aggr(sum(test.t.b),firstrow(test.t.a))->Sel([gt(test.t.a, 1)])->Projection->Projection", + "Dual->Sel([gt(test.t.a, 1)])->Projection", + "DataScan(t)->Aggr(count(test.t.a),firstrow(test.t.a))->Sel([lt(Column#13, 1)])->Projection", + "Join{DataScan(t1)->DataScan(t2)}(test.t.a,test.t.a)->Projection", "Dual->Projection", - "DataScan(t)->Projection->Projection->Window(min(Column#1))->Sel([lt(Column#1, 10) eq(Column#2, Column#14)])->Projection->Projection", - "DataScan(t)->Projection->Projection->Window(sum(cast(Column#1)))->Sel([gt(Column#14, cast(Column#2))])->Projection->Projection" + "DataScan(t)->Projection->Projection->Window(min(test.t.a)->Column#14)->Sel([lt(test.t.a, 10) eq(test.t.b, Column#14)])->Projection->Projection", + "DataScan(t)->Projection->Projection->Window(sum(cast(test.t.a))->Column#14)->Sel([gt(Column#14, cast(test.t.b))])->Projection->Projection" ] }, { "Name": "TestSubquery", "Cases": [ - "Join{DataScan(t)->DataScan(s)}(Column#1,Column#13)->Projection", - "Join{DataScan(t)->Aggr(count(Column#3),firstrow(Column#1))->DataScan(s)}(Column#1,Column#14)->Projection->Projection", - "Join{DataScan(t)->Aggr(count(Column#3),firstrow(Column#1))->DataScan(s)}(Column#1,Column#14)->Aggr(firstrow(Column#13),firstrow(Column#1),count(Column#15))->Projection->Projection", - "Apply{DataScan(t)->DataScan(s)->Sel([eq(Column#13, Column#1)])->Aggr(count(Column#14))}->Projection", - "Join{DataScan(t)->DataScan(s)->Aggr(count(Column#14),firstrow(Column#13))}(Column#1,Column#13)->Projection->Projection->Projection", - "Join{Join{DataScan(t1)->DataScan(t2)}->DataScan(s)->Aggr(count(Column#26),firstrow(Column#25))}(Column#1,Column#25)->Projection->Projection->Projection", - "Join{DataScan(t)->DataScan(s)->Aggr(count(1),firstrow(Column#13))}(Column#1,Column#13)->Projection->Projection->Projection", - "Join{DataScan(t)->DataScan(s)->Aggr(firstrow(Column#13))->Projection}(Column#1,Column#13)->Projection", - "Join{DataScan(t)->DataScan(s)}(Column#1,Column#13)->Projection", - "Join{DataScan(t)->DataScan(s)}(Column#1,Column#13)->Projection->Sel([in(10, Column#14, 10)])->Projection", - "Join{DataScan(t)->DataScan(s)->Aggr(sum(Column#13))->Projection}->Projection", - "Join{DataScan(t1)->DataScan(t)->Projection->Limit}(Column#2,Column#14)->Projection->Projection", - "Join{DataScan(t)->Join{DataScan(s)->DataScan(k)}(Column#16,Column#28)(Column#15,Column#27)->Aggr(sum(Column#13))->Projection}->Projection", - "Join{DataScan(t1)->DataScan(t2)->Aggr(max(Column#13),firstrow(Column#14))}(Column#2,Column#14)->Projection->Sel([eq(Column#2, Column#25)])->Projection", - "Apply{DataScan(t1)->DataScan(t2)->Sel([eq(Column#10, Column#22) or(eq(Column#2, 4), eq(Column#14, 2))])->Aggr(avg(Column#13))}->Projection->Sel([eq(cast(Column#2), Column#25)])->Projection", - "Join{DataScan(t1)->DataScan(t2)->Aggr(max(Column#13),firstrow(Column#14))}(Column#2,Column#14)->Projection->Sel([eq(Column#2, Column#25)])->Projection", - "Join{DataScan(t1)->DataScan(t2)}(Column#1,Column#13)(Column#2,Column#14)->Projection", - "Join{DataScan(t1)->DataScan(t2)}(Column#1,Column#13)->Projection", - "Apply{DataScan(t1)->DataScan(t2)->Sel([eq(Column#13, Column#1)])->Projection->Sort->Limit}->Projection->Sel([eq(Column#2, Column#25)])->Projection" + "Join{DataScan(t)->DataScan(s)}(test.t.a,test.t.a)->Projection", + "Join{DataScan(t)->Aggr(count(test.t.c),firstrow(test.t.a))->DataScan(s)}(test.t.a,test.t.a)->Projection->Projection", + "Join{DataScan(t)->Aggr(count(test.t.c),firstrow(test.t.a))->DataScan(s)}(test.t.a,test.t.a)->Aggr(firstrow(Column#13),firstrow(test.t.a),count(test.t.b))->Projection->Projection", + "Apply{DataScan(t)->DataScan(s)->Sel([eq(test.t.a, test.t.a)])->Aggr(count(test.t.b))}->Projection", + "Join{DataScan(t)->DataScan(s)->Aggr(count(test.t.b),firstrow(test.t.a))}(test.t.a,test.t.a)->Projection->Projection->Projection", + "Join{Join{DataScan(t1)->DataScan(t2)}->DataScan(s)->Aggr(count(test.t.b),firstrow(test.t.a))}(test.t.a,test.t.a)->Projection->Projection->Projection", + "Join{DataScan(t)->DataScan(s)->Aggr(count(1),firstrow(test.t.a))}(test.t.a,test.t.a)->Projection->Projection->Projection", + "Join{DataScan(t)->DataScan(s)->Aggr(firstrow(test.t.a))->Projection}(test.t.a,test.t.a)->Projection", + "Join{DataScan(t)->DataScan(s)}(test.t.a,test.t.a)->Projection", + "Join{DataScan(t)->DataScan(s)}(test.t.a,test.t.a)->Projection->Sel([in(10, test.t.b, 10)])->Projection", + "Join{DataScan(t)->DataScan(s)->Aggr(sum(test.t.a))->Projection}->Projection", + "Join{DataScan(t1)->DataScan(t)->Projection->Limit}(test.t.b,test.t.b)->Projection->Projection", + "Join{DataScan(t)->Join{DataScan(s)->DataScan(k)}(test.t.d,test.t.d)(test.t.c,test.t.c)->Aggr(sum(test.t.a))->Projection}->Projection", + "Join{DataScan(t1)->DataScan(t2)->Aggr(max(test.t.a),firstrow(test.t.b))}(test.t.b,test.t.b)->Projection->Sel([eq(test.t.b, Column#25)])->Projection", + "Apply{DataScan(t1)->DataScan(t2)->Sel([eq(test.t.g, test.t.g) or(eq(test.t.b, 4), eq(test.t.b, 2))])->Aggr(avg(test.t.a))}->Projection->Sel([eq(cast(test.t.b), Column#25)])->Projection", + "Join{DataScan(t1)->DataScan(t2)->Aggr(max(test.t.a),firstrow(test.t.b))}(test.t.b,test.t.b)->Projection->Sel([eq(test.t.b, Column#25)])->Projection", + "Join{DataScan(t1)->DataScan(t2)}(test.t.a,test.t.a)(test.t.b,test.t.b)->Projection", + "Join{DataScan(t1)->DataScan(t2)}(test.t.a,test.t.a)->Projection", + "Apply{DataScan(t1)->DataScan(t2)->Sel([eq(test.t.a, test.t.a)])->Projection->Sort->Limit}->Projection->Sel([eq(test.t.b, test.t.b)])->Projection" ] }, { "Name": "TestTopNPushDown", "Cases": [ - "DataScan(t)->TopN([Column#2],0,5)->Projection", + "DataScan(t)->TopN([test.t.b],0,5)->Projection", "DataScan(t)->Limit->Projection", - "DataScan(t)->Aggr(count(Column#2),firstrow(Column#1))->Limit->Projection", - "DataScan(t)->Aggr(count(Column#2),firstrow(Column#1),firstrow(Column#3))->TopN([Column#3],0,5)->Projection", - "Join{DataScan(t)->DataScan(s)}->TopN([Column#1],0,5)->Projection", + "DataScan(t)->Aggr(count(test.t.b),firstrow(test.t.a))->Limit->Projection", + "DataScan(t)->Aggr(count(test.t.b),firstrow(test.t.a),firstrow(test.t.c))->TopN([test.t.c],0,5)->Projection", + "Join{DataScan(t)->DataScan(s)}->TopN([test.t.a],0,5)->Projection", "Join{DataScan(t)->DataScan(s)}->Limit->Projection", - "Join{DataScan(t)->TopN([Column#1],0,5)->DataScan(s)}(Column#1,Column#13)->TopN([Column#1],0,5)->Projection", - "Join{DataScan(t)->TopN([Column#1],0,10)->DataScan(s)}(Column#1,Column#13)->TopN([Column#1],5,5)->Projection", - "Join{DataScan(t)->Limit->DataScan(s)}(Column#1,Column#13)->Limit->Projection", - "Join{DataScan(t)->Limit->DataScan(s)}(Column#1,Column#13)->Limit->Projection", - "Join{DataScan(t)->TopN([Column#1],0,5)->DataScan(s)}(Column#1,Column#13)->TopN([Column#1],0,5)->Projection", - "Join{DataScan(t)->TopN([Column#1],0,5)->DataScan(s)}(Column#1,Column#13)->TopN([Column#1],0,5)->Projection", - "Join{DataScan(t)->DataScan(s)}(Column#1,Column#13)->TopN([Column#1],0,5)->Projection", - "Join{DataScan(t)->DataScan(s)->TopN([Column#13],0,5)}(Column#1,Column#13)->TopN([Column#13],0,5)->Projection", - "Join{DataScan(t)->DataScan(s)}(Column#1,Column#13)->TopN([Column#13 Column#2],0,5)->Projection", - "UnionAll{DataScan(t)->TopN([Column#13 Column#14],0,5)->Projection->DataScan(s)->TopN([Column#1 Column#2],0,5)->Projection}->TopN([Column#25 Column#26],0,5)", - "UnionAll{DataScan(t)->TopN([Column#13 Column#14],0,10)->Projection->DataScan(s)->TopN([Column#1 Column#2],0,10)->Projection}->TopN([Column#25 Column#26],5,5)", - "UnionAll{DataScan(t)->Limit->Projection->DataScan(s)->TopN([Column#1],0,5)->Projection}->Limit", - "Join{DataScan(t1)->TopN([Column#2],0,5)->DataScan(t2)}(Column#5,Column#17)->TopN([Column#2],0,5)->Projection", - "Join{DataScan(t1)->DataScan(t2)}(Column#5,Column#17)->TopN([ifnull(Column#11, Column#14)],0,5)->Projection->Projection" + "Join{DataScan(t)->TopN([test.t.a],0,5)->DataScan(s)}(test.t.a,test.t.a)->TopN([test.t.a],0,5)->Projection", + "Join{DataScan(t)->TopN([test.t.a],0,10)->DataScan(s)}(test.t.a,test.t.a)->TopN([test.t.a],5,5)->Projection", + "Join{DataScan(t)->Limit->DataScan(s)}(test.t.a,test.t.a)->Limit->Projection", + "Join{DataScan(t)->Limit->DataScan(s)}(test.t.a,test.t.a)->Limit->Projection", + "Join{DataScan(t)->TopN([test.t.a],0,5)->DataScan(s)}(test.t.a,test.t.a)->TopN([test.t.a],0,5)->Projection", + "Join{DataScan(t)->TopN([test.t.a],0,5)->DataScan(s)}(test.t.a,test.t.a)->TopN([test.t.a],0,5)->Projection", + "Join{DataScan(t)->DataScan(s)}(test.t.a,test.t.a)->TopN([test.t.a],0,5)->Projection", + "Join{DataScan(t)->DataScan(s)->TopN([test.t.a],0,5)}(test.t.a,test.t.a)->TopN([test.t.a],0,5)->Projection", + "Join{DataScan(t)->DataScan(s)}(test.t.a,test.t.a)->TopN([test.t.a test.t.b],0,5)->Projection", + "UnionAll{DataScan(t)->TopN([test.t.a test.t.b],0,5)->Projection->DataScan(s)->TopN([test.t.a test.t.b],0,5)->Projection}->TopN([Column#25 Column#26],0,5)", + "UnionAll{DataScan(t)->TopN([test.t.a test.t.b],0,10)->Projection->DataScan(s)->TopN([test.t.a test.t.b],0,10)->Projection}->TopN([Column#25 Column#26],5,5)", + "UnionAll{DataScan(t)->Limit->Projection->DataScan(s)->TopN([test.t.a],0,5)->Projection}->Limit", + "Join{DataScan(t1)->TopN([test.t.b],0,5)->DataScan(t2)}(test.t.e,test.t.e)->TopN([test.t.b],0,5)->Projection", + "Join{DataScan(t1)->DataScan(t2)}(test.t.e,test.t.e)->TopN([ifnull(test.t.h, test.t.b)],0,5)->Projection->Projection" ] }, { @@ -176,18 +176,18 @@ { "Name": "TestWindowFunction", "Cases": [ - "TableReader(Table(t))->Window(avg(cast(Column#1)) over(partition by Column#1))->Projection", - "TableReader(Table(t))->Sort->Window(avg(cast(Column#1)) over(partition by Column#2))->Projection", - "IndexReader(Index(t.f)[[NULL,+inf]])->Projection->Sort->Window(avg(cast(Column#16)) over(partition by Column#15))->Projection", - "TableReader(Table(t))->Sort->Window(avg(cast(Column#1)) over(order by Column#1 asc, Column#2 desc range between unbounded preceding and current row))->Projection", - "TableReader(Table(t))->Window(avg(cast(Column#1)) over(partition by Column#1))->Projection", + "TableReader(Table(t))->Window(avg(cast(test.t.a))->Column#14 over(partition by test.t.a))->Projection", + "TableReader(Table(t))->Sort->Window(avg(cast(test.t.a))->Column#14 over(partition by test.t.b))->Projection", + "IndexReader(Index(t.f)[[NULL,+inf]])->Projection->Sort->Window(avg(cast(Column#16))->Column#17 over(partition by Column#15))->Projection", + "TableReader(Table(t))->Sort->Window(avg(cast(test.t.a))->Column#14 over(order by test.t.a asc, test.t.b desc range between unbounded preceding and current row))->Projection", + "TableReader(Table(t))->Window(avg(cast(test.t.a))->Column#14 over(partition by test.t.a))->Projection", "[planner:1054]Unknown column 'z' in 'field list'", - "TableReader(Table(t))->Window(sum(cast(Column#2)) over())->Sort->Projection", - "IndexReader(Index(t.f)[[NULL,+inf]]->StreamAgg)->StreamAgg->Window(sum(Column#13) over())->Projection", - "TableReader(Table(t))->Window(sum(cast(Column#1)) over())->Sort->Projection", - "TableReader(Table(t))->Window(sum(cast(Column#1)) over(partition by Column#1))->Sort->Projection", - "TableReader(Table(t)->StreamAgg)->StreamAgg->Window(sum(Column#13) over())->Sort->Projection", - "Apply{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]]->Sel([gt(Column#13, Column#1)]))->Window(sum(cast(Column#13)) over())->MaxOneRow->Sel([Column#26])}->Projection", + "TableReader(Table(t))->Window(sum(cast(test.t.b))->Column#14 over())->Sort->Projection", + "IndexReader(Index(t.f)[[NULL,+inf]]->StreamAgg)->StreamAgg->Window(sum(Column#13)->Column#15 over())->Projection", + "TableReader(Table(t))->Window(sum(cast(test.t.a))->Column#14 over())->Sort->Projection", + "TableReader(Table(t))->Window(sum(cast(test.t.a))->Column#14 over(partition by test.t.a))->Sort->Projection", + "TableReader(Table(t)->StreamAgg)->StreamAgg->Window(sum(Column#13)->Column#15 over())->Sort->Projection", + "Apply{IndexReader(Index(t.f)[[NULL,+inf]])->IndexReader(Index(t.f)[[NULL,+inf]]->Sel([gt(test.t.a, test.t.a)]))->Window(sum(cast(test.t.a))->Column#26 over())->MaxOneRow->Sel([Column#26])}->Projection", "[planner:3594]You cannot use the alias 'w' of an expression containing a window function in this context.'", "[planner:1247]Reference 'sum_a' not supported (reference to window function)", "[planner:3579]Window name 'w2' is not defined.", @@ -196,11 +196,11 @@ "[planner:3581]A window which depends on another cannot define partitioning.", "[planner:3581]A window which depends on another cannot define partitioning.", "[planner:3582]Window 'w' has a frame definition, so cannot be referenced by another window.", - "IndexReader(Index(t.f)[[NULL,+inf]])->Window(sum(cast(Column#1)) over(rows between 1 preceding and 1 following))->Projection", + "IndexReader(Index(t.f)[[NULL,+inf]])->Window(sum(cast(test.t.a))->Column#14 over(rows between 1 preceding and 1 following))->Projection", "[planner:3583]Window '' cannot inherit 'w' since both contain an ORDER BY clause.", "[planner:3591]Window 'w1' is defined twice.", - "TableReader(Table(t))->Window(avg(cast(Column#1)) over(partition by Column#1))->Projection", - "TableReader(Table(t))->Window(sum(cast(Column#1)) over(partition by Column#1))->Sort->Projection", + "TableReader(Table(t))->Window(avg(cast(test.t.a))->Column#14 over(partition by test.t.a))->Projection", + "TableReader(Table(t))->Window(sum(cast(test.t.a))->Column#14 over(partition by test.t.a))->Sort->Projection", "[planner:1235]This version of TiDB doesn't yet support 'GROUPS'", "[planner:3584]Window '': frame start cannot be UNBOUNDED FOLLOWING.", "[planner:3585]Window '': frame end cannot be UNBOUNDED PRECEDING.", @@ -212,23 +212,23 @@ "[planner:3590]Window '' has a non-constant frame bound.", "[planner:3586]Window '': frame start or end is negative, NULL or of non-integral type", "[planner:3588]Window '' with RANGE frame has ORDER BY expression of datetime type. Only INTERVAL bound value allowed.", - "TableReader(Table(t))->Window(sum(cast(Column#1)) over(order by Column#1 asc range between 1.0 preceding and 1 following))->Projection", - "IndexReader(Index(t.f)[[NULL,+inf]])->Window(row_number() over())->Projection", - "TableReader(Table(t))->HashAgg->Window(max(Column#13) over(rows between 1 preceding and 1 following))->Projection", + "TableReader(Table(t))->Window(sum(cast(test.t.a))->Column#14 over(order by test.t.a asc range between 1.0 preceding and 1 following))->Projection", + "IndexReader(Index(t.f)[[NULL,+inf]])->Window(row_number()->Column#14 over())->Projection", + "TableReader(Table(t))->HashAgg->Window(max(Column#13)->Column#15 over(rows between 1 preceding and 1 following))->Projection", "[planner:1210]Incorrect arguments to nth_value", "[planner:1210]Incorrect arguments to nth_value", "[planner:1210]Incorrect arguments to nth_value", "[planner:1210]Incorrect arguments to ntile", - "IndexReader(Index(t.f)[[NULL,+inf]])->Window(ntile() over())->Projection", - "TableReader(Table(t))->Sort->Window(avg(cast(Column#1)) over(partition by Column#2))->Projection", - "TableReader(Table(t))->Window(nth_value(Column#12, 1) over())->Projection", - "TableReader(Table(t))->Window(sum(cast(Column#2)), sum(cast(Column#3)) over(order by Column#1 asc range between unbounded preceding and current row))->Projection", + "IndexReader(Index(t.f)[[NULL,+inf]])->Window(ntile()->Column#14 over())->Projection", + "TableReader(Table(t))->Sort->Window(avg(cast(test.t.a))->Column#14 over(partition by test.t.b))->Projection", + "TableReader(Table(t))->Window(nth_value(test.t.i_date, 1)->Column#14 over())->Projection", + "TableReader(Table(t))->Window(sum(cast(test.t.b))->Column#15, sum(cast(test.t.c))->Column#16 over(order by test.t.a asc range between unbounded preceding and current row))->Projection", "[planner:3593]You cannot use the window function 'sum' in this context.'", "[planner:3593]You cannot use the window function 'sum' in this context.'", "[planner:3593]You cannot use the window function 'row_number' in this context.'", - "TableReader(Table(t))->Sort->Window(sum(cast(Column#3)) over(partition by Column#1 order by Column#3 asc range between unbounded preceding and current row))->Sort->Window(sum(cast(Column#2)) over(order by Column#1 asc, Column#2 asc, Column#3 asc range between unbounded preceding and current row))->Window(sum(cast(Column#1)) over(partition by Column#1 order by Column#2 asc range between unbounded preceding and current row))->Window(sum(cast(Column#4)) over())->Projection", + "TableReader(Table(t))->Sort->Window(sum(cast(test.t.c))->Column#17 over(partition by test.t.a order by test.t.c asc range between unbounded preceding and current row))->Sort->Window(sum(cast(test.t.b))->Column#18 over(order by test.t.a asc, test.t.b asc, test.t.c asc range between unbounded preceding and current row))->Window(sum(cast(test.t.a))->Column#19 over(partition by test.t.a order by test.t.b asc range between unbounded preceding and current row))->Window(sum(cast(test.t.d))->Column#20 over())->Projection", "[planner:3587]Window 'w1' with RANGE N PRECEDING/FOLLOWING frame requires exactly one ORDER BY expression, of numeric or temporal type", - "TableReader(Table(t))->Sort->Window(dense_rank() over(partition by Column#2 order by Column#1 desc, Column#2 desc))->Projection", + "TableReader(Table(t))->Sort->Window(dense_rank()->Column#14 over(partition by test.t.b order by test.t.a desc, test.t.b desc))->Projection", "[planner:3587]Window 'w1' with RANGE N PRECEDING/FOLLOWING frame requires exactly one ORDER BY expression, of numeric or temporal type", "[planner:3585]Window 'w1': frame end cannot be UNBOUNDED PRECEDING.", "[planner:3584]Window 'w1': frame start cannot be UNBOUNDED FOLLOWING.", @@ -242,7 +242,7 @@ "[planner:3586]Window 'w': frame start or end is negative, NULL or of non-integral type", "[planner:3586]Window 'w': frame start or end is negative, NULL or of non-integral type", "[planner:3586]Window 'w': frame start or end is negative, NULL or of non-integral type", - "TableReader(Table(t))->Sort->Window(row_number() over(partition by Column#2))->Projection" + "TableReader(Table(t))->Sort->Window(row_number()->Column#14 over(partition by test.t.b))->Projection" ] }, { @@ -251,229 +251,635 @@ { "1": [ [ - "Column#1" + "test.t.a" ] ], "2": [ [ - "Column#1" + "test.t.a" ] ], "3": [ [ - "Column#1" + "test.t.a" ] ] }, { "1": [ [ - "Column#9" + "test.t.f" ], [ - "Column#1" + "test.t.a" ] ], "2": [ [ - "Column#1" + "test.t.a" ], [ - "Column#2" + "test.t.b" ] ], "3": [ [ - "Column#1" + "test.t.a" ], [ - "Column#2" + "test.t.b" ] ] }, { "1": [ [ - "Column#1" + "test.t.a" ] ], "2": [ [ - "Column#3", - "Column#4", - "Column#5" + "test.t.c", + "test.t.d", + "test.t.e" ] ], "3": [ [ - "Column#3", - "Column#4", - "Column#5" + "test.t.c", + "test.t.d", + "test.t.e" ] ] }, { "1": [ [ - "Column#9" + "test.t.f" ], [ - "Column#9", - "Column#10" + "test.t.f", + "test.t.g" ], [ - "Column#1" + "test.t.a" ] ], "2": [ [ - "Column#9" + "test.t.f" ], [ - "Column#9", - "Column#10" + "test.t.f", + "test.t.g" ] ], "3": [ [ - "Column#9" + "test.t.f" ], [ - "Column#9", - "Column#10" + "test.t.f", + "test.t.g" ] ] }, { "1": [ [ - "Column#9" + "test.t.f" ], [ - "Column#9", - "Column#10" + "test.t.f", + "test.t.g" ], [ - "Column#1" + "test.t.a" ] ], "2": [ [ - "Column#21" + "test.t.f" ], [ - "Column#21", - "Column#22" + "test.t.f", + "test.t.g" ], [ - "Column#13" + "test.t.a" ] ], "3": [ [ - "Column#21" + "test.t.f" ], [ - "Column#21", - "Column#22" + "test.t.f", + "test.t.g" ], [ - "Column#13" + "test.t.a" ] ], "4": [ [ - "Column#21" + "test.t.f" ], [ - "Column#21", - "Column#22" + "test.t.f", + "test.t.g" ], [ - "Column#13" + "test.t.a" ] ] }, { "1": [ [ - "Column#9" + "test.t.f" ], [ - "Column#1" + "test.t.a" ] ], "2": [ [ - "Column#9" + "test.t.f" ] ], "3": [ [ - "Column#9" + "test.t.f" ] ], "5": [ [ - "Column#14" + "test.t.f" ] ], "6": [ [ - "Column#9" + "test.t.f" ] ] }, { "1": [ [ - "Column#9" + "test.t.f" ], [ - "Column#9", - "Column#10" + "test.t.f", + "test.t.g" ], [ - "Column#1" + "test.t.a" ] ], "2": [ [ - "Column#21" + "test.t.f" ], [ - "Column#21", - "Column#22" + "test.t.f", + "test.t.g" ], [ - "Column#13" + "test.t.a" ] ], "3": [ [ - "Column#9" + "test.t.f" ], [ - "Column#9", - "Column#10" + "test.t.f", + "test.t.g" ], [ - "Column#1" + "test.t.a" ] ], "4": [ [ - "Column#9" + "test.t.f" ], [ - "Column#9", - "Column#10" + "test.t.f", + "test.t.g" ], [ - "Column#1" + "test.t.a" ] ] } ] + }, + { + "Name": "TestAggPrune", + "Cases": [ + "DataScan(t)->Projection", + "DataScan(t)->Aggr(sum(test.t.b))->Projection", + "DataScan(t)->Projection", + "DataScan(t)->Projection", + "DataScan(t)->Projection", + "DataScan(t)->Projection" + ] + }, + { + "Name": "TestColumnPruning", + "Cases": [ + { + "1": [ + "test.t.a" + ] + }, + { + "1": [ + "test.t.a" + ] + }, + { + "1": [ + "test.t.a" + ], + "2": [ + "test.t.a" + ] + }, + { + "1": [ + "test.t.a" + ], + "2": [ + "test.t.d" + ] + }, + { + "1": [ + "test.t.a", + "test.t.d" + ], + "2": [ + "test.t.d" + ] + }, + { + "1": [ + "test.t.a", + "test.t.d" + ], + "2": [ + "test.t.a", + "test.t.b", + "test.t.d" + ] + }, + { + "1": [ + "test.t.a", + "test.t.d" + ], + "2": [ + "test.t.a", + "test.t.b", + "test.t.d" + ] + }, + { + "1": [ + "test.t.a" + ], + "3": [ + "test.t.a", + "test.t.b" + ] + }, + { + "1": [ + "test.t.a" + ] + }, + { + "1": [ + "test.t.a", + "test.t.b" + ], + "3": [ + "test.t.b" + ] + }, + { + "1": [ + "test.t.a" + ], + "3": [ + "test.t.b" + ] + }, + { + "1": [ + "test.t.a", + "test.t.b", + "test.t.c" + ] + }, + { + "1": [ + "test.t.a", + "test.t.b" + ], + "3": [ + "test.t.c" + ] + }, + { + "1": [ + "test.t.a", + "test.t.b" + ], + "3": [ + "test.t.c", + "test.t.d" + ] + }, + { + "1": [ + "test.t.a", + "test.t.b" + ], + "3": [ + "test.t.c", + "test.t.d" + ] + }, + { + "1": [ + "test.t.a" + ], + "3": [ + "test.t.a" + ] + }, + { + "1": [ + "test.t.a" + ], + "10": [ + "test.t.a" + ], + "12": [ + "test.t.a" + ], + "3": [ + "test.t.a" + ], + "5": [ + "Column#25" + ], + "8": [ + "test.t.a" + ] + }, + { + "1": [ + "test.t.a" + ] + }, + { + "1": [ + "test.t.a" + ] + }, + { + "1": [ + "test.t.c" + ] + } + ] + }, + { + "Name": "TestDeriveNotNullConds", + "Cases": [ + { + "Plan": "Join{DataScan(t1)->DataScan(t2)}(test.t.e,test.t.e)->Projection", + "Left": "[not(isnull(test.t.e))]", + "Right": "[not(isnull(test.t.e))]" + }, + { + "Plan": "Join{DataScan(t1)->DataScan(t2)}->Projection", + "Left": "[not(isnull(test.t.e))]", + "Right": "[not(isnull(test.t.e))]" + }, + { + "Plan": "Join{DataScan(t1)->DataScan(t2)}(test.t.e,test.t.e)->Projection", + "Left": "[not(isnull(test.t.e))]", + "Right": "[not(isnull(test.t.e))]" + }, + { + "Plan": "Join{DataScan(t1)->DataScan(t2)}(test.t.e,test.t.e)->Projection", + "Left": "[]", + "Right": "[not(isnull(test.t.e))]" + }, + { + "Plan": "Join{DataScan(t1)->DataScan(t2)}->Projection", + "Left": "[]", + "Right": "[not(isnull(test.t.e))]" + }, + { + "Plan": "Join{DataScan(t1)->DataScan(t2)}(test.t.e,test.t.e)->Projection", + "Left": "[]", + "Right": "[not(isnull(test.t.e))]" + }, + { + "Plan": "Join{DataScan(t1)->DataScan(t2)}(test.t.e,test.t.e)->Projection", + "Left": "[not(isnull(test.t.e))]", + "Right": "[]" + }, + { + "Plan": "Join{DataScan(t1)->DataScan(t2)}->Projection", + "Left": "[]", + "Right": "[]" + }, + { + "Plan": "Join{DataScan(t1)->DataScan(t2)}->Projection", + "Left": "[]", + "Right": "[]" + }, + { + "Plan": "Join{DataScan(t1)->DataScan(t2)}(test.t.b,test.t.b)->Projection", + "Left": "[]", + "Right": "[]" + }, + { + "Plan": "Join{DataScan(t1)->DataScan(t2)}(test.t.b,test.t.b)->Projection", + "Left": "[]", + "Right": "[]" + }, + { + "Plan": "Join{DataScan(t1)->DataScan(t2)}->Projection", + "Left": "[]", + "Right": "[]" + }, + { + "Plan": "Join{DataScan(t1)->DataScan(t2)}(test.t.e,test.t.e)->Projection", + "Left": "[]", + "Right": "[]" + } + ] + }, + { + "Name": "TestTablePartition", + "Cases": [ + "UnionAll{Partition(41)->Partition(42)->Partition(43)->Partition(44)->Partition(45)}->Projection", + "UnionAll{Partition(41)->Partition(42)}->Projection", + "UnionAll{Partition(41)->Partition(42)->Partition(43)}->Projection", + "UnionAll{Partition(42)->Partition(43)}->Projection", + "UnionAll{UnionAll{Partition(42)->Partition(43)}->Projection->Projection->UnionAll{Partition(42)->Partition(43)}->Projection->Projection}", + "UnionAll{UnionAll{Partition(42)->Partition(43)}->Projection->Projection->UnionAll{Partition(42)->Partition(43)}->Projection->Projection}", + "Partition(41)->Projection", + "Partition(45)->Projection", + "Dual->Projection", + "Partition(41)->Projection", + "UnionAll{Partition(41)->Partition(44)}->Projection" + ] + }, + { + "Name": "TestJoinPredicatePushDown", + "Cases": [ + { + "Left": "[]", + "Right": "[]" + }, + { + "Left": "[]", + "Right": "[]" + }, + { + "Left": "[or(eq(test.t.a, 1), eq(test.t.a, 2))]", + "Right": "[or(eq(test.t.a, 1), eq(test.t.a, 2))]" + }, + { + "Left": "[or(eq(test.t.c, 1), eq(test.t.a, 2))]", + "Right": "[]" + }, + { + "Left": "[eq(test.t.c, 1) or(eq(test.t.a, 3), eq(test.t.a, 4))]", + "Right": "[or(eq(test.t.a, 3), eq(test.t.a, 4))]" + }, + { + "Left": "[or(and(gt(test.t.a, 1), lt(test.t.a, 3)), eq(test.t.a, 2))]", + "Right": "[or(eq(test.t.a, 1), eq(test.t.a, 2))]" + }, + { + "Left": "[or(eq(test.t.a, 1), eq(test.t.a, 2))]", + "Right": "[or(eq(test.t.a, 1), eq(test.t.a, 2))]" + }, + { + "Left": "[]", + "Right": "[or(eq(test.t.a, 1), eq(test.t.a, 2))]" + }, + { + "Left": "[]", + "Right": "[]" + }, + { + "Left": "[]", + "Right": "[]" + }, + { + "Left": "[]", + "Right": "[]" + }, + { + "Left": "[]", + "Right": "[or(eq(test.t.c, 1), eq(test.t.a, 2))]" + }, + { + "Left": "[]", + "Right": "[or(or(eq(test.t.a, 3), eq(test.t.a, 4)), eq(test.t.a, 2))]" + }, + { + "Left": "[gt(test.t.a, 1)]", + "Right": "[]" + } + ] + }, + { + "Name": "TestJoinReOrder", + "Cases": [ + "Join{Join{Join{Join{DataScan(t1)->DataScan(t2)}(test.t.a,test.t.b)->DataScan(t3)}(test.t.a,test.t.b)->DataScan(t4)}(test.t.c,test.t.a)(test.t.c,test.t.d)->Join{DataScan(t5)->DataScan(t6)}(test.t.d,test.t.d)}->Projection", + "Join{Join{Join{Join{DataScan(t1)->DataScan(t8)}(test.t.a,test.t.a)->DataScan(t2)}->Join{DataScan(t3)->DataScan(t4)}}->Join{Join{DataScan(t5)->DataScan(t6)}->DataScan(t7)}}->Projection", + "Join{Join{Join{Join{DataScan(t5)->DataScan(t1)}(test.t.a,test.t.a)->DataScan(t2)}(test.t.a,test.t.a)->DataScan(t3)}(test.t.a,test.t.a)(test.t.a,test.t.a)->DataScan(t4)}(test.t.a,test.t.a)(test.t.a,test.t.a)(test.t.a,test.t.a)->Projection", + "Join{Join{Join{DataScan(t3)->DataScan(t1)}->Join{DataScan(t2)->DataScan(t4)}}->DataScan(t5)}->Projection", + "Apply{DataScan(o)->Join{Join{DataScan(t1)->DataScan(t3)}(test.t.a,test.t.a)->DataScan(t2)}(test.t.a,test.t.a)->Projection}->Projection", + "Apply{DataScan(o)->Join{Join{DataScan(t1)->DataScan(t2)}->DataScan(t3)}->Projection}->Projection" + ] + }, + { + "Name": "TestOuterJoinEliminator", + "Cases": [ + "DataScan(t1)->Aggr(firstrow(test.t.a),firstrow(test.t.b))", + "DataScan(t2)->Aggr(firstrow(test.t.a),firstrow(test.t.b))", + "DataScan(t1)->Aggr(max(test.t.a),min(test.t.b))->Projection", + "DataScan(t1)->Aggr(sum(test.t.a))->Projection", + "DataScan(t1)->Aggr(count(test.t.a, test.t.b))->Projection", + "DataScan(t1)->Projection", + "DataScan(t2)->Projection", + "Join{Join{DataScan(t1)->DataScan(t2)}(test.t.a,test.t.a)->DataScan(t3)->TopN([test.t.b true],0,1)}(test.t.b,test.t.b)->TopN([test.t.b true],0,1)->Aggr(max(test.t.b))->Projection", + "DataScan(t1)->Projection", + "Join{DataScan(t1)->DataScan(t2)}(test.t.a,test.t.a)->Sort->Projection", + "DataScan(a)->Projection" + ] + }, + { + "Name": "TestSimplifyOuterJoin", + "Cases": [ + { + "Best": "Join{DataScan(t1)->DataScan(t2)}(test.t.b,test.t.b)->Sel([or(gt(test.t.c, 1), gt(test.t.c, 1))])->Projection", + "JoinType": "left outer join" + }, + { + "Best": "Join{DataScan(t1)->DataScan(t2)}(test.t.b,test.t.b)->Projection", + "JoinType": "inner join" + }, + { + "Best": "Join{DataScan(t1)->DataScan(t2)}(test.t.b,test.t.b)->Projection", + "JoinType": "inner join" + }, + { + "Best": "Join{DataScan(t1)->DataScan(t2)}(test.t.b,test.t.b)->Sel([not(and(gt(test.t.c, 1), gt(test.t.c, 1)))])->Projection", + "JoinType": "left outer join" + }, + { + "Best": "Join{DataScan(t1)->DataScan(t2)}(test.t.c,test.t.c)->Projection", + "JoinType": "inner join" + }, + { + "Best": "Join{DataScan(t1)->DataScan(t2)}->Sel([nulleq(test.t.b, test.t.b)])->Projection", + "JoinType": "left outer join" + } + ] + }, + { + "Name": "TestOuterWherePredicatePushDown", + "Cases": [ + { + "Sel": "[or(and(eq(test.t.a, 1), isnull(test.t.a)), and(eq(test.t.a, 2), eq(test.t.a, 2)))]", + "Left": "[or(eq(test.t.a, 1), eq(test.t.a, 2))]", + "Right": "[]" + }, + { + "Sel": "[or(and(eq(test.t.c, 1), or(eq(test.t.a, 3), eq(test.t.a, 3))), and(eq(test.t.a, 2), eq(test.t.a, 2)))]", + "Left": "[or(eq(test.t.c, 1), eq(test.t.a, 2))]", + "Right": "[]" + }, + { + "Sel": "[or(and(eq(test.t.c, 1), or(and(eq(test.t.a, 3), eq(test.t.a, 3)), and(eq(test.t.a, 4), eq(test.t.a, 4)))), and(eq(test.t.a, 2), isnull(test.t.a)))]", + "Left": "[or(and(eq(test.t.c, 1), or(eq(test.t.a, 3), eq(test.t.a, 4))), eq(test.t.a, 2))]", + "Right": "[]" + } + ] } ] diff --git a/statistics/selectivity_test.go b/statistics/selectivity_test.go index 3fcfd3221d017..109b4df605946 100644 --- a/statistics/selectivity_test.go +++ b/statistics/selectivity_test.go @@ -42,6 +42,7 @@ import ( "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testleak" + "github.com/pingcap/tidb/util/testutil" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) @@ -51,9 +52,10 @@ const eps = 1e-9 var _ = Suite(&testStatsSuite{}) type testStatsSuite struct { - store kv.Storage - do *domain.Domain - hook *logHook + store kv.Storage + do *domain.Domain + hook *logHook + testData testutil.TestData } func (s *testStatsSuite) SetUpSuite(c *C) { @@ -63,12 +65,15 @@ func (s *testStatsSuite) SetUpSuite(c *C) { var err error s.store, s.do, err = newStoreWithBootstrap() c.Assert(err, IsNil) + s.testData, err = testutil.LoadTestSuiteData("testdata", "stats_suite") + c.Assert(err, IsNil) } func (s *testStatsSuite) TearDownSuite(c *C) { s.do.Close() c.Assert(s.store.Close(), IsNil) testleak.AfterTest(c)() + c.Assert(s.testData.GenerateOutputIfNeeded(), IsNil) } func (s *testStatsSuite) registerHook() { @@ -322,9 +327,17 @@ func (s *testStatsSuite) TestDiscreteDistribution(c *C) { testKit.MustExec("insert into t values ('tw', 0)") } testKit.MustExec("analyze table t") - testKit.MustQuery("explain select * from t where a = 'tw' and b < 0").Check(testkit.Rows( - "IndexReader_6 0.00 root index:IndexScan_5", - "└─IndexScan_5 0.00 cop[tikv] table:t, index:a, b, range:[\"tw\" -inf,\"tw\" 0), keep order:false")) + var ( + input []string + output [][]string + ) + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) + }) + testKit.MustQuery(tt).Check(testkit.Rows(output[i]...)) + } } func (s *testStatsSuite) TestSelectCombinedLowBound(c *C) { @@ -335,9 +348,17 @@ func (s *testStatsSuite) TestSelectCombinedLowBound(c *C) { testKit.MustExec("create table t(id int auto_increment, kid int, pid int, primary key(id), key(kid, pid))") testKit.MustExec("insert into t (kid, pid) values (1,2), (1,3), (1,4),(1, 11), (1, 12), (1, 13), (1, 14), (2, 2), (2, 3), (2, 4)") testKit.MustExec("analyze table t") - testKit.MustQuery("explain select * from t where kid = 1").Check(testkit.Rows( - "IndexReader_6 7.00 root index:IndexScan_5", - "└─IndexScan_5 7.00 cop[tikv] table:t, index:kid, pid, range:[1,1], keep order:false")) + var ( + input []string + output [][]string + ) + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) + }) + testKit.MustQuery(tt).Check(testkit.Rows(output[i]...)) + } } func getRange(start, end int64) []*ranger.Range { @@ -462,16 +483,23 @@ func (s *testStatsSuite) TestPrimaryKeySelectivity(c *C) { testKit.MustExec("use test") testKit.MustExec("drop table if exists t") testKit.MustExec("create table t(a char(10) primary key, b int)") - testKit.MustQuery(`explain select * from t where a > "t"`).Check(testkit.Rows( - "TableReader_7 3333.33 root data:Selection_6", - "└─Selection_6 3333.33 cop[tikv] gt(Column#1, \"t\")", - " └─TableScan_5 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) - - testKit.MustExec("drop table t") - testKit.MustExec("create table t(a int primary key, b int)") - testKit.MustQuery(`explain select * from t where a > 1`).Check(testkit.Rows( - "TableReader_6 3333.33 root data:TableScan_5", - "└─TableScan_5 3333.33 cop[tikv] table:t, range:(1,+inf], keep order:false, stats:pseudo")) + var input, output [][]string + s.testData.GetTestCases(c, &input, &output) + for i, ts := range input { + for j, tt := range ts { + if j != len(ts)-1 { + testKit.MustExec(tt) + } + s.testData.OnRecord(func() { + if j == len(ts)-1 { + output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) + } + }) + if j == len(ts)-1 { + testKit.MustQuery(tt).Check(testkit.Rows(output[i]...)) + } + } + } } func BenchmarkSelectivity(b *testing.B) { @@ -521,51 +549,24 @@ func (s *testStatsSuite) TestColumnIndexNullEstimation(c *C) { h := s.do.StatsHandle() c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) testKit.MustExec("analyze table t") - testKit.MustQuery(`explain select b from t where b is null`).Check(testkit.Rows( - "IndexReader_6 4.00 root index:IndexScan_5", - "└─IndexScan_5 4.00 cop[tikv] table:t, index:b, range:[NULL,NULL], keep order:false", - )) - testKit.MustQuery(`explain select b from t where b is not null`).Check(testkit.Rows( - "IndexReader_6 1.00 root index:IndexScan_5", - "└─IndexScan_5 1.00 cop[tikv] table:t, index:b, range:[-inf,+inf], keep order:false", - )) - testKit.MustQuery(`explain select b from t where b is null or b > 3`).Check(testkit.Rows( - "IndexReader_6 4.00 root index:IndexScan_5", - "└─IndexScan_5 4.00 cop[tikv] table:t, index:b, range:[NULL,NULL], (3,+inf], keep order:false", - )) - testKit.MustQuery(`explain select b from t use index(idx_b)`).Check(testkit.Rows( - "IndexReader_5 5.00 root index:IndexScan_4", - "└─IndexScan_4 5.00 cop[tikv] table:t, index:b, range:[NULL,+inf], keep order:false", - )) - testKit.MustQuery(`explain select b from t where b < 4`).Check(testkit.Rows( - "IndexReader_6 1.00 root index:IndexScan_5", - "└─IndexScan_5 1.00 cop[tikv] table:t, index:b, range:[-inf,4), keep order:false", - )) + var ( + input []string + output [][]string + ) + s.testData.GetTestCases(c, &input, &output) + for i := 0; i < 5; i++ { + s.testData.OnRecord(func() { + output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) + }) + testKit.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) + } // Make sure column stats has been loaded. testKit.MustExec(`explain select * from t where a is null`) c.Assert(h.LoadNeededHistograms(), IsNil) - testKit.MustQuery(`explain select * from t where a is null`).Check(testkit.Rows( - "TableReader_7 1.00 root data:Selection_6", - "└─Selection_6 1.00 cop[tikv] isnull(Column#1)", - " └─TableScan_5 5.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", - )) - testKit.MustQuery(`explain select * from t where a is not null`).Check(testkit.Rows( - "TableReader_7 4.00 root data:Selection_6", - "└─Selection_6 4.00 cop[tikv] not(isnull(Column#1))", - " └─TableScan_5 5.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", - )) - testKit.MustQuery(`explain select * from t where a is null or a > 3`).Check(testkit.Rows( - "TableReader_7 2.00 root data:Selection_6", - "└─Selection_6 2.00 cop[tikv] or(isnull(Column#1), gt(Column#1, 3))", - " └─TableScan_5 5.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", - )) - testKit.MustQuery(`explain select * from t`).Check(testkit.Rows( - "TableReader_5 5.00 root data:TableScan_4", - "└─TableScan_4 5.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", - )) - testKit.MustQuery(`explain select * from t where a < 4`).Check(testkit.Rows( - "TableReader_7 3.00 root data:Selection_6", - "└─Selection_6 3.00 cop[tikv] lt(Column#1, 4)", - " └─TableScan_5 5.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", - )) + for i := 5; i < len(input); i++ { + s.testData.OnRecord(func() { + output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) + }) + testKit.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) + } } diff --git a/statistics/testdata/stats_suite_in.json b/statistics/testdata/stats_suite_in.json new file mode 100644 index 0000000000000..8bb1c93e5d7cc --- /dev/null +++ b/statistics/testdata/stats_suite_in.json @@ -0,0 +1,42 @@ +[ + { + "name": "TestColumnIndexNullEstimation", + "cases": [ + "explain select b from t where b is null", + "explain select b from t where b is not null", + "explain select b from t where b is null or b > 3", + "explain select b from t use index(idx_b)", + "explain select b from t where b < 4", + "explain select * from t where a is null", + "explain select * from t where a is not null", + "explain select * from t where a is null or a > 3", + "explain select * from t", + "explain select * from t where a < 4" + ] + }, + { + "name": "TestDiscreteDistribution", + "cases": [ + "explain select * from t where a = 'tw' and b < 0" + ] + }, + { + "name": "TestPrimaryKeySelectivity", + "cases": [ + [ + "explain select * from t where a > \"t\"" + ], + [ + "drop table t", + "create table t(a int primary key, b int)", + "explain select * from t where a > 1" + ] + ] + }, + { + "name": "TestSelectCombinedLowBound", + "cases": [ + "explain select * from t where kid = 1" + ] + } +] \ No newline at end of file diff --git a/statistics/testdata/stats_suite_out.json b/statistics/testdata/stats_suite_out.json new file mode 100644 index 0000000000000..86c76d5811415 --- /dev/null +++ b/statistics/testdata/stats_suite_out.json @@ -0,0 +1,83 @@ +[ + { + "Name": "TestColumnIndexNullEstimation", + "Cases": [ + [ + "IndexReader_6 4.00 root index:IndexScan_5", + "└─IndexScan_5 4.00 cop[tikv] table:t, index:b, range:[NULL,NULL], keep order:false" + ], + [ + "IndexReader_6 1.00 root index:IndexScan_5", + "└─IndexScan_5 1.00 cop[tikv] table:t, index:b, range:[-inf,+inf], keep order:false" + ], + [ + "IndexReader_6 4.00 root index:IndexScan_5", + "└─IndexScan_5 4.00 cop[tikv] table:t, index:b, range:[NULL,NULL], (3,+inf], keep order:false" + ], + [ + "IndexReader_5 5.00 root index:IndexScan_4", + "└─IndexScan_4 5.00 cop[tikv] table:t, index:b, range:[NULL,+inf], keep order:false" + ], + [ + "IndexReader_6 1.00 root index:IndexScan_5", + "└─IndexScan_5 1.00 cop[tikv] table:t, index:b, range:[-inf,4), keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] isnull(test.t.a)", + " └─TableScan_5 5.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false" + ], + [ + "TableReader_7 4.00 root data:Selection_6", + "└─Selection_6 4.00 cop[tikv] not(isnull(test.t.a))", + " └─TableScan_5 5.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false" + ], + [ + "TableReader_7 2.00 root data:Selection_6", + "└─Selection_6 2.00 cop[tikv] or(isnull(test.t.a), gt(test.t.a, 3))", + " └─TableScan_5 5.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false" + ], + [ + "TableReader_5 5.00 root data:TableScan_4", + "└─TableScan_4 5.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false" + ], + [ + "TableReader_7 3.00 root data:Selection_6", + "└─Selection_6 3.00 cop[tikv] lt(test.t.a, 4)", + " └─TableScan_5 5.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false" + ] + ] + }, + { + "Name": "TestDiscreteDistribution", + "Cases": [ + [ + "IndexReader_6 0.00 root index:IndexScan_5", + "└─IndexScan_5 0.00 cop[tikv] table:t, index:a, b, range:[\"tw\" -inf,\"tw\" 0), keep order:false" + ] + ] + }, + { + "Name": "TestPrimaryKeySelectivity", + "Cases": [ + [ + "TableReader_7 3333.33 root data:Selection_6", + "└─Selection_6 3333.33 cop[tikv] gt(test.t.a, \"t\")", + " └─TableScan_5 10000.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false, stats:pseudo" + ], + [ + "TableReader_6 3333.33 root data:TableScan_5", + "└─TableScan_5 3333.33 cop[tikv] table:t, range:(1,+inf], keep order:false, stats:pseudo" + ] + ] + }, + { + "Name": "TestSelectCombinedLowBound", + "Cases": [ + [ + "IndexReader_6 7.00 root index:IndexScan_5", + "└─IndexScan_5 7.00 cop[tikv] table:t, index:kid, pid, range:[1,1], keep order:false" + ] + ] + } +] diff --git a/table/tables/partition_test.go b/table/tables/partition_test.go index af4f982f6555f..aaaddf2d190aa 100644 --- a/table/tables/partition_test.go +++ b/table/tables/partition_test.go @@ -274,13 +274,13 @@ func (ts *testSuite) TestGeneratePartitionExpr(c *C) { c.Assert(pe.Column.ID, Equals, int64(1)) ranges := []string{ - "or(lt(Column#1, 4), isnull(Column#1))", - "and(lt(Column#1, 7), ge(Column#1, 4))", - "and(1, ge(Column#1, 7))", + "or(lt(test.t1.id, 4), isnull(test.t1.id))", + "and(lt(test.t1.id, 7), ge(test.t1.id, 4))", + "and(1, ge(test.t1.id, 7))", } upperBounds := []string{ - "lt(Column#1, 4)", - "lt(Column#1, 7)", + "lt(test.t1.id, 4)", + "lt(test.t1.id, 7)", "1", } for i, expr := range pe.Ranges { diff --git a/util/ranger/ranger_test.go b/util/ranger/ranger_test.go index 079630029a46c..23da28e2fb9aa 100644 --- a/util/ranger/ranger_test.go +++ b/util/ranger/ranger_test.go @@ -98,205 +98,205 @@ func (s *testRangerSuite) TestTableRange(c *C) { }{ { exprStr: "a = 1", - accessConds: "[eq(Column#1, 1)]", + accessConds: "[eq(test.t.a, 1)]", filterConds: "[]", resultStr: "[[1,1]]", }, { exprStr: "1 = a", - accessConds: "[eq(1, Column#1)]", + accessConds: "[eq(1, test.t.a)]", filterConds: "[]", resultStr: "[[1,1]]", }, { exprStr: "a != 1", - accessConds: "[ne(Column#1, 1)]", + accessConds: "[ne(test.t.a, 1)]", filterConds: "[]", resultStr: "[[-inf,1) (1,+inf]]", }, { exprStr: "1 != a", - accessConds: "[ne(1, Column#1)]", + accessConds: "[ne(1, test.t.a)]", filterConds: "[]", resultStr: "[[-inf,1) (1,+inf]]", }, { exprStr: "a > 1", - accessConds: "[gt(Column#1, 1)]", + accessConds: "[gt(test.t.a, 1)]", filterConds: "[]", resultStr: "[(1,+inf]]", }, { exprStr: "1 < a", - accessConds: "[lt(1, Column#1)]", + accessConds: "[lt(1, test.t.a)]", filterConds: "[]", resultStr: "[(1,+inf]]", }, { exprStr: "a >= 1", - accessConds: "[ge(Column#1, 1)]", + accessConds: "[ge(test.t.a, 1)]", filterConds: "[]", resultStr: "[[1,+inf]]", }, { exprStr: "1 <= a", - accessConds: "[le(1, Column#1)]", + accessConds: "[le(1, test.t.a)]", filterConds: "[]", resultStr: "[[1,+inf]]", }, { exprStr: "a < 1", - accessConds: "[lt(Column#1, 1)]", + accessConds: "[lt(test.t.a, 1)]", filterConds: "[]", resultStr: "[[-inf,1)]", }, { exprStr: "1 > a", - accessConds: "[gt(1, Column#1)]", + accessConds: "[gt(1, test.t.a)]", filterConds: "[]", resultStr: "[[-inf,1)]", }, { exprStr: "a <= 1", - accessConds: "[le(Column#1, 1)]", + accessConds: "[le(test.t.a, 1)]", filterConds: "[]", resultStr: "[[-inf,1]]", }, { exprStr: "1 >= test.t.a", - accessConds: "[ge(1, Column#1)]", + accessConds: "[ge(1, test.t.a)]", filterConds: "[]", resultStr: "[[-inf,1]]", }, { exprStr: "(a)", - accessConds: "[Column#1]", + accessConds: "[test.t.a]", filterConds: "[]", resultStr: "[[-inf,0) (0,+inf]]", }, { exprStr: "a in (1, 3, NULL, 2)", - accessConds: "[in(Column#1, 1, 3, , 2)]", + accessConds: "[in(test.t.a, 1, 3, , 2)]", filterConds: "[]", resultStr: "[[1,1] [2,2] [3,3]]", }, { exprStr: `a IN (8,8,81,45)`, - accessConds: "[in(Column#1, 8, 8, 81, 45)]", + accessConds: "[in(test.t.a, 8, 8, 81, 45)]", filterConds: "[]", resultStr: `[[8,8] [45,45] [81,81]]`, }, { exprStr: "a between 1 and 2", - accessConds: "[ge(Column#1, 1) le(Column#1, 2)]", + accessConds: "[ge(test.t.a, 1) le(test.t.a, 2)]", filterConds: "[]", resultStr: "[[1,2]]", }, { exprStr: "a not between 1 and 2", - accessConds: "[or(lt(Column#1, 1), gt(Column#1, 2))]", + accessConds: "[or(lt(test.t.a, 1), gt(test.t.a, 2))]", filterConds: "[]", resultStr: "[[-inf,1) (2,+inf]]", }, { exprStr: "a between 2 and 1", - accessConds: "[ge(Column#1, 2) le(Column#1, 1)]", + accessConds: "[ge(test.t.a, 2) le(test.t.a, 1)]", filterConds: "[]", resultStr: "[]", }, { exprStr: "a not between 2 and 1", - accessConds: "[or(lt(Column#1, 2), gt(Column#1, 1))]", + accessConds: "[or(lt(test.t.a, 2), gt(test.t.a, 1))]", filterConds: "[]", resultStr: "[[-inf,+inf]]", }, { exprStr: "a IS NULL", - accessConds: "[isnull(Column#1)]", + accessConds: "[isnull(test.t.a)]", filterConds: "[]", resultStr: "[]", }, { exprStr: "a IS NOT NULL", - accessConds: "[not(isnull(Column#1))]", + accessConds: "[not(isnull(test.t.a))]", filterConds: "[]", resultStr: "[[-inf,+inf]]", }, { exprStr: "a IS TRUE", - accessConds: "[istrue(Column#1)]", + accessConds: "[istrue(test.t.a)]", filterConds: "[]", resultStr: "[[-inf,0) (0,+inf]]", }, { exprStr: "a IS NOT TRUE", - accessConds: "[not(istrue(Column#1))]", + accessConds: "[not(istrue(test.t.a))]", filterConds: "[]", resultStr: "[[0,0]]", }, { exprStr: "a IS FALSE", - accessConds: "[isfalse(Column#1)]", + accessConds: "[isfalse(test.t.a)]", filterConds: "[]", resultStr: "[[0,0]]", }, { exprStr: "a IS NOT FALSE", - accessConds: "[not(isfalse(Column#1))]", + accessConds: "[not(isfalse(test.t.a))]", filterConds: "[]", resultStr: "[[-inf,0) (0,+inf]]", }, { exprStr: "a = 1 or a = 3 or a = 4 or (a > 1 and (a = -1 or a = 5))", - accessConds: "[or(or(eq(Column#1, 1), eq(Column#1, 3)), or(eq(Column#1, 4), and(gt(Column#1, 1), or(eq(Column#1, -1), eq(Column#1, 5)))))]", + accessConds: "[or(or(eq(test.t.a, 1), eq(test.t.a, 3)), or(eq(test.t.a, 4), and(gt(test.t.a, 1), or(eq(test.t.a, -1), eq(test.t.a, 5)))))]", filterConds: "[]", resultStr: "[[1,1] [3,3] [4,4] [5,5]]", }, { exprStr: "(a = 1 and b = 1) or (a = 2 and b = 2)", - accessConds: "[or(eq(Column#1, 1), eq(Column#1, 2))]", - filterConds: "[or(and(eq(Column#1, 1), eq(Column#2, 1)), and(eq(Column#1, 2), eq(Column#2, 2)))]", + accessConds: "[or(eq(test.t.a, 1), eq(test.t.a, 2))]", + filterConds: "[or(and(eq(test.t.a, 1), eq(test.t.b, 1)), and(eq(test.t.a, 2), eq(test.t.b, 2)))]", resultStr: "[[1,1] [2,2]]", }, { exprStr: "a = 1 or a = 3 or a = 4 or (b > 1 and (a = -1 or a = 5))", - accessConds: "[or(or(eq(Column#1, 1), eq(Column#1, 3)), or(eq(Column#1, 4), or(eq(Column#1, -1), eq(Column#1, 5))))]", - filterConds: "[or(or(or(eq(Column#1, 1), eq(Column#1, 3)), eq(Column#1, 4)), and(gt(Column#2, 1), or(eq(Column#1, -1), eq(Column#1, 5))))]", + accessConds: "[or(or(eq(test.t.a, 1), eq(test.t.a, 3)), or(eq(test.t.a, 4), or(eq(test.t.a, -1), eq(test.t.a, 5))))]", + filterConds: "[or(or(or(eq(test.t.a, 1), eq(test.t.a, 3)), eq(test.t.a, 4)), and(gt(test.t.b, 1), or(eq(test.t.a, -1), eq(test.t.a, 5))))]", resultStr: "[[-1,-1] [1,1] [3,3] [4,4] [5,5]]", }, { exprStr: "a in (1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 2, 3, 4, 4, 1, 2)", - accessConds: "[in(Column#1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 2, 3, 4, 4, 1, 2)]", + accessConds: "[in(test.t.a, 1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 2, 3, 4, 4, 1, 2)]", filterConds: "[]", resultStr: "[[1,1] [2,2] [3,3] [4,4]]", }, { exprStr: "a not in (1, 2, 3)", - accessConds: "[not(in(Column#1, 1, 2, 3))]", + accessConds: "[not(in(test.t.a, 1, 2, 3))]", filterConds: "[]", resultStr: "[[-inf,1) (3,+inf]]", }, { exprStr: "a > 9223372036854775807", - accessConds: "[gt(Column#1, 9223372036854775807)]", + accessConds: "[gt(test.t.a, 9223372036854775807)]", filterConds: "[]", resultStr: "[]", }, { exprStr: "a >= 9223372036854775807", - accessConds: "[ge(Column#1, 9223372036854775807)]", + accessConds: "[ge(test.t.a, 9223372036854775807)]", filterConds: "[]", resultStr: "[[9223372036854775807,+inf]]", }, { exprStr: "a < -9223372036854775807", - accessConds: "[lt(Column#1, -9223372036854775807)]", + accessConds: "[lt(test.t.a, -9223372036854775807)]", filterConds: "[]", resultStr: "[[-inf,-9223372036854775807)]", }, { exprStr: "a < -9223372036854775808", - accessConds: "[lt(Column#1, -9223372036854775808)]", + accessConds: "[lt(test.t.a, -9223372036854775808)]", filterConds: "[]", resultStr: "[]", }, @@ -356,28 +356,28 @@ func (s *testRangerSuite) TestIndexRange(c *C) { { indexPos: 0, exprStr: `a LIKE 'abc%'`, - accessConds: `[like(Column#1, abc%, 92)]`, + accessConds: `[like(test.t.a, abc%, 92)]`, filterConds: "[]", resultStr: "[[\"abc\",\"abd\")]", }, { indexPos: 0, exprStr: "a LIKE 'abc_'", - accessConds: "[like(Column#1, abc_, 92)]", - filterConds: "[like(Column#1, abc_, 92)]", + accessConds: "[like(test.t.a, abc_, 92)]", + filterConds: "[like(test.t.a, abc_, 92)]", resultStr: "[(\"abc\",\"abd\")]", }, { indexPos: 0, exprStr: "a LIKE 'abc'", - accessConds: "[eq(Column#1, abc)]", + accessConds: "[eq(test.t.a, abc)]", filterConds: "[]", resultStr: "[[\"abc\",\"abc\"]]", }, { indexPos: 0, exprStr: `a LIKE "ab\_c"`, - accessConds: "[eq(Column#1, ab_c)]", + accessConds: "[eq(test.t.a, ab_c)]", filterConds: "[]", resultStr: "[[\"ab_c\",\"ab_c\"]]", }, @@ -385,83 +385,83 @@ func (s *testRangerSuite) TestIndexRange(c *C) { indexPos: 0, exprStr: `a LIKE '%'`, accessConds: "[]", - filterConds: `[like(Column#1, %, 92)]`, + filterConds: `[like(test.t.a, %, 92)]`, resultStr: "[[NULL,+inf]]", }, { indexPos: 0, exprStr: `a LIKE '\%a'`, - accessConds: "[eq(Column#1, %a)]", + accessConds: "[eq(test.t.a, %a)]", filterConds: "[]", resultStr: `[["%a","%a"]]`, }, { indexPos: 0, exprStr: `a LIKE "\\"`, - accessConds: "[eq(Column#1, \\)]", + accessConds: "[eq(test.t.a, \\)]", filterConds: "[]", resultStr: "[[\"\\\",\"\\\"]]", }, { indexPos: 0, exprStr: `a LIKE "\\\\a%"`, - accessConds: `[like(Column#1, \\a%, 92)]`, + accessConds: `[like(test.t.a, \\a%, 92)]`, filterConds: "[]", resultStr: "[[\"\\a\",\"\\b\")]", }, { indexPos: 0, exprStr: `a > NULL`, - accessConds: "[gt(Column#1, )]", + accessConds: "[gt(test.t.a, )]", filterConds: "[]", resultStr: `[]`, }, { indexPos: 0, exprStr: `a = 'a' and b in (1, 2, 3)`, - accessConds: "[eq(Column#1, a) in(Column#2, 1, 2, 3)]", + accessConds: "[eq(test.t.a, a) in(test.t.b, 1, 2, 3)]", filterConds: "[]", resultStr: "[[\"a\" 1,\"a\" 1] [\"a\" 2,\"a\" 2] [\"a\" 3,\"a\" 3]]", }, { indexPos: 0, exprStr: `a = 'a' and b not in (1, 2, 3)`, - accessConds: "[eq(Column#1, a) not(in(Column#2, 1, 2, 3))]", + accessConds: "[eq(test.t.a, a) not(in(test.t.b, 1, 2, 3))]", filterConds: "[]", resultStr: "[(\"a\" NULL,\"a\" 1) (\"a\" 3,\"a\" +inf]]", }, { indexPos: 0, exprStr: `a in ('a') and b in ('1', 2.0, NULL)`, - accessConds: "[eq(Column#1, a) in(Column#2, 1, 2, )]", + accessConds: "[eq(test.t.a, a) in(test.t.b, 1, 2, )]", filterConds: "[]", resultStr: `[["a" 1,"a" 1] ["a" 2,"a" 2]]`, }, { indexPos: 1, exprStr: `c in ('1.1', 1, 1.1) and a in ('1', 'a', NULL)`, - accessConds: "[in(Column#3, 1.1, 1, 1.1) in(Column#1, 1, a, )]", + accessConds: "[in(test.t.c, 1.1, 1, 1.1) in(test.t.a, 1, a, )]", filterConds: "[]", resultStr: "[[1 \"1\",1 \"1\"] [1 \"a\",1 \"a\"] [1.1 \"1\",1.1 \"1\"] [1.1 \"a\",1.1 \"a\"]]", }, { indexPos: 1, exprStr: "c in (1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 2, 3, 4, 4, 1, 2)", - accessConds: "[in(Column#3, 1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 2, 3, 4, 4, 1, 2)]", + accessConds: "[in(test.t.c, 1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 2, 3, 4, 4, 1, 2)]", filterConds: "[]", resultStr: "[[1,1] [2,2] [3,3] [4,4]]", }, { indexPos: 1, exprStr: "c not in (1, 2, 3)", - accessConds: "[not(in(Column#3, 1, 2, 3))]", + accessConds: "[not(in(test.t.c, 1, 2, 3))]", filterConds: "[]", resultStr: "[(NULL,1) (1,2) (2,3) (3,+inf]]", }, { indexPos: 1, exprStr: "c in (1, 2) and c in (1, 3)", - accessConds: "[eq(Column#3, 1)]", + accessConds: "[eq(test.t.c, 1)]", filterConds: "[]", resultStr: "[[1,1]]", }, @@ -475,63 +475,63 @@ func (s *testRangerSuite) TestIndexRange(c *C) { { indexPos: 0, exprStr: "a in (NULL)", - accessConds: "[eq(Column#1, )]", + accessConds: "[eq(test.t.a, )]", filterConds: "[]", resultStr: "[]", }, { indexPos: 0, exprStr: "a not in (NULL, '1', '2', '3')", - accessConds: "[not(in(Column#1, , 1, 2, 3))]", + accessConds: "[not(in(test.t.a, , 1, 2, 3))]", filterConds: "[]", resultStr: "[]", }, { indexPos: 0, exprStr: "not (a not in (NULL, '1', '2', '3') and a > '2')", - accessConds: "[or(in(Column#1, , 1, 2, 3), le(Column#1, 2))]", + accessConds: "[or(in(test.t.a, , 1, 2, 3), le(test.t.a, 2))]", filterConds: "[]", resultStr: "[[-inf,\"2\"] [\"3\",\"3\"]]", }, { indexPos: 0, exprStr: "not (a not in (NULL) and a > '2')", - accessConds: "[or(eq(Column#1, ), le(Column#1, 2))]", + accessConds: "[or(eq(test.t.a, ), le(test.t.a, 2))]", filterConds: "[]", resultStr: "[[-inf,\"2\"]]", }, { indexPos: 0, exprStr: "not (a not in (NULL) or a > '2')", - accessConds: "[and(eq(Column#1, ), le(Column#1, 2))]", + accessConds: "[and(eq(test.t.a, ), le(test.t.a, 2))]", filterConds: "[]", resultStr: "[]", }, { indexPos: 0, exprStr: "(a > 'b' and a < 'bbb') or (a < 'cb' and a > 'a')", - accessConds: "[or(and(gt(Column#1, b), lt(Column#1, bbb)), and(lt(Column#1, cb), gt(Column#1, a)))]", + accessConds: "[or(and(gt(test.t.a, b), lt(test.t.a, bbb)), and(lt(test.t.a, cb), gt(test.t.a, a)))]", filterConds: "[]", resultStr: "[(\"a\",\"cb\")]", }, { indexPos: 0, exprStr: "(a > 'a' and a < 'b') or (a >= 'b' and a < 'c')", - accessConds: "[or(and(gt(Column#1, a), lt(Column#1, b)), and(ge(Column#1, b), lt(Column#1, c)))]", + accessConds: "[or(and(gt(test.t.a, a), lt(test.t.a, b)), and(ge(test.t.a, b), lt(test.t.a, c)))]", filterConds: "[]", resultStr: "[(\"a\",\"c\")]", }, { indexPos: 0, exprStr: "(a > 'a' and a < 'b' and b < 1) or (a >= 'b' and a < 'c')", - accessConds: "[or(and(gt(Column#1, a), lt(Column#1, b)), and(ge(Column#1, b), lt(Column#1, c)))]", - filterConds: "[or(and(and(gt(Column#1, a), lt(Column#1, b)), lt(Column#2, 1)), and(ge(Column#1, b), lt(Column#1, c)))]", + accessConds: "[or(and(gt(test.t.a, a), lt(test.t.a, b)), and(ge(test.t.a, b), lt(test.t.a, c)))]", + filterConds: "[or(and(and(gt(test.t.a, a), lt(test.t.a, b)), lt(test.t.b, 1)), and(ge(test.t.a, b), lt(test.t.a, c)))]", resultStr: "[(\"a\",\"c\")]", }, { indexPos: 0, exprStr: "(a in ('a', 'b') and b < 1) or (a >= 'b' and a < 'c')", - accessConds: "[or(and(in(Column#1, a, b), lt(Column#2, 1)), and(ge(Column#1, b), lt(Column#1, c)))]", + accessConds: "[or(and(in(test.t.a, a, b), lt(test.t.b, 1)), and(ge(test.t.a, b), lt(test.t.a, c)))]", filterConds: "[]", resultStr: `[["a" -inf,"a" 1) ["b","c")]`, }, @@ -539,49 +539,49 @@ func (s *testRangerSuite) TestIndexRange(c *C) { indexPos: 0, exprStr: "(a > 'a') or (c > 1)", accessConds: "[]", - filterConds: "[or(gt(Column#1, a), gt(Column#3, 1))]", + filterConds: "[or(gt(test.t.a, a), gt(test.t.c, 1))]", resultStr: "[[NULL,+inf]]", }, { indexPos: 2, exprStr: `d = "你好啊"`, - accessConds: "[eq(Column#4, 你好啊)]", - filterConds: "[eq(Column#4, 你好啊)]", + accessConds: "[eq(test.t.d, 你好啊)]", + filterConds: "[eq(test.t.d, 你好啊)]", resultStr: "[[\"你好\",\"你好\"]]", }, { indexPos: 3, exprStr: `e = "你好啊"`, - accessConds: "[eq(Column#5, 你好啊)]", - filterConds: "[eq(Column#5, 你好啊)]", + accessConds: "[eq(test.t.e, 你好啊)]", + filterConds: "[eq(test.t.e, 你好啊)]", resultStr: "[[\"[228 189]\",\"[228 189]\"]]", }, { indexPos: 2, exprStr: `d in ("你好啊", "再见")`, - accessConds: "[in(Column#4, 你好啊, 再见)]", - filterConds: "[in(Column#4, 你好啊, 再见)]", + accessConds: "[in(test.t.d, 你好啊, 再见)]", + filterConds: "[in(test.t.d, 你好啊, 再见)]", resultStr: "[[\"你好\",\"你好\"] [\"再见\",\"再见\"]]", }, { indexPos: 2, exprStr: `d not in ("你好啊")`, accessConds: "[]", - filterConds: "[ne(Column#4, 你好啊)]", + filterConds: "[ne(test.t.d, 你好啊)]", resultStr: "[[NULL,+inf]]", }, { indexPos: 2, exprStr: `d < "你好" || d > "你好"`, - accessConds: "[or(lt(Column#4, 你好), gt(Column#4, 你好))]", - filterConds: "[or(lt(Column#4, 你好), gt(Column#4, 你好))]", + accessConds: "[or(lt(test.t.d, 你好), gt(test.t.d, 你好))]", + filterConds: "[or(lt(test.t.d, 你好), gt(test.t.d, 你好))]", resultStr: "[[-inf,\"你好\") (\"你好\",+inf]]", }, { indexPos: 2, exprStr: `not(d < "你好" || d > "你好")`, - accessConds: "[and(ge(Column#4, 你好), le(Column#4, 你好))]", - filterConds: "[and(ge(Column#4, 你好), le(Column#4, 你好))]", + accessConds: "[and(ge(test.t.d, 你好), le(test.t.d, 你好))]", + filterConds: "[and(ge(test.t.d, 你好), le(test.t.d, 你好))]", resultStr: "[[\"你好\",\"你好\"]]", }, } @@ -640,68 +640,68 @@ func (s *testRangerSuite) TestIndexRangeForUnsignedInt(c *C) { { indexPos: 0, exprStr: `a not in (0, 1, 2)`, - accessConds: "[not(in(Column#1, 0, 1, 2))]", + accessConds: "[not(in(test.t.a, 0, 1, 2))]", filterConds: "[]", resultStr: `[(NULL,0) (2,+inf]]`, }, { indexPos: 0, exprStr: `a not in (-1, 1, 2)`, - accessConds: "[not(in(Column#1, -1, 1, 2))]", + accessConds: "[not(in(test.t.a, -1, 1, 2))]", filterConds: "[]", resultStr: `[(NULL,1) (2,+inf]]`, }, { indexPos: 0, exprStr: `a not in (-2, -1, 1, 2)`, - accessConds: "[not(in(Column#1, -2, -1, 1, 2))]", + accessConds: "[not(in(test.t.a, -2, -1, 1, 2))]", filterConds: "[]", resultStr: `[(NULL,1) (2,+inf]]`, }, { indexPos: 0, exprStr: `a not in (111)`, - accessConds: "[ne(Column#1, 111)]", + accessConds: "[ne(test.t.a, 111)]", filterConds: "[]", resultStr: `[[-inf,111) (111,+inf]]`, }, { indexPos: 0, exprStr: `a not in (1, 2, 9223372036854775810)`, - accessConds: "[not(in(Column#1, 1, 2, 9223372036854775810))]", + accessConds: "[not(in(test.t.a, 1, 2, 9223372036854775810))]", filterConds: "[]", resultStr: `[(NULL,1) (2,9223372036854775810) (9223372036854775810,+inf]]`, }, { indexPos: 0, exprStr: `a >= -2147483648`, - accessConds: "[ge(Column#1, -2147483648)]", + accessConds: "[ge(test.t.a, -2147483648)]", filterConds: "[]", resultStr: `[[0,+inf]]`, }, { indexPos: 0, exprStr: `a > -2147483648`, - accessConds: "[gt(Column#1, -2147483648)]", + accessConds: "[gt(test.t.a, -2147483648)]", filterConds: "[]", resultStr: `[[0,+inf]]`, }, { indexPos: 0, exprStr: `a != -2147483648`, - accessConds: "[ne(Column#1, -2147483648)]", + accessConds: "[ne(test.t.a, -2147483648)]", filterConds: "[]", resultStr: `[[0,+inf]]`, }, { exprStr: "a < -1 or a < 1", - accessConds: "[or(lt(Column#1, -1), lt(Column#1, 1))]", + accessConds: "[or(lt(test.t.a, -1), lt(test.t.a, 1))]", filterConds: "[]", resultStr: "[[-inf,1)]", }, { exprStr: "a < -1 and a < 1", - accessConds: "[lt(Column#1, -1) lt(Column#1, 1)]", + accessConds: "[lt(test.t.a, -1) lt(test.t.a, 1)]", filterConds: "[]", resultStr: "[]", }, @@ -761,15 +761,15 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a = 1 and b > 1", - accessConds: "[eq(Column#1, 1)]", - filterConds: "[gt(Column#2, 1)]", + accessConds: "[eq(test.t.a, 1)]", + filterConds: "[gt(test.t.b, 1)]", resultStr: "[[1,1]]", length: types.UnspecifiedLength, }, { colPos: 1, exprStr: "b > 1", - accessConds: "[gt(Column#2, 1)]", + accessConds: "[gt(test.t.b, 1)]", filterConds: "[]", resultStr: "[(1,+inf]]", length: types.UnspecifiedLength, @@ -777,7 +777,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "1 = a", - accessConds: "[eq(1, Column#1)]", + accessConds: "[eq(1, test.t.a)]", filterConds: "[]", resultStr: "[[1,1]]", length: types.UnspecifiedLength, @@ -785,7 +785,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a != 1", - accessConds: "[ne(Column#1, 1)]", + accessConds: "[ne(test.t.a, 1)]", filterConds: "[]", resultStr: "[[-inf,1) (1,+inf]]", length: types.UnspecifiedLength, @@ -793,7 +793,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "1 != a", - accessConds: "[ne(1, Column#1)]", + accessConds: "[ne(1, test.t.a)]", filterConds: "[]", resultStr: "[[-inf,1) (1,+inf]]", length: types.UnspecifiedLength, @@ -801,7 +801,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a > 1", - accessConds: "[gt(Column#1, 1)]", + accessConds: "[gt(test.t.a, 1)]", filterConds: "[]", resultStr: "[(1,+inf]]", length: types.UnspecifiedLength, @@ -809,7 +809,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "1 < a", - accessConds: "[lt(1, Column#1)]", + accessConds: "[lt(1, test.t.a)]", filterConds: "[]", resultStr: "[(1,+inf]]", length: types.UnspecifiedLength, @@ -817,7 +817,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a >= 1", - accessConds: "[ge(Column#1, 1)]", + accessConds: "[ge(test.t.a, 1)]", filterConds: "[]", resultStr: "[[1,+inf]]", length: types.UnspecifiedLength, @@ -825,7 +825,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "1 <= a", - accessConds: "[le(1, Column#1)]", + accessConds: "[le(1, test.t.a)]", filterConds: "[]", resultStr: "[[1,+inf]]", length: types.UnspecifiedLength, @@ -833,7 +833,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a < 1", - accessConds: "[lt(Column#1, 1)]", + accessConds: "[lt(test.t.a, 1)]", filterConds: "[]", resultStr: "[[-inf,1)]", length: types.UnspecifiedLength, @@ -841,7 +841,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "1 > a", - accessConds: "[gt(1, Column#1)]", + accessConds: "[gt(1, test.t.a)]", filterConds: "[]", resultStr: "[[-inf,1)]", length: types.UnspecifiedLength, @@ -849,7 +849,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a <= 1", - accessConds: "[le(Column#1, 1)]", + accessConds: "[le(test.t.a, 1)]", filterConds: "[]", resultStr: "[[-inf,1]]", length: types.UnspecifiedLength, @@ -857,7 +857,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "1 >= a", - accessConds: "[ge(1, Column#1)]", + accessConds: "[ge(1, test.t.a)]", filterConds: "[]", resultStr: "[[-inf,1]]", length: types.UnspecifiedLength, @@ -865,7 +865,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "(a)", - accessConds: "[Column#1]", + accessConds: "[test.t.a]", filterConds: "[]", resultStr: "[[-inf,0) (0,+inf]]", length: types.UnspecifiedLength, @@ -873,7 +873,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a in (1, 3, NULL, 2)", - accessConds: "[in(Column#1, 1, 3, , 2)]", + accessConds: "[in(test.t.a, 1, 3, , 2)]", filterConds: "[]", resultStr: "[[1,1] [2,2] [3,3]]", length: types.UnspecifiedLength, @@ -881,7 +881,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: `a IN (8,8,81,45)`, - accessConds: "[in(Column#1, 8, 8, 81, 45)]", + accessConds: "[in(test.t.a, 8, 8, 81, 45)]", filterConds: "[]", resultStr: `[[8,8] [45,45] [81,81]]`, length: types.UnspecifiedLength, @@ -889,7 +889,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a between 1 and 2", - accessConds: "[ge(Column#1, 1) le(Column#1, 2)]", + accessConds: "[ge(test.t.a, 1) le(test.t.a, 2)]", filterConds: "[]", resultStr: "[[1,2]]", length: types.UnspecifiedLength, @@ -897,7 +897,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a not between 1 and 2", - accessConds: "[or(lt(Column#1, 1), gt(Column#1, 2))]", + accessConds: "[or(lt(test.t.a, 1), gt(test.t.a, 2))]", filterConds: "[]", resultStr: "[[-inf,1) (2,+inf]]", length: types.UnspecifiedLength, @@ -910,7 +910,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a between 2 and 1", - accessConds: "[ge(Column#1, 2) le(Column#1, 1)]", + accessConds: "[ge(test.t.a, 2) le(test.t.a, 1)]", filterConds: "[]", resultStr: "[]", length: types.UnspecifiedLength, @@ -918,7 +918,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a not between 2 and 1", - accessConds: "[or(lt(Column#1, 2), gt(Column#1, 1))]", + accessConds: "[or(lt(test.t.a, 2), gt(test.t.a, 1))]", filterConds: "[]", resultStr: "[[-inf,+inf]]", length: types.UnspecifiedLength, @@ -926,7 +926,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a IS NULL", - accessConds: "[isnull(Column#1)]", + accessConds: "[isnull(test.t.a)]", filterConds: "[]", resultStr: "[[NULL,NULL]]", length: types.UnspecifiedLength, @@ -934,7 +934,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a IS NOT NULL", - accessConds: "[not(isnull(Column#1))]", + accessConds: "[not(isnull(test.t.a))]", filterConds: "[]", resultStr: "[[-inf,+inf]]", length: types.UnspecifiedLength, @@ -942,7 +942,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a IS TRUE", - accessConds: "[istrue(Column#1)]", + accessConds: "[istrue(test.t.a)]", filterConds: "[]", resultStr: "[[-inf,0) (0,+inf]]", length: types.UnspecifiedLength, @@ -950,7 +950,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a IS NOT TRUE", - accessConds: "[not(istrue(Column#1))]", + accessConds: "[not(istrue(test.t.a))]", filterConds: "[]", resultStr: "[[NULL,NULL] [0,0]]", length: types.UnspecifiedLength, @@ -958,7 +958,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a IS FALSE", - accessConds: "[isfalse(Column#1)]", + accessConds: "[isfalse(test.t.a)]", filterConds: "[]", resultStr: "[[0,0]]", length: types.UnspecifiedLength, @@ -966,7 +966,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a IS NOT FALSE", - accessConds: "[not(isfalse(Column#1))]", + accessConds: "[not(isfalse(test.t.a))]", filterConds: "[]", resultStr: "[[NULL,0) (0,+inf]]", length: types.UnspecifiedLength, @@ -974,7 +974,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 1, exprStr: `b in (1, '2.1')`, - accessConds: "[in(Column#2, 1, 2.1)]", + accessConds: "[in(test.t.b, 1, 2.1)]", filterConds: "[]", resultStr: "[[1,1] [2.1,2.1]]", length: types.UnspecifiedLength, @@ -982,7 +982,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: `a > 9223372036854775807`, - accessConds: "[gt(Column#1, 9223372036854775807)]", + accessConds: "[gt(test.t.a, 9223372036854775807)]", filterConds: "[]", resultStr: "[(9223372036854775807,+inf]]", length: types.UnspecifiedLength, @@ -990,7 +990,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 2, exprStr: `c > 111.11111111`, - accessConds: "[gt(Column#3, 111.11111111)]", + accessConds: "[gt(test.t.c, 111.11111111)]", filterConds: "[]", resultStr: "[[111.111115,+inf]]", length: types.UnspecifiedLength, @@ -998,7 +998,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 3, exprStr: `d > 'aaaaaaaaaaaaaa'`, - accessConds: "[gt(Column#4, aaaaaaaaaaaaaa)]", + accessConds: "[gt(test.t.d, aaaaaaaaaaaaaa)]", filterConds: "[]", resultStr: "[(\"aaaaaaaaaaaaaa\",+inf]]", length: types.UnspecifiedLength, @@ -1006,7 +1006,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 4, exprStr: `e > 18446744073709500000`, - accessConds: "[gt(Column#5, 18446744073709500000)]", + accessConds: "[gt(test.t.e, 18446744073709500000)]", filterConds: "[]", resultStr: "[(18446744073709500000,+inf]]", length: types.UnspecifiedLength, @@ -1014,7 +1014,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 4, exprStr: `e > -2147483648`, - accessConds: "[gt(Column#5, -2147483648)]", + accessConds: "[gt(test.t.e, -2147483648)]", filterConds: "[]", resultStr: "[[0,+inf]]", length: types.UnspecifiedLength, @@ -1022,7 +1022,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 3, exprStr: "d = 'aab' or d = 'aac'", - accessConds: "[or(eq(Column#4, aab), eq(Column#4, aac))]", + accessConds: "[or(eq(test.t.d, aab), eq(test.t.d, aac))]", filterConds: "[]", resultStr: "[[\"a\",\"a\"]]", length: 1, @@ -1031,7 +1031,7 @@ func (s *testRangerSuite) TestColumnRange(c *C) { { colPos: 0, exprStr: "a in (1, 2, 3)", - accessConds: "[in(Column#1, 1, 2, 3)]", + accessConds: "[in(test.t.a, 1, 2, 3)]", filterConds: "", resultStr: "[[1,1] [2,2] [3,3]]", length: types.UnspecifiedLength, diff --git a/util/ranger/testdata/ranger_suite_out.json b/util/ranger/testdata/ranger_suite_out.json index 9616c2db53ffc..a0b9a0585f49a 100644 --- a/util/ranger/testdata/ranger_suite_out.json +++ b/util/ranger/testdata/ranger_suite_out.json @@ -6,15 +6,15 @@ "SQL": "explain select t.e in (select count(*) from t s use index(idx), t t1 where s.b = 1 and s.c in (1, 2) and s.d = t.a and s.a = t1.a) from t", "Result": [ "Projection_11 2.00 root Column#17", - "└─Apply_13 2.00 root CARTESIAN left outer semi join, inner:StreamAgg_20, other cond:eq(Column#5, Column#16)", + "└─Apply_13 2.00 root CARTESIAN left outer semi join, inner:StreamAgg_20, other cond:eq(test.t.e, Column#16)", " ├─TableReader_15 2.00 root data:TableScan_14", " │ └─TableScan_14 2.00 cop[tikv] table:t, range:[-inf,+inf], keep order:false", - " └─StreamAgg_20 1.00 root funcs:count(1)", - " └─IndexMergeJoin_44 2.00 root inner join, inner:TableReader_42, outer key:Column#6, inner key:Column#11", + " └─StreamAgg_20 1.00 root funcs:count(1)->Column#16", + " └─IndexMergeJoin_44 2.00 root inner join, inner:TableReader_42, outer key:test.t.a, inner key:test.t.a", " ├─IndexReader_33 2.00 root index:IndexScan_32", - " │ └─IndexScan_32 2.00 cop[tikv] table:s, index:b, c, d, range: decided by [eq(Column#7, 1) in(Column#8, 1, 2) eq(Column#9, Column#1)], keep order:false", + " │ └─IndexScan_32 2.00 cop[tikv] table:s, index:b, c, d, range: decided by [eq(test.t.b, 1) in(test.t.c, 1, 2) eq(test.t.d, test.t.a)], keep order:false", " └─TableReader_42 1.00 root data:TableScan_41", - " └─TableScan_41 1.00 cop[tikv] table:t1, range: decided by [Column#6], keep order:true" + " └─TableScan_41 1.00 cop[tikv] table:t1, range: decided by [test.t.a], keep order:true" ] }, {