in modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIntervalTest.java [222:349]
public void testIntervalArithmetic() {
// Date +/- interval.
assertEquals(LocalDate.parse("2021-01-02"), eval("DATE '2021-01-01' + INTERVAL 1 DAY"));
assertEquals(LocalDate.parse("2020-12-31"), eval("DATE '2021-01-01' - INTERVAL 1 DAY"));
assertEquals(LocalDate.parse("2020-12-31"), eval("DATE '2021-01-01' + INTERVAL -1 DAY"));
assertEquals(LocalDate.parse("2021-02-01"), eval("DATE '2021-01-01' + INTERVAL 1 MONTH"));
assertEquals(LocalDate.parse("2022-01-01"), eval("DATE '2021-01-01' + INTERVAL 1 YEAR"));
assertEquals(LocalDate.parse("2022-02-01"), eval("DATE '2021-01-01' + INTERVAL '1-1' YEAR TO MONTH"));
// Timestamp +/- interval.
assertEquals(LocalDateTime.parse("2021-01-01T00:00:01"),
eval("TIMESTAMP '2021-01-01 00:00:00' + INTERVAL 1 SECOND"));
assertEquals(LocalDateTime.parse("2021-01-01T00:00:01.123"),
eval("TIMESTAMP '2021-01-01 00:00:00.123' + INTERVAL 1 SECOND"));
assertEquals(LocalDateTime.parse("2021-01-01T00:00:01.123"),
eval("TIMESTAMP '2021-01-01 00:00:00' + INTERVAL '1.123' SECOND"));
assertEquals(LocalDateTime.parse("2021-01-01T00:00:01.246"),
eval("TIMESTAMP '2021-01-01 00:00:00.123' + INTERVAL '1.123' SECOND"));
assertEquals(LocalDateTime.parse("2020-12-31T23:59:59"),
eval("TIMESTAMP '2021-01-01 00:00:00' - INTERVAL 1 SECOND"));
assertEquals(LocalDateTime.parse("2020-12-31T23:59:59"),
eval("TIMESTAMP '2021-01-01 00:00:00' + INTERVAL -1 SECOND"));
assertEquals(LocalDateTime.parse("2021-01-01T00:01:00"),
eval("TIMESTAMP '2021-01-01 00:00:00' + INTERVAL 1 MINUTE"));
assertEquals(LocalDateTime.parse("2021-01-01T01:00:00"),
eval("TIMESTAMP '2021-01-01 00:00:00' + INTERVAL 1 HOUR"));
assertEquals(LocalDateTime.parse("2021-01-02T00:00:00"),
eval("TIMESTAMP '2021-01-01 00:00:00' + INTERVAL 1 DAY"));
assertEquals(LocalDateTime.parse("2021-02-01T00:00:00"),
eval("TIMESTAMP '2021-01-01 00:00:00' + INTERVAL 1 MONTH"));
assertEquals(LocalDateTime.parse("2022-01-01T00:00:00"),
eval("TIMESTAMP '2021-01-01 00:00:00' + INTERVAL 1 YEAR"));
assertEquals(LocalDateTime.parse("2021-01-02T01:01:01.123"),
eval("TIMESTAMP '2021-01-01 00:00:00' + INTERVAL '1 1:1:1.123' DAY TO SECOND"));
assertEquals(LocalDateTime.parse("2022-02-01T01:01:01.123"),
eval("TIMESTAMP '2021-01-01 01:01:01.123' + INTERVAL '1-1' YEAR TO MONTH"));
// Time +/- interval.
assertEquals(LocalTime.parse("00:00:01"), eval("TIME '00:00:00' + INTERVAL 1 SECOND"));
assertEquals(LocalTime.parse("00:01:00"), eval("TIME '00:00:00' + INTERVAL 1 MINUTE"));
assertEquals(LocalTime.parse("01:00:00"), eval("TIME '00:00:00' + INTERVAL 1 HOUR"));
// Date - date as interval.
assertEquals(Duration.ofDays(1), eval("(DATE '2021-01-02' - DATE '2021-01-01') DAYS"));
assertEquals(Duration.ofDays(-1), eval("(DATE '2021-01-01' - DATE '2021-01-02') DAYS"));
assertEquals(Duration.ofDays(1), eval("(DATE '2021-01-02' - DATE '2021-01-01') HOURS"));
assertEquals(Period.ofYears(1), eval("(DATE '2022-01-01' - DATE '2021-01-01') YEARS"));
assertEquals(Period.ofMonths(1), eval("(DATE '2021-02-01' - DATE '2021-01-01') MONTHS"));
assertEquals(Period.ofMonths(-1), eval("(DATE '2021-01-01' - DATE '2021-02-01') MONTHS"));
assertEquals(Period.ofMonths(0), eval("(DATE '2021-01-20' - DATE '2021-01-01') MONTHS"));
// Timestamp - timestamp as interval.
assertEquals(Duration.ofDays(1),
eval("(TIMESTAMP '2021-01-02 00:00:00' - TIMESTAMP '2021-01-01 00:00:00') DAYS"));
assertEquals(Duration.ofDays(-1),
eval("(TIMESTAMP '2021-01-01 00:00:00' - TIMESTAMP '2021-01-02 00:00:00') DAYS"));
assertEquals(Duration.ofHours(1),
eval("(TIMESTAMP '2021-01-01 01:00:00' - TIMESTAMP '2021-01-01 00:00:00') HOURS"));
assertEquals(Duration.ofMinutes(1),
eval("(TIMESTAMP '2021-01-01 00:01:00' - TIMESTAMP '2021-01-01 00:00:00') MINUTES"));
assertEquals(Duration.ofSeconds(1),
eval("(TIMESTAMP '2021-01-01 00:00:01' - TIMESTAMP '2021-01-01 00:00:00') SECONDS"));
assertEquals(Duration.ofMillis(123),
eval("(TIMESTAMP '2021-01-01 00:00:00.123' - TIMESTAMP '2021-01-01 00:00:00') SECONDS"));
assertEquals(Period.ofYears(1),
eval("(TIMESTAMP '2022-01-01 00:00:00' - TIMESTAMP '2021-01-01 00:00:00') YEARS"));
assertEquals(Period.ofMonths(1),
eval("(TIMESTAMP '2021-02-01 00:00:00' - TIMESTAMP '2021-01-01 00:00:00') MONTHS"));
assertEquals(Period.ofMonths(-1),
eval("(TIMESTAMP '2021-01-01 00:00:00' - TIMESTAMP '2021-02-01 00:00:00') MONTHS"));
assertEquals(Period.ofMonths(0),
eval("(TIMESTAMP '2021-01-20 00:00:00' - TIMESTAMP '2021-01-01 00:00:00') MONTHS"));
// Time - time as interval.
assertEquals(Duration.ofHours(1), eval("(TIME '02:00:00' - TIME '01:00:00') HOURS"));
assertEquals(Duration.ofMinutes(1), eval("(TIME '00:02:00' - TIME '00:01:00') HOURS"));
assertEquals(Duration.ofMinutes(1), eval("(TIME '00:02:00' - TIME '00:01:00') MINUTES"));
assertEquals(Duration.ofSeconds(1), eval("(TIME '00:00:02' - TIME '00:00:01') SECONDS"));
assertEquals(Duration.ofMillis(123), eval("(TIME '00:00:01.123' - TIME '00:00:01') SECONDS"));
// Interval +/- interval.
assertEquals(Duration.ofSeconds(2), eval("INTERVAL 1 SECONDS + INTERVAL 1 SECONDS"));
assertEquals(Duration.ofSeconds(1), eval("INTERVAL 2 SECONDS - INTERVAL 1 SECONDS"));
assertEquals(Duration.ofSeconds(61), eval("INTERVAL 1 MINUTE + INTERVAL 1 SECONDS"));
assertEquals(Duration.ofSeconds(59), eval("INTERVAL 1 MINUTE - INTERVAL 1 SECONDS"));
assertEquals(Duration.ofSeconds(59), eval("INTERVAL 1 MINUTE + INTERVAL -1 SECONDS"));
assertEquals(Duration.ofSeconds(3723), eval("INTERVAL 1 HOUR + INTERVAL '2:3' MINUTE TO SECONDS"));
assertEquals(Duration.ofSeconds(3477), eval("INTERVAL 1 HOUR - INTERVAL '2:3' MINUTE TO SECONDS"));
assertEquals(Duration.ofHours(25), eval("INTERVAL 1 DAY + INTERVAL 1 HOUR"));
assertEquals(Period.ofMonths(2), eval("INTERVAL 1 MONTH + INTERVAL 1 MONTH"));
assertEquals(Period.ofYears(2), eval("INTERVAL 1 YEAR + INTERVAL 1 YEAR"));
assertEquals(Period.of(1, 1, 0), eval("INTERVAL 1 YEAR + INTERVAL 1 MONTH"));
assertEquals(Period.ofMonths(11), eval("INTERVAL 1 YEAR - INTERVAL 1 MONTH"));
assertEquals(Period.ofMonths(11), eval("INTERVAL 1 YEAR + INTERVAL -1 MONTH"));
assertThrowsEx("SELECT INTERVAL 1 DAY + INTERVAL 1 MONTH", IgniteException.class, "Cannot apply");
// Interval * scalar.
assertEquals(Duration.ofSeconds(2), eval("INTERVAL 1 SECONDS * 2"));
assertEquals(Duration.ofSeconds(-2), eval("INTERVAL -1 SECONDS * 2"));
assertEquals(Duration.ofMinutes(4), eval("INTERVAL 2 MINUTES * 2"));
assertEquals(Duration.ofHours(6), eval("INTERVAL 3 HOURS * 2"));
assertEquals(Duration.ofDays(8), eval("INTERVAL 4 DAYS * 2"));
assertEquals(Period.ofMonths(10), eval("INTERVAL 5 MONTHS * 2"));
assertEquals(Period.ofMonths(-10), eval("INTERVAL -5 MONTHS * 2"));
assertEquals(Period.ofYears(12), eval("INTERVAL 6 YEARS * 2"));
assertEquals(Period.of(2, 4, 0), eval("INTERVAL '1-2' YEAR TO MONTH * 2"));
assertEquals(Duration.ofHours(50), eval("INTERVAL '1 1' DAY TO HOUR * 2"));
assertEquals(Duration.ofMinutes(124), eval("INTERVAL '1:2' HOUR TO MINUTE * 2"));
assertEquals(Duration.ofSeconds(126), eval("INTERVAL '1:3' MINUTE TO SECOND * 2"));
assertEquals(Duration.ofSeconds(7446), eval("INTERVAL '1:2:3' HOUR TO SECOND * 2"));
assertEquals(Duration.ofMillis(7446912), eval("INTERVAL '0 1:2:3.456' DAY TO SECOND * 2"));
// Interval / scalar
assertEquals(Duration.ofSeconds(1), eval("INTERVAL 2 SECONDS / 2"));
assertEquals(Duration.ofSeconds(-1), eval("INTERVAL -2 SECONDS / 2"));
assertEquals(Duration.ofSeconds(30), eval("INTERVAL 1 MINUTES / 2"));
assertEquals(Duration.ofMinutes(90), eval("INTERVAL 3 HOURS / 2"));
assertEquals(Duration.ofDays(2), eval("INTERVAL 4 DAYS / 2"));
assertEquals(Period.ofMonths(2), eval("INTERVAL 5 MONTHS / 2"));
assertEquals(Period.ofMonths(-2), eval("INTERVAL -5 MONTHS / 2"));
assertEquals(Period.of(3, 6, 0), eval("INTERVAL 7 YEARS / 2"));
assertEquals(Period.ofMonths(7), eval("INTERVAL '1-2' YEAR TO MONTH / 2"));
assertEquals(Duration.ofHours(13), eval("INTERVAL '1 2' DAY TO HOUR / 2"));
assertEquals(Duration.ofMinutes(31), eval("INTERVAL '1:2' HOUR TO MINUTE / 2"));
assertEquals(Duration.ofSeconds(31), eval("INTERVAL '1:2' MINUTE TO SECOND / 2"));
assertEquals(Duration.ofSeconds(1862), eval("INTERVAL '1:2:4' HOUR TO SECOND / 2"));
assertEquals(Duration.ofMillis(1862228), eval("INTERVAL '0 1:2:4.456' DAY TO SECOND / 2"));
}