diff --git a/mysql-test/main/opt_trace.result b/mysql-test/main/opt_trace.result index 65fc7d6cc98..5bbb257b3b4 100644 --- a/mysql-test/main/opt_trace.result +++ b/mysql-test/main/opt_trace.result @@ -140,8 +140,7 @@ select * from v1 { "type": "scan", "records": 1, "cost": 2.2044, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 1, @@ -286,8 +285,7 @@ select * from (select * from t1 where t1.a=1)q { "type": "scan", "records": 1, "cost": 2.2044, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 1, @@ -438,8 +436,7 @@ select * from v2 { "type": "scan", "records": 1, "cost": 2.2044, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 1, @@ -505,8 +502,7 @@ select * from v2 { "type": "scan", "records": 2, "cost": 2, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 2, @@ -645,8 +641,7 @@ explain select * from v2 { "type": "scan", "records": 10, "cost": 2.022, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 10, @@ -765,8 +760,7 @@ explain select * from v1 { "type": "scan", "records": 10, "cost": 2.022, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 10, @@ -832,8 +826,7 @@ explain select * from v1 { "type": "scan", "records": 10, "cost": 10, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 10, @@ -1004,8 +997,7 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b { "type": "scan", "records": 100, "cost": 2.3174, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 100, @@ -1036,8 +1028,7 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b { "type": "ref", "records": 1, "cost": 200.06, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 100, @@ -1062,8 +1053,7 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b { "type": "scan", "records": 100, "cost": 2.3174, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 100, @@ -1094,8 +1084,7 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b { "type": "ref", "records": 1, "cost": 200.06, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 100, @@ -1266,8 +1255,7 @@ EXPLAIN SELECT DISTINCT a FROM t1 { "type": "index_merge", "records": 5, "cost": 6.25, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 5, @@ -1459,8 +1447,7 @@ EXPLAIN SELECT MIN(d) FROM t1 where b=2 and c=3 group by a { "type": "index_merge", "records": 8, "cost": 2.2, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 8, @@ -1653,8 +1640,7 @@ EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a>=20010104e0 GROUP BY id { "type": "index_merge", "records": 9, "cost": 2.35, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -1836,8 +1822,7 @@ EXPLAIN SELECT * FROM t1 WHERE a = 20010104e0 GROUP BY id { "type": "index_merge", "records": 9, "cost": 2.35, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -2044,6 +2029,21 @@ explain select * from t1 where a=1 and b=2 order by c limit 1 { } } }, + { + "table": "t1", + "rowid_filters": [ + { + "key": "a_b", + "build_cost": 0.8868, + "rows": 21 + }, + { + "key": "a_c", + "build_cost": 10.522, + "rows": 180 + } + ] + }, { "selectivity_for_indexes": [ { @@ -2098,8 +2098,7 @@ explain select * from t1 where a=1 and b=2 order by c limit 1 { "type": "ref", "records": 21, "cost": 21.142, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 21, @@ -2339,8 +2338,7 @@ select t1.a from t1 left join t2 on t1.a=t2.a { "type": "scan", "records": 4, "cost": 2.0068, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 4, @@ -2466,8 +2464,7 @@ explain select * from t1 left join t2 on t2.a=t1.a { "type": "scan", "records": 4, "cost": 2.0068, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 4, @@ -2496,8 +2493,7 @@ explain select * from t1 left join t2 on t2.a=t1.a { "type": "eq_ref", "records": 1, "cost": 4, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 4, @@ -2657,8 +2653,7 @@ explain select t1.a from t1 left join (t2 join t3 on t2.b=t3.b) on t2.a=t1.a and "type": "scan", "records": 4, "cost": 2.0068, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 4, @@ -2860,8 +2855,7 @@ explain extended select * from t1 where a in (select pk from t10) { "type": "scan", "records": 10, "cost": 2.022, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 10, @@ -2891,8 +2885,7 @@ explain extended select * from t1 where a in (select pk from t10) { "type": "scan", "records": 3, "cost": 2.0066, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -2915,8 +2908,7 @@ explain extended select * from t1 where a in (select pk from t10) { "type": "scan", "records": 10, "cost": 2.022, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 30, @@ -2961,8 +2953,7 @@ explain extended select * from t1 where a in (select pk from t10) { "type": "scan", "records": 10, "cost": 2.022, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 10, @@ -3251,6 +3242,26 @@ explain select * from t1 where pk = 2 and a=5 and b=1 { } } }, + { + "table": "t1", + "rowid_filters": [ + { + "key": "pk", + "build_cost": 0.1306, + "rows": 1 + }, + { + "key": "pk_a", + "build_cost": 0.1308, + "rows": 1 + }, + { + "key": "pk_a_b", + "build_cost": 0.1311, + "rows": 1 + } + ] + }, { "selectivity_for_indexes": [ { @@ -3314,8 +3325,7 @@ explain select * from t1 where pk = 2 and a=5 and b=1 { "type": "ref", "records": 1, "cost": 0.1261, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 1, @@ -3439,8 +3449,7 @@ select f1(a) from t1 { "type": "scan", "records": 4, "cost": 2.0068, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 4, @@ -3538,8 +3547,7 @@ select f2(a) from t1 { "type": "scan", "records": 4, "cost": 2.0068, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 4, @@ -3591,7 +3599,7 @@ a 2 select length(trace) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; length(trace) -2205 +2163 set optimizer_trace_max_mem_size=100; select * from t1; a @@ -3605,7 +3613,7 @@ select * from t1 { "join_preparation": { "select_id": 1, "steps": [ - 2105 0 + 2063 0 set optimizer_trace_max_mem_size=0; select * from t1; a @@ -3613,7 +3621,7 @@ a 2 select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE; QUERY TRACE MISSING_BYTES_BEYOND_MAX_MEM_SIZE INSUFFICIENT_PRIVILEGES -select * from t1 2205 0 +select * from t1 2163 0 drop table t1; set optimizer_trace='enabled=off'; set @@optimizer_trace_max_mem_size= @save_optimizer_trace_max_mem_size; @@ -3921,8 +3929,7 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 { "type": "range", "records": 3, "cost": 0.7468, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -3952,8 +3959,7 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 { "type": "ref", "records": 1, "cost": 3.0018, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -3978,8 +3984,7 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 { "type": "range", "records": 3, "cost": 0.7468, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4009,8 +4014,7 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 { "type": "ref", "records": 2, "cost": 3.0035, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 6, @@ -4149,8 +4153,7 @@ explain select * from (select rand() from t1)q { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4216,8 +4219,7 @@ explain select * from (select rand() from t1)q { "type": "scan", "records": 3, "cost": 3, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4425,8 +4427,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4448,8 +4449,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -4474,8 +4474,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4505,8 +4504,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4529,8 +4527,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -4553,8 +4550,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -4599,8 +4595,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -4626,8 +4621,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4651,8 +4645,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4960,8 +4953,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4984,8 +4976,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -5008,8 +4999,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -5046,8 +5036,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -5075,8 +5064,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -5105,8 +5093,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -5151,8 +5138,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -5178,8 +5164,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -5207,8 +5192,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -5237,8 +5221,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -5278,8 +5261,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -5305,8 +5287,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -5332,8 +5313,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -5356,8 +5336,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -5394,8 +5373,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -5424,8 +5402,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -5465,8 +5442,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -5492,8 +5468,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -5521,8 +5496,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -5551,8 +5525,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -5578,8 +5551,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -5607,8 +5579,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -5646,8 +5617,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 6561, @@ -5675,8 +5645,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -5699,8 +5668,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -5728,8 +5696,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -5758,8 +5725,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -5785,8 +5751,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -5810,8 +5775,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -5837,8 +5801,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -5861,8 +5824,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -5890,8 +5852,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -5920,8 +5881,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 6561, @@ -5947,8 +5907,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -5976,8 +5935,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -6006,8 +5964,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -6033,8 +5990,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -6062,8 +6018,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -6087,8 +6042,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -6112,8 +6066,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -6137,8 +6090,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -6164,8 +6116,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -6189,8 +6140,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -6214,8 +6164,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -6239,8 +6188,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -6264,8 +6212,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -6579,8 +6526,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -6602,8 +6548,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -6628,8 +6573,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -6656,8 +6600,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -6679,8 +6622,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -6705,8 +6647,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -6736,8 +6677,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -6760,8 +6700,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -6784,8 +6723,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -6827,8 +6765,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -6856,8 +6793,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -6886,8 +6822,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -6937,8 +6872,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -6964,8 +6898,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -6993,8 +6926,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -7023,8 +6955,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -7050,8 +6981,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -7077,8 +7007,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -7102,8 +7031,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -7127,8 +7055,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -7154,8 +7081,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -7179,8 +7105,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -7204,8 +7129,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -7229,8 +7153,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -7256,8 +7179,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -7281,8 +7203,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -7306,8 +7227,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -7331,8 +7251,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -7356,8 +7275,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -8050,8 +7968,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) "type": "scan", "records": 5.9375, "cost": 2.8296, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 5.9375, @@ -8082,8 +7999,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) "type": "scan", "records": 804.69, "cost": 256.85, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 4777.8, @@ -8115,8 +8031,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) "type": "scan", "records": 804.69, "cost": 43.26, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 804.69, @@ -8159,8 +8074,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) "type": "scan", "records": 10, "cost": 2.0171, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 10, @@ -8201,8 +8115,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) "type": "ref", "records": 1, "cost": 20.006, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 10, @@ -8235,8 +8148,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) "type": "scan", "records": 804.69, "cost": 43.26, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 804.69, diff --git a/mysql-test/main/opt_trace_index_merge.result b/mysql-test/main/opt_trace_index_merge.result index ca8098391d5..052ec2fd108 100644 --- a/mysql-test/main/opt_trace_index_merge.result +++ b/mysql-test/main/opt_trace_index_merge.result @@ -217,8 +217,7 @@ explain select * from t1 where a=1 or b=1 { "type": "index_merge", "records": 2, "cost": 2.4849, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 2, diff --git a/mysql-test/main/opt_trace_index_merge_innodb.result b/mysql-test/main/opt_trace_index_merge_innodb.result index fd5780cc64c..c2c066f8c27 100644 --- a/mysql-test/main/opt_trace_index_merge_innodb.result +++ b/mysql-test/main/opt_trace_index_merge_innodb.result @@ -171,6 +171,16 @@ explain select * from t1 where pk1 != 0 and key1 = 1 { } } }, + { + "table": "t1", + "rowid_filters": [ + { + "key": "key1", + "build_cost": 0.1301, + "rows": 1 + } + ] + }, { "selectivity_for_indexes": [ { @@ -212,8 +222,7 @@ explain select * from t1 where pk1 != 0 and key1 = 1 { "type": "ref", "records": 1, "cost": 1.1251, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 1, diff --git a/mysql-test/main/opt_trace_security.result b/mysql-test/main/opt_trace_security.result index 22c5f3ff6f6..6f377cd02b5 100644 --- a/mysql-test/main/opt_trace_security.result +++ b/mysql-test/main/opt_trace_security.result @@ -103,8 +103,7 @@ select * from db1.t1 { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -227,8 +226,7 @@ select * from db1.v1 { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, diff --git a/mysql-test/suite/galera/r/MDEV-22021.result b/mysql-test/suite/galera/r/MDEV-22021.result new file mode 100644 index 00000000000..a217e66e2f0 --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-22021.result @@ -0,0 +1,57 @@ +connection node_2; +connection node_1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +START TRANSACTION; +INSERT INTO t1 VALUES (1); +SAVEPOINT sp1; +INSERT INTO t1 VALUES (2); +ROLLBACK TO SAVEPOINT sp1; +COMMIT; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +connection node_2; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +connection node_1; +DELETE FROM t1; +START TRANSACTION; +SAVEPOINT sp1; +INSERT INTO t1 VALUES (1); +SAVEPOINT sp2; +INSERT INTO t1 VALUES (2); +ROLLBACK TO SAVEPOINT sp2; +ROLLBACK TO SAVEPOINT sp1; +COMMIT; +SELECT COUNT(*) = 0 FROM t1; +COUNT(*) = 0 +1 +connection node_2; +SELECT COUNT(*) = 0 FROM t1; +COUNT(*) = 0 +1 +connection node_1; +DELETE FROM t1; +START TRANSACTION; +SAVEPOINT sp1; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +INSERT INTO t1 VALUES (4); +SAVEPOINT sp2; +INSERT INTO t1 VALUES (5); +ROLLBACK TO SAVEPOINT sp2; +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +ROLLBACK TO SAVEPOINT sp1; +INSERT INTO t1 VALUES (8); +COMMIT; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +connection node_2; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-22021.combinations b/mysql-test/suite/galera/t/MDEV-22021.combinations new file mode 100644 index 00000000000..1eeb8fb4614 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-22021.combinations @@ -0,0 +1,4 @@ +[binlogoff] + +[binlogon] +log-bin diff --git a/mysql-test/suite/galera/t/MDEV-22021.test b/mysql-test/suite/galera/t/MDEV-22021.test new file mode 100644 index 00000000000..5e189faf5ea --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-22021.test @@ -0,0 +1,60 @@ +# +# SAVEPOINT ROLLBACK can introduce inconsistency in cluster. +# + +--source include/galera_cluster.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); + +START TRANSACTION; +INSERT INTO t1 VALUES (1); +SAVEPOINT sp1; +INSERT INTO t1 VALUES (2); +ROLLBACK TO SAVEPOINT sp1; +COMMIT; + +SELECT COUNT(*) = 1 FROM t1; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +--connection node_1 +DELETE FROM t1; + +START TRANSACTION; +SAVEPOINT sp1; +INSERT INTO t1 VALUES (1); +SAVEPOINT sp2; +INSERT INTO t1 VALUES (2); +ROLLBACK TO SAVEPOINT sp2; +ROLLBACK TO SAVEPOINT sp1; +COMMIT; + +SELECT COUNT(*) = 0 FROM t1; +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; + +--connection node_1 +DELETE FROM t1; + +START TRANSACTION; +SAVEPOINT sp1; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +INSERT INTO t1 VALUES (4); +SAVEPOINT sp2; +INSERT INTO t1 VALUES (5); +ROLLBACK TO SAVEPOINT sp2; +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +ROLLBACK TO SAVEPOINT sp1; +INSERT INTO t1 VALUES (8); +COMMIT; + +SELECT COUNT(*) = 1 FROM t1; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera_sr/r/GCF-571.result b/mysql-test/suite/galera_sr/r/GCF-571.result index 4b4f749d910..fd20afd7e6e 100644 --- a/mysql-test/suite/galera_sr/r/GCF-571.result +++ b/mysql-test/suite/galera_sr/r/GCF-571.result @@ -24,7 +24,7 @@ COUNT(*) > 0 1 SELECT COUNT(*) = 1 FROM mysql.wsrep_streaming_log WHERE frag LIKE '%SAVEPOINT `A`%'; COUNT(*) = 1 -0 +1 connection node_1; ROLLBACK TO SAVEPOINT A; connection node_1a; @@ -36,7 +36,7 @@ COUNT(*) > 0 1 SELECT COUNT(*) = 1 FROM mysql.wsrep_streaming_log WHERE frag LIKE '%SAVEPOINT `A`%'; COUNT(*) = 1 -0 +1 SELECT COUNT(*) = 1 FROM mysql.wsrep_streaming_log WHERE frag LIKE '%ROLLBACK TO `A`%'; COUNT(*) = 1 0 @@ -49,7 +49,7 @@ COUNT(*) > 0 1 SELECT COUNT(*) = 1 FROM mysql.wsrep_streaming_log WHERE frag LIKE '%SAVEPOINT `A`%'; COUNT(*) = 1 -0 +1 SELECT COUNT(*) = 1 FROM mysql.wsrep_streaming_log WHERE frag LIKE '%ROLLBACK TO `A`%'; COUNT(*) = 1 0 diff --git a/mysql-test/suite/galera_sr/r/GCF-620.result b/mysql-test/suite/galera_sr/r/GCF-620.result index 33789f82add..02cb163a199 100644 --- a/mysql-test/suite/galera_sr/r/GCF-620.result +++ b/mysql-test/suite/galera_sr/r/GCF-620.result @@ -14,5 +14,5 @@ COMMIT; connection node_2; SELECT COUNT(*) = 2 FROM t1; COUNT(*) = 2 -0 +1 DROP TABLE t1; diff --git a/mysql-test/suite/galera_sr/r/galera_sr_rollback_savepoint.result b/mysql-test/suite/galera_sr/r/galera_sr_rollback_savepoint.result index f2efa20f0d3..9db548c1616 100644 --- a/mysql-test/suite/galera_sr/r/galera_sr_rollback_savepoint.result +++ b/mysql-test/suite/galera_sr/r/galera_sr_rollback_savepoint.result @@ -33,7 +33,7 @@ COUNT(*) = 5 1 SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'b'; COUNT(*) = 0 -0 +1 SELECT COUNT(*) = 5 FROM t1 WHERE f2 = 'c'; COUNT(*) = 5 1 diff --git a/mysql-test/suite/galera_sr/r/mysql-wsrep-features#22.result b/mysql-test/suite/galera_sr/r/mysql-wsrep-features#22.result index 0053619187c..1215f3341e7 100644 --- a/mysql-test/suite/galera_sr/r/mysql-wsrep-features#22.result +++ b/mysql-test/suite/galera_sr/r/mysql-wsrep-features#22.result @@ -31,5 +31,5 @@ COUNT(*) = 6 connection node_2; SELECT COUNT(*) = 6 FROM t1; COUNT(*) = 6 -0 +1 DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/innodb_wl6326.result b/mysql-test/suite/innodb/r/innodb_wl6326.result index 96352630c1b..407a81715f6 100644 --- a/mysql-test/suite/innodb/r/innodb_wl6326.result +++ b/mysql-test/suite/innodb/r/innodb_wl6326.result @@ -295,8 +295,6 @@ SET DEBUG_SYNC = 'now WAIT_FOR lockwait1 TIMEOUT 1'; SET DEBUG_SYNC = 'now WAIT_FOR lockwait2 TIMEOUT 1'; SET DEBUG_SYNC = 'now SIGNAL continue'; connection con1; -Warnings: -Warning 1639 debug sync point wait timed out connection con2; a00 a01 ar a diff --git a/mysql-test/suite/period/r/alter.result b/mysql-test/suite/period/r/alter.result index b2fd85a66fc..7b9d1fea861 100644 --- a/mysql-test/suite/period/r/alter.result +++ b/mysql-test/suite/period/r/alter.result @@ -175,6 +175,22 @@ insert t values (3, @e, @s); ERROR 23000: CONSTRAINT `mytime_2` failed for `test`.`t` drop table t; # +# MDEV-20494 ER_NOT_FORM_FILE or assertion upon adding partition to period table +# +create table t1 (f date, t date, period for app(f,t)) with system versioning partition by system_time ( partition p1 history, partition pn current ); +lock table t1 write; +alter table t1 add partition (partition p2 history); +Warnings: +Warning 4115 Maybe missing parameters: no rotation condition for multiple HISTORY partitions. +unlock tables; +create or replace table t1 (x int, s date, e date, period for app(s,e)); +insert into t1 values(1, '2020-03-01', '2020-03-02'); +insert into t1 values(1, '2020-03-01', '2020-03-02'); +alter table t1 add primary key(x, s, e); +ERROR 23000: Duplicate entry '1-2020-03-01-2020-03-02' for key 'PRIMARY' +alter table t1 add system versioning; +drop table t1; +# # MDEV-21941 RENAME doesn't work for system time or period fields # create or replace table t1 ( @@ -191,3 +207,4 @@ t1 CREATE TABLE `t1` ( PERIOD FOR `mytime` (`x`, `y`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; +# End of 10.5 tests diff --git a/mysql-test/suite/period/r/update.result b/mysql-test/suite/period/r/update.result index b86537fc9fb..05d1a2eb6d3 100644 --- a/mysql-test/suite/period/r/update.result +++ b/mysql-test/suite/period/r/update.result @@ -274,3 +274,10 @@ drop function f; drop function g; drop function h; drop procedure log; +# +# MDEV-21471 ER_CRASHED_ON_USAGE upon UPDATE FOR PORTION on Aria table +# +create table t1 (s date, e date, period for app(s,e), f varchar(8)) engine=aria row_format=fixed; +insert into t1 values ('2024-05-13','2026-03-25','foo'); +update t1 for portion of app from '2024-04-02' to '2026-03-15' set f = 'bar'; +drop table t1; diff --git a/mysql-test/suite/period/t/alter.test b/mysql-test/suite/period/t/alter.test index d89b7c93574..68d9adf476a 100644 --- a/mysql-test/suite/period/t/alter.test +++ b/mysql-test/suite/period/t/alter.test @@ -1,3 +1,5 @@ +--source include/have_partition.inc + set @s= '1992-01-01'; set @e= '1999-12-31'; @@ -132,6 +134,24 @@ insert t values (3, @e, @s); drop table t; +--echo # +--echo # MDEV-20494 ER_NOT_FORM_FILE or assertion upon adding partition to period table +--echo # +create table t1 (f date, t date, period for app(f,t)) with system versioning partition by system_time ( partition p1 history, partition pn current ); +lock table t1 write; +alter table t1 add partition (partition p2 history); +unlock tables; + +create or replace table t1 (x int, s date, e date, period for app(s,e)); +insert into t1 values(1, '2020-03-01', '2020-03-02'); +insert into t1 values(1, '2020-03-01', '2020-03-02'); +--error ER_DUP_ENTRY +alter table t1 add primary key(x, s, e); +alter table t1 add system versioning; + +# cleanup +drop table t1; + --echo # --echo # MDEV-21941 RENAME doesn't work for system time or period fields --echo # @@ -145,3 +165,5 @@ alter table t1 rename column e to y; show create table t1; # cleanup drop table t1; + +--echo # End of 10.5 tests diff --git a/mysql-test/suite/period/t/update.test b/mysql-test/suite/period/t/update.test index 5730387dfda..0f54dd80eec 100644 --- a/mysql-test/suite/period/t/update.test +++ b/mysql-test/suite/period/t/update.test @@ -163,3 +163,13 @@ drop function f; drop function g; drop function h; drop procedure log; + +--echo # +--echo # MDEV-21471 ER_CRASHED_ON_USAGE upon UPDATE FOR PORTION on Aria table +--echo # +create table t1 (s date, e date, period for app(s,e), f varchar(8)) engine=aria row_format=fixed; +insert into t1 values ('2024-05-13','2026-03-25','foo'); +update t1 for portion of app from '2024-04-02' to '2026-03-15' set f = 'bar'; + +# cleanup +drop table t1; diff --git a/sql/field.cc b/sql/field.cc index a2cfbe65294..04c45dfb546 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -11077,3 +11077,20 @@ void Field::print_key_value_binary(String *out, const uchar* key, uint32 length) { out->append_semi_hex((const char*)key, length, charset()); } + + +Virtual_column_info* Virtual_column_info::clone(THD *thd) +{ + Virtual_column_info* dst= new (thd->mem_root) Virtual_column_info(*this); + if (!dst) + return NULL; + if (expr) + { + dst->expr= expr->get_copy(thd); + if (!dst->expr) + return NULL; + } + if (!thd->make_lex_string(&dst->name, name.str, name.length)) + return NULL; + return dst; +}; diff --git a/sql/field.h b/sql/field.h index 05955db2a58..d709a84e0fe 100644 --- a/sql/field.h +++ b/sql/field.h @@ -596,6 +596,7 @@ public: name.str= NULL; name.length= 0; }; + Virtual_column_info* clone(THD *thd); ~Virtual_column_info() {}; enum_vcol_info_type get_vcol_type() const { diff --git a/sql/log.cc b/sql/log.cc index 72833c7c173..fce768b2e4c 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -2408,9 +2408,6 @@ static int binlog_savepoint_set(handlerton *hton, THD *thd, void *sv) int error= 1; DBUG_ENTER("binlog_savepoint_set"); - if (wsrep_emulate_bin_log) - DBUG_RETURN(0); - char buf[1024]; String log_query(buf, sizeof(buf), &my_charset_bin); @@ -2443,9 +2440,6 @@ static int binlog_savepoint_rollback(handlerton *hton, THD *thd, void *sv) { DBUG_ENTER("binlog_savepoint_rollback"); - if (wsrep_emulate_bin_log) - DBUG_RETURN(0); - /* Write ROLLBACK TO SAVEPOINT to the binlog cache if we have updated some non-transactional table. Otherwise, truncate the binlog cache starting @@ -11011,18 +11005,20 @@ void wsrep_register_binlog_handler(THD *thd, bool trx) back a statement or a transaction. However, notifications do not happen if the binary log is set as read/write. */ - //binlog_cache_mngr *cache_mngr= thd_get_cache_mngr(thd); binlog_cache_mngr *cache_mngr= (binlog_cache_mngr*) thd_get_ha_data(thd, binlog_hton); /* cache_mngr may be missing e.g. in mtr test ev51914.test */ - if (cache_mngr && cache_mngr->trx_cache.get_prev_position() == MY_OFF_T_UNDEF) + if (cache_mngr) { /* Set an implicit savepoint in order to be able to truncate a trx-cache. */ - my_off_t pos= 0; - binlog_trans_log_savepos(thd, &pos); - cache_mngr->trx_cache.set_prev_position(pos); + if (cache_mngr->trx_cache.get_prev_position() == MY_OFF_T_UNDEF) + { + my_off_t pos= 0; + binlog_trans_log_savepos(thd, &pos); + cache_mngr->trx_cache.set_prev_position(pos); + } /* Set callbacks in order to be able to call commmit or rollback. diff --git a/sql/opt_trace.cc b/sql/opt_trace.cc index a8676eec411..ddec6d5ed2d 100644 --- a/sql/opt_trace.cc +++ b/sql/opt_trace.cc @@ -24,6 +24,8 @@ #include "my_json_writer.h" #include "sp_head.h" +#include "rowid_filter.h" + const char I_S_table_name[]= "OPTIMIZER_TRACE"; /** @@ -664,14 +666,17 @@ void print_best_access_for_table(THD *thd, POSITION *pos, { DBUG_ASSERT(thd->trace_started()); - Json_writer_object trace_best_access(thd, "chosen_access_method"); - trace_best_access.add("type", type == JT_ALL ? "scan" : - join_type_str[type]); - trace_best_access.add("records", pos->records_read); - trace_best_access.add("cost", pos->read_time); - trace_best_access.add("uses_join_buffering", pos->use_join_buffer); - trace_best_access.add("filter_used", - pos->range_rowid_filter_info != NULL); + Json_writer_object obj(thd, "chosen_access_method"); + obj.add("type", type == JT_ALL ? "scan" : join_type_str[type]); + obj.add("records", pos->records_read); + obj.add("cost", pos->read_time); + obj.add("uses_join_buffering", pos->use_join_buffer); + if (pos->range_rowid_filter_info) + { + uint key_no= pos->range_rowid_filter_info->key_no; + obj.add("rowid_filter_key", + pos->table->table->key_info[key_no].name); + } } diff --git a/sql/rowid_filter.cc b/sql/rowid_filter.cc index d6c633aa3e2..1d9363693cb 100644 --- a/sql/rowid_filter.cc +++ b/sql/rowid_filter.cc @@ -20,6 +20,7 @@ #include "opt_range.h" #include "rowid_filter.h" #include "sql_select.h" +#include "opt_trace.h" inline @@ -403,9 +404,37 @@ void TABLE::init_cost_info_for_usable_range_rowid_filters(THD *thd) } prune_range_rowid_filters(); + + if (unlikely(thd->trace_started())) + trace_range_rowid_filters(thd); } +void TABLE::trace_range_rowid_filters(THD *thd) const +{ + if (!range_rowid_filter_cost_info_elems) + return; + + Range_rowid_filter_cost_info **p= range_rowid_filter_cost_info_ptr; + Range_rowid_filter_cost_info **end= p + range_rowid_filter_cost_info_elems; + + Json_writer_object js_obj(thd); + js_obj.add_table_name(this); + Json_writer_array js_arr(thd, "rowid_filters"); + + for (; p < end; p++) + (*p)->trace_info(thd); +} + + +void Range_rowid_filter_cost_info::trace_info(THD *thd) +{ + Json_writer_object js_obj(thd); + js_obj.add("key", table->key_info[key_no].name); + js_obj.add("build_cost", b); + js_obj.add("rows", est_elements); +} + /** @brief Choose the best range filter for the given access of the table diff --git a/sql/rowid_filter.h b/sql/rowid_filter.h index a9930dcbca8..467b6884ca6 100644 --- a/sql/rowid_filter.h +++ b/sql/rowid_filter.h @@ -452,6 +452,8 @@ public: double get_a() { return a; } + void trace_info(THD *thd); + friend void TABLE::prune_range_rowid_filters(); diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index ce2ee1b5aa2..ef8ef5114a8 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -6751,9 +6751,9 @@ static void release_log_entries(partition_info *part_info) alter_partition_lock_handling() lpt Struct carrying parameters RETURN VALUES - NONE + true on error */ -static void alter_partition_lock_handling(ALTER_PARTITION_PARAM_TYPE *lpt) +static bool alter_partition_lock_handling(ALTER_PARTITION_PARAM_TYPE *lpt) { THD *thd= lpt->thd; @@ -6767,23 +6767,9 @@ static void alter_partition_lock_handling(ALTER_PARTITION_PARAM_TYPE *lpt) lpt->table= 0; lpt->table_list->table= 0; if (thd->locked_tables_mode) - { - Diagnostics_area *stmt_da= NULL; - Diagnostics_area tmp_stmt_da(true); + return thd->locked_tables_list.reopen_tables(thd, false); - if (unlikely(thd->is_error())) - { - /* reopen might fail if we have a previous error, use a temporary da. */ - stmt_da= thd->get_stmt_da(); - thd->set_stmt_da(&tmp_stmt_da); - } - - if (unlikely(thd->locked_tables_list.reopen_tables(thd, false))) - sql_print_warning("We failed to reacquire LOCKs in ALTER TABLE"); - - if (stmt_da) - thd->set_stmt_da(stmt_da); - } + return false; } @@ -6984,6 +6970,8 @@ err_exclusive_lock: thd->set_stmt_da(&tmp_stmt_da); } + /* NB: error status is not needed here, the statement fails with + the original error. */ if (unlikely(thd->locked_tables_list.reopen_tables(thd, false))) sql_print_warning("We failed to reacquire LOCKs in ALTER TABLE"); @@ -7207,13 +7195,14 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, ERROR_INJECT_ERROR("fail_drop_partition_8") || (write_log_completed(lpt, FALSE), FALSE) || ERROR_INJECT_CRASH("crash_drop_partition_9") || - ERROR_INJECT_ERROR("fail_drop_partition_9") || - (alter_partition_lock_handling(lpt), FALSE)) + ERROR_INJECT_ERROR("fail_drop_partition_9")) { handle_alter_part_error(lpt, action_completed, TRUE, frm_install, close_table_on_failure); goto err; } + if (alter_partition_lock_handling(lpt)) + goto err; } else if ((alter_info->partition_flags & ALTER_PARTITION_ADD) && (part_info->part_type == RANGE_PARTITION || @@ -7284,13 +7273,14 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, ERROR_INJECT_ERROR("fail_add_partition_9") || (write_log_completed(lpt, FALSE), FALSE) || ERROR_INJECT_CRASH("crash_add_partition_10") || - ERROR_INJECT_ERROR("fail_add_partition_10") || - (alter_partition_lock_handling(lpt), FALSE)) + ERROR_INJECT_ERROR("fail_add_partition_10")) { handle_alter_part_error(lpt, action_completed, FALSE, frm_install, close_table_on_failure); goto err; } + if (alter_partition_lock_handling(lpt)) + goto err; } else { @@ -7389,13 +7379,14 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, ERROR_INJECT_ERROR("fail_change_partition_11") || (write_log_completed(lpt, FALSE), FALSE) || ERROR_INJECT_CRASH("crash_change_partition_12") || - ERROR_INJECT_ERROR("fail_change_partition_12") || - (alter_partition_lock_handling(lpt), FALSE)) + ERROR_INJECT_ERROR("fail_change_partition_12")) { handle_alter_part_error(lpt, action_completed, FALSE, frm_install, close_table_on_failure); goto err; } + if (alter_partition_lock_handling(lpt)) + goto err; } downgrade_mdl_if_lock_tables_mode(thd, mdl_ticket, MDL_SHARED_NO_READ_WRITE); /* diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 9f4ddb4f357..129dae9eedb 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -7818,6 +7818,8 @@ best_access_path(JOIN *join, filter->get_cmp_gain(rows); tmp-= filter->get_adjusted_gain(rows) - filter->get_cmp_gain(rows); DBUG_ASSERT(tmp >= 0); + trace_access_idx.add("rowid_filter_key", + s->table->key_info[filter->key_no].name); } } trace_access_idx.add("rows", records).add("cost", tmp); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 58ca31bf933..6ab224abee5 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -4383,6 +4383,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, const Virtual_column_info *dup_check; while ((dup_check= dup_it++) && dup_check != check) { + if (!dup_check->name.length || dup_check->automatic_name) + continue; if (!lex_string_cmp(system_charset_info, &check->name, &dup_check->name)) { @@ -8703,8 +8705,8 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, key_part_length= 0; // Use whole field } key_part_length /= kfield->charset()->mbmaxlen; - key_parts.push_back(new Key_part_spec(&cfield->field_name, - key_part_length), + key_parts.push_back(new (thd->mem_root) Key_part_spec( + &cfield->field_name, key_part_length), thd->mem_root); } if (table->s->tmp_table == NO_TMP_TABLE) @@ -8770,7 +8772,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, tmp_name.str= key_name; tmp_name.length= strlen(key_name); /* We dont need LONG_UNIQUE_HASH_FIELD flag because it will be autogenerated */ - key= new Key(key_type, &tmp_name, &key_create_info, + key= new (thd->mem_root) Key(key_type, &tmp_name, &key_create_info, MY_TEST(key_info->flags & HA_GENERATED_KEY), &key_parts, key_info->option_list, DDL_options()); key->without_overlaps= key_info->without_overlaps; @@ -8850,26 +8852,37 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, } } + // NB: `check` is TABLE resident, we must keep it intact. + if (keep) + { + check= check->clone(thd); + if (!check) + { + my_error(ER_OUT_OF_RESOURCES, MYF(0)); + goto err; + } + } + if (share->period.constr_name.streq(check->name.str)) { - if (!drop_period && !keep) + if (drop_period) + { + keep= false; + } + else if(!keep) { my_error(ER_PERIOD_CONSTRAINT_DROP, MYF(0), check->name.str, share->period.name.str); goto err; } - keep= keep && !drop_period; - - DBUG_ASSERT(create_info->period_info.constr == NULL || drop_period); - - if (keep) + else { - Item *expr_copy= check->expr->get_copy(thd); - check= new Virtual_column_info(); - check->expr= expr_copy; + DBUG_ASSERT(create_info->period_info.constr == NULL); create_info->period_info.constr= check; + create_info->period_info.constr->automatic_name= true; } } + /* see if the constraint depends on *only* on dropped fields */ if (keep && dropped_fields) { diff --git a/sql/sql_update.cc b/sql/sql_update.cc index c3ade4288d2..2ca03620b17 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -463,6 +463,7 @@ int mysql_update(THD *thd, my_error(ER_NOT_CONSTANT_EXPRESSION, MYF(0), "FOR PORTION OF"); DBUG_RETURN(true); } + table->no_cache= true; } old_covering_keys= table->covering_keys; // Keys used in WHERE diff --git a/sql/table.h b/sql/table.h index ce8f204f3ac..ddd33142fd7 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1591,6 +1591,7 @@ public: void init_cost_info_for_usable_range_rowid_filters(THD *thd); void prune_range_rowid_filters(); + void trace_range_rowid_filters(THD *thd) const; Range_rowid_filter_cost_info * best_range_rowid_filter_for_partial_join(uint access_key_no, double records, diff --git a/sql/unireg.cc b/sql/unireg.cc index 79403ff339d..6860d2c6347 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -57,6 +57,13 @@ static bool make_empty_rec(THD *, uchar *, uint, List &, uint, */ static uchar *extra2_write_len(uchar *pos, size_t len) { + /* TODO: should be + if (len > 0 && len <= 255) + *pos++= (uchar)len; + ... + because extra2_read_len() uses 0 for 2-byte lengths. + extra2_str_size() must be fixed too. + */ if (len <= 255) *pos++= (uchar)len; else diff --git a/sql/wsrep_high_priority_service.cc b/sql/wsrep_high_priority_service.cc index d73b9cb09ce..992883aa797 100644 --- a/sql/wsrep_high_priority_service.cc +++ b/sql/wsrep_high_priority_service.cc @@ -478,11 +478,15 @@ Wsrep_applier_service::Wsrep_applier_service(THD* thd) thd->wsrep_cs().open(wsrep::client_id(thd->thread_id)); thd->wsrep_cs().before_command(); thd->wsrep_cs().debug_log_level(wsrep_debug); - + if (!thd->slave_thread) + thd->system_thread_info.rpl_sql_info= + new rpl_sql_thread_info(thd->wsrep_rgi->rli->mi->rpl_filter); } Wsrep_applier_service::~Wsrep_applier_service() { + if (!m_thd->slave_thread) + delete m_thd->system_thread_info.rpl_sql_info; m_thd->wsrep_cs().after_command_before_result(); m_thd->wsrep_cs().after_command_after_result(); m_thd->wsrep_cs().close(); diff --git a/sql/wsrep_thd.cc b/sql/wsrep_thd.cc index b605ff0496d..94d01b273c5 100644 --- a/sql/wsrep_thd.cc +++ b/sql/wsrep_thd.cc @@ -53,11 +53,6 @@ static void wsrep_replication_process(THD *thd, Wsrep_applier_service applier_service(thd); - /* thd->system_thread_info.rpl_sql_info isn't initialized. */ - if (!thd->slave_thread) - thd->system_thread_info.rpl_sql_info= - new rpl_sql_thread_info(thd->wsrep_rgi->rli->mi->rpl_filter); - WSREP_INFO("Starting applier thread %llu", thd->thread_id); enum wsrep::provider::status ret= Wsrep_server_state::get_provider().run_applier(&applier_service); @@ -68,8 +63,6 @@ static void wsrep_replication_process(THD *thd, mysql_cond_broadcast(&COND_wsrep_slave_threads); mysql_mutex_unlock(&LOCK_wsrep_slave_threads); - if (!thd->slave_thread) - delete thd->system_thread_info.rpl_sql_info; delete thd->wsrep_rgi->rli->mi; delete thd->wsrep_rgi->rli;