mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge with 4.0
This commit is contained in:
@ -367,6 +367,7 @@ JOIN::optimize()
|
||||
{
|
||||
conds->fix_fields(thd, tables_list, &conds);
|
||||
conds->change_ref_to_fields(thd, tables_list);
|
||||
conds->top_level_item();
|
||||
having= 0;
|
||||
}
|
||||
}
|
||||
@ -960,6 +961,7 @@ JOIN::exec()
|
||||
sort_table_cond)))
|
||||
DBUG_VOID_RETURN;
|
||||
table->select_cond=table->select->cond;
|
||||
table->select_cond->top_level_item();
|
||||
DBUG_EXECUTE("where",print_where(table->select->cond,
|
||||
"select and having"););
|
||||
having_list= make_cond_for_table(having_list, ~ (table_map) 0,
|
||||
@ -1432,7 +1434,7 @@ make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds,
|
||||
select->quick=0;
|
||||
if (records != HA_POS_ERROR)
|
||||
{
|
||||
s->found_records=records;
|
||||
s->records=s->found_records=records;
|
||||
s->read_time= (ha_rows) (s->quick ? s->quick->read_time : 0.0);
|
||||
}
|
||||
}
|
||||
@ -1965,7 +1967,7 @@ static void
|
||||
find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
|
||||
double read_time)
|
||||
{
|
||||
ulong rec;
|
||||
ha_rows rec;
|
||||
double tmp;
|
||||
THD *thd= join->thd;
|
||||
|
||||
@ -2158,7 +2160,7 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
|
||||
records
|
||||
This gives the formula:
|
||||
records= (x * (b-a) + a*c-b)/(c-1)
|
||||
|
||||
|
||||
b = records matched by whole key
|
||||
a = records matched by first key part (10% of all records?)
|
||||
c = number of key parts in key
|
||||
@ -2227,7 +2229,7 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
|
||||
{ // Check full join
|
||||
if (s->on_expr)
|
||||
{
|
||||
tmp=s->found_records; // Can't use read cache
|
||||
tmp=rows2double(s->found_records); // Can't use read cache
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -2246,11 +2248,11 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
|
||||
will ensure that this will be used
|
||||
*/
|
||||
best=tmp;
|
||||
records=s->found_records;
|
||||
records= rows2double(s->found_records);
|
||||
best_key=0;
|
||||
}
|
||||
}
|
||||
join->positions[idx].records_read=(double) records;
|
||||
join->positions[idx].records_read= records;
|
||||
join->positions[idx].key=best_key;
|
||||
join->positions[idx].table= s;
|
||||
if (!best_key && idx == join->const_tables &&
|
||||
@ -2587,7 +2589,7 @@ bool
|
||||
store_val_in_field(Field *field,Item *item)
|
||||
{
|
||||
THD *thd=current_thd;
|
||||
ulong cuted_fields=thd->cuted_fields;
|
||||
ha_rows cuted_fields=thd->cuted_fields;
|
||||
thd->count_cuted_fields=1;
|
||||
(void) item->save_in_field(field);
|
||||
thd->count_cuted_fields=0;
|
||||
@ -2675,7 +2677,7 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
|
||||
use_quick_range=1;
|
||||
tab->use_quick=1;
|
||||
tab->ref.key_parts=0; // Don't use ref key.
|
||||
join->best_positions[i].records_read=tab->quick->records;
|
||||
join->best_positions[i].records_read= rows2double(tab->quick->records);
|
||||
}
|
||||
|
||||
COND *tmp=make_cond_for_table(cond,used_tables,current_map);
|
||||
@ -3948,7 +3950,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
||||
*blob_field= 0; // End marker
|
||||
|
||||
/* If result table is small; use a heap */
|
||||
if (blob_count || using_unique_constraint || group_null_items ||
|
||||
if (blob_count || using_unique_constraint ||
|
||||
(select_options & (OPTION_BIG_TABLES | SELECT_SMALL_RESULT)) ==
|
||||
OPTION_BIG_TABLES)
|
||||
{
|
||||
@ -5547,6 +5549,8 @@ end_write_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
|
||||
}
|
||||
else
|
||||
{
|
||||
if (end_of_records)
|
||||
DBUG_RETURN(0);
|
||||
join->first_record=1;
|
||||
VOID(test_if_group_changed(join->group_fields));
|
||||
}
|
||||
@ -5616,6 +5620,7 @@ make_cond_for_table(COND *cond,table_map tables,table_map used_table)
|
||||
{
|
||||
if (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
|
||||
{
|
||||
/* Create new top level AND item */
|
||||
Item_cond_and *new_cond=new Item_cond_and;
|
||||
if (!new_cond)
|
||||
return (COND*) 0; // OOM /* purecov: inspected */
|
||||
@ -5653,6 +5658,7 @@ make_cond_for_table(COND *cond,table_map tables,table_map used_table)
|
||||
new_cond->argument_list()->push_back(fix);
|
||||
}
|
||||
new_cond->used_tables_cache=((Item_cond_or*) cond)->used_tables_cache;
|
||||
new_cond->top_level_item();
|
||||
return new_cond;
|
||||
}
|
||||
}
|
||||
@ -6004,6 +6010,7 @@ static bool fix_having(JOIN *join, Item **having)
|
||||
sort_table_cond)))
|
||||
return 1;
|
||||
table->select_cond=table->select->cond;
|
||||
table->select_cond->top_level_item();
|
||||
DBUG_EXECUTE("where",print_where(table->select_cond,
|
||||
"select and having"););
|
||||
*having=make_cond_for_table(*having,~ (table_map) 0,~used_tables);
|
||||
@ -7432,56 +7439,32 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
|
||||
{
|
||||
if (tab->use_quick == 2)
|
||||
{
|
||||
sprintf(buff_ptr,"range checked for each record (index map: %u)",
|
||||
sprintf(buff_ptr,"; Range checked for each record (index map: %u)",
|
||||
tab->keys);
|
||||
buff_ptr=strend(buff_ptr);
|
||||
}
|
||||
else
|
||||
buff_ptr=strmov(buff_ptr,"where used");
|
||||
buff_ptr=strmov(buff_ptr,"; Using where");
|
||||
}
|
||||
if (key_read)
|
||||
{
|
||||
if (buff != buff_ptr)
|
||||
{
|
||||
buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2;
|
||||
}
|
||||
buff_ptr=strmov(buff_ptr,"Using index");
|
||||
}
|
||||
buff_ptr= strmov(buff_ptr,"; Using index");
|
||||
if (table->reginfo.not_exists_optimize)
|
||||
{
|
||||
if (buff != buff_ptr)
|
||||
{
|
||||
buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2;
|
||||
}
|
||||
buff_ptr=strmov(buff_ptr,"Not exists");
|
||||
}
|
||||
buff_ptr= strmov(buff_ptr,"; Not exists");
|
||||
if (need_tmp_table)
|
||||
{
|
||||
need_tmp_table=0;
|
||||
if (buff != buff_ptr)
|
||||
{
|
||||
buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2;
|
||||
}
|
||||
buff_ptr=strmov(buff_ptr,"Using temporary");
|
||||
buff_ptr= strmov(buff_ptr,"; Using temporary");
|
||||
}
|
||||
if (need_order)
|
||||
{
|
||||
need_order=0;
|
||||
if (buff != buff_ptr)
|
||||
{
|
||||
buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2;
|
||||
}
|
||||
buff_ptr=strmov(buff_ptr,"Using filesort");
|
||||
buff_ptr= strmov(buff_ptr,"; Using filesort");
|
||||
}
|
||||
if (distinct & test_all_bits(used_tables,thd->used_tables))
|
||||
{
|
||||
if (buff != buff_ptr)
|
||||
{
|
||||
buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2;
|
||||
}
|
||||
buff_ptr=strmov(buff_ptr,"Distinct");
|
||||
}
|
||||
item_list.push_back(new Item_string(buff,(uint) (buff_ptr - buff),
|
||||
buff_ptr= strmov(buff_ptr,"; Distinct");
|
||||
if (buff_ptr == buff)
|
||||
buff_ptr+= 2; // Skip inital "; "
|
||||
item_list.push_back(new Item_string(buff+2,(uint) (buff_ptr - buff)-2,
|
||||
default_charset_info));
|
||||
// For next iteration
|
||||
used_tables|=table->map;
|
||||
|
Reference in New Issue
Block a user