mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge remote-tracking branch '5.5' into 10.0
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2016 Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2016 MariaDB
|
||||
Copyright (c) 2009, 2018 MariaDB Corporation
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -280,6 +280,11 @@ enum enum_exec_or_opt {WALK_OPTIMIZATION_TABS , WALK_EXECUTION_TABS};
|
||||
JOIN_TAB *first_breadth_first_tab(JOIN *join, enum enum_exec_or_opt tabs_kind);
|
||||
JOIN_TAB *next_breadth_first_tab(JOIN *join, enum enum_exec_or_opt tabs_kind,
|
||||
JOIN_TAB *tab);
|
||||
static bool
|
||||
find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
||||
ORDER *order, List<Item> &fields, List<Item> &all_fields,
|
||||
bool is_group_field, bool add_to_all_fields);
|
||||
|
||||
static double table_cond_selectivity(JOIN *join, uint idx, JOIN_TAB *s,
|
||||
table_map rem_tables);
|
||||
|
||||
@ -333,7 +338,6 @@ bool dbug_user_var_equals_int(THD *thd, const char *name, int value)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
This handles SELECT with and without UNION.
|
||||
*/
|
||||
@ -697,6 +701,9 @@ JOIN::prepare(Item ***rref_pointer_array,
|
||||
join_list= &select_lex->top_join_list;
|
||||
union_part= unit_arg->is_union();
|
||||
|
||||
// simple check that we got usable conds
|
||||
dbug_print_item(conds);
|
||||
|
||||
if (select_lex->handle_derived(thd->lex, DT_PREPARE))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
@ -759,12 +766,11 @@ JOIN::prepare(Item ***rref_pointer_array,
|
||||
}
|
||||
|
||||
table_count= select_lex->leaf_tables.elements;
|
||||
|
||||
|
||||
TABLE_LIST *tbl;
|
||||
List_iterator_fast<TABLE_LIST> li(select_lex->leaf_tables);
|
||||
while ((tbl= li++))
|
||||
{
|
||||
//table_count++; /* Count the number of tables in the join. */
|
||||
/*
|
||||
If the query uses implicit grouping where the select list contains both
|
||||
aggregate functions and non-aggregate fields, any non-aggregated field
|
||||
@ -799,9 +805,15 @@ JOIN::prepare(Item ***rref_pointer_array,
|
||||
/* Resolve the ORDER BY that was skipped, then remove it. */
|
||||
if (skip_order_by && select_lex != select_lex->master_unit()->global_parameters)
|
||||
{
|
||||
if (setup_order(thd, (*rref_pointer_array), tables_list, fields_list,
|
||||
all_fields, select_lex->order_list.first))
|
||||
DBUG_RETURN(-1);
|
||||
thd->where= "order clause";
|
||||
for (ORDER *order= select_lex->order_list.first; order; order= order->next)
|
||||
{
|
||||
/* Don't add the order items to all fields. Just resolve them to ensure
|
||||
the query is valid, we'll drop them immediately after. */
|
||||
if (find_order_in_list(thd, *rref_pointer_array, tables_list, order,
|
||||
fields_list, all_fields, false, false))
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
select_lex->order_list.empty();
|
||||
}
|
||||
|
||||
@ -2208,8 +2220,11 @@ bool JOIN::shrink_join_buffers(JOIN_TAB *jt,
|
||||
ulonglong curr_space,
|
||||
ulonglong needed_space)
|
||||
{
|
||||
JOIN_TAB *tab;
|
||||
JOIN_CACHE *cache;
|
||||
for (JOIN_TAB *tab= join_tab+const_tables; tab < jt; tab++)
|
||||
for (tab= first_linear_tab(this, WITHOUT_BUSH_ROOTS, WITHOUT_CONST_TABLES);
|
||||
tab != jt;
|
||||
tab= next_linear_tab(this, tab, WITHOUT_BUSH_ROOTS))
|
||||
{
|
||||
cache= tab->cache;
|
||||
if (cache)
|
||||
@ -10239,7 +10254,7 @@ void JOIN::drop_unused_derived_keys()
|
||||
table->use_index(tab->ref.key);
|
||||
if (table->s->keys)
|
||||
{
|
||||
if (tab->ref.key >= 0)
|
||||
if (tab->ref.key >= 0 && tab->ref.key < MAX_KEY)
|
||||
tab->ref.key= 0;
|
||||
else
|
||||
table->s->keys= 0;
|
||||
@ -12049,8 +12064,8 @@ static void update_depend_map(JOIN *join)
|
||||
uint i;
|
||||
for (i=0 ; i < ref->key_parts ; i++,item++)
|
||||
depend_map|=(*item)->used_tables();
|
||||
ref->depend_map=depend_map & ~OUTER_REF_TABLE_BIT;
|
||||
depend_map&= ~OUTER_REF_TABLE_BIT;
|
||||
ref->depend_map= depend_map;
|
||||
for (JOIN_TAB **tab=join->map2table;
|
||||
depend_map ;
|
||||
tab++,depend_map>>=1 )
|
||||
@ -12355,7 +12370,7 @@ public:
|
||||
}
|
||||
static void operator delete(void *ptr __attribute__((unused)),
|
||||
size_t size __attribute__((unused)))
|
||||
{ TRASH(ptr, size); }
|
||||
{ TRASH_FREE(ptr, size); }
|
||||
|
||||
Item *and_level;
|
||||
Item_bool_func2 *cmp_func;
|
||||
@ -15189,14 +15204,14 @@ internal_remove_eq_conds(THD *thd, COND *cond, Item::cond_result *cond_value)
|
||||
|
||||
*/
|
||||
Item **args= ((Item_func_isnull*) cond)->arguments();
|
||||
Field *field=((Item_field*) args[0])->field;
|
||||
Field *field=((Item_field*) (args[0]->real_item()))->field;
|
||||
|
||||
Item *item0= new(thd->mem_root) Item_int((longlong)0, 1);
|
||||
Item *eq_cond= new(thd->mem_root) Item_func_eq(args[0], item0);
|
||||
if (!eq_cond)
|
||||
return cond;
|
||||
|
||||
if (field->table->pos_in_table_list->is_inner_table_of_outer_join())
|
||||
if (field->table->pos_in_table_list->is_inner_table_of_outer_join())
|
||||
{
|
||||
// outer join: transform "col IS NULL" to "col IS NULL or col=0"
|
||||
Item *or_cond= new(thd->mem_root) Item_cond_or(eq_cond, cond);
|
||||
@ -16430,7 +16445,7 @@ create_tmp_table(THD *thd, TMP_TABLE_PARAM *param, List<Item> &fields,
|
||||
else
|
||||
{
|
||||
field->set_notnull();
|
||||
memcpy(field->ptr, orig_field->ptr, field->pack_length());
|
||||
memcpy(field->ptr, orig_field->ptr, field->pack_length_in_rec());
|
||||
}
|
||||
orig_field->move_field_offset(-diff); // Back to record[0]
|
||||
}
|
||||
@ -21457,7 +21472,10 @@ cp_buffer_from_ref(THD *thd, TABLE *table, TABLE_REF *ref)
|
||||
SELECT list)
|
||||
@param[in,out] all_fields All select, group and order by fields
|
||||
@param[in] is_group_field True if order is a GROUP field, false if
|
||||
ORDER by field
|
||||
ORDER by field
|
||||
@param[in] add_to_all_fields If the item is to be added to all_fields and
|
||||
ref_pointer_array, this flag can be set to
|
||||
false to stop the automatic insertion.
|
||||
|
||||
@retval
|
||||
FALSE if OK
|
||||
@ -21468,7 +21486,7 @@ cp_buffer_from_ref(THD *thd, TABLE *table, TABLE_REF *ref)
|
||||
static bool
|
||||
find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
||||
ORDER *order, List<Item> &fields, List<Item> &all_fields,
|
||||
bool is_group_field)
|
||||
bool is_group_field, bool add_to_all_fields)
|
||||
{
|
||||
Item *order_item= *order->item; /* The item from the GROUP/ORDER caluse. */
|
||||
Item::Type order_item_type;
|
||||
@ -21588,6 +21606,9 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
||||
thd->is_error()))
|
||||
return TRUE; /* Wrong field. */
|
||||
|
||||
if (!add_to_all_fields)
|
||||
return FALSE;
|
||||
|
||||
uint el= all_fields.elements;
|
||||
DBUG_ASSERT(all_fields.elements <=
|
||||
thd->lex->current_select->ref_pointer_array_size);
|
||||
@ -21617,13 +21638,13 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
||||
*/
|
||||
|
||||
int setup_order(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
||||
List<Item> &fields, List<Item> &all_fields, ORDER *order)
|
||||
List<Item> &fields, List<Item> &all_fields, ORDER *order)
|
||||
{
|
||||
thd->where="order clause";
|
||||
for (; order; order=order->next)
|
||||
{
|
||||
if (find_order_in_list(thd, ref_pointer_array, tables, order, fields,
|
||||
all_fields, FALSE))
|
||||
all_fields, FALSE, true))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@ -21675,7 +21696,7 @@ setup_group(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
||||
for (ord= order; ord; ord= ord->next)
|
||||
{
|
||||
if (find_order_in_list(thd, ref_pointer_array, tables, ord, fields,
|
||||
all_fields, TRUE))
|
||||
all_fields, TRUE, true))
|
||||
return 1;
|
||||
(*ord->item)->marker= UNDEF_POS; /* Mark found */
|
||||
if ((*ord->item)->with_sum_func)
|
||||
@ -21994,6 +22015,7 @@ get_sort_by_table(ORDER *a,ORDER *b, List<TABLE_LIST> &tables,
|
||||
if (!map || (map & (RAND_TABLE_BIT | OUTER_REF_TABLE_BIT)))
|
||||
DBUG_RETURN(0);
|
||||
|
||||
map&= ~const_tables;
|
||||
while ((table= ti++) && !(map & table->table->map)) ;
|
||||
if (map != table->table->map)
|
||||
DBUG_RETURN(0); // More than one table
|
||||
|
Reference in New Issue
Block a user