MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:eugene Date:May 29 2007 8:33pm
Subject:bk commit into 5.0 tree (evgen:1.2504) BUG#28450
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of evgen. When evgen 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-05-30 00:33:12+04:00, evgen@stripped +4 -0
  Bug#28450: The Item_date_add_interval in select list may fail the field 
  type assertion.
  
  The bug was introduced by the patch for bug #16377.
  The "+ INTERVAL" (Item_date_add_interval) function detects its result type
  by the type of its first argument. But in some cases it returns STRING
  as the result type. This happens when, for example, the first argument is a 
  DATE represented as string. All this makes the get_datetime_value()
  function misinterpret such result and return wrong DATE/DATETIME value.
  To avoid such cases in the fix for #16377 the code that detects correct result
  field type on the first execution was added to the
  Item_date_add_interval::get_date() function. Due to this the result
  field type of the Item_date_add_interval item stored by the send_fields()
  function differs from item's result field type at the moment when
  the item is actually sent. It causes an assertion failure.
  
  Now the get_datetime_value() detects that the DATE value is returned by
  some item not only by checking the result field type but also by comparing
  the returned value with the 100000000L constant - any DATE value should be
  less than this value.
  Removed result field type adjusting code from the
  Item_date_add_interval::get_date() function.

  mysql-test/r/func_date_add.result@stripped, 2007-05-30 00:32:57+04:00, evgen@stripped +11 -0
    Added a test case for the bug#28450: The Item_date_add_interval in select list may fail the field
    type assertion.

  mysql-test/t/func_date_add.test@stripped, 2007-05-30 00:32:58+04:00, evgen@stripped +10 -0
    Added a test case for the bug#28450: The Item_date_add_interval in select list may fail the field
    type assertion.

  sql/item_cmpfunc.cc@stripped, 2007-05-30 00:32:55+04:00, evgen@stripped +6 -1
    Bug#28450: The Item_date_add_interval in select list may fail the field 
    type assertion.
    Now the get_datetime_value() detects that the DATE value is returned by
    some item not only by checking the result field type but also by comparing
    the returned value with the 100000000L constant - any DATE value should be
    less than this value.

  sql/item_timefunc.cc@stripped, 2007-05-30 00:32:57+04:00, evgen@stripped +0 -21
    Bug#28450: The Item_date_add_interval in select list may fail the field 
    type assertion.
    Removed result field type adjusting code from the
    Item_date_add_interval::get_date() function.

# 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:	evgen
# Host:	moonbone.local
# Root:	/mnt/gentoo64/work/28450-bug-5.0-opt-mysql

--- 1.253/sql/item_cmpfunc.cc	2007-05-21 22:50:02 +04:00
+++ 1.254/sql/item_cmpfunc.cc	2007-05-30 00:32:55 +04:00
@@ -766,7 +766,12 @@ get_datetime_value(THD *thd, Item ***ite
   {
     value= item->val_int();
     *is_null= item->null_value;
-    if (item->field_type() == MYSQL_TYPE_DATE)
+    /*
+      Item_date_add_interval may return MYSQL_TYPE_STRING as the result
+      field type. To detect that the DATE value has been returned we
+      compare it with 1000000L - any DATE value should be less than it.
+    */
+    if (item->field_type() == MYSQL_TYPE_DATE || value < 100000000L)
       value*= 1000000L;
   }
   else

--- 1.143/sql/item_timefunc.cc	2007-05-16 12:44:40 +04:00
+++ 1.144/sql/item_timefunc.cc	2007-05-30 00:32:57 +04:00
@@ -2180,27 +2180,6 @@ bool Item_date_add_interval::get_date(MY
   default:
     goto null_date;
   }
-
-  /* Adjust cached_field_type according to the detected type. */
-  if (cached_field_type == MYSQL_TYPE_STRING)
-  {
-    switch (ltime->time_type)
-    {
-    case MYSQL_TIMESTAMP_DATE:
-      cached_field_type= MYSQL_TYPE_DATE;
-      break;
-    case MYSQL_TIMESTAMP_DATETIME:
-      cached_field_type= MYSQL_TYPE_DATETIME;
-      break;
-    case MYSQL_TIMESTAMP_TIME:
-      cached_field_type= MYSQL_TYPE_TIME;
-      break;
-    default:
-      /* Shouldn't get here. */
-      DBUG_ASSERT(0);
-      break;
-    }
-  }
   return 0;					// Ok
 
 invalid_date:

--- 1.10/mysql-test/r/func_date_add.result	2006-10-02 14:36:56 +04:00
+++ 1.11/mysql-test/r/func_date_add.result	2007-05-30 00:32:57 +04:00
@@ -84,4 +84,15 @@ CAST('2006-09-26' AS DATE) + INTERVAL 1 
 SELECT CAST('2006-09-26' AS DATE) + INTERVAL 1 WEEK;
 CAST('2006-09-26' AS DATE) + INTERVAL 1 WEEK
 2006-10-03
+create table t1 (a int, b varchar(10));
+insert into t1 values (1, '2001-01-01'),(2, '2002-02-02');
+select '2007-01-01' + interval a day from t1;
+'2007-01-01' + interval a day
+2007-01-02
+2007-01-03
+select b + interval a day from t1;
+b + interval a day
+2001-01-02
+2002-02-04
+drop table t1;
 End of 5.0 tests

--- 1.9/mysql-test/t/func_date_add.test	2006-10-02 14:36:57 +04:00
+++ 1.10/mysql-test/t/func_date_add.test	2007-05-30 00:32:58 +04:00
@@ -77,4 +77,14 @@ SELECT CAST('2006-09-26' AS DATE) + INTE
 SELECT CAST('2006-09-26' AS DATE) + INTERVAL 1 YEAR;
 SELECT CAST('2006-09-26' AS DATE) + INTERVAL 1 WEEK;
 
+#
+# Bug#28450: The Item_date_add_interval in select list may fail the field 
+#            type assertion.
+#
+create table t1 (a int, b varchar(10));
+insert into t1 values (1, '2001-01-01'),(2, '2002-02-02'); 
+select '2007-01-01' + interval a day from t1;
+select b + interval a day from t1;
+drop table t1;
+
 --echo End of 5.0 tests
Thread
bk commit into 5.0 tree (evgen:1.2504) BUG#28450eugene29 May