Commit 72f44daf authored by unknown's avatar unknown
Browse files

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
parent d69a5630
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
t1.i	1	7	1	1	0	0	4.0000	2.2361	ENUM('1','3','5','7') NOT NULL
t1.j	2	8	1	1	0	0	5.0000	2.2361	ENUM('2','4','6','8') NOT NULL
t1.empty_string			0	0	4	0	0.0000	NULL	ENUM('') NOT NULL
t1.bool	N	Y	1	1	0	0	1.0000	NULL	ENUM('N','Y') NOT NULL
t1.d		2002-03-04	10	10	0	0	10.0000	NULL	ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
t1.i	1	7	1	1	0	0	4.0000	2.2361	TINYINT(1) UNSIGNED NOT NULL
t1.j	2	8	1	1	0	0	5.0000	2.2361	TINYINT(1) UNSIGNED NOT NULL
t1.empty_string			0	0	4	0	0.0000	NULL	CHAR(0) NOT NULL
t1.bool	N	Y	1	1	0	0	1.0000	NULL	ENUM('N','Y') NOT NULL
t1.d		2002-03-04	10	10	0	0	10.0000	NULL	DATE NOT NULL
Field_name	Min_value	Max_value	Min_length	Max_length	Empties_or_zeros	Nulls	Avg_value_or_avg_length	Std	Optimal_fieldtype
t1.i	1	7	1	1	0	0	4.0000	2.2361	ENUM('1','3','5','7') NOT NULL
t1.j	2	8	1	1	0	0	5.0000	2.2361	ENUM('2','4','6','8') NOT NULL
t1.empty_string			0	0	4	0	0.0000	NULL	ENUM('') NOT NULL
t1.bool	N	Y	1	1	0	0	1.0000	NULL	ENUM('N','Y') NOT NULL
t1.d		2002-03-04	10	10	0	0	10.0000	NULL	ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
+3 −2
Original line number Diff line number Diff line
@@ -2,9 +2,10 @@
# Test of procedure analyse
#

create table t1 (i int, j int);
insert into t1 values (1,2), (3,4), (5,6), (7,8);
create table t1 (i int, j int, empty_string char(10), bool char(1), d date);
insert into t1 values (1,2,"","Y","2002-03-03"), (3,4,"","N","2002-03-04"), (5,6,"","Y","2002-03-04"), (7,8,"","N","2002-03-05");
select * from t1 procedure analyse();
select * from t1 procedure analyse(2);
create table t2 select * from t1 procedure analyse();
select * from t2;
drop table t1,t2;
+48 −32
Original line number Diff line number Diff line
@@ -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