You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2025/08/04 13:59:01 UTC
(ignite-3) 01/01: wip
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 <an...@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);