mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
d393c9e666
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. sql/item_cmpfunc.cc: 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. mysql-test/r/func_date_add.result: Added a test case for the bug#28450: The Item_date_add_interval in select list may fail the field type assertion. sql/item_timefunc.cc: 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. mysql-test/t/func_date_add.test: Added a test case for the bug#28450: The Item_date_add_interval in select list may fail the field type assertion.
90 lines
3.3 KiB
Text
90 lines
3.3 KiB
Text
#
|
|
# Test of DATE_ADD
|
|
#
|
|
|
|
--disable_warnings
|
|
drop table if exists t1;
|
|
--enable_warnings
|
|
|
|
CREATE TABLE t1 (
|
|
visitor_id int(10) unsigned DEFAULT '0' NOT NULL,
|
|
group_id int(10) unsigned DEFAULT '0' NOT NULL,
|
|
hits int(10) unsigned DEFAULT '0' NOT NULL,
|
|
sessions int(10) unsigned DEFAULT '0' NOT NULL,
|
|
ts timestamp,
|
|
PRIMARY KEY (visitor_id,group_id)
|
|
)/*! engine=MyISAM */;
|
|
INSERT INTO t1 VALUES (465931136,7,2,2,20000318160952);
|
|
INSERT INTO t1 VALUES (173865424,2,2,2,20000318233615);
|
|
INSERT INTO t1 VALUES (173865424,8,2,2,20000318233615);
|
|
INSERT INTO t1 VALUES (173865424,39,2,2,20000318233615);
|
|
INSERT INTO t1 VALUES (173865424,7,2,2,20000318233615);
|
|
INSERT INTO t1 VALUES (173865424,3,2,2,20000318233615);
|
|
INSERT INTO t1 VALUES (173865424,6,2,2,20000318233615);
|
|
INSERT INTO t1 VALUES (173865424,60,2,2,20000318233615);
|
|
INSERT INTO t1 VALUES (173865424,1502,2,2,20000318233615);
|
|
INSERT INTO t1 VALUES (48985536,2,2,2,20000319013932);
|
|
INSERT INTO t1 VALUES (48985536,8,2,2,20000319013932);
|
|
INSERT INTO t1 VALUES (48985536,39,2,2,20000319013932);
|
|
INSERT INTO t1 VALUES (48985536,7,2,2,20000319013932);
|
|
INSERT INTO t1 VALUES (465931136,3,2,2,20000318160951);
|
|
INSERT INTO t1 VALUES (465931136,119,1,1,20000318160953);
|
|
INSERT INTO t1 VALUES (465931136,2,1,1,20000318160950);
|
|
INSERT INTO t1 VALUES (465931136,8,1,1,20000318160950);
|
|
INSERT INTO t1 VALUES (465931136,39,1,1,20000318160950);
|
|
INSERT INTO t1 VALUES (1092858576,14,1,1,20000319013445);
|
|
INSERT INTO t1 VALUES (357917728,3,2,2,20000319145026);
|
|
INSERT INTO t1 VALUES (357917728,7,2,2,20000319145027);
|
|
select visitor_id,max(ts) as mts from t1 group by visitor_id
|
|
having mts < DATE_SUB(NOW(),INTERVAL 3 MONTH);
|
|
select visitor_id,max(ts) as mts from t1 group by visitor_id
|
|
having DATE_ADD(mts,INTERVAL 3 MONTH) < NOW();
|
|
drop table t1;
|
|
|
|
#
|
|
# Bug #10627: Invalid date turned to NULL from date_sub/date_add in
|
|
# traditional mode
|
|
#
|
|
set sql_mode='traditional';
|
|
create table t1 (d date);
|
|
--error S22008
|
|
insert into t1 (d) select date_sub('2000-01-01', INTERVAL 2001 YEAR);
|
|
--error S22008
|
|
insert into t1 (d) select date_add('2000-01-01',interval 8000 year);
|
|
# No warnings/errors from the next two
|
|
insert into t1 values (date_add(NULL, INTERVAL 1 DAY));
|
|
insert into t1 values (date_add('2000-01-04', INTERVAL NULL DAY));
|
|
set sql_mode='';
|
|
# These will all work now, and we'll end up with some NULL entries in the
|
|
# table and some warnings.
|
|
insert into t1 (d) select date_sub('2000-01-01', INTERVAL 2001 YEAR);
|
|
insert into t1 (d) select date_add('2000-01-01',interval 8000 year);
|
|
insert into t1 values (date_add(NULL, INTERVAL 1 DAY));
|
|
insert into t1 values (date_add('2000-01-04', INTERVAL NULL DAY));
|
|
select * from t1;
|
|
drop table t1;
|
|
|
|
--echo End of 4.1 tests
|
|
|
|
#
|
|
# Bug#21811
|
|
#
|
|
# Make sure we end up with an appropriate
|
|
# date format (DATE) after addition operation
|
|
#
|
|
SELECT CAST('2006-09-26' AS DATE) + INTERVAL 1 DAY;
|
|
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
|