This is an automated email from the ASF dual-hosted git repository.
snuyanzin pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new bfa7d782b1 [CALCITE-4555] Invalid zero literal value is used for
TIMESTAMP WITH LOCAL TIME ZONE type in RexBuilder
bfa7d782b1 is described below
commit bfa7d782b13afc8c361c04345a256d84a449116d
Author: Sergey Nuyanzin <[email protected]>
AuthorDate: Wed May 17 09:41:19 2023 +0200
[CALCITE-4555] Invalid zero literal value is used for TIMESTAMP WITH LOCAL
TIME ZONE type in RexBuilder
Close apache/calcite#3208
---
.../java/org/apache/calcite/rex/RexBuilder.java | 2 +-
.../org/apache/calcite/rex/RexBuilderTest.java | 70 ++++++++++++++++++++++
2 files changed, 71 insertions(+), 1 deletion(-)
diff --git a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
index 7efea7b94e..ab96e94011 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
@@ -1542,7 +1542,7 @@ public class RexBuilder {
case TIME_WITH_LOCAL_TIME_ZONE:
return new TimeString(0, 0, 0);
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
- return new TimestampString(0, 0, 0, 0, 0, 0);
+ return new TimestampString(0, 1, 1, 0, 0, 0);
default:
throw Util.unexpected(type.getSqlTypeName());
}
diff --git a/core/src/test/java/org/apache/calcite/rex/RexBuilderTest.java
b/core/src/test/java/org/apache/calcite/rex/RexBuilderTest.java
index fe7bfdbd50..de96bdf312 100644
--- a/core/src/test/java/org/apache/calcite/rex/RexBuilderTest.java
+++ b/core/src/test/java/org/apache/calcite/rex/RexBuilderTest.java
@@ -16,6 +16,8 @@
*/
package org.apache.calcite.rex;
import org.apache.calcite.avatica.util.ByteString;
+import org.apache.calcite.avatica.util.DateTimeUtils;
+import org.apache.calcite.avatica.util.Spaces;
import org.apache.calcite.avatica.util.TimeUnit;
import org.apache.calcite.rel.core.CorrelationId;
import org.apache.calcite.rel.type.RelDataType;
@@ -45,14 +47,21 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
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;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Calendar;
import java.util.TimeZone;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import java.util.stream.Stream;
import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
@@ -63,6 +72,7 @@ import static
org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
+import static org.junit.jupiter.params.provider.Arguments.of;
/**
* Test for {@link RexBuilder}.
@@ -703,6 +713,66 @@ class RexBuilderTest {
assertThat(inCall.getKind(), is(SqlKind.SEARCH));
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-4555">[CALCITE-4555]
+ * Invalid zero literal value is used for
+ * TIMESTAMP WITH LOCAL TIME ZONE type in RexBuilder</a>. */
+ @ParameterizedTest
+ @MethodSource("testData4testMakeZeroLiteral")
+ void testMakeZeroLiteral(RelDataType type, RexLiteral expected) {
+ final RelDataTypeFactory typeFactory = new
SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
+ final RexBuilder rexBuilder = new RexBuilder(typeFactory);
+ assertThat(rexBuilder.makeZeroLiteral(type), is(equalTo(expected)));
+ }
+
+ private static Stream<Arguments> testData4testMakeZeroLiteral() {
+ final RelDataTypeFactory typeFactory =
+ new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
+ final RexBuilder rexBuilder = new RexBuilder(typeFactory);
+ BiFunction<RelDataType, Function<RelDataType, Comparable>, Arguments>
type2rexLiteral =
+ (relDataType, relDataTypeComparableFunction) ->
+ of(relDataType,
+ rexBuilder.makeLiteral(
+ relDataTypeComparableFunction.apply(relDataType),
relDataType));
+ return Stream.of(
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.CHAR),
+ relDataType -> new
NlsString(Spaces.of(relDataType.getPrecision()), null, null)),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.VARCHAR),
+ relDataType -> new NlsString("", null, null)),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.BINARY),
+ relDataType -> new ByteString(new
byte[relDataType.getPrecision()])),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.VARBINARY),
+ relDataType -> ByteString.EMPTY),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.TINYINT),
+ relDataType -> BigDecimal.ZERO),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.SMALLINT),
+ relDataType -> BigDecimal.ZERO),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.INTEGER),
+ relDataType -> BigDecimal.ZERO),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.BIGINT),
+ relDataType -> BigDecimal.ZERO),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.DECIMAL),
+ relDataType -> BigDecimal.ZERO),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.FLOAT),
+ relDataType -> BigDecimal.ZERO),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.REAL),
+ relDataType -> BigDecimal.ZERO),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.DOUBLE),
+ relDataType -> BigDecimal.ZERO),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.BOOLEAN),
+ relDataType -> false),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.TIME),
+ relDataType -> DateTimeUtils.ZERO_CALENDAR),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.DATE),
+ relDataType -> DateTimeUtils.ZERO_CALENDAR),
+ type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.TIMESTAMP),
+ relDataType -> DateTimeUtils.ZERO_CALENDAR),
+
type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.TIME_WITH_LOCAL_TIME_ZONE),
+ relDataType -> new TimeString(0, 0, 0)),
+
type2rexLiteral.apply(typeFactory.createSqlType(SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE),
+ relDataType -> new TimestampString(0, 1, 1, 0, 0, 0)));
+ }
+
/** Test case for
* <a
href="https://issues.apache.org/jira/browse/CALCITE-4632">[CALCITE-4632]
* Find the least restrictive datatype for SARG</a>. */