This is an automated email from the ASF dual-hosted git repository.

korlov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 3a138f93dc IGNITE-22831 Sql. Make ItCastToTsWithLocalTimeZoneTest 
stable (attempt #2) (#4136)
3a138f93dc is described below

commit 3a138f93dc9ee550efc0f3125bbf26770add5715
Author: korlov42 <[email protected]>
AuthorDate: Thu Jul 25 14:40:20 2024 +0300

    IGNITE-22831 Sql. Make ItCastToTsWithLocalTimeZoneTest stable (attempt #2) 
(#4136)
---
 .../datatypes/ItCastToTsWithLocalTimeZoneTest.java | 606 ++++++++-------------
 1 file changed, 232 insertions(+), 374 deletions(-)

diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/ItCastToTsWithLocalTimeZoneTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/ItCastToTsWithLocalTimeZoneTest.java
index 98b7b72f43..1b57885d9f 100644
--- 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/ItCastToTsWithLocalTimeZoneTest.java
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/ItCastToTsWithLocalTimeZoneTest.java
@@ -17,22 +17,35 @@
 
 package org.apache.ignite.internal.sql.engine.datatypes;
 
+import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
+
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.ZoneId;
 import java.time.ZoneOffset;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.apache.ignite.internal.sql.BaseSqlIntegrationTest;
+import org.apache.ignite.internal.sql.engine.util.QueryChecker;
 import org.apache.ignite.internal.testframework.WithSystemProperty;
+import org.apache.ignite.internal.util.Pair;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 
 /**
- * Set of tests to ensure correctness of CAST expression to TIMESTAMP WITH 
TIME ZONE for
+ * Set of tests to ensure correctness of CAST expression to TIMESTAMP WITH 
LOCAL TIME ZONE for
  * type pairs supported by cast specification.
  */
 @WithSystemProperty(key = "IMPLICIT_PK_ENABLED", value = "true")
@@ -55,433 +68,230 @@ public class ItCastToTsWithLocalTimeZoneTest extends 
BaseSqlIntegrationTest {
         sql("DELETE FROM src");
     }
 
-    @Test
-    void implicitCastOfLiteralsOnInsert() {
-        {
-            ZoneId zone = ZoneOffset.ofHours(4);
-
-            assertQuery("INSERT INTO test VALUES ('1970-01-01 
12:00:00')").withTimeZoneId(zone).check();
-            assertQuery("INSERT INTO test VALUES (timestamp '1970-01-01 
13:00:00')").withTimeZoneId(zone).check();
-            assertQuery("INSERT INTO test VALUES (date 
'1970-01-01')").withTimeZoneId(zone).check();
-            assertQuery("INSERT INTO test VALUES (time 
'12:00:00')").withTimeZoneId(zone).check();
-        }
-
-        {
-            ZoneId zone = ZoneOffset.ofHours(8);
+    @ParameterizedTest
+    @MethodSource("literalsWithExpectedResult")
+    void implicitCastOfLiteralsOnInsert(String literal, int zoneOffset, Object 
expectedResult) {
+        ZoneId zone = ZoneOffset.ofHours(zoneOffset);
 
-            assertQuery("INSERT INTO test VALUES ('1970-01-01 
14:00:00')").withTimeZoneId(zone).check();
-            assertQuery("INSERT INTO test VALUES (timestamp '1970-01-01 
15:00:00')").withTimeZoneId(zone).check();
-            assertQuery("INSERT INTO test VALUES (date 
'1970-01-01')").withTimeZoneId(zone).check();
-            assertQuery("INSERT INTO test VALUES (time 
'14:00:00')").withTimeZoneId(zone).check();
-        }
+        assertQuery(format("INSERT INTO test VALUES ({})", literal))
+                .withTimeZoneId(zone)
+                .check();
 
         assertQuery("SELECT * FROM test")
-                .returns(Instant.parse("1970-01-01T08:00:00Z"))
-                .returns(Instant.parse("1970-01-01T09:00:00Z"))
-                .returns(Instant.parse("1969-12-31T20:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T08:00:00Z"))
-                .returns(Instant.parse("1970-01-01T06:00:00Z"))
-                .returns(Instant.parse("1970-01-01T07:00:00Z"))
-                .returns(Instant.parse("1969-12-31T16:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T06:00:00Z"))
+                .returns(expectedResult)
                 .check();
     }
 
-    @Test
-    void explicitCastOfLiteralsOnInsert() {
-        {
-            ZoneId zone = ZoneOffset.ofHours(4);
+    @ParameterizedTest
+    @MethodSource("literalsWithExpectedResult")
+    void explicitCastOfLiteralsOnInsert(String literal, int zoneOffset, Object 
expectedResult) {
+        ZoneId zone = ZoneOffset.ofHours(zoneOffset);
 
-            assertQuery("INSERT INTO test VALUES (CAST('1970-01-01 12:00:00' 
as TIMESTAMP WITH LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .check();
-            assertQuery("INSERT INTO test VALUES (CAST(timestamp '1970-01-01 
13:00:00' as TIMESTAMP WITH LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .check();
-            assertQuery("INSERT INTO test VALUES (CAST(date '1970-01-01' as 
TIMESTAMP WITH LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .check();
-            assertQuery("INSERT INTO test VALUES (CAST(time '12:00:00' as 
TIMESTAMP WITH LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .check();
-        }
+        assertQuery(format("INSERT INTO test VALUES (CAST({} as TIMESTAMP WITH 
LOCAL TIME ZONE))", literal))
+                .withTimeZoneId(zone)
+                .check();
 
-        {
-            ZoneId zone = ZoneOffset.ofHours(8);
+        assertQuery("SELECT * FROM test")
+                .returns(expectedResult)
+                .check();
+    }
 
-            assertQuery("INSERT INTO test VALUES (CAST('1970-01-01 14:00:00' 
as TIMESTAMP WITH LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .check();
-            assertQuery("INSERT INTO test VALUES (CAST(timestamp '1970-01-01 
15:00:00' as TIMESTAMP WITH LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .check();
-            assertQuery("INSERT INTO test VALUES (CAST(date '1970-01-01' as 
TIMESTAMP WITH LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .check();
-            assertQuery("INSERT INTO test VALUES (CAST(time '14:00:00' as 
TIMESTAMP WITH LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .check();
-        }
+    @ParameterizedTest
+    @MethodSource("literalsWithExpectedResult")
+    void explicitCastOfLiteralsOnSelect(String literal, int zoneOffset, Object 
expectedResult) {
+        ZoneId zone = ZoneOffset.ofHours(zoneOffset);
 
-        assertQuery("SELECT * FROM test")
-                .returns(Instant.parse("1970-01-01T08:00:00Z"))
-                .returns(Instant.parse("1970-01-01T09:00:00Z"))
-                .returns(Instant.parse("1969-12-31T20:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T08:00:00Z"))
-                .returns(Instant.parse("1970-01-01T06:00:00Z"))
-                .returns(Instant.parse("1970-01-01T07:00:00Z"))
-                .returns(Instant.parse("1969-12-31T16:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T06:00:00Z"))
+        assertQuery(format("SELECT CAST({} as TIMESTAMP WITH LOCAL TIME 
ZONE)", literal))
+                .withTimeZoneId(zone)
+                .returns(expectedResult)
                 .check();
     }
 
     @Test
-    void explicitCastOfLiteralsOnSelect() {
-        {
-            ZoneId zone = ZoneOffset.ofHours(4);
+    void explicitCastOfLiteralsOnMultiInsert() {
+        List<Object> expectedResults = new ArrayList<>();
 
-            assertQuery("SELECT CAST('1970-01-01 12:00:00' as TIMESTAMP WITH 
LOCAL TIME ZONE)")
-                    .withTimeZoneId(zone)
-                    .returns(Instant.parse("1970-01-01T08:00:00Z"))
-                    .check();
-            assertQuery("SELECT CAST(timestamp '1970-01-01 13:00:00' as 
TIMESTAMP WITH LOCAL TIME ZONE)")
-                    .withTimeZoneId(zone)
-                    .returns(Instant.parse("1970-01-01T09:00:00Z"))
-                    .check();
-            assertQuery("SELECT CAST(date '1970-01-01' as TIMESTAMP WITH LOCAL 
TIME ZONE)")
-                    .withTimeZoneId(zone)
-                    .returns(Instant.parse("1969-12-31T20:00:00Z"))
-                    .check();
-            assertQuery("SELECT CAST(time '12:00:00' as TIMESTAMP WITH LOCAL 
TIME ZONE)")
-                    .withTimeZoneId(zone)
-                    .returns(Instant.parse(currentUtcDate() + "T08:00:00Z"))
-                    .check();
-        }
+        Map<Integer, StringBuilder> statementBuildersByOffset = new 
HashMap<>();
+        for (Arguments args : 
literalsWithExpectedResult().collect(Collectors.toList())) {
+            String literal = (String) args.get()[0];
+            int offset = (int) args.get()[1];
+            Object expectedResult = args.get()[2];
 
-        {
-            ZoneId zone = ZoneOffset.ofHours(8);
+            StringBuilder builder = statementBuildersByOffset.get(offset);
 
-            assertQuery("SELECT CAST('1970-01-01 14:00:00' as TIMESTAMP WITH 
LOCAL TIME ZONE)")
-                    .withTimeZoneId(zone)
-                    .returns(Instant.parse("1970-01-01T06:00:00Z"))
-                    .check();
-            assertQuery("SELECT CAST(timestamp '1970-01-01 15:00:00' as 
TIMESTAMP WITH LOCAL TIME ZONE)")
-                    .withTimeZoneId(zone)
-                    .returns(Instant.parse("1970-01-01T07:00:00Z"))
-                    .check();
-            assertQuery("SELECT CAST(date '1970-01-01' as TIMESTAMP WITH LOCAL 
TIME ZONE)")
-                    .withTimeZoneId(zone)
-                    .returns(Instant.parse("1969-12-31T16:00:00Z"))
-                    .check();
-            assertQuery("SELECT CAST(time '14:00:00' as TIMESTAMP WITH LOCAL 
TIME ZONE)")
-                    .withTimeZoneId(zone)
-                    .returns(Instant.parse(currentUtcDate() + "T06:00:00Z"))
+            if (builder == null) {
+                builder = new StringBuilder("INSERT INTO test VALUES");
+
+                statementBuildersByOffset.put(offset, builder);
+            } else {
+                builder.append(",");
+            }
+
+            builder.append("(CAST(").append(literal).append(" as TIMESTAMP 
WITH LOCAL TIME ZONE))");
+
+            expectedResults.add(expectedResult);
+        }
+
+        for (Map.Entry<Integer, StringBuilder> entry : 
statementBuildersByOffset.entrySet()) {
+            assertQuery(entry.getValue().toString())
+                    .withTimeZoneId(ZoneOffset.ofHours(entry.getKey()))
                     .check();
         }
-    }
 
-    @Test
-    void explicitCastOfLiteralsOnMultiInsert() {
-        {
-            ZoneId zone = ZoneOffset.ofHours(4);
+        QueryChecker checker = assertQuery("SELECT * FROM test");
 
-            assertQuery("INSERT INTO test VALUES " 
-                    + "(CAST('1970-01-01 12:00:00' as TIMESTAMP WITH LOCAL 
TIME ZONE))," 
-                    + "(CAST(timestamp '1970-01-01 13:00:00' as TIMESTAMP WITH 
LOCAL TIME ZONE))," 
-                    + "(CAST(date '1970-01-01' as TIMESTAMP WITH LOCAL TIME 
ZONE))," 
-                    + "(CAST(time '12:00:00' as TIMESTAMP WITH LOCAL TIME 
ZONE))")
-                    .withTimeZoneId(zone).check();
-        }
+        expectedResults.forEach(checker::returns);
 
-        {
-            ZoneId zone = ZoneOffset.ofHours(8);
+        checker.check();
+    }
 
-            assertQuery("INSERT INTO test VALUES " 
-                    + "(CAST('1970-01-01 14:00:00' as TIMESTAMP WITH LOCAL 
TIME ZONE))," 
-                    + "(CAST(timestamp '1970-01-01 15:00:00' as TIMESTAMP WITH 
LOCAL TIME ZONE))," 
-                    + "(CAST(date '1970-01-01' as TIMESTAMP WITH LOCAL TIME 
ZONE))," 
-                    + "(CAST(time '14:00:00' as TIMESTAMP WITH LOCAL TIME 
ZONE))")
-                    .withTimeZoneId(zone).check();
-        }
+    @ParameterizedTest
+    @MethodSource("valuesWithExpectedResult")
+    @Disabled("https://issues.apache.org/jira/browse/IGNITE-22779";)
+    void implicitCastOfDynParamsOnInsert(Object param, int zoneOffset, Object 
expectedResult) {
+        ZoneId zone = ZoneOffset.ofHours(zoneOffset);
+
+        assertQuery("INSERT INTO test VALUES (?)")
+                .withTimeZoneId(zone)
+                .withParam(param)
+                .check();
 
         assertQuery("SELECT * FROM test")
-                .returns(Instant.parse("1970-01-01T08:00:00Z"))
-                .returns(Instant.parse("1970-01-01T09:00:00Z"))
-                .returns(Instant.parse("1969-12-31T20:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T08:00:00Z"))
-                .returns(Instant.parse("1970-01-01T06:00:00Z"))
-                .returns(Instant.parse("1970-01-01T07:00:00Z"))
-                .returns(Instant.parse("1969-12-31T16:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T06:00:00Z"))
+                .returns(expectedResult)
                 .check();
     }
 
-    @Test
-    @Disabled("https://issues.apache.org/jira/browse/IGNITE-22779";)
-    void implicitCastOfDynParamsOnInsert() {
-        {
-            ZoneId zone = ZoneOffset.ofHours(4);
+    @ParameterizedTest
+    @MethodSource("valuesWithExpectedResult")
+    void explicitCastOfDynParamsOnInsert(Object param, int zoneOffset, Object 
expectedResult) {
+        ZoneId zone = ZoneOffset.ofHours(zoneOffset);
 
-            assertQuery("INSERT INTO test VALUES (?)")
-                    .withTimeZoneId(zone)
-                    .withParam("1970-01-01 12:00:00")
-                    .check();
-            assertQuery("INSERT INTO test VALUES (?)")
-                    .withTimeZoneId(zone)
-                    .withParam(LocalDateTime.parse("1970-01-01T13:00:00"))
-                    .check();
-            assertQuery("INSERT INTO test VALUES (?)")
-                    .withTimeZoneId(zone)
-                    .withParam(LocalDate.parse("1970-01-01"))
-                    .check();
-            assertQuery("INSERT INTO test VALUES (?)")
-                    .withTimeZoneId(zone)
-                    .withParam(LocalTime.parse("12:00:00"))
-                    .check();
-        }
+        assertQuery("INSERT INTO test VALUES (CAST(? as TIMESTAMP WITH LOCAL 
TIME ZONE))")
+                .withTimeZoneId(zone)
+                .withParam(param)
+                .check();
 
-        {
-            ZoneId zone = ZoneOffset.ofHours(8);
+        assertQuery("SELECT * FROM test")
+                .returns(expectedResult)
+                .check();
+    }
 
-            assertQuery("INSERT INTO test VALUES (?)")
-                    .withTimeZoneId(zone)
-                    .withParam("1970-01-01 14:00:00")
-                    .check();
-            assertQuery("INSERT INTO test VALUES (?)")
-                    .withTimeZoneId(zone)
-                    .withParam(LocalDateTime.parse("1970-01-01T15:00:00"))
-                    .check();
-            assertQuery("INSERT INTO test VALUES (?)")
-                    .withTimeZoneId(zone)
-                    .withParam(LocalDate.parse("1970-01-01"))
-                    .check();
-            assertQuery("INSERT INTO test VALUES (?)")
-                    .withTimeZoneId(zone)
-                    .withParam(LocalTime.parse("14:00:00"))
-                    .check();
-        }
+    @ParameterizedTest
+    @MethodSource("valuesWithExpectedResult")
+    void explicitCastOfDynParamsOnSelect(Object param, int zoneOffset, Object 
expectedResult) {
+        ZoneId zone = ZoneOffset.ofHours(zoneOffset);
 
-        assertQuery("SELECT * FROM test")
-                .returns(Instant.parse("1970-01-01T08:00:00Z"))
-                .returns(Instant.parse("1970-01-01T09:00:00Z"))
-                .returns(Instant.parse("1969-12-31T20:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T08:00:00Z"))
-                .returns(Instant.parse("1970-01-01T06:00:00Z"))
-                .returns(Instant.parse("1970-01-01T07:00:00Z"))
-                .returns(Instant.parse("1969-12-31T16:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T06:00:00Z"))
+        assertQuery("SELECT CAST(? as TIMESTAMP WITH LOCAL TIME ZONE)")
+                .withTimeZoneId(zone)
+                .withParam(param)
+                .returns(expectedResult)
                 .check();
     }
 
     @Test
-    void implicitCastOfSourceTableOnInsert() {
-        sql("INSERT INTO src VALUES " 
-                + "(1, '1970-01-01 12:00:00', timestamp '1970-01-01 13:00:00', 
date '1970-01-01', time '12:00:00')," 
-                + "(2, '1970-01-01 14:00:00', timestamp '1970-01-01 15:00:00', 
date '1970-01-01', time '14:00:00')"
-        );
+    void explicitCastOfDynParamsOnMultiInsert() {
+        List<Object> expectedResults = new ArrayList<>();
 
-        {
-            ZoneId zone = ZoneOffset.ofHours(4);
+        Map<Integer, Pair<StringBuilder, List<Object>>> 
statementBuildersWithParamsByOffset = new HashMap<>();
+        for (Arguments args : 
valuesWithExpectedResult().collect(Collectors.toList())) {
+            Object param = args.get()[0];
+            int offset = (int) args.get()[1];
+            Object expectedResult = args.get()[2];
 
-            assertQuery("INSERT INTO test SELECT s FROM src WHERE id = 1")
-                    .withTimeZoneId(zone)
-                    .check();
-            assertQuery("INSERT INTO test SELECT ts FROM src WHERE id = 1")
-                    .withTimeZoneId(zone)
-                    .check();
-            assertQuery("INSERT INTO test SELECT d FROM src WHERE id = 1")
-                    .withTimeZoneId(zone)
-                    .check();
-            assertQuery("INSERT INTO test SELECT t FROM src WHERE id = 1")
-                    .withTimeZoneId(zone)
-                    .check();
-        }
+            Pair<StringBuilder, List<Object>> pair = 
statementBuildersWithParamsByOffset.get(offset);
 
-        {
-            ZoneId zone = ZoneOffset.ofHours(8);
+            StringBuilder builder;
+            List<Object> params;
+            if (pair == null) {
+                builder = new StringBuilder("INSERT INTO test VALUES");
+                params = new ArrayList<>();
 
-            assertQuery("INSERT INTO test SELECT s FROM src WHERE id = 2")
-                    .withTimeZoneId(zone)
-                    .check();
-            assertQuery("INSERT INTO test SELECT ts FROM src WHERE id = 2")
-                    .withTimeZoneId(zone)
-                    .check();
-            assertQuery("INSERT INTO test SELECT d FROM src WHERE id = 2")
-                    .withTimeZoneId(zone)
-                    .check();
-            assertQuery("INSERT INTO test SELECT t FROM src WHERE id = 2")
-                    .withTimeZoneId(zone)
-                    .check();
-        }
+                statementBuildersWithParamsByOffset.put(offset, new 
Pair<>(builder, params));
+            } else {
+                builder = pair.getFirst();
+                params = pair.getSecond();
 
-        assertQuery("SELECT * FROM test")
-                .returns(Instant.parse("1970-01-01T08:00:00Z"))
-                .returns(Instant.parse("1970-01-01T09:00:00Z"))
-                .returns(Instant.parse("1969-12-31T20:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T08:00:00Z"))
-                .returns(Instant.parse("1970-01-01T06:00:00Z"))
-                .returns(Instant.parse("1970-01-01T07:00:00Z"))
-                .returns(Instant.parse("1969-12-31T16:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T06:00:00Z"))
-                .check();
-    }
+                builder.append(",");
+            }
 
-    @Test
-    void explicitCastOfDynParamsOnInsert() {
-        {
-            ZoneId zone = ZoneOffset.ofHours(4);
+            builder.append("(CAST(? as TIMESTAMP WITH LOCAL TIME ZONE))");
+            params.add(param);
 
-            assertQuery("INSERT INTO test VALUES (CAST(? as TIMESTAMP WITH 
LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .withParam("1970-01-01 12:00:00")
-                    .check();
-            assertQuery("INSERT INTO test VALUES (CAST(? as TIMESTAMP WITH 
LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .withParam(LocalDateTime.parse("1970-01-01T13:00:00"))
-                    .check();
-            assertQuery("INSERT INTO test VALUES (CAST(? as TIMESTAMP WITH 
LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .withParam(LocalDate.parse("1970-01-01"))
-                    .check();
-            assertQuery("INSERT INTO test VALUES (CAST(? as TIMESTAMP WITH 
LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .withParam(LocalTime.parse("12:00:00"))
-                    .check();
+            expectedResults.add(expectedResult);
         }
 
-        {
-            ZoneId zone = ZoneOffset.ofHours(8);
-
-            assertQuery("INSERT INTO test VALUES (CAST(? as TIMESTAMP WITH 
LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .withParam("1970-01-01 14:00:00")
-                    .check();
-            assertQuery("INSERT INTO test VALUES (CAST(? as TIMESTAMP WITH 
LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .withParam(LocalDateTime.parse("1970-01-01T15:00:00"))
-                    .check();
-            assertQuery("INSERT INTO test VALUES (CAST(? as TIMESTAMP WITH 
LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .withParam(LocalDate.parse("1970-01-01"))
-                    .check();
-            assertQuery("INSERT INTO test VALUES (CAST(? as TIMESTAMP WITH 
LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .withParam(LocalTime.parse("14:00:00"))
+        for (Map.Entry<Integer, Pair<StringBuilder, List<Object>>> entry : 
statementBuildersWithParamsByOffset.entrySet()) {
+            assertQuery(entry.getValue().getFirst().toString())
+                    .withTimeZoneId(ZoneOffset.ofHours(entry.getKey()))
+                    .withParams(entry.getValue().getSecond().toArray())
                     .check();
         }
 
-        assertQuery("SELECT * FROM test")
-                .returns(Instant.parse("1970-01-01T08:00:00Z"))
-                .returns(Instant.parse("1970-01-01T09:00:00Z"))
-                .returns(Instant.parse("1969-12-31T20:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T08:00:00Z"))
-                .returns(Instant.parse("1970-01-01T06:00:00Z"))
-                .returns(Instant.parse("1970-01-01T07:00:00Z"))
-                .returns(Instant.parse("1969-12-31T16:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T06:00:00Z"))
-                .check();
+        QueryChecker checker = assertQuery("SELECT * FROM test");
+
+        expectedResults.forEach(checker::returns);
+
+        checker.check();
     }
 
     @Test
-    void explicitCastOfDynParamsOnSelect() {
+    void implicitCastOfSourceTableOnInsert() {
+        sql("INSERT INTO src VALUES "
+                + "(1, '1970-01-01 12:00:00', timestamp '1970-01-01 13:00:00', 
date '1970-01-01', time '12:00:00'),"
+                + "(2, NULL, NULL, NULL, NULL)"
+        );
+
         {
             ZoneId zone = ZoneOffset.ofHours(4);
 
-            assertQuery("SELECT CAST(? as TIMESTAMP WITH LOCAL TIME ZONE)")
+            assertQuery("INSERT INTO test SELECT s FROM src")
                     .withTimeZoneId(zone)
-                    .withParam("1970-01-01 12:00:00")
-                    .returns(Instant.parse("1970-01-01T08:00:00Z"))
                     .check();
-            assertQuery("SELECT CAST(? as TIMESTAMP WITH LOCAL TIME ZONE)")
+            assertQuery("INSERT INTO test SELECT ts FROM src")
                     .withTimeZoneId(zone)
-                    .withParam(LocalDateTime.parse("1970-01-01T13:00:00"))
-                    .returns(Instant.parse("1970-01-01T09:00:00Z"))
                     .check();
-            assertQuery("SELECT CAST(? as TIMESTAMP WITH LOCAL TIME ZONE)")
+            assertQuery("INSERT INTO test SELECT d FROM src")
                     .withTimeZoneId(zone)
-                    .withParam(LocalDate.parse("1970-01-01"))
-                    .returns(Instant.parse("1969-12-31T20:00:00Z"))
                     .check();
-            assertQuery("SELECT CAST(? as TIMESTAMP WITH LOCAL TIME ZONE)")
+            assertQuery("INSERT INTO test SELECT t FROM src")
                     .withTimeZoneId(zone)
-                    .withParam(LocalTime.parse("12:00:00"))
-                    .returns(Instant.parse(currentUtcDate() + "T08:00:00Z"))
                     .check();
         }
 
         {
             ZoneId zone = ZoneOffset.ofHours(8);
 
-            assertQuery("SELECT CAST(? as TIMESTAMP WITH LOCAL TIME ZONE)")
+            assertQuery("INSERT INTO test SELECT s FROM src")
                     .withTimeZoneId(zone)
-                    .withParam("1970-01-01 14:00:00")
-                    .returns(Instant.parse("1970-01-01T06:00:00Z"))
                     .check();
-            assertQuery("SELECT CAST(? as TIMESTAMP WITH LOCAL TIME ZONE)")
+            assertQuery("INSERT INTO test SELECT ts FROM src")
                     .withTimeZoneId(zone)
-                    .withParam(LocalDateTime.parse("1970-01-01T15:00:00"))
-                    .returns(Instant.parse("1970-01-01T07:00:00Z"))
                     .check();
-            assertQuery("SELECT CAST(? as TIMESTAMP WITH LOCAL TIME ZONE)")
+            assertQuery("INSERT INTO test SELECT d FROM src")
                     .withTimeZoneId(zone)
-                    .withParam(LocalDate.parse("1970-01-01"))
-                    .returns(Instant.parse("1969-12-31T16:00:00Z"))
                     .check();
-            assertQuery("SELECT CAST(? as TIMESTAMP WITH LOCAL TIME ZONE)")
-                    .withTimeZoneId(zone)
-                    .withParam(LocalTime.parse("14:00:00"))
-                    .returns(Instant.parse(currentUtcDate() + "T06:00:00Z"))
-                    .check();
-        }
-    }
-
-    @Test
-    void explicitCastOfDynParamsOnMultiInsert() {
-        {
-            ZoneId zone = ZoneOffset.ofHours(4);
-
-            assertQuery("INSERT INTO test VALUES " 
-                    + "(CAST(? as TIMESTAMP WITH LOCAL TIME ZONE))," 
-                    + "(CAST(? as TIMESTAMP WITH LOCAL TIME ZONE))," 
-                    + "(CAST(? as TIMESTAMP WITH LOCAL TIME ZONE))," 
-                    + "(CAST(? as TIMESTAMP WITH LOCAL TIME ZONE))")
+            assertQuery("INSERT INTO test SELECT t FROM src")
                     .withTimeZoneId(zone)
-                    .withParams(
-                            "1970-01-01 12:00:00",
-                            LocalDateTime.parse("1970-01-01T13:00:00"),
-                            LocalDate.parse("1970-01-01"),
-                            LocalTime.parse("12:00:00")
-                    )
-                    .check();
-        }
-
-        {
-            ZoneId zone = ZoneOffset.ofHours(8);
-
-            assertQuery("INSERT INTO test VALUES "
-                    + "(CAST(? as TIMESTAMP WITH LOCAL TIME ZONE)),"
-                    + "(CAST(? as TIMESTAMP WITH LOCAL TIME ZONE)),"
-                    + "(CAST(? as TIMESTAMP WITH LOCAL TIME ZONE)),"
-                    + "(CAST(? as TIMESTAMP WITH LOCAL TIME ZONE))")
-                    .withTimeZoneId(zone)
-                    .withParams(
-                            "1970-01-01 14:00:00",
-                            LocalDateTime.parse("1970-01-01T15:00:00"),
-                            LocalDate.parse("1970-01-01"),
-                            LocalTime.parse("14:00:00")
-                    )
                     .check();
         }
 
         assertQuery("SELECT * FROM test")
                 .returns(Instant.parse("1970-01-01T08:00:00Z"))
+                .returns(QueryChecker.NULL_AS_VARARG)
                 .returns(Instant.parse("1970-01-01T09:00:00Z"))
+                .returns(QueryChecker.NULL_AS_VARARG)
                 .returns(Instant.parse("1969-12-31T20:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T08:00:00Z"))
-                .returns(Instant.parse("1970-01-01T06:00:00Z"))
-                .returns(Instant.parse("1970-01-01T07:00:00Z"))
+                .returns(QueryChecker.NULL_AS_VARARG)
+                
.returns(localDateAndProvidedTimeAtOffset(LocalTime.parse("12:00:00"), 4))
+                .returns(QueryChecker.NULL_AS_VARARG)
+                .returns(Instant.parse("1970-01-01T04:00:00Z"))
+                .returns(QueryChecker.NULL_AS_VARARG)
+                .returns(Instant.parse("1970-01-01T05:00:00Z"))
+                .returns(QueryChecker.NULL_AS_VARARG)
                 .returns(Instant.parse("1969-12-31T16:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T06:00:00Z"))
+                .returns(QueryChecker.NULL_AS_VARARG)
+                
.returns(localDateAndProvidedTimeAtOffset(LocalTime.parse("12:00:00"), 8))
+                .returns(QueryChecker.NULL_AS_VARARG)
                 .check();
     }
 
@@ -489,22 +299,22 @@ public class ItCastToTsWithLocalTimeZoneTest extends 
BaseSqlIntegrationTest {
     void explicitCastOfSourceTableOnInsert() {
         sql("INSERT INTO src VALUES "
                 + "(1, '1970-01-01 12:00:00', timestamp '1970-01-01 13:00:00', 
date '1970-01-01', time '12:00:00'),"
-                + "(2, '1970-01-01 14:00:00', timestamp '1970-01-01 15:00:00', 
date '1970-01-01', time '14:00:00')"
+                + "(2, NULL, NULL, NULL, NULL)"
         );
 
         {
             ZoneId zone = ZoneOffset.ofHours(4);
 
-            assertQuery("INSERT INTO test SELECT CAST(s as TIMESTAMP WITH 
LOCAL TIME ZONE) FROM src WHERE id = 1")
+            assertQuery("INSERT INTO test SELECT CAST(s as TIMESTAMP WITH 
LOCAL TIME ZONE) FROM src")
                     .withTimeZoneId(zone)
                     .check();
-            assertQuery("INSERT INTO test SELECT CAST(ts as TIMESTAMP WITH 
LOCAL TIME ZONE) FROM src WHERE id = 1")
+            assertQuery("INSERT INTO test SELECT CAST(ts as TIMESTAMP WITH 
LOCAL TIME ZONE) FROM src")
                     .withTimeZoneId(zone)
                     .check();
-            assertQuery("INSERT INTO test SELECT CAST(d as TIMESTAMP WITH 
LOCAL TIME ZONE) FROM src WHERE id = 1")
+            assertQuery("INSERT INTO test SELECT CAST(d as TIMESTAMP WITH 
LOCAL TIME ZONE) FROM src")
                     .withTimeZoneId(zone)
                     .check();
-            assertQuery("INSERT INTO test SELECT CAST(t as TIMESTAMP WITH 
LOCAL TIME ZONE) FROM src WHERE id = 1")
+            assertQuery("INSERT INTO test SELECT CAST(t as TIMESTAMP WITH 
LOCAL TIME ZONE) FROM src")
                     .withTimeZoneId(zone)
                     .check();
         }
@@ -512,29 +322,37 @@ public class ItCastToTsWithLocalTimeZoneTest extends 
BaseSqlIntegrationTest {
         {
             ZoneId zone = ZoneOffset.ofHours(8);
 
-            assertQuery("INSERT INTO test SELECT CAST(s as TIMESTAMP WITH 
LOCAL TIME ZONE) FROM src WHERE id = 2")
+            assertQuery("INSERT INTO test SELECT s FROM src")
                     .withTimeZoneId(zone)
                     .check();
-            assertQuery("INSERT INTO test SELECT CAST(ts as TIMESTAMP WITH 
LOCAL TIME ZONE) FROM src WHERE id = 2")
+            assertQuery("INSERT INTO test SELECT ts FROM src")
                     .withTimeZoneId(zone)
                     .check();
-            assertQuery("INSERT INTO test SELECT CAST(d as TIMESTAMP WITH 
LOCAL TIME ZONE) FROM src WHERE id = 2")
+            assertQuery("INSERT INTO test SELECT d FROM src")
                     .withTimeZoneId(zone)
                     .check();
-            assertQuery("INSERT INTO test SELECT CAST(t as TIMESTAMP WITH 
LOCAL TIME ZONE) FROM src WHERE id = 2")
+            assertQuery("INSERT INTO test SELECT t FROM src")
                     .withTimeZoneId(zone)
                     .check();
         }
 
         assertQuery("SELECT * FROM test")
                 .returns(Instant.parse("1970-01-01T08:00:00Z"))
+                .returns(QueryChecker.NULL_AS_VARARG)
                 .returns(Instant.parse("1970-01-01T09:00:00Z"))
+                .returns(QueryChecker.NULL_AS_VARARG)
                 .returns(Instant.parse("1969-12-31T20:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T08:00:00Z"))
-                .returns(Instant.parse("1970-01-01T06:00:00Z"))
-                .returns(Instant.parse("1970-01-01T07:00:00Z"))
+                .returns(QueryChecker.NULL_AS_VARARG)
+                
.returns(localDateAndProvidedTimeAtOffset(LocalTime.parse("12:00:00"), 4))
+                .returns(QueryChecker.NULL_AS_VARARG)
+                .returns(Instant.parse("1970-01-01T04:00:00Z"))
+                .returns(QueryChecker.NULL_AS_VARARG)
+                .returns(Instant.parse("1970-01-01T05:00:00Z"))
+                .returns(QueryChecker.NULL_AS_VARARG)
                 .returns(Instant.parse("1969-12-31T16:00:00Z"))
-                .returns(Instant.parse(currentUtcDate() + "T06:00:00Z"))
+                .returns(QueryChecker.NULL_AS_VARARG)
+                
.returns(localDateAndProvidedTimeAtOffset(LocalTime.parse("12:00:00"), 8))
+                .returns(QueryChecker.NULL_AS_VARARG)
                 .check();
     }
 
@@ -542,59 +360,99 @@ public class ItCastToTsWithLocalTimeZoneTest extends 
BaseSqlIntegrationTest {
     void explicitCastOfSourceTableOnSelect() {
         sql("INSERT INTO src VALUES "
                 + "(1, '1970-01-01 12:00:00', timestamp '1970-01-01 13:00:00', 
date '1970-01-01', time '12:00:00'),"
-                + "(2, '1970-01-01 14:00:00', timestamp '1970-01-01 15:00:00', 
date '1970-01-01', time '14:00:00')"
+                + "(2, NULL, NULL, NULL, NULL)"
         );
 
         {
             ZoneId zone = ZoneOffset.ofHours(4);
 
-            assertQuery("SELECT CAST(s as TIMESTAMP WITH LOCAL TIME ZONE) FROM 
src WHERE id = 1")
+            assertQuery("SELECT CAST(s as TIMESTAMP WITH LOCAL TIME ZONE) FROM 
src")
                     .withTimeZoneId(zone)
+                    .returns(QueryChecker.NULL_AS_VARARG)
                     .returns(Instant.parse("1970-01-01T08:00:00Z"))
                     .check();
 
-            assertQuery("SELECT CAST(ts as TIMESTAMP WITH LOCAL TIME ZONE) 
FROM src WHERE id = 1")
+            assertQuery("SELECT CAST(ts as TIMESTAMP WITH LOCAL TIME ZONE) 
FROM src")
                     .withTimeZoneId(zone)
                     .returns(Instant.parse("1970-01-01T09:00:00Z"))
+                    .returns(QueryChecker.NULL_AS_VARARG)
                     .check();
 
-            assertQuery("SELECT CAST(d as TIMESTAMP WITH LOCAL TIME ZONE) FROM 
src WHERE id = 1")
+            assertQuery("SELECT CAST(d as TIMESTAMP WITH LOCAL TIME ZONE) FROM 
src")
                     .withTimeZoneId(zone)
                     .returns(Instant.parse("1969-12-31T20:00:00Z"))
+                    .returns(QueryChecker.NULL_AS_VARARG)
                     .check();
 
-            assertQuery("SELECT CAST(t as TIMESTAMP WITH LOCAL TIME ZONE) FROM 
src WHERE id = 1")
+            assertQuery("SELECT CAST(t as TIMESTAMP WITH LOCAL TIME ZONE) FROM 
src")
                     .withTimeZoneId(zone)
-                    .returns(Instant.parse(currentUtcDate() + "T08:00:00Z"))
+                    
.returns(localDateAndProvidedTimeAtOffset(LocalTime.parse("12:00:00"), 4))
+                    .returns(QueryChecker.NULL_AS_VARARG)
                     .check();
         }
 
         {
             ZoneId zone = ZoneOffset.ofHours(8);
 
-            assertQuery("SELECT CAST(s as TIMESTAMP WITH LOCAL TIME ZONE) FROM 
src WHERE id = 2")
+            assertQuery("SELECT CAST(s as TIMESTAMP WITH LOCAL TIME ZONE) FROM 
src")
                     .withTimeZoneId(zone)
-                    .returns(Instant.parse("1970-01-01T06:00:00Z"))
+                    .returns(QueryChecker.NULL_AS_VARARG)
+                    .returns(Instant.parse("1970-01-01T04:00:00Z"))
                     .check();
 
-            assertQuery("SELECT CAST(ts as TIMESTAMP WITH LOCAL TIME ZONE) 
FROM src WHERE id = 2")
+            assertQuery("SELECT CAST(ts as TIMESTAMP WITH LOCAL TIME ZONE) 
FROM src")
                     .withTimeZoneId(zone)
-                    .returns(Instant.parse("1970-01-01T07:00:00Z"))
+                    .returns(Instant.parse("1970-01-01T05:00:00Z"))
+                    .returns(QueryChecker.NULL_AS_VARARG)
                     .check();
 
-            assertQuery("SELECT CAST(d as TIMESTAMP WITH LOCAL TIME ZONE) FROM 
src WHERE id = 2")
+            assertQuery("SELECT CAST(d as TIMESTAMP WITH LOCAL TIME ZONE) FROM 
src")
                     .withTimeZoneId(zone)
                     .returns(Instant.parse("1969-12-31T16:00:00Z"))
+                    .returns(QueryChecker.NULL_AS_VARARG)
                     .check();
 
-            assertQuery("SELECT CAST(t as TIMESTAMP WITH LOCAL TIME ZONE) FROM 
src WHERE id = 2")
+            assertQuery("SELECT CAST(t as TIMESTAMP WITH LOCAL TIME ZONE) FROM 
src")
                     .withTimeZoneId(zone)
-                    .returns(Instant.parse(currentUtcDate() + "T06:00:00Z"))
+                    
.returns(localDateAndProvidedTimeAtOffset(LocalTime.parse("12:00:00"), 8))
+                    .returns(QueryChecker.NULL_AS_VARARG)
                     .check();
         }
     }
 
-    private static LocalDate currentUtcDate() {
-        return LocalDate.now(ZoneId.of("UTC"));
+    private static Stream<Arguments> literalsWithExpectedResult() {
+        return Stream.of(
+                Arguments.of("NULL", 4, null),
+                Arguments.of("NULL", 8, null),
+                Arguments.of("'1970-01-01 12:00:00'", 4, 
Instant.parse("1970-01-01T08:00:00Z")),
+                Arguments.of("'1970-01-01 12:00:00'", 8, 
Instant.parse("1970-01-01T04:00:00Z")),
+                Arguments.of("timestamp '1970-01-01 13:00:00'", 4, 
Instant.parse("1970-01-01T09:00:00Z")),
+                Arguments.of("timestamp '1970-01-01 13:00:00'", 8, 
Instant.parse("1970-01-01T05:00:00Z")),
+                Arguments.of("date '1970-01-01'", 4, 
Instant.parse("1969-12-31T20:00:00Z")),
+                Arguments.of("date '1970-01-01'", 8, 
Instant.parse("1969-12-31T16:00:00Z")),
+                Arguments.of("time '12:00:00'", 4, 
localDateAndProvidedTimeAtOffset(LocalTime.parse("12:00:00"), 4)),
+                Arguments.of("time '12:00:00'", 8, 
localDateAndProvidedTimeAtOffset(LocalTime.parse("12:00:00"), 8))
+        );
+    }
+
+    private static Stream<Arguments> valuesWithExpectedResult() {
+        return Stream.of(
+                Arguments.of(null, 4, null),
+                Arguments.of(null, 8, null),
+                Arguments.of("1970-01-01 12:00:00", 4, 
Instant.parse("1970-01-01T08:00:00Z")),
+                Arguments.of("1970-01-01 12:00:00", 8, 
Instant.parse("1970-01-01T04:00:00Z")),
+                Arguments.of(LocalDateTime.parse("1970-01-01T13:00:00"), 4, 
Instant.parse("1970-01-01T09:00:00Z")),
+                Arguments.of(LocalDateTime.parse("1970-01-01T13:00:00"), 8, 
Instant.parse("1970-01-01T05:00:00Z")),
+                Arguments.of(LocalDate.parse("1970-01-01"), 4, 
Instant.parse("1969-12-31T20:00:00Z")),
+                Arguments.of(LocalDate.parse("1970-01-01"), 8, 
Instant.parse("1969-12-31T16:00:00Z")),
+                Arguments.of(LocalTime.parse("12:00:00"), 4, 
localDateAndProvidedTimeAtOffset(LocalTime.parse("12:00:00"), 4)),
+                Arguments.of(LocalTime.parse("12:00:00"), 8, 
localDateAndProvidedTimeAtOffset(LocalTime.parse("12:00:00"), 8))
+        );
+    }
+
+    private static Instant localDateAndProvidedTimeAtOffset(LocalTime time, 
int offset) {
+        ZoneOffset zone = ZoneOffset.ofHours(offset);
+
+        return LocalDateTime.of(LocalDate.now(zone), time).toInstant(zone);
     }
 }


Reply via email to