mirror of
https://github.com/MariaDB/server.git
synced 2026-05-02 05:05:33 +02:00
MDEV-3798: EXPLAIN UPDATE/DELETE
- Update test results after last few csets - Generate correct value for `possible_keys` column for single table UPDATE/DELETE.
This commit is contained in:
parent
fda46df620
commit
69e6a2bb22
5 changed files with 21 additions and 5 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -982,6 +982,8 @@ class SQL_SELECT :public Sql_alloc {
|
|||
key_map quick_keys; // Possible quick keys
|
||||
key_map needed_reg; // Possible quick keys after prev tables.
|
||||
table_map const_tables,read_tables;
|
||||
/* See PARAM::possible_keys */
|
||||
key_map possible_keys;
|
||||
bool free_cond; /* Currently not used and always FALSE */
|
||||
|
||||
SQL_SELECT();
|
||||
|
|
|
|||
|
|
@ -436,7 +436,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
|
|||
}
|
||||
|
||||
query_plan.select= select;
|
||||
query_plan.possible_keys= table->quick_keys;
|
||||
query_plan.possible_keys= select? select->possible_keys: key_map(0);
|
||||
query_plan.table_rows= table->file->stats.records;
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -492,8 +492,8 @@ int mysql_update(THD *thd,
|
|||
- if we're running EXPLAIN UPDATE, get out
|
||||
*/
|
||||
query_plan.select= select;
|
||||
query_plan.possible_keys= table->quick_keys;
|
||||
query_plan.table_rows= table->file->stats.records;
|
||||
query_plan.possible_keys= select? select->possible_keys: key_map(0);
|
||||
|
||||
/*
|
||||
Ok, we have generated a query plan for the UPDATE.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue