diff --git a/mysql-test/main/range_notembedded.result b/mysql-test/main/range_notembedded.result index 0ecf47c892ef9..eeab230e72f7f 100644 --- a/mysql-test/main/range_notembedded.result +++ b/mysql-test/main/range_notembedded.result @@ -239,3 +239,12 @@ insert into t1 values (1,1,1,1), (2,2,2,2), (3,3,3,3); 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 diff --git a/mysql-test/main/range_notembedded.test b/mysql-test/main/range_notembedded.test index 5f6a05e8d9101..4e77d6a4810b4 100644 --- a/mysql-test/main/range_notembedded.test +++ b/mysql-test/main/range_notembedded.test @@ -140,3 +140,13 @@ WHERE --enable_query_log drop table t1; + +--echo # +--echo # MDEV-25069: Assertion `root->weight >= ...' failed in SEL_ARG::tree_delete #2 +--echo # + +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; diff --git a/sql/opt_range.cc b/sql/opt_range.cc index a02b6171a20e4..f1657b51bf32f 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -10642,9 +10642,15 @@ key_or(RANGE_OPT_PARAM *param, SEL_ARG *key1,SEL_ARG *key2) */ tmp->maybe_flag|= key2_cpy.maybe_flag; key2_cpy.increment_use_count(key1->use_count+1); + + uint old_weight= tmp->next_key_part? tmp->next_key_part->weight: 0; + tmp->next_key_part= key_or(param, tmp->next_key_part, key2_cpy.next_key_part); + uint new_weight= tmp->next_key_part? tmp->next_key_part->weight: 0; + key1->weight += (new_weight - old_weight); + if (!cmp) break; // case b: done with this key2 range