diff options
Diffstat (limited to 'sql/sql_analyse.cc')
-rw-r--r-- | sql/sql_analyse.cc | 112 |
1 files changed, 72 insertions, 40 deletions
diff --git a/sql/sql_analyse.cc b/sql/sql_analyse.cc index 80a35120f45..5d3f9a0595c 100644 --- a/sql/sql_analyse.cc +++ b/sql/sql_analyse.cc @@ -1,15 +1,15 @@ /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB - + 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 the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ @@ -38,6 +38,37 @@ #define UINT_MAX24 0xffffff #define UINT_MAX32 0xffffffff +int sortcmp2(void* cmp_arg __attribute__((unused)), + const String *a,const String *b) +{ + return sortcmp(a,b); +} + +int stringcmp2(void* cmp_arg __attribute__((unused)), + const String *a,const String *b) +{ + return stringcmp(a,b); +} + +int compare_double2(void* cmp_arg __attribute__((unused)), + const double *s, const double *t) +{ + return compare_double(s,t); +} + +int compare_longlong2(void* cmp_arg __attribute__((unused)), + const longlong *s, const longlong *t) +{ + return compare_longlong(s,t); +} + +int compare_ulonglong2(void* cmp_arg __attribute__((unused)), + const ulonglong *s, const ulonglong *t) +{ + return compare_ulonglong(s,t); +} + + Procedure * proc_analyse_init(THD *thd, ORDER *param, select_result *result, List<Item> &field_list) @@ -60,7 +91,7 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result, { delete pc; net_printf(&thd->net, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name); - return 0; + DBUG_RETURN(0); } pc->max_tree_elements = (uint) (*param->item)->val_int(); param = param->next; @@ -68,7 +99,7 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result, { delete pc; net_printf(&thd->net, ER_WRONG_PARAMCOUNT_TO_PROCEDURE, proc_name); - return 0; + DBUG_RETURN(0); } // second parameter if ((*param->item)->type() != Item::INT_ITEM || @@ -76,7 +107,7 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result, { delete pc; net_printf(&thd->net, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name); - return 0; + DBUG_RETURN(0); } pc->max_treemem = (uint) (*param->item)->val_int(); } @@ -85,7 +116,7 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result, { delete pc; net_printf(&thd->net, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name); - return 0; + DBUG_RETURN(0); } // if only one parameter was given, it will be the value of max_tree_elements else @@ -100,7 +131,7 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result, pc->f_end = pc->f_info + field_list.elements; pc->fields = field_list; - List_iterator<Item> it(pc->fields); + List_iterator_fast<Item> it(pc->fields); f_info = pc->f_info; Item *item; @@ -121,7 +152,7 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result, if (item->result_type() == STRING_RESULT) *f_info++ = new field_str(item, pc); } - return pc; + DBUG_RETURN(pc); } @@ -137,8 +168,10 @@ bool test_if_number(NUM_INFO *info, const char *str, uint str_len) DBUG_ENTER("test_if_number"); - // MySQL removes any endspaces of a string, so we must take care only of - // spaces in front of a string + /* + MySQL removes any endspaces of a string, so we must take care only of + spaces in front of a string + */ for (; str != end && isspace(*str); str++) ; if (str == end) return 0; @@ -285,32 +318,6 @@ void field_str::add() was_maybe_zerofill = num_info.maybe_zerofill; } - if (room_in_tree) - { - if (res != &s) - s.copy(*res); - if (!tree_search(&tree, (void*) &s)) // If not in tree - { - s.copy(); // slow, when SAFE_MALLOC is in use - if (!(element=tree_insert(&tree, (void*) &s, 0))) - { - room_in_tree = 0; // Remove tree, out of RAM ? - delete_tree(&tree); - } - else - { - bzero((char*) &s, sizeof(s)); // Let tree handle free of this - if ((treemem += length) > pc->max_treemem || - (element->count == 1 && - (tree_elements++) >= pc->max_tree_elements)) - { - room_in_tree = 0; // Remove tree, too big tree - delete_tree(&tree); - } - } - } - } - if (!found) { found = 1; @@ -341,6 +348,31 @@ void field_str::add() max_arg.copy(*res); } } + + if (room_in_tree) + { + if (res != &s) + s.copy(*res); + if (!tree_search(&tree, (void*) &s)) // If not in tree + { + s.copy(); // slow, when SAFE_MALLOC is in use + if (!tree_insert(&tree, (void*) &s, 0)) + { + room_in_tree = 0; // Remove tree, out of RAM ? + delete_tree(&tree); + } + else + { + bzero((char*) &s, sizeof(s)); // Let tree handle free of this + if ((treemem += length) > pc->max_treemem) + { + room_in_tree = 0; // Remove tree, too big tree + delete_tree(&tree); + } + } + } + } + if ((num_info.zerofill && (max_length != min_length)) || (was_zero_fill && (max_length != min_length))) can_be_still_num = 0; // zerofilled numbers must be of same length @@ -879,7 +911,7 @@ int collect_string(String *element, int collect_real(double *element, element_count count __attribute__((unused)), TREE_INFO *info) { - char buff[255]; + char buff[MAX_FIELD_WIDTH]; String s(buff, sizeof(buff)); if (info->found) @@ -898,7 +930,7 @@ int collect_longlong(longlong *element, element_count count __attribute__((unused)), TREE_INFO *info) { - char buff[255]; + char buff[MAX_FIELD_WIDTH]; String s(buff, sizeof(buff)); if (info->found) @@ -917,7 +949,7 @@ int collect_ulonglong(ulonglong *element, element_count count __attribute__((unused)), TREE_INFO *info) { - char buff[255]; + char buff[MAX_FIELD_WIDTH]; String s(buff, sizeof(buff)); if (info->found) |