Loading mysql-test/r/func_date_add.result +11 −0 Original line number Diff line number Diff line Loading @@ -84,4 +84,15 @@ CAST('2006-09-26' AS DATE) + INTERVAL 1 YEAR 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 mysql-test/t/func_date_add.test +10 −0 Original line number Diff line number Diff line Loading @@ -77,4 +77,14 @@ SELECT CAST('2006-09-26' AS DATE) + INTERVAL 1 MONTH; 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 sql/item_cmpfunc.cc +6 −1 Original line number Diff line number Diff line Loading @@ -766,7 +766,12 @@ get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg, { 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 Loading sql/item_timefunc.cc +0 −21 Original line number Diff line number Diff line Loading @@ -2180,27 +2180,6 @@ bool Item_date_add_interval::get_date(MYSQL_TIME *ltime, uint fuzzy_date) 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: Loading Loading
mysql-test/r/func_date_add.result +11 −0 Original line number Diff line number Diff line Loading @@ -84,4 +84,15 @@ CAST('2006-09-26' AS DATE) + INTERVAL 1 YEAR 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
mysql-test/t/func_date_add.test +10 −0 Original line number Diff line number Diff line Loading @@ -77,4 +77,14 @@ SELECT CAST('2006-09-26' AS DATE) + INTERVAL 1 MONTH; 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
sql/item_cmpfunc.cc +6 −1 Original line number Diff line number Diff line Loading @@ -766,7 +766,12 @@ get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg, { 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 Loading
sql/item_timefunc.cc +0 −21 Original line number Diff line number Diff line Loading @@ -2180,27 +2180,6 @@ bool Item_date_add_interval::get_date(MYSQL_TIME *ltime, uint fuzzy_date) 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: Loading