summaryrefslogtreecommitdiff
path: root/sql/opt_range.cc
diff options
context:
space:
mode:
authorSergey Petrunya <psergey@askmonty.org>2013-10-08 16:13:49 +0400
committerSergey Petrunya <psergey@askmonty.org>2013-10-08 16:13:49 +0400
commit69e6a2bb22434d94d96312ba8a0540195273dfdd (patch)
treec84e3440a7d6f55c9e8c7c53415eba21c326fbcb /sql/opt_range.cc
parentfda46df62071f54ebc4d806c6d9caf031d801150 (diff)
downloadmariadb-git-69e6a2bb22434d94d96312ba8a0540195273dfdd.tar.gz
MDEV-3798: EXPLAIN UPDATE/DELETE
- Update test results after last few csets - Generate correct value for `possible_keys` column for single table UPDATE/DELETE.
Diffstat (limited to 'sql/opt_range.cc')
-rw-r--r--sql/opt_range.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index eec15ed93f9..08d9df2a10a 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -861,6 +861,14 @@ class PARAM : public RANGE_OPT_PARAM
{
public:
ha_rows quick_rows[MAX_KEY];
+
+ /*
+ This will collect 'possible keys' based on the range optimization.
+
+ Queries with a JOIN object actually use ref optimizer (see add_key_field)
+ to collect possible_keys. This is used by single table UPDATE/DELETE.
+ */
+ key_map possible_keys;
longlong baseflag;
uint max_key_part, range_count;
@@ -2955,6 +2963,8 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
read_time= (double) records + scan_time + 1; // Force to use index
else if (read_time <= 2.0 && !force_quick_range)
DBUG_RETURN(0); /* No need for quick select */
+
+ possible_keys.clear_all();
DBUG_PRINT("info",("Time to scan table: %g", read_time));
@@ -2986,6 +2996,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
param.using_real_indexes= TRUE;
param.remove_jump_scans= TRUE;
param.force_default_mrr= ordered_output;
+ param.possible_keys.clear_all();
thd->no_errors=1; // Don't warn about NULL
init_sql_alloc(&alloc, thd->variables.range_alloc_block_size, 0,
@@ -3197,6 +3208,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
quick= NULL;
}
}
+ possible_keys= param.possible_keys;
free_mem:
free_root(&alloc,MYF(0)); // Return memory & allocator
@@ -3204,6 +3216,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
thd->no_errors=0;
}
+
DBUG_EXECUTE("info", print_quick(quick, &needed_reg););
/*
@@ -10467,6 +10480,7 @@ ha_rows check_quick_select(PARAM *param, uint idx, bool index_only,
if (rows != HA_POS_ERROR)
{
param->quick_rows[keynr]= rows;
+ param->possible_keys.set_bit(keynr);
if (update_tbl_stats)
{
param->table->quick_keys.set_bit(keynr);