drop table if exists t1,t2; # # MDEV-21958: Query having many NOT-IN clauses running forever # create table t2 ( pk int primary key, key1 int, col1 int, key (key1, pk) ); insert into t2 (pk, key1) values (1,1),(2,2),(3,3),(4,4),(5,5); set @tmp_21958=@@optimizer_trace; set optimizer_trace=1; explain select * from t2 where key1 in (1,2,3) and pk not in (1,2,3); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 range PRIMARY,key1 key1 5 NULL 3 Using index condition # This should show only ranges in form "(1) <= (key1) <= (1)" # ranges over "pk" should not be constructed. select json_detailed(JSON_EXTRACT(trace, '$**.ranges')) from information_schema.optimizer_trace; json_detailed(JSON_EXTRACT(trace, '$**.ranges')) [ [ "(1) <= (key1) <= (1)", "(2) <= (key1) <= (2)", "(3) <= (key1) <= (3)" ], [ "(1) <= (key1) <= (1)", "(2) <= (key1) <= (2)", "(3) <= (key1) <= (3)" ] ] set optimizer_trace=@tmp_21958; drop table t2; # # MDEV-9750: Quick memory exhaustion with 'extended_keys=on'... # create table t1 ( kp1 int, kp2 int, kp3 int, kp4 int, key key1(kp1, kp2, kp3,kp4) ); insert into t1 values (1,1,1,1),(2,2,2,2),(3,3,3,3); analyze table t1; Table Op Msg_type Msg_text test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK show variables like 'optimizer_max_sel_arg_weight'; Variable_name Value optimizer_max_sel_arg_weight 32000 set @tmp_9750=@@optimizer_trace; set optimizer_trace=1; explain select * from t1 where kp1 in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20) and kp2 in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20) and kp3 in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20) and kp4 in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20) ; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index key1 key1 20 NULL 3 Using where; Using index set @json= (select json_detailed(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) from information_schema.optimizer_trace); # This will show 3-component ranges. # The ranges were produced, but the optimizer has cut away kp4 # to keep the number of ranges at manageable level: select left(@json, 500); left(@json, 500) [ [ { "index": "key1", "ranges": [ "(1,1,1) <= (kp1,kp2,kp3) <= (1,1,1)", "(1,1,2) <= (kp1,kp2,kp3) <= (1,1,2)", "(1,1,3) <= (kp1,kp2,kp3) <= (1,1,3)", "(1,1,4) <= (kp1,kp2,kp3) <= (1,1,4)", "(1,1,5) <= (kp1,kp2,kp3) <= (1,1,5)", "(1,1,6) <= (kp1,kp2,kp3) <= (1,1,6)", "(1,1,7) <= (kp1,kp2,kp3) <= (1,1,7)", "(1,1,8) <= (kp ## Repeat the above with low max_weight: set @tmp9750_weight=@@optimizer_max_sel_arg_weight; set optimizer_max_sel_arg_weight=20; explain select * from t1 where kp1 in (1,2,3,4,5,6,7,8,9,10) and kp2 in (1,2,3,4,5,6,7,8,9,10) and kp3 in (1,2,3,4,5,6,7,8,9,10) and kp4 in (1,2,3,4,5,6,7,8,9,10) ; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index key1 key1 20 NULL 3 Using where; Using index set @trace= (select trace from information_schema.optimizer_trace); set @json= json_detailed(json_extract(@trace, '$**.range_scan_alternatives')); select left(@json, 500); left(@json, 500) [ [ { "index": "key1", "ranges": [ "(1) <= (kp1) <= (1)", "(2) <= (kp1) <= (2)", "(3) <= (kp1) <= (3)", "(4) <= (kp1) <= (4)", "(5) <= (kp1) <= (5)", "(6) <= (kp1) <= (6)", "(7) <= (kp1) <= (7)", "(8) <= (kp1) <= (8)", "(9) <= (kp1) <= (9)", "(10) <= (kp1) <= (10)" ], set @json= json_detailed(json_extract(@trace, '$**.setup_range_conditions')); select left(@json, 2500); left(@json, 2500) [ [ { "sel_arg_weight_heuristic": { "key1_field": "kp1", "key2_field": "kp2", "key1_weight": 10, "key2_weight": 10 } }, { "sel_arg_weight_heuristic": { "key1_field": "kp1", "key2_field": "kp3", "key1_weight": 10, "key2_weight": 10 } }, { "sel_arg_weight_heuristic": { "key1_field": "kp1", "key2_field": "kp4", "key1_weight": 10, "key2_weight": 10 } } ] ] ## Repeat the above with a bit higher max_weight: set optimizer_max_sel_arg_weight=120; explain select * from t1 where kp1 in (1,2,3,4,5,6,7,8,9,10) and kp2 in (1,2,3,4,5,6,7,8,9,10) and kp3 in (1,2,3,4,5,6,7,8,9,10) and kp4 in (1,2,3,4,5,6,7,8,9,10) ; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index key1 key1 20 NULL 3 Using where; Using index set @json= (select json_detailed(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) from information_schema.optimizer_trace); select left(@json, 1500); left(@json, 1500) [ [ { "index": "key1", "ranges": [ "(1,1) <= (kp1,kp2) <= (1,1)", "(1,2) <= (kp1,kp2) <= (1,2)", "(1,3) <= (kp1,kp2) <= (1,3)", "(1,4) <= (kp1,kp2) <= (1,4)", "(1,5) <= (kp1,kp2) <= (1,5)", "(1,6) <= (kp1,kp2) <= (1,6)", "(1,7) <= (kp1,kp2) <= (1,7)", "(1,8) <= (kp1,kp2) <= (1,8)", "(1,9) <= (kp1,kp2) <= (1,9)", "(1,10) <= (kp1,kp2) <= (1,10)", "(2,1) <= (kp1,kp2) <= (2,1)", "(2,2) <= (kp1,kp2) <= (2,2)", "(2,3) <= (kp1,kp2) <= (2,3)", "(2,4) <= (kp1,kp2) <= (2,4)", "(2,5) <= (kp1,kp2) <= (2,5)", "(2,6) <= (kp1,kp2) <= (2,6)", "(2,7) <= (kp1,kp2) <= (2,7)", "(2,8) <= (kp1,kp2) <= (2,8)", "(2,9) <= (kp1,kp2) <= (2,9)", "(2,10) <= (kp1,kp2) <= (2,10)", "(3,1) <= (kp1,kp2) <= (3,1)", "(3,2) <= (kp1,kp2) <= (3,2)", "(3,3) <= (kp1,kp2) <= (3,3)", "(3,4) <= (kp1,kp2) <= (3,4)", "(3,5) <= (kp1,kp2) <= (3,5)", "(3,6) <= (kp1,kp2) <= (3,6)", "(3,7) <= (kp1,kp2) <= (3,7)", "(3,8) <= (kp1,kp2) <= (3,8)", "(3,9) <= (kp1,kp2) <= (3,9)", "(3,10) <= (kp1,kp2) <= (3,10)", set optimizer_max_sel_arg_weight= @tmp9750_weight; set optimizer_trace=@tmp_9750; drop table t1; # # MDEV-24739: Assertion `root->weight >= ...' failed in SEL_ARG::tree_delete # SELECT * FROM mysql.help_relation WHERE NOT (help_topic_id != 8 AND help_keyword_id != 0 OR help_keyword_id = 2 OR help_topic_id < 1900); help_topic_id help_keyword_id SELECT * FROM mysql.help_relation ignore index (help_topic_id) WHERE (help_topic_id = 8 OR help_keyword_id = 0) AND help_keyword_id != 2 AND help_topic_id >= 1900; help_topic_id help_keyword_id # # MDEV-24953: 10.5.9 crashes with large IN() list # CREATE TABLE t1 ( notification_type_id smallint(4) unsigned NOT NULL DEFAULT 0, item_id int(10) unsigned NOT NULL DEFAULT 0, item_parent_id int(10) unsigned NOT NULL DEFAULT 0, user_id int(10) unsigned NOT NULL DEFAULT 0, PRIMARY KEY (notification_type_id,item_id,item_parent_id,user_id) ); insert into t1 values (1,1,1,1), (2,2,2,2), (3,3,3,3); # Run crashing query id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range PRIMARY PRIMARY 2 NULL 3 Using where drop table t1; # # MDEV-25069: Assertion `root->weight >= ...' failed in SEL_ARG::tree_delete #2 # SELECT * FROM mysql.help_relation WHERE (help_topic_id < '2' OR help_topic_id != 8 OR help_topic_id < 1) AND help_keyword_id = help_topic_id; help_topic_id help_keyword_id # # MDEV-29242: Assertion `computed_weight == weight' failed SEL_ARG::verify_weight # CREATE TABLE t1 (id INT, KEY (id)); INSERT INTO t1 VALUES (1),(5); SELECT id FROM t1 WHERE id IS NULL OR id NOT BETWEEN 1 AND 4; id 5 DROP TABLE t1;