List:Commits« Previous MessageNext Message »
From:Evgeny Potemkin Date:November 26 2009 4:50pm
Subject:Re: bzr commit into mysql-5.1-bugteam branch (kevin.lewis:3208)
Bug#47631
View as plain text  
Hello Kevin,

Honestly, I don't understand what problem you're trying to fix.
The bug reporter says that MAX(DATE) - MIN(DATE) returns result that differs 
from what he expects. Our manual describes "-" as a _numeric_ function.
It's not a DATE/DATETIME function, so there is no surprise that its result is 
wrong. Probably our manual doesn't state this clear enough, but this a 
documentation problem, not a bug in the code.
If you want to make "-" DATE/DATETIME aware, then it should be a clearly 
described as a first step. For example what the result should be for the 
expression like " DATE - DATETIME" or "TIMESTAMP - DATE". As the second step it 
should  be approved|agreed upon it because it's a feature request.
So for now I'm closing this as not a bug with a note to doc team to make it 
clean that "-" doesn't support anything but numbers.

Regards, Evgen.

Kevin Lewis wrote:
> #At file:///C:/Work/bzr/Chg-20/mysql-5.1-bugteam/ based on
> revid:sven.sandberg@stripped
> 
>  3208 Kevin Lewis	2009-11-23
>       Bug#47631 - Math on DATETIME types is now consistently done as a longlong.
>      @ mysql-test/r/cast.result
>         Expanded and improved this test while checking for similarities to Bug#47631.
> All of these results were correct before the fix for 47631.
>      @ mysql-test/r/func_time.result
>         Bug#47631 - Math on DATETIME types is now consistently done as a longlong. 
> This afected the results of tests that referred to now()-now().  
>         Added an array of tests that were used while debugging 47631.
>      @ mysql-test/r/sysdate_is_now.result
>         Bug#47631 - Math on DATETIME types is now consistently done as a longlong.
>      @ mysql-test/t/cast.test
>         Expanded and improved this test while checking for similarities to Bug#47631.
> All of these results were correct before the fix for 47631.
>      @ mysql-test/t/func_time.test
>         Bug#47631 - Math on DATETIME types is now consistently done as a longlong. 
> This afected the results of tests that referred to now()-now().  
>         Added an array of tests that were used while debugging 47631.
>      @ sql/item.cc
>         Bug#47631 - Added Item::is_time(), similar to Item::is_datetime()
>      @ sql/item.h
>         Bug#47631 - Added Item::is_time(), similar to Item::is_datetime()
>      @ sql/item_func.cc
>         Bug#47631 - Math on date and time types is now consistently done as a
> longlong.  This is accomplished by setting the Item_func_minus::hybrid_type to INT_RESULT
> in calls to fix_length_and_desc and by doing the correct conversion to this longlong by
> calling get_datetime_value() or get_time_value().
>      @ sql/item_func.h
>         Bug#47631 - Math on DATETIME types is now consistently done as a longlong.
>      @ sql/mysql_priv.h
>         Bug#47631 - Allow get_time_value() to be called from item_func.cc like
> get_datetime_value() is.
> 
>     modified:
>       mysql-test/r/cast.result
>       mysql-test/r/func_time.result
>       mysql-test/r/sysdate_is_now.result
>       mysql-test/t/cast.test
>       mysql-test/t/func_time.test
>       sql/item.cc
>       sql/item.h
>       sql/item_func.cc
>       sql/item_func.h
>       sql/mysql_priv.h
> === modified file 'mysql-test/r/cast.result'
> --- a/mysql-test/r/cast.result	2009-05-21 08:06:43 +0000
> +++ b/mysql-test/r/cast.result	2009-11-23 21:17:29 +0000
> @@ -351,12 +351,44 @@ DROP TABLE t1;
>  select isnull(date(NULL)), isnull(cast(NULL as DATE));
>  isnull(date(NULL))	isnull(cast(NULL as DATE))
>  1	1
> -SELECT CAST(cast('01-01-01' as date) AS UNSIGNED);
> -CAST(cast('01-01-01' as date) AS UNSIGNED)
> +SELECT CAST('01-01-01 01:01:01' as DATETIME);
> +CAST('01-01-01 01:01:01' as DATETIME)
> +2001-01-01 01:01:01
> +SELECT CAST('01-01-01' as DATE);
> +CAST('01-01-01' as DATE)
> +2001-01-01
> +SELECT CAST('01:01:01' as TIME);
> +CAST('01:01:01' as TIME)
> +01:01:01
> +SELECT CAST(CAST('01-01-01 01:01:01' as DATETIME) AS SIGNED);
> +CAST(CAST('01-01-01 01:01:01' as DATETIME) AS SIGNED)
> +20010101010101
> +SELECT CAST(CAST('01-01-01' as DATE) AS SIGNED);
> +CAST(CAST('01-01-01' as DATE) AS SIGNED)
>  20010101
> -SELECT CAST(cast('01-01-01' as date) AS SIGNED);
> -CAST(cast('01-01-01' as date) AS SIGNED)
> +SELECT CAST(CAST('01:01:01' as TIME) AS SIGNED);
> +CAST(CAST('01:01:01' as TIME) AS SIGNED)
> +10101
> +SELECT CAST(CAST('01-01-01 01:01:01' as DATETIME) AS UNSIGNED);
> +CAST(CAST('01-01-01 01:01:01' as DATETIME) AS UNSIGNED)
> +20010101010101
> +SELECT CAST(CAST('01-01-01' as DATE) AS UNSIGNED);
> +CAST(CAST('01-01-01' as DATE) AS UNSIGNED)
>  20010101
> +SELECT CAST(CAST('01:01:01' as TIME) AS UNSIGNED);
> +CAST(CAST('01:01:01' as TIME) AS UNSIGNED)
> +10101
> +SELECT CAST(CAST('01-01-01 01:01:01' as DATETIME) AS DECIMAL);
> +CAST(CAST('01-01-01 01:01:01' as DATETIME) AS DECIMAL)
> +9999999999
> +Warnings:
> +Error	1264	Out of range value for column 'CAST(CAST('01-01-01 01:01:01' as DATETIME)
> AS DECIMAL)' at row 1
> +SELECT CAST(CAST('01-01-01' as DATE) AS DECIMAL);
> +CAST(CAST('01-01-01' as DATE) AS DECIMAL)
> +20010101
> +SELECT CAST(CAST('01:01:01' as TIME) AS DECIMAL);
> +CAST(CAST('01:01:01' as TIME) AS DECIMAL)
> +10101
>  End of 4.1 tests
>  select cast('1.2' as decimal(3,2));
>  cast('1.2' as decimal(3,2))
> 
> === modified file 'mysql-test/r/func_time.result'
> --- a/mysql-test/r/func_time.result	2009-01-23 12:22:05 +0000
> +++ b/mysql-test/r/func_time.result	2009-11-23 21:17:29 +0000
> @@ -8,7 +8,7 @@ period_add("9602",-12)	period_diff(19950
>  199502	13
>  select
> now()-now(),weekday(curdate())-weekday(now()),unix_timestamp()-unix_timestamp(now());
> 
> now()-now()	weekday(curdate())-weekday(now())	unix_timestamp()-unix_timestamp(now())
> -0.000000	0	0
> +0	0	0
>  select from_unixtime(unix_timestamp("1994-03-02
> 10:11:12")),from_unixtime(unix_timestamp("1994-03-02 10:11:12"),"%Y-%m-%d
> %h:%i:%s"),from_unixtime(unix_timestamp("1994-03-02 10:11:12"))+0;
>  from_unixtime(unix_timestamp("1994-03-02
> 10:11:12"))	from_unixtime(unix_timestamp("1994-03-02 10:11:12"),"%Y-%m-%d
> %h:%i:%s")	from_unixtime(unix_timestamp("1994-03-02 10:11:12"))+0
>  1994-03-02 10:11:12	1994-03-02 10:11:12	19940302101112.000000
> @@ -21,7 +21,7 @@ sec_to_time(time_to_sec('-838:59:59'))
>  -838:59:59
>  select now()-curdate()*1000000-curtime();
>  now()-curdate()*1000000-curtime()
> -0.000000
> +0
>  select strcmp(current_timestamp(),concat(current_date()," ",current_time()));
>  strcmp(current_timestamp(),concat(current_date()," ",current_time()))
>  0
> @@ -941,8 +941,8 @@ sec_to_time(1) + 0, from_unixtime(1) + 0
>  show create table t1;
>  Table	Create Table
>  t1	CREATE TABLE `t1` (
> -  `now() - now()` double(23,6) NOT NULL DEFAULT '0.000000',
> -  `curtime() - curtime()` double(23,6) NOT NULL DEFAULT '0.000000',
> +  `now() - now()` bigint(22) NOT NULL DEFAULT '0',
> +  `curtime() - curtime()` int(11) NOT NULL DEFAULT '0',
>    `sec_to_time(1) + 0` double(23,6) DEFAULT NULL,
>    `from_unixtime(1) + 0` double(23,6) DEFAULT NULL
>  ) ENGINE=MyISAM DEFAULT CHARSET=latin1
> @@ -1335,4 +1335,79 @@ date_sub("0069-01-01 00:00:01",INTERVAL 
>  select date_sub("0169-01-01 00:00:01",INTERVAL 2 SECOND);
>  date_sub("0169-01-01 00:00:01",INTERVAL 2 SECOND)
>  0168-12-31 23:59:59
> +# Bug #47631
> +CREATE TABLE t1 (a INTEGER, b TIMESTAMP) engine innodb;
> +INSERT INTO t1 VALUES (1, '1993-12-1 12:00:00');
> +INSERT INTO t1 VALUES (2, '1993-12-31 12:00:00');
> +CREATE TABLE t2 (a INTEGER, b TIMESTAMP) engine innodb;
> +INSERT INTO t2 VALUES (1, '1994-12-1 12:00:00');
> +INSERT INTO t2 VALUES (2, '1994-12-31 12:00:00');
> +CREATE TABLE t3( a INTEGER(4), b DATE, c DATE) engine innodb;
> +INSERT INTO t3 (select 0 a, max(b), min(b) FROM t1);
> +Warnings:
> +Note	1265	Data truncated for column 'b' at row 2
> +Note	1265	Data truncated for column 'c' at row 2
> +INSERT INTO t3 (select 1 a, max(b), min(b) FROM t2);
> +Warnings:
> +Note	1265	Data truncated for column 'b' at row 2
> +Note	1265	Data truncated for column 'c' at row 2
> +SELECT * FROM t3;
> +a	b	c
> +0	1993-12-31	1993-12-01
> +1	1994-12-31	1994-12-01
> +SELECT a, MAX(b), MIN(c), (MAX(b) - MIN(c)) FROM t3 GROUP BY a;
> +a	MAX(b)	MIN(c)	(MAX(b) - MIN(c))
> +0	1993-12-31	1993-12-01	30000000
> +1	1994-12-31	1994-12-01	30000000
> +CREATE index t3_i on t3 (a);
> +SELECT a, MAX(b), MIN(c), (MAX(b) - MIN(c)) FROM t3 GROUP BY a;
> +a	MAX(b)	MIN(c)	(MAX(b) - MIN(c))
> +0	1993-12-31	1993-12-01	30000000
> +1	1994-12-31	1994-12-01	30000000
> +DROP TABLE t1, t2, t3;
> +CREATE TABLE t1 (a INTEGER(4), b DATE, c DATE);
> +INSERT INTO t1 VALUES (0, '1994-12-31', '1994-12-1');
> +SELECT *, MAX(b) - MIN(c), DATEDIFF(MAX(b), MIN(c)) FROM t1 GROUP BY a;
> +a	b	c	MAX(b) - MIN(c)	DATEDIFF(MAX(b), MIN(c))
> +0	1994-12-31	1994-12-01	30000000	30
> +DROP TABLE t1;
> +CREATE TABLE t1(a DATE, b DATE, c DATETIME, d DATETIME, e TIME, f TIME);
> +INSERT INTO t1 VALUES ('2000-01-01', '2010-10-20', '2000-01-01 00:00:00', 
> +'2010-10-09 07:06:05', '10:10:10', '50:40:30');
> +INSERT INTO t1 VALUES ('2005-01-01', '2015-09-08', '2005-05-05 05:15:15', 
> +'2015-09-08 07:06:05', '11:00:00', '51:00:00');
> +INSERT INTO t1 VALUES ('2010-02-02', '2020-12-30', '2010-02-02 11:11:11', 
> +'2020-01-09 11:22:33', '22:22:22', '55:44:33');
> +SELECT * FROM t1;
> +a	b	c	d	e	f
> +2000-01-01	2010-10-20	2000-01-01 00:00:00	2010-10-09 07:06:05	10:10:10	50:40:30
> +2005-01-01	2015-09-08	2005-05-05 05:15:15	2015-09-08 07:06:05	11:00:00	51:00:00
> +2010-02-02	2020-12-30	2010-02-02 11:11:11	2020-01-09 11:22:33	22:22:22	55:44:33
> +SELECT a, b, b - a, TIMESTAMPDIFF(day, a, b) DiffDay FROM t1;
> +a	b	b - a	DiffDay
> +2000-01-01	2010-10-20	100919000000	3945
> +2005-01-01	2015-09-08	100807000000	3902
> +2010-02-02	2020-12-30	101028000000	3984
> +SELECT c, d, d - c, TIMESTAMPDIFF(day, c, d) DiffDay FROM t1;
> +c	d	d - c	DiffDay
> +2000-01-01 00:00:00	2010-10-09 07:06:05	100908070605	3934
> +2005-05-05 05:15:15	2015-09-08 07:06:05	100403019090	3778
> +2010-02-02 11:11:11	2020-01-09 11:22:33	99907001122	3628
> +SELECT e, f, f - e, SUBTIME(f, e) FROM t1;
> +e	f	f - e	SUBTIME(f, e)
> +10:10:10	50:40:30	403020	40:30:20
> +11:00:00	51:00:00	400000	40:00:00
> +22:22:22	55:44:33	332211	33:22:11
> +SELECT MIN(a), MAX(b), MAX(b) - MIN(a), 
> +TIMESTAMPDIFF(day, MIN(a), MAX(b)) DiffDay FROM t1;
> +MIN(a)	MAX(b)	MAX(b) - MIN(a)	DiffDay
> +2000-01-01	2020-12-30	201129000000	7669
> +SELECT MIN(c), MAX(d), MAX(d) - MIN(c), 
> +TIMESTAMPDIFF(day, MIN(c), MAX(d)) DiffDay FROM t1;
> +MIN(c)	MAX(d)	MAX(d) - MIN(c)	DiffDay
> +2000-01-01 00:00:00	2020-01-09 11:22:33	200008112233	7313
> +SELECT MIN(e), MAX(f), MAX(f) - MIN(e), SUBTIME(MAX(f), MIN(e)) FROM t1;
> +MIN(e)	MAX(f)	MAX(f) - MIN(e)	SUBTIME(MAX(f), MIN(e))
> +10:10:10	55:44:33	453423	45:34:23
> +DROP TABLE t1;
>  End of 5.1 tests
> 
> === modified file 'mysql-test/r/sysdate_is_now.result'
> --- a/mysql-test/r/sysdate_is_now.result	2006-06-10 02:29:39 +0000
> +++ b/mysql-test/r/sysdate_is_now.result	2009-11-23 21:17:29 +0000
> @@ -1,4 +1,4 @@
>  set timestamp=1;
>  SELECT sleep(1),NOW()-SYSDATE() as zero;
>  sleep(1)	zero
> -0	0.000000
> +0	0
> 
> === modified file 'mysql-test/t/cast.test'
> --- a/mysql-test/t/cast.test	2009-05-21 08:06:43 +0000
> +++ b/mysql-test/t/cast.test	2009-11-23 21:17:29 +0000
> @@ -191,8 +191,18 @@ select isnull(date(NULL)), isnull(cast(N
>  #
>  # Bug#23656: Wrong result of CAST from DATE to int
>  #
> -SELECT CAST(cast('01-01-01' as date) AS UNSIGNED);
> -SELECT CAST(cast('01-01-01' as date) AS SIGNED);
> +SELECT CAST('01-01-01 01:01:01' as DATETIME);
> +SELECT CAST('01-01-01' as DATE);
> +SELECT CAST('01:01:01' as TIME);
> +SELECT CAST(CAST('01-01-01 01:01:01' as DATETIME) AS SIGNED);
> +SELECT CAST(CAST('01-01-01' as DATE) AS SIGNED);
> +SELECT CAST(CAST('01:01:01' as TIME) AS SIGNED);
> +SELECT CAST(CAST('01-01-01 01:01:01' as DATETIME) AS UNSIGNED);
> +SELECT CAST(CAST('01-01-01' as DATE) AS UNSIGNED);
> +SELECT CAST(CAST('01:01:01' as TIME) AS UNSIGNED);
> +SELECT CAST(CAST('01-01-01 01:01:01' as DATETIME) AS DECIMAL);
> +SELECT CAST(CAST('01-01-01' as DATE) AS DECIMAL);
> +SELECT CAST(CAST('01:01:01' as TIME) AS DECIMAL);
>  
>  --echo End of 4.1 tests
>  
> 
> === modified file 'mysql-test/t/func_time.test'
> --- a/mysql-test/t/func_time.test	2009-01-23 12:22:05 +0000
> +++ b/mysql-test/t/func_time.test	2009-11-23 21:17:29 +0000
> @@ -1,6 +1,7 @@
>  #
>  # time functions
>  #
> +--source include/have_innodb.inc
>  --disable_warnings
>  drop table if exists t1,t2,t3;
>  --enable_warnings
> @@ -838,4 +839,59 @@ select date_sub("0069-01-01 00:00:01",IN
>  select date_sub("0169-01-01 00:00:01",INTERVAL 2 SECOND);
>  
>  
> +#
> +# Bug #47631: Inconsistent handling of date and time output 
> +#             when subtracting MIN/MAX
> +#
> +--echo # Bug #47631
> +# Original for bug#47631 which occured for InnoDB but not MyISAM
> +CREATE TABLE t1 (a INTEGER, b TIMESTAMP) engine innodb;
> +INSERT INTO t1 VALUES (1, '1993-12-1 12:00:00');
> +INSERT INTO t1 VALUES (2, '1993-12-31 12:00:00');
> +CREATE TABLE t2 (a INTEGER, b TIMESTAMP) engine innodb;
> +INSERT INTO t2 VALUES (1, '1994-12-1 12:00:00');
> +INSERT INTO t2 VALUES (2, '1994-12-31 12:00:00');
> +CREATE TABLE t3( a INTEGER(4), b DATE, c DATE) engine innodb;
> +INSERT INTO t3 (select 0 a, max(b), min(b) FROM t1);
> +INSERT INTO t3 (select 1 a, max(b), min(b) FROM t2);
> +SELECT * FROM t3;
> +SELECT a, MAX(b), MIN(c), (MAX(b) - MIN(c)) FROM t3 GROUP BY a;
> +CREATE index t3_i on t3 (a);
> +SELECT a, MAX(b), MIN(c), (MAX(b) - MIN(c)) FROM t3 GROUP BY a;
> +DROP TABLE t1, t2, t3;
> +
> +
> +# Second testcase
> +# Shows that DATEDIFF works as well and aught to be used instead.
> +CREATE TABLE t1 (a INTEGER(4), b DATE, c DATE);
> +INSERT INTO t1 VALUES (0, '1994-12-31', '1994-12-1');
> +SELECT *, MAX(b) - MIN(c), DATEDIFF(MAX(b), MIN(c)) FROM t1 GROUP BY a;
> +DROP TABLE t1;
> +
> +# Third Testcase
> +# This Shows that TIMESTAMPDIFF and SUBTIME aught to be used instead.
> +# This also shows how ridiculous it is to do math on the internal longlong
> +# representation of timestamps.  For example, see d - c for the second row;
> +# 2015090807060 - 20050505051515 = 100403019090!!!  10-04-03 01:90:90 !!!
> +# That number makes no sense since it contains 90 minutes and 90 seconds
> +# AND it does not account for leap years AND it represents an interval of 
> +# time in inexact 'years' and 'months'.
> +CREATE TABLE t1(a DATE, b DATE, c DATETIME, d DATETIME, e TIME, f TIME);
> +INSERT INTO t1 VALUES ('2000-01-01', '2010-10-20', '2000-01-01 00:00:00', 
> +   '2010-10-09 07:06:05', '10:10:10', '50:40:30');
> +INSERT INTO t1 VALUES ('2005-01-01', '2015-09-08', '2005-05-05 05:15:15', 
> +   '2015-09-08 07:06:05', '11:00:00', '51:00:00');
> +INSERT INTO t1 VALUES ('2010-02-02', '2020-12-30', '2010-02-02 11:11:11', 
> +   '2020-01-09 11:22:33', '22:22:22', '55:44:33');
> +SELECT * FROM t1;
> +SELECT a, b, b - a, TIMESTAMPDIFF(day, a, b) DiffDay FROM t1;
> +SELECT c, d, d - c, TIMESTAMPDIFF(day, c, d) DiffDay FROM t1;
> +SELECT e, f, f - e, SUBTIME(f, e) FROM t1;
> +SELECT MIN(a), MAX(b), MAX(b) - MIN(a), 
> +   TIMESTAMPDIFF(day, MIN(a), MAX(b)) DiffDay FROM t1;
> +SELECT MIN(c), MAX(d), MAX(d) - MIN(c), 
> +   TIMESTAMPDIFF(day, MIN(c), MAX(d)) DiffDay FROM t1;
> +SELECT MIN(e), MAX(f), MAX(f) - MIN(e), SUBTIME(MAX(f), MIN(e)) FROM t1;
> +DROP TABLE t1;
> +
>  --echo End of 5.1 tests
> 
> === modified file 'sql/item.cc'
> --- a/sql/item.cc	2009-11-06 19:42:24 +0000
> +++ b/sql/item.cc	2009-11-23 21:17:29 +0000
> @@ -4760,6 +4760,10 @@ bool Item::is_datetime()
>    return FALSE;
>  }
>  
> +bool Item::is_time()
> +{
> +  return (MYSQL_TYPE_TIME == field_type());
> +}
>  
>  String *Item::check_well_formed_result(String *str, bool send_error)
>  {
> 
> === modified file 'sql/item.h'
> --- a/sql/item.h	2009-11-06 19:42:24 +0000
> +++ b/sql/item.h	2009-11-23 21:17:29 +0000
> @@ -1012,6 +1012,7 @@ public:
>    */
>    virtual bool result_as_longlong() { return FALSE; }
>    bool is_datetime();
> +  bool is_time();
>    virtual Field::geometry_type get_geometry_type() const
>      { return Field::GEOM_GEOMETRY; };
>    String *check_well_formed_result(String *str, bool send_error= 0);
> 
> === modified file 'sql/item_func.cc'
> --- a/sql/item_func.cc	2009-11-02 11:21:39 +0000
> +++ b/sql/item_func.cc	2009-11-23 21:17:29 +0000
> @@ -1193,12 +1193,41 @@ void Item_func_additive_op::result_preci
>  
>  void Item_func_minus::fix_length_and_dec()
>  {
> -  Item_num_op::fix_length_and_dec();
> +  arg_is_date[0]= args[0]->is_datetime();
> +  arg_is_date[1]= args[1]->is_datetime();
> +  arg_is_time[0]= args[0]->is_time();
> +  arg_is_time[1]= args[1]->is_time();
> +  if (arg_is_date[0] || arg_is_date[1] || arg_is_time[0] || arg_is_time[1])
> +  {
> +    decimals= 0;
> +    hybrid_type=INT_RESULT;
> +    result_precision();
> +  }
> +  else
> +    Item_num_op::fix_length_and_dec();
> +
>    if (unsigned_flag &&
>        (current_thd->variables.sql_mode & MODE_NO_UNSIGNED_SUBTRACTION))
>      unsigned_flag=0;
>  }
>  
> +longlong Item_func_minus::get_datetime_arg(uint arg_num)
> +{
> +  bool is_null;
> +  Item **tmp_item;
> +  if (arg_is_date[arg_num])
> +    {
> +    tmp_item= &args[arg_num];
> +    return get_datetime_value(current_thd, &tmp_item, NULL, args[arg_num],
> &is_null);
> +    }
> +  if (arg_is_time[arg_num])
> +    {
> +    tmp_item= &args[arg_num];
> +    return get_time_value(current_thd, &tmp_item, NULL, args[arg_num],
> &is_null);
> +    }
> +
> +  return args[arg_num]->val_int();
> +}
>  
>  double Item_func_minus::real_op()
>  {
> @@ -1211,7 +1240,7 @@ double Item_func_minus::real_op()
>  
>  longlong Item_func_minus::int_op()
>  {
> -  longlong value=args[0]->val_int() - args[1]->val_int();
> +  longlong value= get_datetime_arg(0) - get_datetime_arg(1);
>    if ((null_value=args[0]->null_value || args[1]->null_value))
>      return 0;
>    return value;
> 
> === modified file 'sql/item_func.h'
> --- a/sql/item_func.h	2009-11-02 11:21:39 +0000
> +++ b/sql/item_func.h	2009-11-23 21:17:29 +0000
> @@ -414,6 +414,10 @@ public:
>  
>  class Item_func_minus :public Item_func_additive_op
>  {
> +  bool arg_is_date[2];
> +  bool arg_is_time[2];
> +  longlong get_datetime_arg(uint arg_num);
> +
>  public:
>    Item_func_minus(Item *a,Item *b) :Item_func_additive_op(a,b) {}
>    const char *func_name() const { return "-"; }
> 
> === modified file 'sql/mysql_priv.h'
> --- a/sql/mysql_priv.h	2009-10-27 13:20:34 +0000
> +++ b/sql/mysql_priv.h	2009-11-23 21:17:29 +0000
> @@ -2224,6 +2224,8 @@ void make_time(const DATE_TIME_FORMAT *f
>  int my_time_compare(MYSQL_TIME *a, MYSQL_TIME *b);
>  longlong get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg,
>                              Item *warn_item, bool *is_null);
> +longlong get_time_value(THD *thd, Item ***item_arg, Item **cache_arg,
> +                            Item *warn_item, bool *is_null);
>  
>  int test_if_number(char *str,int *res,bool allow_wildcards);
>  void change_byte(uchar *,uint,char,char);
> 
> 
> 
> ------------------------------------------------------------------------
> 
> 
Thread
bzr commit into mysql-5.1-bugteam branch (kevin.lewis:3208) Bug#47631Kevin Lewis23 Nov
  • Re: bzr commit into mysql-5.1-bugteam branch (kevin.lewis:3208)Bug#47631Evgeny Potemkin26 Nov