# TestDaynameArithmetic select dayname("1962-03-01")+0; select dayname("1962-03-02")+0; select dayname("1962-03-03")+0; select dayname("1962-03-04")+0; select dayname("1962-03-05")+0; select dayname("1962-03-06")+0; select dayname("1962-03-07")+0; select dayname("1962-03-08")+0; select dayname("1962-03-01")+1; select dayname("1962-03-01")+2; select dayname("1962-03-01")+3; select dayname("1962-03-01")+4; select dayname("1962-03-01")+5; select dayname("1962-03-01")+6; select dayname("1962-03-01")+7; select dayname("1962-03-01")+2333; select dayname("1962-03-01")+2.333; select dayname("1962-03-01")>2; select dayname("1962-03-01")<2; select dayname("1962-03-01")=3; select dayname("1962-03-01")!=3; select dayname("1962-03-01")<4; select dayname("1962-03-01")>4; select !dayname("1962-03-01"); select dayname("1962-03-01")&1; select dayname("1962-03-01")&3; select dayname("1962-03-01")&7; select dayname("1962-03-01")|1; select dayname("1962-03-01")|3; select dayname("1962-03-01")|7; select dayname("1962-03-01")^1; select dayname("1962-03-01")^3; select dayname("1962-03-01")^7; # TestTimestampDatumEncode drop table if exists t; create table t (a bigint primary key, b timestamp); insert into t values (1, "2019-04-29 11:56:12"); explain format = 'brief' select * from t where b = (select max(b) from t); select * from t where b = (select max(b) from t); # TestDateTimeAddReal SELECT "1900-01-01 00:00:00" + INTERVAL 1.123456789e3 SECOND; SELECT 19000101000000 + INTERVAL 1.123456789e3 SECOND; select date("1900-01-01") + interval 1.123456789e3 second; SELECT "1900-01-01 00:18:43.456789" - INTERVAL 1.123456789e3 SECOND; SELECT 19000101001843.456789 - INTERVAL 1.123456789e3 SECOND; SELECT 19000101000000.0005 + INTERVAL 0.0005 SECOND; select date("1900-01-01") - interval 1.123456789e3 second; select 19000101000000 - interval 1.123456789e3 second; # TestDateTimeAddString SELECT "1900-01-01 00:00:00" + INTERVAL "2" HOUR; SELECT "1900-01-01 00:00:00" + INTERVAL "-2" HOUR; SELECT "1900-01-01 00:00:00" + INTERVAL "128" HOUR; SELECT "1900-01-01 00:00:00" + INTERVAL "1e+3" HOUR; SELECT "1900-01-01 00:00:00" + INTERVAL "1+1" HOUR; drop table if exists t; create table t (id int primary key auto_increment, a varchar(32)); insert into t (a) values(''), ('+1'), ('+1+2'), ('-1'), ('2.2'), ('2.9'), ('2.2+1'), ('2+2.2'), ('5-2'), ('1e2'), ('true'), ('false'), ('xxx'), ('xxx+1'), ('xxx1'), (' 1 '), ('xxx-1'), ('9223372036854775808'), ('-9223372036854775809'), ('9223372036854775808-02'), ('-9223372036854775809-02'); select id, a, "1900-01-01 00:00:00" + INTERVAL a MICROSECOND as result from t order by id ASC; select id, a, "1900-01-01 00:00:00" + INTERVAL a SECOND as result from t order by id ASC; select id, a, "1900-01-01 00:00:00" + INTERVAL a MINUTE as result from t order by id ASC; select id, a, "1900-01-01 00:00:00" + INTERVAL a HOUR as result from t order by id ASC; select id, a, "1900-01-01 00:00:00" + INTERVAL a DAY as result from t order by id ASC; select id, a, "1900-01-01 00:00:00" + INTERVAL a WEEK as result from t order by id ASC; select id, a, "1900-01-01 00:00:00" + INTERVAL a MONTH as result from t order by id ASC; select id, a, "1900-01-01 00:00:00" + INTERVAL a QUARTER as result from t order by id ASC; select id, a, "1900-01-01 00:00:00" + INTERVAL a YEAR as result from t order by id ASC; # TestAddIntervalSpecialCase select "1900-01-01 00:00:00" + INTERVAL true MICROSECOND; select "1900-01-01 00:00:00" + INTERVAL "1.2" MICROSECOND; select "1900-01-01 00:00:00" + INTERVAL "1.9" MINUTE; select "1900-01-01 00:00:00" + INTERVAL 1.2 MICROSECOND; select "1900-01-01 00:00:00" + INTERVAL 1.9 MICROSECOND; select "1900-01-01 00:00:00" + INTERVAL true SECOND; select "1900-01-01 00:00:00" + INTERVAL 1.2 SECOND; select "1900-01-01 00:00:00" + INTERVAL "1+2" SECOND; select "1900-01-01 00:00:00" + INTERVAL "1.2+2" SECOND; select "1900-01-01 00:00:00" + INTERVAL "1+2.2" SECOND; select "1900-01-01 00:00:00" + INTERVAL "0.000001" SECOND; select "1900-01-01 00:00:00" + INTERVAL "0.0000009" SECOND; select "1900-01-01 00:00:00" + INTERVAL true MINUTE; select "1900-01-01 00:00:00" + INTERVAL "1.2" MINUTE; select "1900-01-01 00:00:00" + INTERVAL "1.9" MINUTE; select "1900-01-01 00:00:00" + INTERVAL 1.2 MINUTE; select "1900-01-01 00:00:00" + INTERVAL 1.9 MINUTE; # TestDecimalConvertToTime # for issue #9770 drop table if exists t; create table t(a datetime(6), b timestamp); insert t values (20010101100000.123456, 20110707101112.123456); select * from t; # TestDateAddForNonExistingTimestamp set time_zone = 'CET'; drop table if exists t; create table t(ts timestamp); set time_zone = 'UTC'; insert into t values('2022-03-27 00:30:00'); insert into t values('2022-10-30 00:30:00'); insert into t values('2022-10-30 01:30:00'); set time_zone = 'Europe/Amsterdam'; -- error 1292 insert into t values('2022-03-27 02:30:00'); select date_add(ts, interval 1 hour) from t order by ts; set time_zone = default; # TestTimestampAddWithFractionalSecond drop table if exists t; create table t(a date); insert into t values ('2021-08-20'); select timestampadd(microsecond, 1, a) from t; select timestampadd(second, 6/4, a) from t; select timestampadd(second, 9.9999e2, a) from t; select timestampadd(second, 1, '2021-08-20 00:00:01.0001'); select timestampadd(minute, 1.5, '2021-08-20 00:00:00'); select timestampadd(minute, 1.5, '2021-08-20 00:00:00.0001'); --enable_warnings SELECT timestampadd(year,1.212208e+308,'1995-01-05 06:32:20.859724') as result; --disable_warnings # TestDatetimeMicrosecond # for int select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2 SECOND_MICROSECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2 MINUTE_MICROSECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2 HOUR_MICROSECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2 DAY_MICROSECOND); # for decimal select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 HOUR_MINUTE); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 MINUTE_SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 YEAR_MONTH); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 DAY_HOUR); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 DAY_MINUTE); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 DAY_SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 HOUR_SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 YEAR); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 QUARTER); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 MONTH); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 WEEK); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 DAY); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 HOUR); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 MINUTE); select DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 MICROSECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 HOUR_MINUTE); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 MINUTE_SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 YEAR_MONTH); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 DAY_HOUR); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 DAY_MINUTE); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 DAY_SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 HOUR_SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 YEAR); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 QUARTER); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 MONTH); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 WEEK); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 DAY); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 HOUR); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 MINUTE); select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 MICROSECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" HOUR_MINUTE); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" MINUTE_SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" YEAR_MONTH); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" DAY_HOUR); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" DAY_MINUTE); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" DAY_SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" HOUR_SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" YEAR); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" QUARTER); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" MONTH); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" WEEK); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" DAY); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" HOUR); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" MINUTE); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" MICROSECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" HOUR_MINUTE); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" MINUTE_SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" YEAR_MONTH); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" DAY_HOUR); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" DAY_MINUTE); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" DAY_SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" HOUR_SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.+2" SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.*2" SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2./2" SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.a2" SECOND); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" YEAR); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" QUARTER); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" MONTH); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" WEEK); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" DAY); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" HOUR); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" MINUTE); select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" MICROSECOND); # select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2.2 SECOND); # TestExprDateTimeOnDST set @@session.time_zone = 'Europe/Amsterdam'; drop table if exists t; create table t (id int, dt datetime, primary key (id, dt)); insert into t values (1, date_add('2023-03-26 00:00:00', interval 2 hour)); insert into t values (4,'2023-03-26 02:00:00'); select * from t; set time_zone = default; # TestGreatestTimeType drop table if exists t1; create table t1(c_time time(5), c_dt datetime(4), c_ts timestamp(3), c_d date, c_str varchar(100)); insert into t1 values('-800:10:10', '2021-10-10 10:10:10.1234', '2021-10-10 10:10:10.1234', '2021-10-11', '2021-10-10 10:10:10.1234'); set @@tidb_enable_vectorized_expression = off; select greatest(c_time, c_time) from t1; select greatest(c_dt, c_dt) from t1; select greatest(c_ts, c_ts) from t1; select greatest(c_d, c_d) from t1; select greatest(c_str, c_str) from t1; select least(c_time, c_time) from t1; select least(c_dt, c_dt) from t1; select least(c_ts, c_ts) from t1; select least(c_d, c_d) from t1; select least(c_str, c_str) from t1; select greatest(c_time, cast('10:01:01' as time)) from t1; select least(c_time, cast('10:01:01' as time)) from t1; select greatest(c_d, cast('1999-10-10' as date)) from t1; select least(c_d, cast('1999-10-10' as date)) from t1; select greatest(c_dt, cast('1999-10-10 10:10:10.1234' as datetime)) from t1; select least(c_dt, cast('1999-10-10 10:10:10.1234' as datetime)) from t1; set @@tidb_enable_vectorized_expression = on; select greatest(c_time, c_time) from t1; select greatest(c_dt, c_dt) from t1; select greatest(c_ts, c_ts) from t1; select greatest(c_d, c_d) from t1; select greatest(c_str, c_str) from t1; select least(c_time, c_time) from t1; select least(c_dt, c_dt) from t1; select least(c_ts, c_ts) from t1; select least(c_d, c_d) from t1; select least(c_str, c_str) from t1; select greatest(c_time, cast('10:01:01' as time)) from t1; select least(c_time, cast('10:01:01' as time)) from t1; select greatest(c_d, cast('1999-10-10' as date)) from t1; select least(c_d, cast('1999-10-10' as date)) from t1; select greatest(c_dt, cast('1999-10-10 10:10:10.1234' as datetime)) from t1; select least(c_dt, cast('1999-10-10 10:10:10.1234' as datetime)) from t1; set @@tidb_enable_vectorized_expression = default; # TestDatetimeOverflow drop table if exists t1; create table t1 (d date); set sql_mode='traditional'; -- error 1441 insert into t1 (d) select date_add('2000-01-01',interval 8000 year); -- error 1441 insert into t1 (d) select date_sub('2000-01-01', INTERVAL 2001 YEAR); -- error 1441 insert into t1 (d) select date_add('9999-12-31',interval 1 year); -- error 1441 insert into t1 (d) select date_add('9999-12-31',interval 1 day); set sql_mode=''; insert into t1 (d) select date_add('2000-01-01',interval 8000 year); insert into t1 (d) select date_sub('2000-01-01', INTERVAL 2001 YEAR); insert into t1 (d) select date_add('9999-12-31',interval 1 year); insert into t1 (d) select date_add('9999-12-31',interval 1 day); select * from t1; set sql_mode=default; # Test date add interval overflow select "1000-01-01 00:00:00" + INTERVAL 9223372036854775808 day; select "1000-01-01 00:00:00" + INTERVAL 18446744073709551616 day; drop table if exists t1; create table t1(a decimal(65, 2)); insert into t1 (a) values (1), (1.4), (1.5), (1.6), (-1), (-1.4), (-1.5), (-1.6), (-1000.5); insert into t1 (a) values (315600000000000000), (9223372036854775808), (18446744073709551615), (18446744073709551616), (-9223372036854775808), (-9223372036854775809); set @@tidb_enable_vectorized_expression=0; select a, "1000-01-01 00:00:00" + INTERVAL a YEAR from t1 order by a ASC; select a, "1000-01-01 00:00:00" + INTERVAL a MINUTE from t1 order by a ASC; select a, "1000-01-01 00:00:00" + INTERVAL a MICROSECOND from t1 order by a ASC; select a, "1000-01-01 00:00:00" + INTERVAL cast(a as char) DAY from t1 order by a ASC; select a, "1000-01-01 00:00:00" + INTERVAL cast(a as signed) DAY from t1 order by a ASC; select a, "1000-01-01 00:00:00" + INTERVAL cast(a as unsigned) DAY from t1 order by a ASC; set @@tidb_enable_vectorized_expression=1; select a, "1000-01-01 00:00:00" + INTERVAL a YEAR from t1 order by a ASC; select a, "1000-01-01 00:00:00" + INTERVAL a MINUTE from t1 order by a ASC; select a, "1000-01-01 00:00:00" + INTERVAL a MICROSECOND from t1 order by a ASC; select a, "1000-01-01 00:00:00" + INTERVAL cast(a as char) DAY from t1 order by a ASC; select a, "1000-01-01 00:00:00" + INTERVAL cast(a as signed) DAY from t1 order by a ASC; select a, "1000-01-01 00:00:00" + INTERVAL cast(a as unsigned) DAY from t1 order by a ASC; create table t2(a decimal(65, 2), d datetime); set @old_sql_mode=@@sql_mode; set @@sql_mode=''; insert into t2 values('1', "1000-01-01 00:00:00" + INTERVAL "+1" YEAR); insert into t2 values('-1', "1000-01-01 00:00:00" + INTERVAL "-1" YEAR); insert into t2 values('0', "1000-01-01 00:00:00" + INTERVAL "XXX" YEAR); insert into t2 values('99999', "1000-01-01 00:00:00" + INTERVAL 99999 YEAR); insert into t2 values('116777216', "1000-01-01 00:00:00" + INTERVAL 116777216 YEAR); insert into t2 values('9223372036854775809', "1000-01-01 00:00:00" + INTERVAL 9223372036854775808 YEAR); insert into t2 values('18446744073709551616', "1000-01-01 00:00:00" + INTERVAL 18446744073709551616 YEAR); insert into t2 values('-9223372036854775809', "1000-01-01 00:00:00" + INTERVAL -9223372036854775809 YEAR); select a, d from t2 order by a ASC; truncate table t2; set @@sql_mode=@old_sql_mode; insert into t2 values('1', "1000-01-01 00:00:00" + INTERVAL "+1" YEAR); insert into t2 values('-1', "1000-01-01 00:00:00" + INTERVAL "-1" YEAR); --error 1292 insert into t2 values('0', "1000-01-01 00:00:00" + INTERVAL "XXX" YEAR); --error 1441 insert into t2 values('99999', "1000-01-01 00:00:00" + INTERVAL 99999 YEAR); --error 1441 insert into t2 values('116777216', "1000-01-01 00:00:00" + INTERVAL 116777216 YEAR); --error 1292 insert into t2 values('9223372036854775809', "1000-01-01 00:00:00" + INTERVAL 9223372036854775808 YEAR); --error 1292 insert into t2 values('18446744073709551616', "1000-01-01 00:00:00" + INTERVAL 18446744073709551616 YEAR); --error 1292 insert into t2 values('-9223372036854775809', "1000-01-01 00:00:00" + INTERVAL -9223372036854775809 YEAR); select a, d from t2 order by a ASC; drop table if exists t1;