mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Merge branch '10.1' into 10.2
This commit is contained in:
@ -695,7 +695,7 @@ JOIN::prepare(TABLE_LIST *tables_init,
|
||||
DBUG_ENTER("JOIN::prepare");
|
||||
|
||||
// to prevent double initialization on EXPLAIN
|
||||
if (optimized)
|
||||
if (optimization_state != JOIN::NOT_OPTIMIZED)
|
||||
DBUG_RETURN(0);
|
||||
|
||||
conds= conds_init;
|
||||
@ -1068,24 +1068,13 @@ err:
|
||||
|
||||
int JOIN::optimize()
|
||||
{
|
||||
bool was_optimized= optimized;
|
||||
// to prevent double initialization on EXPLAIN
|
||||
if (optimization_state != JOIN::NOT_OPTIMIZED)
|
||||
return FALSE;
|
||||
optimization_state= JOIN::OPTIMIZATION_IN_PROGRESS;
|
||||
|
||||
int res= optimize_inner();
|
||||
/*
|
||||
If we're inside a non-correlated subquery, this function may be
|
||||
called for the second time after the subquery has been executed
|
||||
and deleted. The second call will not produce a valid query plan, it will
|
||||
short-circuit because optimized==TRUE.
|
||||
|
||||
"was_optimized != optimized" is here to handle this case:
|
||||
- first optimization starts, gets an error (from a const. cheap
|
||||
subquery), returns 1
|
||||
- another JOIN::optimize() call made, and now join->optimize() will
|
||||
return 0, even though we never had a query plan.
|
||||
|
||||
Can have QEP_NOT_PRESENT_YET for degenerate queries (for example,
|
||||
SELECT * FROM tbl LIMIT 0)
|
||||
*/
|
||||
if (was_optimized != optimized && !res && have_query_plan != QEP_DELETED)
|
||||
if (!res && have_query_plan != QEP_DELETED)
|
||||
{
|
||||
create_explain_query_if_not_exists(thd->lex, thd->mem_root);
|
||||
have_query_plan= QEP_AVAILABLE;
|
||||
@ -1112,6 +1101,7 @@ int JOIN::optimize()
|
||||
}
|
||||
|
||||
}
|
||||
optimization_state= JOIN::OPTIMIZATION_DONE;
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -1139,10 +1129,7 @@ JOIN::optimize_inner()
|
||||
JOIN_TAB *tab;
|
||||
DBUG_ENTER("JOIN::optimize");
|
||||
do_send_rows = (unit->select_limit_cnt) ? 1 : 0;
|
||||
// to prevent double initialization on EXPLAIN
|
||||
if (optimized)
|
||||
DBUG_RETURN(0);
|
||||
optimized= 1;
|
||||
|
||||
DEBUG_SYNC(thd, "before_join_optimize");
|
||||
|
||||
THD_STAGE_INFO(thd, stage_optimizing);
|
||||
@ -3190,6 +3177,7 @@ void JOIN::exec_inner()
|
||||
{
|
||||
List<Item> *columns_list= &fields_list;
|
||||
DBUG_ENTER("JOIN::exec_inner");
|
||||
DBUG_ASSERT(optimization_state == JOIN::OPTIMIZATION_DONE);
|
||||
|
||||
THD_STAGE_INFO(thd, stage_executing);
|
||||
|
||||
@ -15778,7 +15766,7 @@ Field *Item::create_tmp_field(bool group, TABLE *table, uint convert_int_length)
|
||||
Field_double(max_length, maybe_null, name, decimals, TRUE);
|
||||
break;
|
||||
case INT_RESULT:
|
||||
/*
|
||||
/*
|
||||
Select an integer type with the minimal fit precision.
|
||||
convert_int_length is sign inclusive, don't consider the sign.
|
||||
*/
|
||||
@ -15794,7 +15782,6 @@ Field *Item::create_tmp_field(bool group, TABLE *table, uint convert_int_length)
|
||||
break;
|
||||
case STRING_RESULT:
|
||||
DBUG_ASSERT(collation.collation);
|
||||
|
||||
/*
|
||||
GEOMETRY fields have STRING_RESULT result type.
|
||||
To preserve type they needed to be handled separately.
|
||||
|
Reference in New Issue
Block a user