List:Commits« Previous MessageNext Message »
From:holyfoot Date:November 1 2006 12:21pm
Subject:bk commit into 5.1 tree (holyfoot:1.2323)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of hf. When hf 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, 2006-11-01 16:20:53+04:00, holyfoot@deer.(none) +12 -0
  Merge mysql.com:/home/hf/work/19491/my50-19491
  into  mysql.com:/home/hf/work/19491/my51-19491
  MERGE: 1.1810.2211.2

  mysql-test/r/type_datetime.result@stripped, 2006-11-01 15:49:07+04:00, holyfoot@deer.(none) +0 -0
    Auto merged
    MERGE: 1.30.1.3

  mysql-test/r/type_newdecimal.result@stripped, 2006-11-01 16:17:08+04:00, holyfoot@deer.(none) +8 -8
    merging
    MERGE: 1.36.1.7

  mysql-test/t/type_datetime.test@stripped, 2006-11-01 15:49:07+04:00, holyfoot@deer.(none) +0 -0
    Auto merged
    MERGE: 1.18.1.2

  mysql-test/t/type_newdecimal.test@stripped, 2006-11-01 16:17:31+04:00, holyfoot@deer.(none) +7 -8
    merging
    MERGE: 1.33.1.6

  sql/field.cc@stripped, 2006-11-01 15:49:07+04:00, holyfoot@deer.(none) +0 -0
    Auto merged
    MERGE: 1.256.1.71

  sql/field.h@stripped, 2006-11-01 15:49:07+04:00, holyfoot@deer.(none) +0 -0
    Auto merged
    MERGE: 1.153.12.5

  sql/item.cc@stripped, 2006-11-01 15:49:07+04:00, holyfoot@deer.(none) +0 -0
    Auto merged
    MERGE: 1.113.1.124

  sql/item.h@stripped, 2006-11-01 15:49:08+04:00, holyfoot@deer.(none) +0 -0
    Auto merged
    MERGE: 1.183.1.27

  sql/item_timefunc.cc@stripped, 2006-11-01 15:49:08+04:00, holyfoot@deer.(none) +0 -0
    Auto merged
    MERGE: 1.100.1.27

  sql/item_timefunc.h@stripped, 2006-11-01 16:20:43+04:00, holyfoot@deer.(none) +12 -5
    merging
    MERGE: 1.63.1.6

  sql/my_decimal.cc@stripped, 2006-11-01 15:49:08+04:00, holyfoot@deer.(none) +0 -0
    Auto merged
    MERGE: 1.11.1.1

  sql/my_decimal.h@stripped, 2006-11-01 15:49:08+04:00, holyfoot@deer.(none) +0 -0
    Auto merged
    MERGE: 1.10.1.1

# 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:	holyfoot
# Host:	deer.(none)
# Root:	/home/hf/work/19491/my51-19491/RESYNC

--- 1.346/sql/field.cc	2006-11-01 16:21:02 +04:00
+++ 1.347/sql/field.cc	2006-11-01 16:21:02 +04:00
@@ -2477,6 +2477,13 @@ int Field_new_decimal::store_decimal(con
 }
 
 
+int Field_new_decimal::store_time(TIME *ltime, timestamp_type t_type)
+{
+    my_decimal decimal_value;
+    return store_value(date2my_decimal(ltime, &decimal_value));
+}
+
+
 double Field_new_decimal::val_real(void)
 {
   ASSERT_COLUMN_MARKED_FOR_READ;

--- 1.190/sql/field.h	2006-11-01 16:21:02 +04:00
+++ 1.191/sql/field.h	2006-11-01 16:21:02 +04:00
@@ -555,6 +555,7 @@ public:
   int  store(const char *to, uint length, CHARSET_INFO *charset);
   int  store(double nr);
   int  store(longlong nr, bool unsigned_val);
+  int store_time(TIME *ltime, timestamp_type t_type);
   int  store_decimal(const my_decimal *);
   double val_real(void);
   longlong val_int(void);

--- 1.215/sql/item.cc	2006-11-01 16:21:02 +04:00
+++ 1.216/sql/item.cc	2006-11-01 16:21:02 +04:00
@@ -269,6 +269,34 @@ my_decimal *Item::val_decimal_from_strin
 }
 
 
+my_decimal *Item::val_decimal_from_date(my_decimal *decimal_value)
+{
+  DBUG_ASSERT(fixed == 1);
+  TIME ltime;
+  longlong date;
+  if (get_date(&ltime, TIME_FUZZY_DATE))
+  {
+    my_decimal_set_zero(decimal_value);
+    return 0;
+  }
+  return date2my_decimal(&ltime, decimal_value);
+}
+
+
+my_decimal *Item::val_decimal_from_time(my_decimal *decimal_value)
+{
+  DBUG_ASSERT(fixed == 1);
+  TIME ltime;
+  longlong date;
+  if (get_time(&ltime))
+  {
+    my_decimal_set_zero(decimal_value);
+    return 0;
+  }
+  return date2my_decimal(&ltime, decimal_value);
+}
+
+
 double Item::val_real_from_decimal()
 {
   /* Note that fix_fields may not be called for Item_avg_field items */
@@ -290,6 +318,25 @@ longlong Item::val_int_from_decimal()
     return 0;
   my_decimal2int(E_DEC_FATAL_ERROR, dec_val, unsigned_flag, &result);
   return result;
+}
+
+int Item::save_time_in_field(Field *field)
+{
+  TIME ltime;
+  if (get_time(&ltime))
+    return set_field_to_null(field);
+  field->set_notnull();
+  return field->store_time(&ltime, MYSQL_TIMESTAMP_TIME);
+}
+
+
+int Item::save_date_in_field(Field *field)
+{
+  TIME ltime;
+  if (get_date(&ltime, TIME_FUZZY_DATE))
+    return set_field_to_null(field);
+  field->set_notnull();
+  return field->store_time(&ltime, MYSQL_TIMESTAMP_DATETIME);
 }
 
 

--- 1.212/sql/item.h	2006-11-01 16:21:02 +04:00
+++ 1.213/sql/item.h	2006-11-01 16:21:02 +04:00
@@ -658,8 +658,13 @@ public:
   my_decimal *val_decimal_from_real(my_decimal *decimal_value);
   my_decimal *val_decimal_from_int(my_decimal *decimal_value);
   my_decimal *val_decimal_from_string(my_decimal *decimal_value);
+  my_decimal *val_decimal_from_date(my_decimal *decimal_value);
+  my_decimal *val_decimal_from_time(my_decimal *decimal_value);
   longlong val_int_from_decimal();
   double val_real_from_decimal();
+
+  int save_time_in_field(Field *field);
+  int save_date_in_field(Field *field);
 
   virtual Field *get_tmp_table_field() { return 0; }
   /* This is also used to create fields in CREATE ... SELECT: */

--- 1.137/sql/item_timefunc.cc	2006-11-01 16:21:02 +04:00
+++ 1.138/sql/item_timefunc.cc	2006-11-01 16:21:02 +04:00
@@ -1270,17 +1270,6 @@ String *Item_date::val_str(String *str)
 }
 
 
-int Item_date::save_in_field(Field *field, bool no_conversions)
-{
-  TIME ltime;
-  if (get_date(&ltime, TIME_FUZZY_DATE))
-    return set_field_to_null(field);
-  field->set_notnull();
-  field->store_time(&ltime, MYSQL_TIMESTAMP_DATE);
-  return 0;
-}
-
-
 longlong Item_date::val_int()
 {
   DBUG_ASSERT(fixed == 1);

--- 1.75/sql/item_timefunc.h	2006-11-01 16:21:02 +04:00
+++ 1.76/sql/item_timefunc.h	2006-11-01 16:21:02 +04:00
@@ -366,6 +366,15 @@ public:
     return tmp_table_field_from_field_type(table, 0);
   }
   bool result_as_longlong() { return TRUE; }
+  my_decimal *val_decimal(my_decimal *decimal_value)
+  {
+    DBUG_ASSERT(fixed == 1);
+    return  val_decimal_from_date(decimal_value);
+  }
+  int save_in_field(Field *field, bool no_conversions)
+  {
+    return save_date_in_field(field);
+  }
 };
 
 
@@ -382,21 +391,57 @@ public:
     return tmp_table_field_from_field_type(table, 0);
   }
   bool result_as_longlong() { return TRUE; }
+  my_decimal *val_decimal(my_decimal *decimal_value)
+  {
+    DBUG_ASSERT(fixed == 1);
+    return  val_decimal_from_date(decimal_value);
+  }
+  int save_in_field(Field *field, bool no_conversions)
+  {
+    return save_date_in_field(field);
+  }
+};
+
+
+class Item_str_timefunc :public Item_str_func
+{
+public:
+  Item_str_timefunc() :Item_str_func() {}
+  Item_str_timefunc(Item *a) :Item_str_func(a) {}
+  Item_str_timefunc(Item *a,Item *b) :Item_str_func(a,b) {}
+  Item_str_timefunc(Item *a, Item *b, Item *c) :Item_str_func(a, b ,c) {}
+  enum_field_types field_type() const { return MYSQL_TYPE_TIME; }
+  void fix_length_and_dec()
+  {
+    decimals=0;
+    max_length=MAX_TIME_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
+  }
+  Field *tmp_table_field(TABLE *t_arg)
+  {
+    return (new Field_time(maybe_null, name, t_arg, &my_charset_bin));
+  }
+  my_decimal *val_decimal(my_decimal *decimal_value)
+  {
+    DBUG_ASSERT(fixed == 1);
+    return  val_decimal_from_time(decimal_value);
+  }
+  int save_in_field(Field *field, bool no_conversions)
+  {
+    return save_time_in_field(field);
+  }
 };
 
 
 /* Abstract CURTIME function. Children should define what time zone is used */
 
-class Item_func_curtime :public Item_func
+class Item_func_curtime :public Item_str_timefunc
 {
   longlong value;
   char buff[9*2+32];
   uint buff_length;
 public:
-  Item_func_curtime() :Item_func() {}
-  Item_func_curtime(Item *a) :Item_func(a) {}
-  enum Item_result result_type () const { return STRING_RESULT; }
-  enum_field_types field_type() const { return MYSQL_TYPE_TIME; }
+  Item_func_curtime() :Item_str_timefunc() {}
+  Item_func_curtime(Item *a) :Item_str_timefunc(a) {}
   double val_real() { DBUG_ASSERT(fixed == 1); return (double) value; }
   longlong val_int() { DBUG_ASSERT(fixed == 1); return value; }
   String *val_str(String *str);
@@ -626,10 +671,10 @@ class Item_func_convert_tz :public Item_
 };
 
 
-class Item_func_sec_to_time :public Item_str_func
+class Item_func_sec_to_time :public Item_str_timefunc
 {
 public:
-  Item_func_sec_to_time(Item *item) :Item_str_func(item) {}
+  Item_func_sec_to_time(Item *item) :Item_str_timefunc(item) {}
   double val_real()
   {
     DBUG_ASSERT(fixed == 1);
@@ -639,17 +684,12 @@ public:
   String *val_str(String *);
   void fix_length_and_dec()
   { 
+    Item_str_timefunc::fix_length_and_dec();
     collation.set(&my_charset_bin);
     maybe_null=1;
     decimals= DATETIME_DEC;
-    max_length=MAX_TIME_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
   }
-  enum_field_types field_type() const { return MYSQL_TYPE_TIME; }
   const char *func_name() const { return "sec_to_time"; }
-  Field *tmp_table_field(TABLE *table)
-  {
-    return tmp_table_field_from_field_type(table, 0);
-  }
   bool result_as_longlong() { return TRUE; }
   bool check_partition_func_processor(byte *int_arg) {return FALSE;}
 };
@@ -774,6 +814,15 @@ public:
   }
   bool result_as_longlong() { return TRUE; }
   longlong val_int();
+  my_decimal *val_decimal(my_decimal *decimal_value)
+  {
+    DBUG_ASSERT(fixed == 1);
+    return  val_decimal_from_date(decimal_value);
+  }
+  int save_in_field(Field *field, bool no_conversions)
+  {
+    return save_date_in_field(field);
+  }
 };
 
 
@@ -792,6 +841,15 @@ public:
   }
   bool result_as_longlong() { return TRUE; }
   longlong val_int();
+  my_decimal *val_decimal(my_decimal *decimal_value)
+  {
+    DBUG_ASSERT(fixed == 1);
+    return  val_decimal_from_time(decimal_value);
+  }
+  int save_in_field(Field *field, bool no_conversions)
+  {
+    return save_time_in_field(field);
+  }
 };
 
 
@@ -809,12 +867,21 @@ public:
   }
   bool result_as_longlong() { return TRUE; }
   longlong val_int();
+  my_decimal *val_decimal(my_decimal *decimal_value)
+  {
+    DBUG_ASSERT(fixed == 1);
+    return  val_decimal_from_date(decimal_value);
+  }
+  int save_in_field(Field *field, bool no_conversions)
+  {
+    return save_date_in_field(field);
+  }
 };
 
-class Item_func_makedate :public Item_str_func
+class Item_func_makedate :public Item_date_func
 {
 public:
-  Item_func_makedate(Item *a,Item *b) :Item_str_func(a,b) {}
+  Item_func_makedate(Item *a,Item *b) :Item_date_func(a,b) {}
   String *val_str(String *str);
   const char *func_name() const { return "makedate"; }
   enum_field_types field_type() const { return MYSQL_TYPE_DATE; }
@@ -827,9 +894,17 @@ public:
   {
     return tmp_table_field_from_field_type(table, 0);
   }
-  bool result_as_longlong() { return TRUE; }
   longlong val_int();
   bool check_partition_func_processor(byte *int_arg) {return FALSE;}
+  my_decimal *val_decimal(my_decimal *decimal_value)
+  {
+    DBUG_ASSERT(fixed == 1);
+    return  val_decimal_from_date(decimal_value);
+  }
+  int save_in_field(Field *field, bool no_conversions)
+  {
+    return save_date_in_field(field);
+  }
 };
 
 
@@ -853,33 +928,44 @@ public:
   void print(String *str);
   const char *func_name() const { return "add_time"; }
   bool check_partition_func_processor(byte *int_arg) {return FALSE;}
+  my_decimal *val_decimal(my_decimal *decimal_value)
+  {
+    DBUG_ASSERT(fixed == 1);
+    if (cached_field_type == MYSQL_TYPE_TIME)
+      return  val_decimal_from_time(decimal_value);
+    if (cached_field_type == MYSQL_TYPE_DATETIME)
+      return  val_decimal_from_date(decimal_value);
+    return Item_str_func::val_decimal(decimal_value);
+  }
+  int save_in_field(Field *field, bool no_conversions)
+  {
+    if (cached_field_type == MYSQL_TYPE_TIME)
+      return save_time_in_field(field);
+    if (cached_field_type == MYSQL_TYPE_DATETIME)
+      return save_date_in_field(field);
+    return Item_str_func::save_in_field(field, no_conversions);
+  }
 };
 
-class Item_func_timediff :public Item_str_func
+class Item_func_timediff :public Item_str_timefunc
 {
 public:
   Item_func_timediff(Item *a, Item *b)
-    :Item_str_func(a, b) {}
+    :Item_str_timefunc(a, b) {}
   String *val_str(String *str);
   const char *func_name() const { return "timediff"; }
-  enum_field_types field_type() const { return MYSQL_TYPE_TIME; }
   void fix_length_and_dec()
   {
-    decimals=0;
-    max_length=MAX_TIME_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
+    Item_str_timefunc::fix_length_and_dec();
     maybe_null= 1;
   }
-  Field *tmp_table_field(TABLE *table)
-  {
-    return tmp_table_field_from_field_type(table, 0);
-  }
 };
 
-class Item_func_maketime :public Item_str_func
+class Item_func_maketime :public Item_str_timefunc
 {
 public:
   Item_func_maketime(Item *a, Item *b, Item *c)
-    :Item_str_func(a, b ,c) {}
+    :Item_str_timefunc(a, b ,c) {}
   String *val_str(String *str);
   const char *func_name() const { return "maketime"; }
   enum_field_types field_type() const { return MYSQL_TYPE_TIME; }
@@ -887,10 +973,6 @@ public:
   {
     decimals=0;
     max_length=MAX_TIME_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
-  }
-  Field *tmp_table_field(TABLE *table)
-  {
-    return tmp_table_field_from_field_type(table, 0);
   }
   bool check_partition_func_processor(byte *int_arg) {return FALSE;}
 };

--- 1.49/mysql-test/r/type_newdecimal.result	2006-11-01 16:21:02 +04:00
+++ 1.50/mysql-test/r/type_newdecimal.result	2006-11-01 16:21:02 +04:00
@@ -1449,3 +1449,11 @@ Error	1264	Out of range value for column
 select cast(98.6 as decimal(2,0));
 cast(98.6 as decimal(2,0))
 99
+create table t1(f1 decimal(20,6));
+insert into t1 values (CAST('10:11:12' AS date) + interval 14 microsecond);
+insert into t1 values (CAST('10:11:12' AS time));
+select * from t1;
+f1
+20101112000000.000014
+101112.000000
+drop table t1;

--- 1.42/mysql-test/t/type_newdecimal.test	2006-11-01 16:21:02 +04:00
+++ 1.43/mysql-test/t/type_newdecimal.test	2006-11-01 16:21:02 +04:00
@@ -1130,3 +1130,10 @@ select cast(-3.4 as decimal(2,1));
 select cast(99.6 as decimal(2,0));
 select cast(-13.4 as decimal(2,1));
 select cast(98.6 as decimal(2,0));
+
+create table t1(f1 decimal(20,6));
+insert into t1 values (CAST('10:11:12' AS date) + interval 14 microsecond);
+insert into t1 values (CAST('10:11:12' AS time));
+select * from t1;
+drop table t1;
+

--- 1.12/sql/my_decimal.cc	2006-11-01 16:21:02 +04:00
+++ 1.13/sql/my_decimal.cc	2006-11-01 16:21:02 +04:00
@@ -15,6 +15,8 @@
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 
 #include "mysql_priv.h"
+#include <time.h>
+
 
 #ifndef MYSQL_CLIENT
 /*
@@ -187,6 +189,23 @@ int str2my_decimal(uint mask, const char
   }
   check_result_and_overflow(mask, err, decimal_value);
   return err;
+}
+
+
+my_decimal *date2my_decimal(TIME *ltime, my_decimal *dec)
+{
+  longlong date;
+  date = (ltime->year*100L + ltime->month)*100L + ltime->day;
+  if (ltime->time_type > MYSQL_TIMESTAMP_DATE)
+    date= ((date*100L + ltime->hour)*100L+ ltime->minute)*100L + ltime->second;
+  if (int2my_decimal(E_DEC_FATAL_ERROR, date, FALSE, dec))
+    return dec;
+  if (ltime->second_part)
+  {
+    dec->buf[(dec->intg-1) / 9 + 1]= ltime->second_part * 1000;
+    dec->frac= 6;
+  }
+  return dec;
 }
 
 

--- 1.11/sql/my_decimal.h	2006-11-01 16:21:02 +04:00
+++ 1.12/sql/my_decimal.h	2006-11-01 16:21:02 +04:00
@@ -295,7 +295,12 @@ int string2my_decimal(uint mask, const S
 {
   return str2my_decimal(mask, str->ptr(), str->length(), str->charset(), d);
 }
-#endif
+
+
+my_decimal *date2my_decimal(TIME *ltime, my_decimal *dec);
+
+
+#endif /*defined(MYSQL_SERVER) || defined(EMBEDDED_LIBRARY) */
 
 inline
 int double2my_decimal(uint mask, double val, my_decimal *d)

--- 1.35/mysql-test/r/type_datetime.result	2006-11-01 16:21:02 +04:00
+++ 1.36/mysql-test/r/type_datetime.result	2006-11-01 16:21:02 +04:00
@@ -179,3 +179,15 @@ a
 2006-06-06 15:55:55
 DROP PREPARE s;
 DROP TABLE t1;
+SELECT CAST(CAST('2006-08-10' AS DATE) AS DECIMAL(20,6));
+CAST(CAST('2006-08-10' AS DATE) AS DECIMAL(20,6))
+20060810.000000
+SELECT CAST(CAST('2006-08-10 10:11:12' AS DATETIME) AS DECIMAL(20,6));
+CAST(CAST('2006-08-10 10:11:12' AS DATETIME) AS DECIMAL(20,6))
+20060810101112.000000
+SELECT CAST(CAST('2006-08-10 10:11:12' AS DATETIME) + INTERVAL 14 MICROSECOND AS DECIMAL(20,6));
+CAST(CAST('2006-08-10 10:11:12' AS DATETIME) + INTERVAL 14 MICROSECOND AS DECIMAL(20,6))
+20060810101112.000014
+SELECT CAST(CAST('10:11:12.098700' AS TIME) AS DECIMAL(20,6));
+CAST(CAST('10:11:12.098700' AS TIME) AS DECIMAL(20,6))
+101112.098700

--- 1.20/mysql-test/t/type_datetime.test	2006-11-01 16:21:02 +04:00
+++ 1.21/mysql-test/t/type_datetime.test	2006-11-01 16:21:02 +04:00
@@ -125,3 +125,13 @@ PREPARE s FROM 'SELECT a FROM t1 WHERE a
 EXECUTE s;
 DROP PREPARE s;
 DROP TABLE t1;
+
+
+#
+# Bug 19491 (CAST DATE AS DECIMAL returns incorrect result
+#
+SELECT CAST(CAST('2006-08-10' AS DATE) AS DECIMAL(20,6));
+SELECT CAST(CAST('2006-08-10 10:11:12' AS DATETIME) AS DECIMAL(20,6));
+SELECT CAST(CAST('2006-08-10 10:11:12' AS DATETIME) + INTERVAL 14 MICROSECOND AS DECIMAL(20,6));
+SELECT CAST(CAST('10:11:12.098700' AS TIME) AS DECIMAL(20,6));
+
Thread
bk commit into 5.1 tree (holyfoot:1.2323)holyfoot1 Nov