List:Commits« Previous MessageNext Message »
From:ramil Date:January 31 2007 9:53am
Subject:bk commit into 5.1 tree (ramil:1.2434)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of ram. When ram does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-01-31 12:53:36+04:00, ramil@stripped +11 -0
  Merge mysql.com:/home/ram/work/b19690/b19690.5.0
  into  mysql.com:/home/ram/work/b19690/b19690.5.1
  MERGE: 1.1810.2485.8

  mysql-test/r/type_float.result@stripped, 2007-01-31 12:40:33+04:00,
ramil@stripped +0 -0
    Auto merged
    MERGE: 1.42.1.7

  mysql-test/t/type_float.test@stripped, 2007-01-31 12:40:33+04:00,
ramil@stripped +0 -0
    Auto merged
    MERGE: 1.29.1.3

  sql/field.cc@stripped, 2007-01-31 12:40:34+04:00, ramil@stripped +0 -0
    Auto merged
    MERGE: 1.256.1.84

  sql/field.h@stripped, 2007-01-31 12:53:34+04:00, ramil@stripped +4 -5
    merging
    MERGE: 1.153.12.12

  sql/init.cc@stripped, 2007-01-31 12:40:34+04:00, ramil@stripped +0 -0
    Auto merged
    MERGE: 1.16.1.3

  sql/item_cmpfunc.cc@stripped, 2007-01-31 12:40:34+04:00, ramil@stripped +0
-0
    Auto merged
    MERGE: 1.187.16.2

  sql/item_cmpfunc.h@stripped, 2007-01-31 12:40:34+04:00, ramil@stripped +0
-0
    Auto merged
    MERGE: 1.122.2.13

  sql/item_sum.cc@stripped, 2007-01-31 12:53:34+04:00, ramil@stripped +3 -7
    merging
    MERGE: 1.170.1.25

  sql/mysql_priv.h@stripped, 2007-01-31 12:40:34+04:00, ramil@stripped +0 -0
    Auto merged
    MERGE: 1.290.1.140

  sql/mysqld.cc@stripped, 2007-01-31 12:40:34+04:00, ramil@stripped +0 -0
    Auto merged
    MERGE: 1.439.1.151

  sql/sql_select.cc@stripped, 2007-01-31 12:53:34+04:00, ramil@stripped +1 -2
    merging
    MERGE: 1.312.1.168

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	ramil
# Host:	ramil.myoffice.izhnet.ru
# Root:	/home/ram/work/b19690/b19690.5.1/RESYNC

--- 1.368/sql/field.cc	2007-01-31 12:53:41 +04:00
+++ 1.369/sql/field.cc	2007-01-31 12:53:41 +04:00
@@ -4163,7 +4163,7 @@ int Field_double::store(double nr)
   else 
   {
     double max_value;
-    if (dec >= NOT_FIXED_DEC)
+    if (not_fixed)
     {
       max_value= DBL_MAX;
     }

--- 1.205/sql/field.h	2007-01-31 12:53:41 +04:00
+++ 1.206/sql/field.h	2007-01-31 12:53:41 +04:00
@@ -789,18 +789,27 @@ public:
 
 class Field_double :public Field_real {
 public:
+  my_bool not_fixed;
   Field_double(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
 	       uchar null_bit_arg,
 	       enum utype unireg_check_arg, const char *field_name_arg,
 	       uint8 dec_arg,bool zero_arg,bool unsigned_arg)
     :Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
                 unireg_check_arg, field_name_arg,
-                dec_arg, zero_arg, unsigned_arg)
+                dec_arg, zero_arg, unsigned_arg),
+     not_fixed(dec_arg >= NOT_FIXED_DEC)
     {}
   Field_double(uint32 len_arg, bool maybe_null_arg, const char *field_name_arg,
 	       uint8 dec_arg)
-    :Field_real((char*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0, (uint) 0,
-                NONE, field_name_arg, dec_arg, 0, 0)
+    :Field_real((char*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0,
+                NONE, field_name_arg, dec_arg, 0, 0),
+     not_fixed(dec_arg >= NOT_FIXED_DEC)
+    {}
+  Field_double(uint32 len_arg, bool maybe_null_arg, const char *field_name_arg,
+	       uint8 dec_arg, my_bool not_fixed_srg)
+    :Field_real((char*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0,
+                NONE, field_name_arg, dec_arg, 0, 0),
+     not_fixed(not_fixed_srg)
     {}
   enum_field_types type() const { return MYSQL_TYPE_DOUBLE;}
   enum ha_base_keytype key_type() const { return HA_KEYTYPE_DOUBLE; }

--- 1.19/sql/init.cc	2007-01-31 12:53:41 +04:00
+++ 1.20/sql/init.cc	2007-01-31 12:53:41 +04:00
@@ -45,5 +45,11 @@ void unireg_init(ulong options)
   {					/* It's used by filesort... */
     log_10[i]= nr ; nr*= 10.0;
   }
+  /* Make a tab of powers of 0.1 */
+  for (i= 0, nr= 0.1; i < array_elements(log_01); i++)
+  {
+    log_01[i]= nr;
+    nr*= 0.1;
+  }
   DBUG_VOID_RETURN;
 }

--- 1.235/sql/item_cmpfunc.cc	2007-01-31 12:53:41 +04:00
+++ 1.236/sql/item_cmpfunc.cc	2007-01-31 12:53:41 +04:00
@@ -470,8 +470,19 @@ int Arg_comparator::set_compare_func(Ite
     break;
   }
   case DECIMAL_RESULT:
+    break;
   case REAL_RESULT:
+  {
+    if ((*a)->decimals < NOT_FIXED_DEC && (*b)->decimals <
NOT_FIXED_DEC)
+    {
+      precision= 5 * log_01[max((*a)->decimals, (*b)->decimals)];
+      if (func == &Arg_comparator::compare_real)
+        func= &Arg_comparator::compare_real_fixed;
+      else if (func == &Arg_comparator::compare_e_real)
+        func= &Arg_comparator::compare_e_real_fixed;
+    }
     break;
+  }
   default:
     DBUG_ASSERT(0);
   }
@@ -609,6 +620,44 @@ int Arg_comparator::compare_e_decimal()
     return test((*a)->null_value && (*b)->null_value);
   return test(my_decimal_cmp(val1, val2) == 0);
 }
+
+
+int Arg_comparator::compare_real_fixed()
+{
+  /*
+    Fix yet another manifestation of Bug#2338. 'Volatile' will instruct
+    gcc to flush double values out of 80-bit Intel FPU registers before
+    performing the comparison.
+  */
+  volatile double val1, val2;
+  val1= (*a)->val_real();
+  if (!(*a)->null_value)
+  {
+    val2= (*b)->val_real();
+    if (!(*b)->null_value)
+    {
+      owner->null_value= 0;
+      if (val1 == val2 || fabs(val1 - val2) < precision)
+        return 0;
+      if (val1 < val2)
+        return -1;
+      return 1;
+    }
+  }
+  owner->null_value= 1;
+  return -1;
+}
+
+
+int Arg_comparator::compare_e_real_fixed()
+{
+  double val1= (*a)->val_real();
+  double val2= (*b)->val_real();
+  if ((*a)->null_value || (*b)->null_value)
+    return test((*a)->null_value && (*b)->null_value);
+  return test(val1 == val2 || fabs(val1 - val2) < precision);
+}
+
 
 int Arg_comparator::compare_int_signed()
 {

--- 1.139/sql/item_cmpfunc.h	2007-01-31 12:53:41 +04:00
+++ 1.140/sql/item_cmpfunc.h	2007-01-31 12:53:41 +04:00
@@ -34,6 +34,7 @@ class Arg_comparator: public Sql_alloc
   arg_cmp_func func;
   Item_bool_func2 *owner;
   Arg_comparator *comparators;   // used only for compare_row()
+  double precision;
 
 public:
   DTCollation cmp_collation;
@@ -80,6 +81,8 @@ public:
   int compare_e_int();           // compare args[0] & args[1]
   int compare_e_int_diff_signedness();
   int compare_e_row();           // compare args[0] & args[1]
+  int compare_real_fixed();
+  int compare_e_real_fixed();
 
   static arg_cmp_func comparator_matrix [5][2];
 

--- 1.211/sql/item_sum.cc	2007-01-31 12:53:41 +04:00
+++ 1.212/sql/item_sum.cc	2007-01-31 12:53:41 +04:00
@@ -400,7 +400,7 @@ Field *Item_sum::create_tmp_field(bool g
   Field *field;
   switch (result_type()) {
   case REAL_RESULT:
-    field= new Field_double(max_length, maybe_null, name, decimals);
+    field= new Field_double(max_length, maybe_null, name, decimals, TRUE);
     break;
   case INT_RESULT:
     field= new Field_longlong(max_length, maybe_null, name, unsigned_flag);
@@ -1135,7 +1135,7 @@ Field *Item_sum_avg::create_tmp_field(bo
     field= new Field_new_decimal(max_length, maybe_null, name,
                                  decimals, unsigned_flag);
   else
-    field= new Field_double(max_length, maybe_null, name, decimals);
+    field= new Field_double(max_length, maybe_null, name, decimals, TRUE);
   if (field)
     field->init(table);
   return field;
@@ -1334,7 +1334,7 @@ Field *Item_sum_variance::create_tmp_fie
     field= new Field_string(sizeof(double)*2 + sizeof(longlong), 0, name,
&my_charset_bin);
   }
   else
-    field= new Field_double(max_length, maybe_null, name, decimals);
+    field= new Field_double(max_length, maybe_null, name, decimals, TRUE);
 
   if (field != NULL)
     field->init(table);

--- 1.470/sql/mysql_priv.h	2007-01-31 12:53:41 +04:00
+++ 1.471/sql/mysql_priv.h	2007-01-31 12:53:41 +04:00
@@ -1543,6 +1543,7 @@ extern char glob_hostname[FN_REFLEN], my
 extern char pidfile_name[FN_REFLEN], system_time_zone[30], *opt_init_file;
 extern char log_error_file[FN_REFLEN], *opt_tc_log_file;
 extern double log_10[32];
+extern double log_01[32];
 extern ulonglong log_10_int[20];
 extern ulonglong keybuff_size;
 extern ulonglong thd_startup_options;

--- 1.604/sql/mysqld.cc	2007-01-31 12:53:41 +04:00
+++ 1.605/sql/mysqld.cc	2007-01-31 12:53:41 +04:00
@@ -502,6 +502,7 @@ ulong rpl_recovery_rank=0;
 const char *log_output_str= "TABLE";
 
 double log_10[32];			/* 10 potences */
+double log_01[32];
 time_t start_time;
 
 char mysql_home[FN_REFLEN], pidfile_name[FN_REFLEN], system_time_zone[30];

--- 1.480/sql/sql_select.cc	2007-01-31 12:53:41 +04:00
+++ 1.481/sql/sql_select.cc	2007-01-31 12:53:41 +04:00
@@ -8761,6 +8761,8 @@ Field *create_tmp_field_from_field(THD *
     if (org_field->type() == MYSQL_TYPE_VAR_STRING ||
         org_field->type() == MYSQL_TYPE_VARCHAR)
       table->s->db_create_options|= HA_OPTION_PACK_RECORD;
+    else if (org_field->type() == FIELD_TYPE_DOUBLE)
+      ((Field_double *) new_field)->not_fixed= TRUE;
   }
   return new_field;
 }
@@ -8801,7 +8803,7 @@ static Field *create_tmp_field_from_item
   switch (item->result_type()) {
   case REAL_RESULT:
     new_field= new Field_double(item->max_length, maybe_null,
-                                item->name, item->decimals);
+                                item->name, item->decimals, TRUE);
     break;
   case INT_RESULT:
     /* Select an integer type with the minimal fit precision */

--- 1.51/mysql-test/r/type_float.result	2007-01-31 12:53:41 +04:00
+++ 1.52/mysql-test/r/type_float.result	2007-01-31 12:53:41 +04:00
@@ -268,6 +268,77 @@ select 1e-308, 1.00000001e-300, 10000000
 select 10e307;
 10e307
 1e+308
+create table t1(a int, b double(8, 2));
+insert into t1 values
+(1, 28.50), (1, 121.85), (1, 157.23), (1, 1351.00), (1, -1965.35), (1, 81.75), 
+(1, 217.08), (1, 7.94), (4, 96.07), (4, 6404.65), (4, -6500.72), (2, 100.00),
+(5, 5.00), (5, -2104.80), (5, 2033.80), (5, 0.07), (5, 65.93),
+(3, -4986.24), (3, 5.00), (3, 4857.34), (3, 123.74), (3,  0.16),
+(6, -1695.31), (6, 1003.77), (6, 499.72), (6, 191.82);
+explain select sum(b) s from t1 group by a;
+id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
+1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	26	Using temporary; Using filesort
+select sum(b) s from t1 group by a;
+s
+0.00
+100.00
+0.00
+-0.00
+-0.00
+0.00
+select sum(b) s from t1 group by a having s <> 0;
+s
+100.00
+select sum(b) s from t1 group by a having s <> 0 order by s;
+s
+100.00
+select sum(b) s from t1 group by a having s <=> 0;
+s
+0.00
+0.00
+-0.00
+-0.00
+0.00
+select sum(b) s from t1 group by a having s <=> 0 order by s;
+s
+-0.00
+-0.00
+0.00
+0.00
+0.00
+alter table t1 add key (a, b);
+explain select sum(b) s from t1 group by a;
+id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
+1	SIMPLE	t1	index	NULL	a	14	NULL	26	Using index
+select sum(b) s from t1 group by a;
+s
+0.00
+100.00
+0.00
+-0.00
+0.00
+0.00
+select sum(b) s from t1 group by a having s <> 0;
+s
+100.00
+select sum(b) s from t1 group by a having s <> 0 order by s;
+s
+100.00
+select sum(b) s from t1 group by a having s <=> 0;
+s
+0.00
+0.00
+-0.00
+0.00
+0.00
+select sum(b) s from t1 group by a having s <=> 0 order by s;
+s
+-0.00
+0.00
+0.00
+0.00
+0.00
+drop table t1;
 End of 4.1 tests
 create table t1 (s1 float(0,2));
 ERROR 42000: For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column
's1').

--- 1.32/mysql-test/t/type_float.test	2007-01-31 12:53:41 +04:00
+++ 1.33/mysql-test/t/type_float.test	2007-01-31 12:53:41 +04:00
@@ -187,6 +187,31 @@ select 1e-308, 1.00000001e-300, 10000000
 # check if overflows are detected correctly
 select 10e307;
 
+#
+# Bug #19690: ORDER BY eliminates rows from the result
+#
+create table t1(a int, b double(8, 2));
+insert into t1 values
+(1, 28.50), (1, 121.85), (1, 157.23), (1, 1351.00), (1, -1965.35), (1, 81.75), 
+(1, 217.08), (1, 7.94), (4, 96.07), (4, 6404.65), (4, -6500.72), (2, 100.00),
+(5, 5.00), (5, -2104.80), (5, 2033.80), (5, 0.07), (5, 65.93),
+(3, -4986.24), (3, 5.00), (3, 4857.34), (3, 123.74), (3,  0.16),
+(6, -1695.31), (6, 1003.77), (6, 499.72), (6, 191.82);
+explain select sum(b) s from t1 group by a;
+select sum(b) s from t1 group by a;
+select sum(b) s from t1 group by a having s <> 0;
+select sum(b) s from t1 group by a having s <> 0 order by s;
+select sum(b) s from t1 group by a having s <=> 0;
+select sum(b) s from t1 group by a having s <=> 0 order by s;
+alter table t1 add key (a, b);
+explain select sum(b) s from t1 group by a;
+select sum(b) s from t1 group by a;
+select sum(b) s from t1 group by a having s <> 0;
+select sum(b) s from t1 group by a having s <> 0 order by s;
+select sum(b) s from t1 group by a having s <=> 0;
+select sum(b) s from t1 group by a having s <=> 0 order by s;
+drop table t1;
+
 --echo End of 4.1 tests
 
 #
Thread
bk commit into 5.1 tree (ramil:1.2434)ramil31 Jan