This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch ignite-25811 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit 037791805874c19c574c0be607c947d20369eeda Author: amashenkov <andrey.mashen...@gmail.com> AuthorDate: Mon Aug 4 16:58:45 2025 +0300 wip --- .../ignite/internal/sql/engine/ItIntervalTest.java | 176 ++++++++++----------- .../internal/sql/engine/ItSqlOperatorsTest.java | 6 +- .../sql/engine/prepare/IgniteSqlValidator.java | 3 + 3 files changed, 94 insertions(+), 91 deletions(-) diff --git a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIntervalTest.java b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIntervalTest.java index 564a2e372f1..2e86ea70388 100644 --- a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIntervalTest.java +++ b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIntervalTest.java @@ -149,17 +149,17 @@ public class ItIntervalTest extends BaseSqlIntegrationTest { */ @Test public void testIntervalResult() { - assertEquals(Duration.ofDays(4), eval("INTERVAL 4 DAYS")); - assertEquals(Duration.ofSeconds(1), eval("INTERVAL 1 SECONDS")); + assertEquals(Duration.ofDays(4), eval("INTERVAL '4' DAYS")); + assertEquals(Duration.ofSeconds(1), eval("INTERVAL '1' SECONDS")); assertEquals(Duration.ofSeconds(-1), eval("INTERVAL -1 SECONDS")); - assertEquals(Duration.ofSeconds(123), eval("INTERVAL 123 SECONDS")); + assertEquals(Duration.ofSeconds(123), eval("INTERVAL '1'23 SECONDS")); assertEquals(Duration.ofSeconds(123), eval("INTERVAL '123' SECONDS(3)")); - assertEquals(Duration.ofMinutes(2), eval("INTERVAL 2 MINUTES")); - assertEquals(Duration.ofHours(3), eval("INTERVAL 3 HOURS")); - assertEquals(Duration.ofDays(4), eval("INTERVAL 4 DAYS")); - assertEquals(Period.ofMonths(5), eval("INTERVAL 5 MONTHS")); - assertEquals(Period.ofMonths(-5), eval("INTERVAL -5 MONTHS")); - assertEquals(Period.ofYears(6), eval("INTERVAL 6 YEARS")); + assertEquals(Duration.ofMinutes(2), eval("INTERVAL '2' MINUTES")); + assertEquals(Duration.ofHours(3), eval("INTERVAL '3' HOURS")); + assertEquals(Duration.ofDays(4), eval("INTERVAL '4' DAYS")); + assertEquals(Period.ofMonths(5), eval("INTERVAL '5' MONTHS")); + assertEquals(Period.ofMonths(-5), eval("INTERVAL '-5' MONTHS")); + assertEquals(Period.ofYears(6), eval("INTERVAL '6' YEARS")); assertEquals(Period.of(1, 2, 0), eval("INTERVAL '1-2' YEAR TO MONTH")); assertEquals(Duration.ofHours(25), eval("INTERVAL '1 1' DAY TO HOUR")); assertEquals(Duration.ofMinutes(62), eval("INTERVAL '1:2' HOUR TO MINUTE")); @@ -185,18 +185,18 @@ public class ItIntervalTest extends BaseSqlIntegrationTest { public void testIntervalIntCast() { assertNull(eval("CAST(NULL::INTERVAL SECONDS AS INT)")); assertNull(eval("CAST(NULL::INTERVAL MONTHS AS INT)")); - assertEquals(1, eval("CAST(INTERVAL 1 SECONDS AS INT)")); - assertEquals(2, eval("CAST(INTERVAL 2 MINUTES AS INT)")); - assertEquals(3, eval("CAST(INTERVAL 3 HOURS AS INT)")); - assertEquals(4, eval("CAST(INTERVAL 4 DAYS AS INT)")); - assertEquals(-4, eval("CAST(INTERVAL -4 DAYS AS INT)")); - assertEquals(5, eval("CAST(INTERVAL 5 MONTHS AS INT)")); - assertEquals(6, eval("CAST(INTERVAL 6 YEARS AS INT)")); - assertEquals(-6, eval("CAST(INTERVAL -6 YEARS AS INT)")); - - assertEquals("+6", eval("CAST(INTERVAL 6 YEARS AS VARCHAR)")); - assertEquals("+1", eval("CAST(INTERVAL 1 HOUR AS VARCHAR)")); - assertEquals("+7.000000", eval("CAST(INTERVAL 7 SECONDS AS VARCHAR)")); + assertEquals(1, eval("CAST(INTERVAL '1' SECONDS AS INT)")); + assertEquals(2, eval("CAST(INTERVAL '2' MINUTES AS INT)")); + assertEquals(3, eval("CAST(INTERVAL '3' HOURS AS INT)")); + assertEquals(4, eval("CAST(INTERVAL '4' DAYS AS INT)")); + assertEquals(-4, eval("CAST(INTERVAL '-4' DAYS AS INT)")); + assertEquals(5, eval("CAST(INTERVAL '5' MONTHS AS INT)")); + assertEquals(6, eval("CAST(INTERVAL '6' YEARS AS INT)")); + assertEquals(-6, eval("CAST(INTERVAL '-6' YEARS AS INT)")); + + assertEquals("+6", eval("CAST(INTERVAL '6' YEARS AS VARCHAR)")); + assertEquals("+1", eval("CAST(INTERVAL '1' HOUR AS VARCHAR)")); + assertEquals("+7.000000", eval("CAST(INTERVAL '7' SECONDS AS VARCHAR)")); assertNull(eval("CAST(NULL::INT AS INTERVAL SECONDS)")); assertNull(eval("CAST(NULL::INT AS INTERVAL MONTHS)")); @@ -223,12 +223,12 @@ public class ItIntervalTest extends BaseSqlIntegrationTest { assertNull(eval("CAST(NULL::INTERVAL SECONDS AS VARCHAR)")); assertNull(eval("CAST(NULL::INTERVAL MONTHS AS VARCHAR)")); assertEquals("+1.234", eval("CAST(INTERVAL '1.234' SECONDS (1,3) AS VARCHAR)")); - assertEquals("+1.000000", eval("CAST(INTERVAL 1 SECONDS AS VARCHAR)")); - assertEquals("+2", eval("CAST(INTERVAL 2 MINUTES AS VARCHAR)")); - assertEquals("+3", eval("CAST(INTERVAL 3 HOURS AS VARCHAR)")); - assertEquals("+4", eval("CAST(INTERVAL 4 DAYS AS VARCHAR)")); - assertEquals("+5", eval("CAST(INTERVAL 5 MONTHS AS VARCHAR)")); - assertEquals("+6", eval("CAST(INTERVAL 6 YEARS AS VARCHAR)")); + assertEquals("+1.000000", eval("CAST(INTERVAL '1' SECONDS AS VARCHAR)")); + assertEquals("+2", eval("CAST(INTERVAL '2' MINUTES AS VARCHAR)")); + assertEquals("+3", eval("CAST(INTERVAL '3' HOURS AS VARCHAR)")); + assertEquals("+4", eval("CAST(INTERVAL '4' DAYS AS VARCHAR)")); + assertEquals("+5", eval("CAST(INTERVAL '5' MONTHS AS VARCHAR)")); + assertEquals("+6", eval("CAST(INTERVAL '6' YEARS AS VARCHAR)")); assertEquals("+1-02", eval("CAST(INTERVAL '1-2' YEAR TO MONTH AS VARCHAR)")); assertEquals("+1 02", eval("CAST(INTERVAL '1 2' DAY TO HOUR AS VARCHAR)")); assertEquals("-1 02:03:04.000000", eval("CAST(INTERVAL '-1 2:3:4' DAY TO SECOND AS VARCHAR)")); @@ -255,15 +255,15 @@ public class ItIntervalTest extends BaseSqlIntegrationTest { public void testIntervalToIntervalCast() { assertNull(eval("CAST(NULL::INTERVAL MINUTE AS INTERVAL SECONDS)")); assertNull(eval("CAST(NULL::INTERVAL YEAR AS INTERVAL MONTHS)")); - assertEquals(Duration.ofMinutes(1), eval("CAST(INTERVAL 60 SECONDS AS INTERVAL MINUTE)")); - assertEquals(Duration.ofHours(1), eval("CAST(INTERVAL 60 MINUTES AS INTERVAL HOUR)")); - assertEquals(Duration.ofDays(1), eval("CAST(INTERVAL 24 HOURS AS INTERVAL DAY)")); - assertEquals(Period.ofYears(1), eval("CAST(INTERVAL 1 YEAR AS INTERVAL MONTHS)")); - assertEquals(Period.ofYears(1), eval("CAST(INTERVAL 12 MONTHS AS INTERVAL YEARS)")); + assertEquals(Duration.ofMinutes(1), eval("CAST(INTERVAL '60' SECONDS AS INTERVAL MINUTE)")); + assertEquals(Duration.ofHours(1), eval("CAST(INTERVAL '60' MINUTES AS INTERVAL HOUR)")); + assertEquals(Duration.ofDays(1), eval("CAST(INTERVAL '24' HOURS AS INTERVAL DAY)")); + assertEquals(Period.ofYears(1), eval("CAST(INTERVAL '1' YEAR AS INTERVAL MONTHS)")); + assertEquals(Period.ofYears(1), eval("CAST(INTERVAL '12' MONTHS AS INTERVAL YEARS)")); // Cannot convert between month-year and day-time interval types. - assertThrowsEx("SELECT CAST(INTERVAL 1 MONTHS AS INTERVAL DAYS)", IgniteException.class, "cannot convert"); - assertThrowsEx("SELECT CAST(INTERVAL 1 DAYS AS INTERVAL MONTHS)", IgniteException.class, "cannot convert"); + assertThrowsEx("SELECT CAST(INTERVAL '1' MONTHS AS INTERVAL DAYS)", IgniteException.class, "cannot convert"); + assertThrowsEx("SELECT CAST(INTERVAL '1' DAYS AS INTERVAL MONTHS)", IgniteException.class, "cannot convert"); } /** @@ -273,15 +273,15 @@ public class ItIntervalTest extends BaseSqlIntegrationTest { @Test public void testDml() { sql("CREATE TABLE test(id int PRIMARY KEY, ym INTERVAL YEAR, dt INTERVAL DAYS)"); - sql("INSERT INTO test VALUES (1, INTERVAL 1 MONTH, INTERVAL 2 DAYS)"); - sql("INSERT INTO test VALUES (2, INTERVAL 3 YEARS, INTERVAL 4 HOURS)"); + sql("INSERT INTO test VALUES (1, INTERVAL '1' MONTH, INTERVAL 2 DAYS)"); + sql("INSERT INTO test VALUES (2, INTERVAL '3' YEARS, INTERVAL 4 HOURS)"); sql("INSERT INTO test VALUES (3, INTERVAL '4-5' YEARS TO MONTHS, INTERVAL '6:7' HOURS TO MINUTES)"); sql("INSERT INTO test VALUES (4, NULL, NULL)"); - assertThrowsEx("INSERT INTO test VALUES (5, INTERVAL 1 DAYS, INTERVAL 1 HOURS)", IgniteInternalException.class, + assertThrowsEx("INSERT INTO test VALUES (5, INTERVAL '1' DAYS, INTERVAL '1' HOURS)", IgniteInternalException.class, "cannot assign"); - assertThrowsEx("INSERT INTO test VALUES (6, INTERVAL 1 YEARS, INTERVAL 1 MONTHS)", IgniteInternalException.class, + assertThrowsEx("INSERT INTO test VALUES (6, INTERVAL '1' YEARS, INTERVAL '1' MONTHS)", IgniteInternalException.class, "cannot assign"); assertQuery("SELECT ym, dt FROM test") @@ -291,18 +291,18 @@ public class ItIntervalTest extends BaseSqlIntegrationTest { .returns(null, null) .check(); - assertThrowsEx("SELECT * FROM test WHERE ym = INTERVAL 6 DAYS", IgniteInternalException.class, "Cannot apply"); - assertThrowsEx("SELECT * FROM test WHERE dt = INTERVAL 6 YEARS", IgniteInternalException.class, "Cannot apply"); + assertThrowsEx("SELECT * FROM test WHERE ym = INTERVAL '6' DAYS", IgniteInternalException.class, "Cannot apply"); + assertThrowsEx("SELECT * FROM test WHERE dt = INTERVAL '6' YEARS", IgniteInternalException.class, "Cannot apply"); - sql("UPDATE test SET dt = INTERVAL 3 DAYS WHERE ym = INTERVAL 1 MONTH"); - sql("UPDATE test SET ym = INTERVAL 5 YEARS WHERE dt = INTERVAL 4 HOURS"); + sql("UPDATE test SET dt = INTERVAL '3' DAYS WHERE ym = INTERVAL '1' MONTH"); + sql("UPDATE test SET ym = INTERVAL '5' YEARS WHERE dt = INTERVAL '4' HOURS"); sql("UPDATE test SET ym = INTERVAL '6-7' YEARS TO MONTHS, dt = INTERVAL '8 9' DAYS TO HOURS " + "WHERE ym = INTERVAL '4-5' YEARS TO MONTHS AND dt = INTERVAL '6:7' HOURS TO MINUTES"); - assertThrowsEx("UPDATE test SET dt = INTERVAL 5 YEARS WHERE ym = INTERVAL 1 MONTH", IgniteInternalException.class, + assertThrowsEx("UPDATE test SET dt = INTERVAL '5' YEARS WHERE ym = INTERVAL '1' MONTH", IgniteInternalException.class, "Cannot assign"); - assertThrowsEx("UPDATE test SET ym = INTERVAL 8 YEARS WHERE dt = INTERVAL 1 MONTH", IgniteInternalException.class, + assertThrowsEx("UPDATE test SET ym = INTERVAL '8' YEARS WHERE dt = INTERVAL '1' MONTH", IgniteInternalException.class, "Cannot apply"); assertQuery("SELECT * FROM test") @@ -315,8 +315,8 @@ public class ItIntervalTest extends BaseSqlIntegrationTest { assertThrowsEx("DELETE FROM test WHERE ym = INTERVAL 6 DAYS", IgniteInternalException.class, "cannot apply"); assertThrowsEx("DELETE FROM test WHERE dt = INTERVAL 6 YEARS", IgniteInternalException.class, "cannot apply"); - sql("DELETE FROM test WHERE ym = INTERVAL 1 MONTH"); - sql("DELETE FROM test WHERE dt = INTERVAL 4 HOURS"); + sql("DELETE FROM test WHERE ym = INTERVAL '1' MONTH"); + sql("DELETE FROM test WHERE dt = INTERVAL '4' HOURS"); sql("DELETE FROM test WHERE ym = INTERVAL '6-7' YEARS TO MONTHS AND dt = INTERVAL '8 9' DAYS TO HOURS"); sql("DELETE FROM test WHERE ym IS NULL AND dt IS NULL"); @@ -324,8 +324,8 @@ public class ItIntervalTest extends BaseSqlIntegrationTest { sql("ALTER TABLE test ADD (ym2 INTERVAL MONTH, dt2 INTERVAL HOURS)"); - sql("INSERT INTO test(id, ym, ym2, dt, dt2) VALUES (7, INTERVAL 1 YEAR, INTERVAL 2 YEARS, " - + "INTERVAL 1 SECOND, INTERVAL 2 MINUTES)"); + sql("INSERT INTO test(id, ym, ym2, dt, dt2) VALUES (7, INTERVAL '1' YEAR, INTERVAL 2 YEARS, " + + "INTERVAL '1' SECOND, INTERVAL 2 MINUTES)"); assertQuery("SELECT ym, ym2, dt, dt2 FROM test") .returns(Period.ofYears(1), Period.ofYears(2), Duration.ofSeconds(1), Duration.ofMinutes(2)) @@ -466,7 +466,7 @@ public class ItIntervalTest extends BaseSqlIntegrationTest { @Test public void testDateTimeIntervalArithmetic() { // Date +/- interval. - 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("2022-02-01"), eval("DATE '2021-01-01' + INTERVAL '1-1' YEAR TO MONTH")); // Date - date as interval. @@ -520,11 +520,11 @@ public class ItIntervalTest extends BaseSqlIntegrationTest { ZoneId zoneId = ZoneId.systemDefault(); String tzSuffix = sqlTypeName == SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE ? ' ' + zoneId.getId() : ""; - assertQuery(format("SELECT ({} '2021-11-06 02:30:00' + interval (23) hours)::varchar", typeName)) + assertQuery(format("SELECT ({} '2021-11-06 02:30:00' + interval '23' hours)::varchar", typeName)) .withTimeZoneId(zoneId) .returns("2021-11-07 01:30:00" + tzSuffix).check(); - assertQuery(format("SELECT ({} '2021-11-06 01:30:00' + interval (24) hours)::varchar", typeName)) + assertQuery(format("SELECT ({} '2021-11-06 01:30:00' + interval '24' hours)::varchar", typeName)) .withTimeZoneId(zoneId) .returns("2021-11-07 01:30:00" + tzSuffix).check(); @@ -1013,30 +1013,30 @@ public class ItIntervalTest extends BaseSqlIntegrationTest { @Test public void testIntervalArithmetic() { // 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"); + 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(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")); @@ -1045,14 +1045,14 @@ public class ItIntervalTest extends BaseSqlIntegrationTest { 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(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")); @@ -1066,13 +1066,13 @@ public class ItIntervalTest extends BaseSqlIntegrationTest { */ @Test public void testExtract() { - assertEquals(2L, eval("EXTRACT(MONTH FROM INTERVAL 14 MONTHS)")); - assertEquals(0L, eval("EXTRACT(MONTH FROM INTERVAL 1 YEAR)")); + assertEquals(2L, eval("EXTRACT(MONTH FROM INTERVAL '14' MONTHS)")); + assertEquals(0L, eval("EXTRACT(MONTH FROM INTERVAL '1' YEAR)")); assertEquals(2L, eval("EXTRACT(MONTH FROM INTERVAL '1-2' YEAR TO MONTH)")); assertEquals(1L, eval("EXTRACT(YEAR FROM INTERVAL '1-2' YEAR TO MONTH)")); - assertEquals(-1L, eval("EXTRACT(MONTH FROM INTERVAL -1 MONTHS)")); - assertEquals(-1L, eval("EXTRACT(YEAR FROM INTERVAL -14 MONTHS)")); - assertEquals(-2L, eval("EXTRACT(MONTH FROM INTERVAL -14 MONTHS)")); + assertEquals(-1L, eval("EXTRACT(MONTH FROM INTERVAL '-1' MONTHS)")); + assertEquals(-1L, eval("EXTRACT(YEAR FROM INTERVAL '-14' MONTHS)")); + assertEquals(-2L, eval("EXTRACT(MONTH FROM INTERVAL '-14' MONTHS)")); assertEquals(-20L, eval("EXTRACT(MINUTE FROM INTERVAL '-10:20' HOURS TO MINUTES)")); assertEquals(1L, eval("EXTRACT(DAY FROM INTERVAL '1 2:3:4.567' DAY TO SECOND)")); assertEquals(2L, eval("EXTRACT(HOUR FROM INTERVAL '1 2:3:4.567' DAY TO SECOND)")); @@ -1084,9 +1084,9 @@ public class ItIntervalTest extends BaseSqlIntegrationTest { assertEquals(-3L, eval("EXTRACT(MINUTE FROM INTERVAL '-1 2:3:4.567' DAY TO SECOND)")); assertEquals(-4L, eval("EXTRACT(SECOND FROM INTERVAL '-1 2:3:4.567' DAY TO SECOND)")); assertEquals(-4567L, eval("EXTRACT(MILLISECOND FROM INTERVAL '-1 2:3:4.567' DAY TO SECOND)")); - assertEquals(0L, eval("EXTRACT(DAY FROM INTERVAL 1 MONTH)")); + assertEquals(0L, eval("EXTRACT(DAY FROM INTERVAL '1' MONTH)")); - assertThrowsEx("SELECT EXTRACT(MONTH FROM INTERVAL 1 DAY)", IgniteException.class, "Cannot apply"); + assertThrowsEx("SELECT EXTRACT(MONTH FROM INTERVAL '1' DAY)", IgniteException.class, "Cannot apply"); } /** diff --git a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java index 21ed6e5afe1..842b536243c 100644 --- a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java +++ b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java @@ -223,7 +223,7 @@ public class ItSqlOperatorsTest extends BaseSqlIntegrationTest { @Test public void testDateAndTime() { - assertExpression("DATE '2021-01-01' + interval (1) days").returns(LocalDate.parse("2021-01-02")).check(); + assertExpression("DATE '2021-01-01' + interval '1' days").returns(LocalDate.parse("2021-01-02")).check(); assertExpression("(DATE '2021-03-01' - DATE '2021-01-01') months").returns(Period.ofMonths(2)).check(); assertExpression("(DATE '2021-03-02' - DATE '2021-03-01') hours").returns(Duration.ofHours(24)).check(); assertExpression("EXTRACT(DAY FROM DATE '2021-01-15')").returns(15L).check(); @@ -296,8 +296,8 @@ public class ItSqlOperatorsTest extends BaseSqlIntegrationTest { assertExpression("COMPRESS('')").returns(new byte[]{}).check(); assertExpression("OCTET_LENGTH(x'01')").returns(1).check(); assertExpression("OCTET_LENGTH('text')").returns(4).check(); - assertExpression("CAST(INTERVAL 1 SECONDS AS INT)").returns(1).check(); // Converted to REINTERPRED. - assertExpression("CAST(INTERVAL 1 DAY AS INT)").returns(1).check(); // Converted to REINTERPRED. + assertExpression("CAST(INTERVAL '1' SECONDS AS INT)").returns(1).check(); // Converted to REINTERPRED. + assertExpression("CAST(INTERVAL '1' DAY AS INT)").returns(1).check(); // Converted to REINTERPRED. } @Test diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java index a8129cb425b..675de41667d 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java @@ -1419,6 +1419,9 @@ public class IgniteSqlValidator extends SqlValidatorImpl { } try { + if (call.getKind() == SqlKind.INTERVAL) { + throw newValidationError(call, IgniteResource.INSTANCE.unsupportedExpression("Only string literal are allowed")); + } super.validateCall(call, scope); checkCallsWithCustomTypes(call, scope);