From 60561ae6133cf40f4fc445e1d6e8f395a20b2573 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 21 Jun 2012 18:47:13 +0300 Subject: Fix for LP bug#1001505 and LP bug#1001510 We set correct cmp_context during preparation to avoid changing it later by Item_field::equal_fields_propagator. (see mysql bugs #57135 #57692 during merging) --- sql/item_cmpfunc.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'sql') diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 61554bdf420..847c51b8a5e 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -3095,6 +3095,15 @@ void Item_func_case::fix_length_and_dec() return; } } + /* + Set cmp_context of all WHEN arguments. This prevents + Item_field::equal_fields_propagator() from transforming a + zerofill argument into a string constant. Such a change would + require rebuilding cmp_items. + */ + for (i= 0; i < ncases; i+= 2) + args[i]->cmp_context= item_cmp_type(left_result_type, + args[i]->result_type()); } if (else_expr_num == -1 || args[else_expr_num]->maybe_null) @@ -4081,6 +4090,16 @@ void Item_func_in::fix_length_and_dec() } } } + /* + Set cmp_context of all arguments. This prevents + Item_field::equal_fields_propagator() from transforming a zerofill integer + argument into a string constant. Such a change would require rebuilding + cmp_itmes. + */ + for (arg= args + 1, arg_end= args + arg_count; arg != arg_end ; arg++) + { + arg[0]->cmp_context= item_cmp_type(left_result_type, arg[0]->result_type()); + } max_length= 1; } -- cgit v1.2.1 From d07b179fd2397bd78dd4f9ba7c54dda38fc1ce8c Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Mon, 13 Aug 2012 21:13:14 -0700 Subject: Fixed bug mdev-449. The bug could caused a crash when the server executed a query with ORDER by and sort_buffer_size was set to a small enough number. It happened because the small sort buffer did not allow to allocate all merge buffers in it. Made sure that the allocated sort buffer would be big enough to contain all possible merge buffers. --- sql/filesort.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'sql') diff --git a/sql/filesort.cc b/sql/filesort.cc index 772698c6e1a..4d06317447a 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -102,6 +102,7 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, { int error; ulong memavl, min_sort_memory; + ulong sort_buff_sz; uint maxbuffer; BUFFPEK *buffpek; ha_rows records= HA_POS_ERROR; @@ -210,6 +211,7 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, memavl= thd->variables.sortbuff_size; min_sort_memory= max(MIN_SORT_MEMORY, param.sort_length*MERGEBUFF2); + set_if_bigger(min_sort_memory, sizeof(BUFFPEK*)*MERGEBUFF2); if (!table_sort.sort_keys) { while (memavl >= min_sort_memory) @@ -217,9 +219,10 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, ulong old_memavl; ulong keys= memavl/(param.rec_length+sizeof(char*)); table_sort.keys= (uint) min(records+1, keys); + sort_buff_sz= table_sort.keys*(param.rec_length+sizeof(char*)); + set_if_bigger(sort_buff_sz, param.rec_length * MERGEBUFF2); if ((table_sort.sort_keys= - (uchar**) my_malloc(table_sort.keys*(param.rec_length+sizeof(char*)), - MYF(0)))) + (uchar**) my_malloc(sort_buff_sz, MYF(0)))) break; old_memavl=memavl; if ((memavl=memavl/4*3) < min_sort_memory && @@ -282,8 +285,7 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, Use also the space previously used by string pointers in sort_buffer for temporary key storage. */ - param.keys=((param.keys*(param.rec_length+sizeof(char*))) / - param.rec_length-1); + param.keys= sort_buff_sz / param.rec_length; maxbuffer--; // Offset from 0 if (merge_many_buff(¶m,(uchar*) sort_keys,buffpek,&maxbuffer, &tempfile)) @@ -1257,7 +1259,7 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file, to_start_filepos= my_b_tell(to_file); strpos= sort_buffer; org_max_rows=max_rows= param->max_rows; - + /* The following will fire if there is not enough space in sort_buffer */ DBUG_ASSERT(maxcount!=0); -- cgit v1.2.1 From fbee9f5b6e25e60c7e6785b3125a277426eb78b5 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Tue, 14 Aug 2012 14:25:56 -0700 Subject: Corrected the pactch for mdev-449 to fix valgrind failures. --- sql/filesort.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'sql') diff --git a/sql/filesort.cc b/sql/filesort.cc index 4d06317447a..46348f91bb4 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -285,7 +285,8 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, Use also the space previously used by string pointers in sort_buffer for temporary key storage. */ - param.keys= sort_buff_sz / param.rec_length; + param.keys=((param.keys*(param.rec_length+sizeof(char*))) / + param.rec_length-1); maxbuffer--; // Offset from 0 if (merge_many_buff(¶m,(uchar*) sort_keys,buffpek,&maxbuffer, &tempfile)) @@ -1260,8 +1261,7 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file, strpos= sort_buffer; org_max_rows=max_rows= param->max_rows; - /* The following will fire if there is not enough space in sort_buffer */ - DBUG_ASSERT(maxcount!=0); + set_if_bigger(maxcount, 1); if (unique_buff) { -- cgit v1.2.1 From ed06ba3492d55c9e9dde231b55352f854e5e4b50 Mon Sep 17 00:00:00 2001 From: Sergey Petrunya Date: Tue, 21 Aug 2012 22:24:34 +0400 Subject: Better comments --- sql/opt_subselect.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'sql') diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index 0273c947ef6..4591888307e 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -143,18 +143,18 @@ 3.2.1 Non-merged semi-joins and join optimization ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For join optimization purposes, non-merged semi-join nests are similar to - base tables - they've got one JOIN_TAB, which can be accessed with one of - two methods: + base tables. Each such nest is represented by one one JOIN_TAB, which has + two possible access strategies: - full table scan (representing SJ-Materialization-Scan strategy) - eq_ref-like table lookup (representing SJ-Materialization-Lookup) Unlike regular base tables, non-merged semi-joins have: - non-zero JOIN_TAB::startup_cost, and - join_tab->table->is_filled_at_execution()==TRUE, which means one - cannot do const table detection or range analysis or other table data- - dependent inferences - // instead, get_delayed_table_estimates() runs optimization on the nest so that - // we get an idea about temptable size + cannot do const table detection, range analysis or other dataset-dependent + optimizations. + Instead, get_delayed_table_estimates() will run optimization for the + subquery and produce an E(materialized table size). 3.2.2 Merged semi-joins and join optimization ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- cgit v1.2.1