You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Consider following statements. Some of them PASS but they obviously are pointless and must fail (checked on 2.5.9, 3.0.6, 4.0.0 -- result is the same).
set list on;
-- J4YI:
-- select datediff( day from date '01.02.2020' to date '31.12.9999') from rdb$database; -- 2914603
-- select datediff( day from date '01.01.0001' to date '01.02.2020') from rdb$database; -- 737455
-- select datediff( day from date '01.01.0001' to date '31.12.9999') from rdb$database; -- 3652058
-- set echo on;
select date '01.02.2020' + 2914603 from rdb$database; -- OK, as expected: 9999-12-31
select date '01.02.2020' + 2914604 from rdb$database; -- OK, as expected: SQLSTATE = 22008 (value exceeds the range for valid dates)
select date '01.02.2020' + 2147483647 from rdb$database; -- OK, as expected: SQLSTATE = 22008
select date '01.02.2020' + 2147483648 from rdb$database; -- OK, as expected: SQLSTATE = 22008
select date '01.02.2020' + 4294229840 from rdb$database; -- OK, as expected: SQLSTATE = 22008
select date '01.02.2020' + 4294229841 from rdb$database; -- ???? 0001-01-01; NB: 4294967296 - 4294229841 = 737455 -- days since 01.01.0001 to 01.02.2020
select date '01.02.2020' + 9223372036854775807 from rdb$database; -- ???? 2020-01-31
select date '01.02.2020' - 737455 from rdb$database; -- OK, as expected: 0001-01-01
select date '01.02.2020' - 737456 from rdb$database; -- OK, as expected: SQLSTATE = 22008 (value exceeds the range for valid dates)
select date '01.02.2020' - 2147483648 from rdb$database; -- OK, as expected: SQLSTATE = 22008
select date '01.02.2020' - 4292052692 from rdb$database; -- OK, as expected: SQLSTATE = 22008
select date '01.02.2020' - 4292052693 from rdb$database; -- ???? 9999-12-31; NB: 4294967296 - 4292052693 = 2914603 -- days since 01.02.2020 to 31.12.9999
select date '01.02.2020' - 9223372036854775807 from rdb$database; -- ???? 2020-02-02
select date '01.02.2020' + -9223372036854775808 from rdb$database; -- ???? 2020-02-01
PS.
IMO, this is not a bug from practice point of view (i can not imagine that such expressions can be in use in any apps ). But compiler (or engine ?) for sure must decline all terms that we attempt to add/subtract from DATE with magniotude more that allowed by built-in limits of this type.
Submitted by: @pavel-zotov
Consider following statements. Some of them PASS but they obviously are pointless and must fail (checked on 2.5.9, 3.0.6, 4.0.0 -- result is the same).
set list on;
-- J4YI:
-- select datediff( day from date '01.02.2020' to date '31.12.9999') from rdb$database; -- 2914603
-- select datediff( day from date '01.01.0001' to date '01.02.2020') from rdb$database; -- 737455
-- select datediff( day from date '01.01.0001' to date '31.12.9999') from rdb$database; -- 3652058
-- set echo on;
-- ################# 1. ADDITION ##################
select date '01.02.2020' + 2914603 from rdb$database; -- OK, as expected: 9999-12-31
select date '01.02.2020' + 2914604 from rdb$database; -- OK, as expected: SQLSTATE = 22008 (value exceeds the range for valid dates)
select date '01.02.2020' + 2147483647 from rdb$database; -- OK, as expected: SQLSTATE = 22008
select date '01.02.2020' + 2147483648 from rdb$database; -- OK, as expected: SQLSTATE = 22008
select date '01.02.2020' + 4294229840 from rdb$database; -- OK, as expected: SQLSTATE = 22008
select date '01.02.2020' + 4294229841 from rdb$database; -- ???? 0001-01-01; NB: 4294967296 - 4294229841 = 737455 -- days since 01.01.0001 to 01.02.2020
select date '01.02.2020' + 9223372036854775807 from rdb$database; -- ???? 2020-01-31
-- ############### 2. SUBTRACTION #################
select date '01.02.2020' - 737455 from rdb$database; -- OK, as expected: 0001-01-01
select date '01.02.2020' - 737456 from rdb$database; -- OK, as expected: SQLSTATE = 22008 (value exceeds the range for valid dates)
select date '01.02.2020' - 2147483648 from rdb$database; -- OK, as expected: SQLSTATE = 22008
select date '01.02.2020' - 4292052692 from rdb$database; -- OK, as expected: SQLSTATE = 22008
select date '01.02.2020' - 4292052693 from rdb$database; -- ???? 9999-12-31; NB: 4294967296 - 4292052693 = 2914603 -- days since 01.02.2020 to 31.12.9999
select date '01.02.2020' - 9223372036854775807 from rdb$database; -- ???? 2020-02-02
select date '01.02.2020' + -9223372036854775808 from rdb$database; -- ???? 2020-02-01
PS.
IMO, this is not a bug from practice point of view (i can not imagine that such expressions can be in use in any apps ). But compiler (or engine ?) for sure must decline all terms that we attempt to add/subtract from DATE with magniotude more that allowed by built-in limits of this type.
Commits: baf8bc1 0734f69 53e74d2 fcae494
The text was updated successfully, but these errors were encountered: