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