mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
NEWDATE -> DATE in anylyse() output
Changed that analyse(#) also affects strings mysql-test/r/analyse.result: Better analyse test mysql-test/t/analyse.test: Better analyse test sql/sql_analyse.cc: NEWDATE -> DATE in anylyse() output Changed that analyse(#) also affects strings Fixed that number of elements in ENUM is limited by # not by #+1
This commit is contained in:
@ -122,12 +122,15 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result,
|
||||
*f_info++ = new field_str(item, pc);
|
||||
}
|
||||
return pc;
|
||||
} // proc_analyse_init
|
||||
}
|
||||
|
||||
|
||||
// return 1 if number, else return 0
|
||||
// store info about found number in info
|
||||
// NOTE:It is expected, that elements of 'info' are all zero!
|
||||
/*
|
||||
Return 1 if number, else return 0
|
||||
store info about found number in info
|
||||
NOTE:It is expected, that elements of 'info' are all zero!
|
||||
*/
|
||||
|
||||
bool test_if_number(NUM_INFO *info, const char *str, uint str_len)
|
||||
{
|
||||
const char *begin, *end = str + str_len;
|
||||
@ -205,14 +208,16 @@ bool test_if_number(NUM_INFO *info, const char *str, uint str_len)
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
} //test_if_number
|
||||
}
|
||||
|
||||
|
||||
// Stores the biggest and the smallest value from current 'info'
|
||||
// to ev_num_info
|
||||
// If info contains an ulonglong number, which is bigger than
|
||||
// biggest positive number able to be stored in a longlong variable
|
||||
// and is marked as negative, function will return 0, else 1.
|
||||
/*
|
||||
Stores the biggest and the smallest value from current 'info'
|
||||
to ev_num_info
|
||||
If info contains an ulonglong number, which is bigger than
|
||||
biggest positive number able to be stored in a longlong variable
|
||||
and is marked as negative, function will return 0, else 1.
|
||||
*/
|
||||
|
||||
bool get_ev_num_info(EV_NUM_INFO *ev_info, NUM_INFO *info, const char *num)
|
||||
{
|
||||
@ -240,11 +245,13 @@ void free_string(String *s)
|
||||
s->free();
|
||||
}
|
||||
|
||||
|
||||
void field_str::add()
|
||||
{
|
||||
char buff[MAX_FIELD_WIDTH], *ptr;
|
||||
String s(buff, sizeof(buff)), *res;
|
||||
ulong length;
|
||||
TREE_ELEMENT *element;
|
||||
|
||||
if (!(res = item->val_str(&s)))
|
||||
{
|
||||
@ -285,7 +292,7 @@ void field_str::add()
|
||||
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))
|
||||
if (!(element=tree_insert(&tree, (void*) &s, 0)))
|
||||
{
|
||||
room_in_tree = 0; // Remove tree, out of RAM ?
|
||||
delete_tree(&tree);
|
||||
@ -293,7 +300,9 @@ void field_str::add()
|
||||
else
|
||||
{
|
||||
bzero((char*) &s, sizeof(s)); // Let tree handle free of this
|
||||
if ((treemem += length) > pc->max_treemem)
|
||||
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);
|
||||
@ -389,9 +398,11 @@ void field_real::add()
|
||||
room_in_tree = 0; // Remove tree, out of RAM ?
|
||||
delete_tree(&tree);
|
||||
}
|
||||
// if element->count == 1, this element can be found only once from tree
|
||||
// if element->count == 2, or more, this element is already in tree
|
||||
else if (element->count == 1 && (tree_elements++) > pc->max_tree_elements)
|
||||
/*
|
||||
if element->count == 1, this element can be found only once from tree
|
||||
if element->count == 2, or more, this element is already in tree
|
||||
*/
|
||||
else if (element->count == 1 && (tree_elements++) >= pc->max_tree_elements)
|
||||
{
|
||||
room_in_tree = 0; // Remove tree, too many elements
|
||||
delete_tree(&tree);
|
||||
@ -420,6 +431,7 @@ void field_real::add()
|
||||
}
|
||||
} // field_real::add
|
||||
|
||||
|
||||
void field_longlong::add()
|
||||
{
|
||||
char buff[MAX_FIELD_WIDTH];
|
||||
@ -442,9 +454,11 @@ void field_longlong::add()
|
||||
room_in_tree = 0; // Remove tree, out of RAM ?
|
||||
delete_tree(&tree);
|
||||
}
|
||||
// if element->count == 1, this element can be found only once from tree
|
||||
// if element->count == 2, or more, this element is already in tree
|
||||
else if (element->count == 1 && (tree_elements++) > pc->max_tree_elements)
|
||||
/*
|
||||
if element->count == 1, this element can be found only once from tree
|
||||
if element->count == 2, or more, this element is already in tree
|
||||
*/
|
||||
else if (element->count == 1 && (tree_elements++) >= pc->max_tree_elements)
|
||||
{
|
||||
room_in_tree = 0; // Remove tree, too many elements
|
||||
delete_tree(&tree);
|
||||
@ -496,9 +510,11 @@ void field_ulonglong::add()
|
||||
room_in_tree = 0; // Remove tree, out of RAM ?
|
||||
delete_tree(&tree);
|
||||
}
|
||||
// if element->count == 1, this element can be found only once from tree
|
||||
// if element->count == 2, or more, this element is already in tree
|
||||
else if (element->count == 1 && (tree_elements++) > pc->max_tree_elements)
|
||||
/*
|
||||
if element->count == 1, this element can be found only once from tree
|
||||
if element->count == 2, or more, this element is already in tree
|
||||
*/
|
||||
else if (element->count == 1 && (tree_elements++) >= pc->max_tree_elements)
|
||||
{
|
||||
room_in_tree = 0; // Remove tree, too many elements
|
||||
delete_tree(&tree);
|
||||
@ -578,14 +594,16 @@ bool analyse::end_of_records()
|
||||
func_items[8]->null_value = 1;
|
||||
else
|
||||
func_items[8]->set(res->ptr(), res->length());
|
||||
// count the dots, quotas, etc. in (ENUM("a","b","c"...))
|
||||
// if tree has been removed, don't suggest ENUM.
|
||||
// treemem is used to measure the size of tree for strings,
|
||||
// tree_elements is used to count the elements in tree in case of numbers.
|
||||
// max_treemem tells how long the string starting from ENUM("... and
|
||||
// ending to ..") shall at maximum be. If case is about numbers,
|
||||
// max_tree_elements will tell the length of the above, now
|
||||
// every number is considered as length 1
|
||||
/*
|
||||
count the dots, quotas, etc. in (ENUM("a","b","c"...))
|
||||
If tree has been removed, don't suggest ENUM.
|
||||
treemem is used to measure the size of tree for strings,
|
||||
tree_elements is used to count the elements
|
||||
max_treemem tells how long the string starting from ENUM("... and
|
||||
ending to ..") shall at maximum be. If case is about numbers,
|
||||
max_tree_elements will tell the length of the above, now
|
||||
every number is considered as length 1
|
||||
*/
|
||||
if (((*f)->treemem || (*f)->tree_elements) &&
|
||||
(*f)->tree.elements_in_tree &&
|
||||
(((*f)->treemem ? max_treemem : max_tree_elements) >
|
||||
@ -628,6 +646,7 @@ bool analyse::end_of_records()
|
||||
ans.append("DATETIME", 8);
|
||||
break;
|
||||
case FIELD_TYPE_DATE:
|
||||
case FIELD_TYPE_NEWDATE:
|
||||
ans.append("DATE", 4);
|
||||
break;
|
||||
case FIELD_TYPE_SET:
|
||||
@ -639,9 +658,6 @@ bool analyse::end_of_records()
|
||||
case FIELD_TYPE_TIME:
|
||||
ans.append("TIME", 4);
|
||||
break;
|
||||
case FIELD_TYPE_NEWDATE:
|
||||
ans.append("NEWDATE", 7);
|
||||
break;
|
||||
case FIELD_TYPE_DECIMAL:
|
||||
ans.append("DECIMAL", 7);
|
||||
// if item is FIELD_ITEM, it _must_be_ Field_num in this case
|
||||
|
Reference in New Issue
Block a user