summaryrefslogtreecommitdiffstats
path: root/sql/opt_range.cc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--sql/opt_range.cc69
1 files changed, 23 insertions, 46 deletions
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index 0ca8402f..42afc930 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -2692,7 +2692,7 @@ SQL_SELECT::test_quick_select(THD *thd,
bool ordered_output,
bool remove_false_parts_of_where,
bool only_single_index_range_scan,
- bool suppress_unusable_key_notes)
+ Item_func::Bitmap note_unusable_keys)
{
uint idx;
double scan_time;
@@ -2786,9 +2786,9 @@ SQL_SELECT::test_quick_select(THD *thd,
param.max_key_parts= 0;
param.remove_false_where_parts= remove_false_parts_of_where;
param.force_default_mrr= ordered_output;
- param.note_unusable_keys= (!suppress_unusable_key_notes &&
- thd->give_notes_for_unusable_keys());
-
+ param.note_unusable_keys= thd->give_notes_for_unusable_keys() ?
+ note_unusable_keys :
+ Item_func::BITMAP_NONE;
param.possible_keys.clear_all();
thd->no_errors=1; // Don't warn about NULL
@@ -3999,7 +3999,7 @@ bool prune_partitions(THD *thd, TABLE *table, Item *pprune_cond)
range_par->remove_jump_scans= FALSE;
range_par->real_keynr[0]= 0;
range_par->alloced_sel_args= 0;
- range_par->note_unusable_keys= 0;
+ range_par->note_unusable_keys= Item_func::BITMAP_NONE;
thd->no_errors=1; // Don't warn about NULL
thd->mem_root=&alloc;
@@ -8762,9 +8762,11 @@ Item_func_like::get_mm_leaf(RANGE_OPT_PARAM *param,
if (field->result_type() == STRING_RESULT &&
field->charset() != compare_collation())
{
- if (param->note_unusable_keys)
+ if (param->note_unusable_keys & BITMAP_LIKE)
field->raise_note_cannot_use_key_part(param->thd, keynr, key_part->part,
- func_name_cstring(), value,
+ func_name_cstring(),
+ compare_collation(),
+ value,
Data_type_compatibility::
INCOMPATIBLE_COLLATION);
DBUG_RETURN(0);
@@ -8780,9 +8782,11 @@ Item_func_like::get_mm_leaf(RANGE_OPT_PARAM *param,
field->type_handler() == &type_handler_enum ||
field->type_handler() == &type_handler_set)
{
- if (param->note_unusable_keys)
+ if (param->note_unusable_keys & BITMAP_LIKE)
field->raise_note_cannot_use_key_part(param->thd, keynr, key_part->part,
- func_name_cstring(), value,
+ func_name_cstring(),
+ compare_collation(),
+ value,
Data_type_compatibility::
INCOMPATIBLE_DATA_TYPE);
DBUG_RETURN(0);
@@ -8887,7 +8891,8 @@ Field::can_optimize_scalar_range(const RANGE_OPT_PARAM *param,
TODO: Perhaps we also need to raise a similar note when
a partition could not be used (when using_real_indexes==false).
*/
- if (param->using_real_indexes && param->note_unusable_keys)
+ if (param->using_real_indexes && param->note_unusable_keys &&
+ (param->note_unusable_keys & cond->bitmap_bit()))
{
DBUG_ASSERT(keynr < table->s->keys);
/*
@@ -8901,6 +8906,7 @@ Field::can_optimize_scalar_range(const RANGE_OPT_PARAM *param,
*/
raise_note_cannot_use_key_part(param->thd, keynr, key_part->part,
scalar_comparison_op_to_lex_cstring(op),
+ cond->compare_collation(),
value, compat);
}
return compat;
@@ -15173,13 +15179,6 @@ int QUICK_GROUP_MIN_MAX_SELECT::init()
{
if (group_prefix) /* Already initialized. */
return 0;
-
- /*
- We allocate one byte more to serve the case when the last field in
- the buffer is compared using uint3korr (e.g. a Field_newdate field)
- */
- if (!(last_prefix= (uchar*) alloc_root(&alloc, group_prefix_len+1)))
- return 1;
/*
We may use group_prefix to store keys with all select fields, so allocate
enough space for it.
@@ -15436,8 +15435,7 @@ void QUICK_GROUP_MIN_MAX_SELECT::update_key_stat()
QUICK_GROUP_MIN_MAX_SELECT::reset()
DESCRIPTION
- Initialize the index chosen for access and find and store the prefix
- of the last group. The method is expensive since it performs disk access.
+ Initialize the index chosen for access.
RETURN
0 OK
@@ -15459,12 +15457,6 @@ int QUICK_GROUP_MIN_MAX_SELECT::reset(void)
}
if (quick_prefix_select && quick_prefix_select->reset())
DBUG_RETURN(1);
- result= file->ha_index_last(record);
- if (result == HA_ERR_END_OF_FILE)
- DBUG_RETURN(0);
- /* Save the prefix of the last group. */
- key_copy(last_prefix, record, index_info, group_prefix_len);
-
DBUG_RETURN(0);
}
@@ -15510,34 +15502,20 @@ int QUICK_GROUP_MIN_MAX_SELECT::get_next()
#else
int result;
#endif
- int is_last_prefix= 0;
-
DBUG_ENTER("QUICK_GROUP_MIN_MAX_SELECT::get_next");
/*
- Loop until a group is found that satisfies all query conditions or the last
- group is reached.
+ Loop until a group is found that satisfies all query conditions or
+ there are no satisfying groups left
*/
do
{
result= next_prefix();
+ if (result != 0)
+ break;
/*
- Check if this is the last group prefix. Notice that at this point
- this->record contains the current prefix in record format.
+ At this point this->record contains the current prefix in record format.
*/
- if (!result)
- {
- is_last_prefix= key_cmp(index_info->key_part, last_prefix,
- group_prefix_len);
- DBUG_ASSERT(is_last_prefix <= 0);
- }
- else
- {
- if (result == HA_ERR_KEY_NOT_FOUND)
- continue;
- break;
- }
-
if (have_min)
{
min_res= next_min();
@@ -15566,8 +15544,7 @@ int QUICK_GROUP_MIN_MAX_SELECT::get_next()
HA_READ_KEY_EXACT);
result= have_min ? min_res : have_max ? max_res : result;
- } while ((result == HA_ERR_KEY_NOT_FOUND || result == HA_ERR_END_OF_FILE) &&
- is_last_prefix != 0);
+ } while (result == HA_ERR_KEY_NOT_FOUND || result == HA_ERR_END_OF_FILE);
if (result == HA_ERR_KEY_NOT_FOUND)
result= HA_ERR_END_OF_FILE;