mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge remote-tracking branch 'origin/10.3' into 10.4
This commit is contained in:
@ -822,8 +822,10 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables)
|
||||
lock_type= TL_READ; // ignore TL_WRITE, history is immutable anyway
|
||||
}
|
||||
|
||||
const LEX_CSTRING *fstart= &table->table->vers_start_field()->field_name;
|
||||
const LEX_CSTRING *fend= &table->table->vers_end_field()->field_name;
|
||||
const LEX_CSTRING *fstart=
|
||||
thd->make_clex_string(table->table->vers_start_field()->field_name);
|
||||
const LEX_CSTRING *fend=
|
||||
thd->make_clex_string(table->table->vers_end_field()->field_name);
|
||||
|
||||
Item *row_start=
|
||||
newx Item_field(thd, &this->context, table->db.str, table->alias.str, fstart);
|
||||
@ -1674,9 +1676,11 @@ JOIN::optimize_inner()
|
||||
if (having)
|
||||
{
|
||||
select_lex->having_fix_field= 1;
|
||||
select_lex->having_fix_field_for_pushed_cond= 1;
|
||||
if (having->fix_fields(thd, &having))
|
||||
DBUG_RETURN(1);
|
||||
select_lex->having_fix_field= 0;
|
||||
select_lex->having_fix_field_for_pushed_cond= 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1780,10 +1784,18 @@ JOIN::optimize_inner()
|
||||
if (cond_value == Item::COND_FALSE || having_value == Item::COND_FALSE ||
|
||||
(!unit->select_limit_cnt && !(select_options & OPTION_FOUND_ROWS)))
|
||||
{ /* Impossible cond */
|
||||
DBUG_PRINT("info", (having_value == Item::COND_FALSE ?
|
||||
"Impossible HAVING" : "Impossible WHERE"));
|
||||
zero_result_cause= having_value == Item::COND_FALSE ?
|
||||
"Impossible HAVING" : "Impossible WHERE";
|
||||
if (unit->select_limit_cnt)
|
||||
{
|
||||
DBUG_PRINT("info", (having_value == Item::COND_FALSE ?
|
||||
"Impossible HAVING" : "Impossible WHERE"));
|
||||
zero_result_cause= having_value == Item::COND_FALSE ?
|
||||
"Impossible HAVING" : "Impossible WHERE";
|
||||
}
|
||||
else
|
||||
{
|
||||
DBUG_PRINT("info", ("Zero limit"));
|
||||
zero_result_cause= "Zero limit";
|
||||
}
|
||||
table_count= top_join_tab_count= 0;
|
||||
error= 0;
|
||||
subq_exit_fl= true;
|
||||
@ -10432,7 +10444,7 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
|
||||
table_map current_map;
|
||||
i= join->const_tables;
|
||||
for (tab= first_depth_first_tab(join); tab;
|
||||
tab= next_depth_first_tab(join, tab), i++)
|
||||
tab= next_depth_first_tab(join, tab))
|
||||
{
|
||||
bool is_hj;
|
||||
|
||||
@ -10917,6 +10929,8 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
|
||||
}
|
||||
first_inner_tab= first_inner_tab->first_upper;
|
||||
}
|
||||
if (!tab->bush_children)
|
||||
i++;
|
||||
}
|
||||
}
|
||||
DBUG_RETURN(0);
|
||||
@ -14077,7 +14091,8 @@ COND *Item_func_eq::build_equal_items(THD *thd,
|
||||
List_iterator_fast<Item_equal> it(cond_equal.current_level);
|
||||
while ((item_equal= it++))
|
||||
{
|
||||
item_equal->fix_length_and_dec();
|
||||
if (item_equal->fix_length_and_dec())
|
||||
return NULL;
|
||||
item_equal->update_used_tables();
|
||||
set_if_bigger(thd->lex->current_select->max_equal_elems,
|
||||
item_equal->n_field_items());
|
||||
@ -16687,7 +16702,8 @@ Item_field::create_tmp_field_from_item_field(TABLE *new_table,
|
||||
Record_addr rec(orig_item ? orig_item->maybe_null : maybe_null);
|
||||
const Type_handler *handler= type_handler()->
|
||||
type_handler_for_tmp_table(this);
|
||||
result= handler->make_and_init_table_field(&name, rec, *this, new_table);
|
||||
result= handler->make_and_init_table_field(orig_item ? &orig_item->name : &name,
|
||||
rec, *this, new_table);
|
||||
}
|
||||
else if (param->table_cant_handle_bit_fields() &&
|
||||
field->type() == MYSQL_TYPE_BIT)
|
||||
@ -26276,21 +26292,18 @@ void JOIN::set_allowed_join_cache_types()
|
||||
|
||||
void JOIN::save_query_plan(Join_plan_state *save_to)
|
||||
{
|
||||
if (keyuse.elements)
|
||||
{
|
||||
DYNAMIC_ARRAY tmp_keyuse;
|
||||
/* Swap the current and the backup keyuse internal arrays. */
|
||||
tmp_keyuse= keyuse;
|
||||
keyuse= save_to->keyuse; /* keyuse is reset to an empty array. */
|
||||
save_to->keyuse= tmp_keyuse;
|
||||
DYNAMIC_ARRAY tmp_keyuse;
|
||||
/* Swap the current and the backup keyuse internal arrays. */
|
||||
tmp_keyuse= keyuse;
|
||||
keyuse= save_to->keyuse; /* keyuse is reset to an empty array. */
|
||||
save_to->keyuse= tmp_keyuse;
|
||||
|
||||
for (uint i= 0; i < table_count; i++)
|
||||
{
|
||||
save_to->join_tab_keyuse[i]= join_tab[i].keyuse;
|
||||
join_tab[i].keyuse= NULL;
|
||||
save_to->join_tab_checked_keys[i]= join_tab[i].checked_keys;
|
||||
join_tab[i].checked_keys.clear_all();
|
||||
}
|
||||
for (uint i= 0; i < table_count; i++)
|
||||
{
|
||||
save_to->join_tab_keyuse[i]= join_tab[i].keyuse;
|
||||
join_tab[i].keyuse= NULL;
|
||||
save_to->join_tab_checked_keys[i]= join_tab[i].checked_keys;
|
||||
join_tab[i].checked_keys.clear_all();
|
||||
}
|
||||
memcpy((uchar*) save_to->best_positions, (uchar*) best_positions,
|
||||
sizeof(POSITION) * (table_count + 1));
|
||||
@ -26328,20 +26341,17 @@ void JOIN::reset_query_plan()
|
||||
|
||||
void JOIN::restore_query_plan(Join_plan_state *restore_from)
|
||||
{
|
||||
if (restore_from->keyuse.elements)
|
||||
DYNAMIC_ARRAY tmp_keyuse;
|
||||
tmp_keyuse= keyuse;
|
||||
keyuse= restore_from->keyuse;
|
||||
restore_from->keyuse= tmp_keyuse;
|
||||
|
||||
for (uint i= 0; i < table_count; i++)
|
||||
{
|
||||
DYNAMIC_ARRAY tmp_keyuse;
|
||||
tmp_keyuse= keyuse;
|
||||
keyuse= restore_from->keyuse;
|
||||
restore_from->keyuse= tmp_keyuse;
|
||||
|
||||
for (uint i= 0; i < table_count; i++)
|
||||
{
|
||||
join_tab[i].keyuse= restore_from->join_tab_keyuse[i];
|
||||
join_tab[i].checked_keys= restore_from->join_tab_checked_keys[i];
|
||||
}
|
||||
|
||||
join_tab[i].keyuse= restore_from->join_tab_keyuse[i];
|
||||
join_tab[i].checked_keys= restore_from->join_tab_checked_keys[i];
|
||||
}
|
||||
|
||||
memcpy((uchar*) best_positions, (uchar*) restore_from->best_positions,
|
||||
sizeof(POSITION) * (table_count + 1));
|
||||
/* Restore SJM nests */
|
||||
|
Reference in New Issue
Block a user