summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/main/range_notembedded.result9
-rw-r--r--mysql-test/main/range_notembedded.test10
-rw-r--r--sql/opt_range.cc6
3 files changed, 25 insertions, 0 deletions
diff --git a/mysql-test/main/range_notembedded.result b/mysql-test/main/range_notembedded.result
index 0ecf47c892e..eeab230e72f 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 5f6a05e8d91..4e77d6a4810 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 a02b6171a20..f1657b51bf3 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