mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
Merge 10.3 into 10.4
In main.index_merge_myisam we remove the test that was added in commita2d24def8c
because it duplicates the test case that was added in commit5af12e4635
.
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2008, 2019, MariaDB
|
||||
Copyright (c) 2008, 2020, MariaDB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -357,7 +357,8 @@ QUICK_RANGE_SELECT *get_quick_select(PARAM *param,uint index,
|
||||
static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
||||
bool index_read_must_be_used,
|
||||
bool update_tbl_stats,
|
||||
double read_time);
|
||||
double read_time,
|
||||
bool ror_scans_required);
|
||||
static
|
||||
TRP_INDEX_INTERSECT *get_best_index_intersect(PARAM *param, SEL_TREE *tree,
|
||||
double read_time);
|
||||
@ -2637,7 +2638,7 @@ static int fill_used_fields_bitmap(PARAM *param)
|
||||
force_quick_range is really needed.
|
||||
|
||||
RETURN
|
||||
-1 if impossible select (i.e. certainly no rows will be selected)
|
||||
-1 if error or impossible select (i.e. certainly no rows will be selected)
|
||||
0 if can't use quick_select
|
||||
1 if found usable ranges and quick select has been successfully created.
|
||||
*/
|
||||
@ -2737,7 +2738,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
||||
{
|
||||
thd->no_errors=0;
|
||||
free_root(&alloc,MYF(0)); // Return memory & allocator
|
||||
DBUG_RETURN(0); // Can't use range
|
||||
DBUG_RETURN(-1); // Error
|
||||
}
|
||||
key_parts= param.key_parts;
|
||||
|
||||
@ -2805,7 +2806,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
||||
{
|
||||
thd->no_errors=0;
|
||||
free_root(&alloc,MYF(0)); // Return memory & allocator
|
||||
DBUG_RETURN(0); // Can't use range
|
||||
DBUG_RETURN(-1); // Error
|
||||
}
|
||||
|
||||
thd->mem_root= &alloc;
|
||||
@ -2861,6 +2862,13 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
||||
tree= NULL;
|
||||
}
|
||||
}
|
||||
else if (thd->is_error())
|
||||
{
|
||||
thd->no_errors=0;
|
||||
thd->mem_root= param.old_root;
|
||||
free_root(&alloc, MYF(0));
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2910,7 +2918,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
||||
/* Get best 'range' plan and prepare data for making other plans */
|
||||
if ((range_trp= get_key_scans_params(¶m, tree,
|
||||
only_single_index_range_scan, TRUE,
|
||||
best_read_time)))
|
||||
best_read_time, FALSE)))
|
||||
{
|
||||
best_trp= range_trp;
|
||||
best_read_time= best_trp->read_cost;
|
||||
@ -5078,7 +5086,8 @@ TABLE_READ_PLAN *get_best_disjunct_quick(PARAM *param, SEL_IMERGE *imerge,
|
||||
DBUG_EXECUTE("info", print_sel_tree(param, *ptree, &(*ptree)->keys_map,
|
||||
"tree in SEL_IMERGE"););
|
||||
Json_writer_object trace_idx(thd);
|
||||
if (!(*cur_child= get_key_scans_params(param, *ptree, TRUE, FALSE, read_time)))
|
||||
if (!(*cur_child= get_key_scans_params(param, *ptree, TRUE, FALSE,
|
||||
read_time, TRUE)))
|
||||
{
|
||||
/*
|
||||
One of index scans in this index_merge is more expensive than entire
|
||||
@ -5440,7 +5449,7 @@ TABLE_READ_PLAN *merge_same_index_scans(PARAM *param, SEL_IMERGE *imerge,
|
||||
index merge retrievals are not well calibrated
|
||||
*/
|
||||
trp= get_key_scans_params(param, *imerge->trees, FALSE, TRUE,
|
||||
read_time);
|
||||
read_time, TRUE);
|
||||
}
|
||||
|
||||
DBUG_RETURN(trp);
|
||||
@ -7324,6 +7333,7 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param,
|
||||
index_read_must_be_used if TRUE, assume 'index only' option will be set
|
||||
(except for clustered PK indexes)
|
||||
read_time don't create read plans with cost > read_time.
|
||||
ror_scans_required set to TRUE for index merge
|
||||
RETURN
|
||||
Best range read plan
|
||||
NULL if no plan found or error occurred
|
||||
@ -7332,7 +7342,8 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param,
|
||||
static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
||||
bool index_read_must_be_used,
|
||||
bool update_tbl_stats,
|
||||
double read_time)
|
||||
double read_time,
|
||||
bool ror_scans_required)
|
||||
{
|
||||
uint idx, UNINIT_VAR(best_idx);
|
||||
SEL_ARG *key_to_read= NULL;
|
||||
@ -7386,7 +7397,7 @@ static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
||||
found_records= check_quick_select(param, idx, read_index_only, key,
|
||||
update_tbl_stats, &mrr_flags,
|
||||
&buf_size, &cost, &is_ror_scan);
|
||||
if (!is_ror_scan &&
|
||||
if (ror_scans_required && !is_ror_scan &&
|
||||
!optimizer_flag(param->thd, OPTIMIZER_SWITCH_INDEX_MERGE_SORT_UNION))
|
||||
continue;
|
||||
|
||||
@ -9773,7 +9784,7 @@ key_and(RANGE_OPT_PARAM *param, SEL_ARG *key1, SEL_ARG *key2, uint clone_flag)
|
||||
if (key2->next_key_part)
|
||||
{
|
||||
key1->use_count--; // Incremented in and_all_keys
|
||||
return and_all_keys(param, key1, key2, clone_flag);
|
||||
return and_all_keys(param, key1, key2->next_key_part, clone_flag);
|
||||
}
|
||||
key2->use_count--; // Key2 doesn't have a tree
|
||||
}
|
||||
|
Reference in New Issue
Block a user