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);

Reply via email to