diff -urN mysql-5.0.67-orig/sql/opt_range.cc mysql-5.0.67/sql/opt_range.cc --- mysql-5.0.67-orig/sql/opt_range.cc 2008-12-18 18:57:05.000000000 -0800 +++ mysql-5.0.67/sql/opt_range.cc 2008-12-18 18:57:13.000000000 -0800 @@ -7752,6 +7752,7 @@ uint cur_param_idx=MAX_KEY; key_map cur_used_key_parts; uint pk= param->table->s->primary_key; + uint last_valid_key_infix_len = 0; for (uint cur_index= 0 ; cur_index_info != cur_index_info_end ; cur_index_info++, cur_index++) @@ -7916,6 +7917,11 @@ last_part, thd, key_infix, &key_infix_len, &first_non_infix_part)) goto next_index; + + + if (key_infix_len > 0) { + last_valid_key_infix_len= key_infix_len; + } } else if (min_max_arg_part && (min_max_arg_part - first_non_group_part > 0)) @@ -8016,6 +8022,10 @@ Field::itMBR : Field::itRAW)) DBUG_RETURN(NULL); + if (key_infix_len == 0) { + key_infix_len= last_valid_key_infix_len; + } + /* The query passes all tests, so construct a new TRP object. */ read_plan= new (param->mem_root) TRP_GROUP_MIN_MAX(have_min, have_max, min_max_arg_part,