mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
7925326183
- Fixing the code in get_interval_value() to use Longlong_hybrid_null. This allows to handle correctly: - Signed and unsigned arguments (the old code assumed the argument to be signed) - Avoid undefined negation behavior the corner case with LONGLONG_MIN This fixes the UBSAN warning: negation of -9223372036854775808 cannot be represented in type 'long long int'; - Fixing the code in get_interval_value() to avoid overflow in the INTERVAL_QUARTER and INTERVAL_WEEK branches. This fixes the UBSAN warning: signed integer overflow: -9223372036854775808 * 7 cannot be represented in type 'long long int' - Fixing the INTERVAL_WEEK branch in date_add_interval() to handle huge numbers correctly. Before the change, huge positive numeber were treated as their negative complements. Note, some other branches still can be affected by this problem and should also be fixed eventually.
188 lines
7 KiB
Text
188 lines
7 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
|
|
|
|
#
|
|
# MDEV-4284 Assertion `cmp_items[(uint)cmp_type]' fails in sql/item_cmpfunc.cc
|
|
#
|
|
|
|
create table t1 (a varchar(10));
|
|
insert t1 values ('2000-12-03'),('2008-05-03');
|
|
select * from t1 where case a when adddate( '2012-12-12', 7 ) then true end;
|
|
drop table t1;
|
|
|
|
--echo End of 5.5 tests
|
|
|
|
--echo #
|
|
--echo # Start of 10.1 tests
|
|
--echo #
|
|
|
|
--echo #
|
|
--echo # MDEV-14452 Precision in INTERVAL xxx DAY_MICROSECOND parsed wrong?
|
|
--echo #
|
|
|
|
--vertical_results
|
|
SELECT
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5' DAY_MICROSECOND) c1,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50' DAY_MICROSECOND) c2,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500' DAY_MICROSECOND) c3,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000' DAY_MICROSECOND) c4,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000' DAY_MICROSECOND) c5,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000' DAY_MICROSECOND) c6,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000' DAY_MICROSECOND) c7,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000' DAY_MICROSECOND) c8,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000000' DAY_MICROSECOND) c9,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000000' DAY_MICROSECOND) c10,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000000' DAY_MICROSECOND) c11,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000000000' DAY_MICROSECOND) c12,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000000000' DAY_MICROSECOND) c13,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000000000' DAY_MICROSECOND) c14,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000000000000' DAY_MICROSECOND) c15,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000000000000' DAY_MICROSECOND) c16,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000000000000' DAY_MICROSECOND) c17,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000000000000000' DAY_MICROSECOND) c18,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000000000000000' DAY_MICROSECOND) c19,
|
|
DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000000000000000' DAY_MICROSECOND) c20
|
|
;
|
|
--horizontal_results
|
|
|
|
|
|
--echo #
|
|
--echo # End of 10.1 tests
|
|
--echo #
|
|
|
|
#
|
|
# how + interval is printed
|
|
#
|
|
|
|
create or replace view v1 as select 3 & 20010101 + interval 2 day as x;
|
|
show create view v1;
|
|
select 3 & 20010101 + interval 2 day, x from v1;
|
|
|
|
create or replace view v1 as select (3 & 20010101) + interval 2 day as x;
|
|
show create view v1;
|
|
select (3 & 20010101) + interval 2 day, x from v1;
|
|
|
|
create or replace view v1 as select 3 & (20010101 + interval 2 day) as x;
|
|
show create view v1;
|
|
select 3 & (20010101 + interval 2 day), x from v1;
|
|
|
|
create or replace view v1 as select 30 + 20010101 + interval 2 day as x;
|
|
show create view v1;
|
|
select 30 + 20010101 + interval 2 day, x from v1;
|
|
|
|
create or replace view v1 as select (30 + 20010101) + interval 2 day as x;
|
|
show create view v1;
|
|
select (30 + 20010101) + interval 2 day, x from v1;
|
|
|
|
create or replace view v1 as select 30 + (20010101 + interval 2 day) as x;
|
|
show create view v1;
|
|
select 30 + (20010101 + interval 2 day), x from v1;
|
|
|
|
drop view v1;
|
|
|
|
--echo End of 10.2 tests
|
|
|
|
--echo #
|
|
--echo # Start of 10.5 tests
|
|
--echo #
|
|
|
|
--echo #
|
|
--echo # MDEV-30931 UBSAN: negation of -X cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in get_interval_value on SELECT
|
|
--echo #
|
|
|
|
SELECT DATE_ADD('01-01-23',INTERVAL '9223372036854775808-02' WEEK);
|
|
SELECT DATE_ADD('01-01-23',INTERVAL -9223372036854775807 WEEK);
|
|
SELECT DATE_ADD('01-01-23',INTERVAL -9223372036854775808 WEEK);
|
|
SELECT DATE_ADD('01-01-23',INTERVAL -9223372036854775809 WEEK);
|
|
|
|
--echo #
|
|
--echo # End of 10.5 tests
|
|
--echo #
|