summaryrefslogtreecommitdiff
path: root/sql/sql_analyse.cc
diff options
context:
space:
mode:
authorunknown <monty@mashka.mysql.fi>2003-03-12 16:43:01 +0200
committerunknown <monty@mashka.mysql.fi>2003-03-12 16:43:01 +0200
commit72f44dafe6ed6580a1b5775a1d0c11ff84722445 (patch)
treee5698ae6de3cef3f86bc74d7ad31b8bd885f71eb /sql/sql_analyse.cc
parentd69a5630ff30564d497bf1dc48e5f50b7d226cfc (diff)
downloadmariadb-git-72f44dafe6ed6580a1b5775a1d0c11ff84722445.tar.gz
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
Diffstat (limited to 'sql/sql_analyse.cc')
-rw-r--r--sql/sql_analyse.cc80
1 files changed, 48 insertions, 32 deletions
diff --git a/sql/sql_analyse.cc b/sql/sql_analyse.cc
index 6227b1251db..80a35120f45 100644
--- a/sql/sql_analyse.cc
+++ b/sql/sql_analyse.cc
@@ -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