From 0b48e00281e50006bc0e61a8e78739dbf9286336 Mon Sep 17 00:00:00 2001 From: Rebecca Schlussel Date: Wed, 29 May 2024 10:28:00 -0400 Subject: [PATCH] Add nan definition field to DoubleType and RealType Add a boolean field to DoubleType and RealType to determine whether to use the new nan definition. If useNewNanDefinition is set to true in the configuration property, then only doubles/reals with that property set to true will be created, and if it is false, then only doubles/reals with that property set to false will be created. This will be used in later commits to make decisions about how to handle nans. Because DoubleType and RealType are now parametrized types, it is no longer correct to use type == DOUBLE for type checking, as it is no longer a singleton instance. All code that was using type == DOUBLE or type == REAL has been updated to use .equals() comparison --- .../plugin/clickhouse/ClickHouseClient.java | 4 ++-- .../clickhouse/ClickHouseColumnHandle.java | 4 ++-- .../common/predicate/TupleDomainFilterUtils.java | 8 ++++---- .../facebook/presto/common/type/DoubleType.java | 10 +++++++--- .../facebook/presto/common/type/RealType.java | 9 ++++++--- .../facebook/presto/common/type/TypeUtils.java | 4 ++-- .../block/TestBlockRetainedSizeBreakdown.java | 2 +- .../presto/druid/column/ColumnReader.java | 4 ++-- .../presto/druid/column/DoubleColumnReader.java | 2 +- .../presto/druid/column/FloatColumnReader.java | 2 +- .../elasticsearch/ElasticsearchLoader.java | 2 +- .../functions/AbstractTestHiveFunctions.java | 2 +- .../functions/TestHiveAggregationFunctions.java | 2 +- .../presto/hive/FilteringPageSource.java | 4 ++-- .../presto/kafka/encoder/AbstractRowEncoder.java | 4 ++-- .../presto/kafka/encoder/raw/RawRowEncoder.java | 2 +- .../com/facebook/presto/kudu/TypeHelper.java | 16 ++++++++-------- .../BuiltInTypeAndFunctionNamespaceManager.java | 16 ++++++++++++---- .../operator/DynamicFilterSourceOperator.java | 2 +- .../presto/sql/analyzer/ExpressionAnalyzer.java | 2 +- .../relational/SqlToRowExpressionTranslator.java | 2 +- .../facebook/presto/block/BlockAssertions.java | 2 +- .../scalar/BenchmarkJsonToArrayCast.java | 2 +- .../operator/scalar/BenchmarkJsonToMapCast.java | 2 +- .../planner/TestExpressionDomainTranslator.java | 2 +- .../TestRowExpressionDomainTranslator.java | 10 +++++----- .../TestKHyperLogLogAggregationFunction.java | 4 ++-- .../presto/orc/OrcSelectiveRecordReader.java | 2 +- .../presto/orc/TupleDomainOrcPredicate.java | 2 +- .../statistics/DoubleStatisticsBuilder.java | 2 +- .../orc/BenchmarkSelectiveStreamReaders.java | 8 ++++---- .../java/com/facebook/presto/orc/OrcTester.java | 9 ++++----- .../orc/writer/TestWriterBlockRawSize.java | 2 +- .../presto/decoder/raw/RawColumnDecoder.java | 2 +- 34 files changed, 83 insertions(+), 69 deletions(-) diff --git a/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/ClickHouseClient.java b/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/ClickHouseClient.java index fce660719beff..87eb7606cd841 100755 --- a/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/ClickHouseClient.java +++ b/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/ClickHouseClient.java @@ -854,10 +854,10 @@ private String toWriteMapping(Type type) if (type == BIGINT) { return "Int64"; } - if (type == REAL) { + if (type.equals(REAL)) { return "Float32"; } - if (type == DOUBLE) { + if (type.equals(DOUBLE)) { return "Float64"; } if (type instanceof DecimalType) { diff --git a/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/ClickHouseColumnHandle.java b/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/ClickHouseColumnHandle.java index fb4d7148cb891..d0c616554f6cc 100755 --- a/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/ClickHouseColumnHandle.java +++ b/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/ClickHouseColumnHandle.java @@ -195,10 +195,10 @@ public static ClickHouseTypeHandle toMappingDefaultJdbcHandle(Type type) if (type == BIGINT) { return new ClickHouseTypeHandle(Types.BIGINT, Optional.of("bigint"), 8, 0, Optional.empty(), Optional.empty()); } - if (type == REAL) { + if (type.equals(REAL)) { return new ClickHouseTypeHandle(Types.REAL, Optional.of("real"), 16, 4, Optional.empty(), Optional.empty()); } - if (type == DOUBLE) { + if (type.equals(DOUBLE)) { return new ClickHouseTypeHandle(Types.DOUBLE, Optional.of("double precision"), 32, 4, Optional.empty(), Optional.empty()); } if (type instanceof CharType || type instanceof VarcharType) { diff --git a/presto-common/src/main/java/com/facebook/presto/common/predicate/TupleDomainFilterUtils.java b/presto-common/src/main/java/com/facebook/presto/common/predicate/TupleDomainFilterUtils.java index 526eb64057f88..08c012bb5b684 100644 --- a/presto-common/src/main/java/com/facebook/presto/common/predicate/TupleDomainFilterUtils.java +++ b/presto-common/src/main/java/com/facebook/presto/common/predicate/TupleDomainFilterUtils.java @@ -148,7 +148,7 @@ public static TupleDomainFilter toFilter(Domain domain) /** * Returns true is ranges represent != or NOT IN filter for double, float or string column. - * + *

* The logic is to return true if ranges are next to each other, but don't include the touch value. */ private static boolean isNotIn(List ranges) @@ -161,7 +161,7 @@ private static boolean isNotIn(List ranges) Marker previousHigh = firstRange.getHigh(); Type type = previousHigh.getType(); - if (type != DOUBLE && type != REAL && !isVarcharType(type) && !(type instanceof CharType)) { + if (!type.equals(DOUBLE) && !type.equals(REAL) && !isVarcharType(type) && !(type instanceof CharType)) { return false; } @@ -219,10 +219,10 @@ private static TupleDomainFilter createRangeFilter(Type type, Range range, boole checkArgument(range.isSingleValue(), "Unexpected range of boolean values"); return BooleanValue.of(((Boolean) range.getSingleValue()).booleanValue(), nullAllowed); } - if (type == DOUBLE) { + if (type.equals(DOUBLE)) { return doubleRangeToFilter(range, nullAllowed); } - if (type == REAL) { + if (type.equals(REAL)) { return floatRangeToFilter(range, nullAllowed); } if (type instanceof DecimalType) { diff --git a/presto-common/src/main/java/com/facebook/presto/common/type/DoubleType.java b/presto-common/src/main/java/com/facebook/presto/common/type/DoubleType.java index 7c36919d7d537..7f49c1f58680a 100644 --- a/presto-common/src/main/java/com/facebook/presto/common/type/DoubleType.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/DoubleType.java @@ -29,11 +29,15 @@ public final class DoubleType extends AbstractPrimitiveType implements FixedWidthType { - public static final DoubleType DOUBLE = new DoubleType(); + public static final DoubleType DOUBLE = new DoubleType(true); + public static final DoubleType OLD_NAN_DOUBLE = new DoubleType(false); - private DoubleType() + private final boolean useNewNanDefintion; + + private DoubleType(boolean useNewNanDefintion) { super(parseTypeSignature(StandardTypes.DOUBLE), double.class); + this.useNewNanDefintion = useNewNanDefintion; } @Override @@ -149,7 +153,7 @@ public final BlockBuilder createFixedSizeBlockBuilder(int positionCount) @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") public boolean equals(Object other) { - return other == DOUBLE; + return other instanceof DoubleType; } @Override diff --git a/presto-common/src/main/java/com/facebook/presto/common/type/RealType.java b/presto-common/src/main/java/com/facebook/presto/common/type/RealType.java index 118caf4c6e67e..3334994ce8bb6 100644 --- a/presto-common/src/main/java/com/facebook/presto/common/type/RealType.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/RealType.java @@ -27,11 +27,14 @@ public final class RealType extends AbstractIntType { - public static final RealType REAL = new RealType(); + public static final RealType REAL = new RealType(true); + public static final RealType OLD_NAN_REAL = new RealType(false); + private final boolean useNewNanDefinition; - private RealType() + private RealType(boolean useNewNanDefinition) { super(parseTypeSignature(StandardTypes.REAL)); + this.useNewNanDefinition = useNewNanDefinition; } @Override @@ -86,7 +89,7 @@ public void writeLong(BlockBuilder blockBuilder, long value) @Override public boolean equals(Object other) { - return other == REAL; + return other instanceof RealType; } @Override diff --git a/presto-common/src/main/java/com/facebook/presto/common/type/TypeUtils.java b/presto-common/src/main/java/com/facebook/presto/common/type/TypeUtils.java index 1de251ac68842..1d82beaa51ed5 100644 --- a/presto-common/src/main/java/com/facebook/presto/common/type/TypeUtils.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/TypeUtils.java @@ -175,10 +175,10 @@ public static boolean isFloatingPointNaN(Type type, Object value) requireNonNull(type, "type is null"); requireNonNull(value, "value is null"); - if (type == DOUBLE) { + if (type.equals(DOUBLE)) { return Double.isNaN((double) value); } - if (type == REAL) { + if (type.equals(REAL)) { return Float.isNaN(intBitsToFloat(toIntExact((long) value))); } return false; diff --git a/presto-common/src/test/java/com/facebook/presto/common/block/TestBlockRetainedSizeBreakdown.java b/presto-common/src/test/java/com/facebook/presto/common/block/TestBlockRetainedSizeBreakdown.java index 7de089c9cf440..0a26d7a858c35 100644 --- a/presto-common/src/test/java/com/facebook/presto/common/block/TestBlockRetainedSizeBreakdown.java +++ b/presto-common/src/test/java/com/facebook/presto/common/block/TestBlockRetainedSizeBreakdown.java @@ -176,7 +176,7 @@ private static Object castIntegerToObject(int value, Type type) if (type == VARCHAR) { return String.valueOf(value); } - if (type == DOUBLE) { + if (type.equals(DOUBLE)) { return (double) value; } throw new UnsupportedOperationException(); diff --git a/presto-druid/src/main/java/com/facebook/presto/druid/column/ColumnReader.java b/presto-druid/src/main/java/com/facebook/presto/druid/column/ColumnReader.java index 5ff07f5fbae0f..81dc3c5a76fb5 100644 --- a/presto-druid/src/main/java/com/facebook/presto/druid/column/ColumnReader.java +++ b/presto-druid/src/main/java/com/facebook/presto/druid/column/ColumnReader.java @@ -35,13 +35,13 @@ static ColumnReader createColumnReader(Type type, ColumnValueSelector valueSelec if (type == VARCHAR) { return new StringColumnReader(valueSelector); } - if (type == DOUBLE) { + if (type.equals(DOUBLE)) { return new DoubleColumnReader(valueSelector); } if (type == BIGINT) { return new LongColumnReader(valueSelector); } - if (type == REAL) { + if (type.equals(REAL)) { return new FloatColumnReader(valueSelector); } if (type == TIMESTAMP) { diff --git a/presto-druid/src/main/java/com/facebook/presto/druid/column/DoubleColumnReader.java b/presto-druid/src/main/java/com/facebook/presto/druid/column/DoubleColumnReader.java index 0b4fdc4ea6ad0..0cb114fd39458 100644 --- a/presto-druid/src/main/java/com/facebook/presto/druid/column/DoubleColumnReader.java +++ b/presto-druid/src/main/java/com/facebook/presto/druid/column/DoubleColumnReader.java @@ -35,7 +35,7 @@ public DoubleColumnReader(ColumnValueSelector valueSelector) @Override public Block readBlock(Type type, int batchSize) { - checkArgument(type == DOUBLE); + checkArgument(type.equals(DOUBLE)); BlockBuilder builder = type.createBlockBuilder(null, batchSize); for (int i = 0; i < batchSize; i++) { type.writeDouble(builder, valueSelector.getDouble()); diff --git a/presto-druid/src/main/java/com/facebook/presto/druid/column/FloatColumnReader.java b/presto-druid/src/main/java/com/facebook/presto/druid/column/FloatColumnReader.java index 48d3b393e70c1..b90be49ca3e27 100644 --- a/presto-druid/src/main/java/com/facebook/presto/druid/column/FloatColumnReader.java +++ b/presto-druid/src/main/java/com/facebook/presto/druid/column/FloatColumnReader.java @@ -36,7 +36,7 @@ public FloatColumnReader(ColumnValueSelector valueSelector) @Override public Block readBlock(Type type, int batchSize) { - checkArgument(type == REAL); + checkArgument(type.equals(REAL)); BlockBuilder builder = type.createBlockBuilder(null, batchSize); for (int i = 0; i < batchSize; i++) { type.writeLong(builder, floatToRawIntBits(valueSelector.getFloat())); diff --git a/presto-elasticsearch/src/test/java/com/facebook/presto/elasticsearch/ElasticsearchLoader.java b/presto-elasticsearch/src/test/java/com/facebook/presto/elasticsearch/ElasticsearchLoader.java index 80545c6488a9b..f8ed7dac0d6eb 100644 --- a/presto-elasticsearch/src/test/java/com/facebook/presto/elasticsearch/ElasticsearchLoader.java +++ b/presto-elasticsearch/src/test/java/com/facebook/presto/elasticsearch/ElasticsearchLoader.java @@ -138,7 +138,7 @@ private Object convertValue(Object value, Type type) if (type == INTEGER) { return ((Number) value).intValue(); } - if (type == DOUBLE) { + if (type.equals(DOUBLE)) { return ((Number) value).doubleValue(); } throw new IllegalArgumentException("Unhandled type: " + type); diff --git a/presto-hive-function-namespace/src/test/java/com/facebook/presto/hive/functions/AbstractTestHiveFunctions.java b/presto-hive-function-namespace/src/test/java/com/facebook/presto/hive/functions/AbstractTestHiveFunctions.java index fbaa177ca7718..a9ec89406e4dd 100644 --- a/presto-hive-function-namespace/src/test/java/com/facebook/presto/hive/functions/AbstractTestHiveFunctions.java +++ b/presto-hive-function-namespace/src/test/java/com/facebook/presto/hive/functions/AbstractTestHiveFunctions.java @@ -108,7 +108,7 @@ public void assertQuery(@Language("SQL") String sql, Column... cols) for (int j = 0; j < numColumns; j++) { Object actual = rows.get(i).getField(j); Object expected = cols[j].values[i]; - if (cols[j].type == DOUBLE) { + if (cols[j].type.equals(DOUBLE)) { assertEquals(((Number) actual).doubleValue(), ((double) expected), 0.000001); } else { diff --git a/presto-hive-function-namespace/src/test/java/com/facebook/presto/hive/functions/TestHiveAggregationFunctions.java b/presto-hive-function-namespace/src/test/java/com/facebook/presto/hive/functions/TestHiveAggregationFunctions.java index edf1a2091bbb2..03294c4c98d2d 100644 --- a/presto-hive-function-namespace/src/test/java/com/facebook/presto/hive/functions/TestHiveAggregationFunctions.java +++ b/presto-hive-function-namespace/src/test/java/com/facebook/presto/hive/functions/TestHiveAggregationFunctions.java @@ -128,7 +128,7 @@ public void check(@Language("SQL") String query, Column... expectedColumns) for (int j = 0; j < numColumns; j++) { Object actual = rows.get(i).getField(j); Object expected = expectedColumns[j].values[i]; - if (expectedColumns[j].type == DOUBLE) { + if (expectedColumns[j].type.equals(DOUBLE)) { assertEquals(((Number) actual).doubleValue(), ((double) expected), 0.000001); } else { diff --git a/presto-hive/src/main/java/com/facebook/presto/hive/FilteringPageSource.java b/presto-hive/src/main/java/com/facebook/presto/hive/FilteringPageSource.java index 12006fb329d3d..07f47603e0523 100644 --- a/presto-hive/src/main/java/com/facebook/presto/hive/FilteringPageSource.java +++ b/presto-hive/src/main/java/com/facebook/presto/hive/FilteringPageSource.java @@ -246,11 +246,11 @@ private static boolean testNonNullPosition(Block block, int position, Type type, return filter.testBoolean(type.getBoolean(block, position)); } - if (type == DOUBLE) { + if (type.equals(DOUBLE)) { return filter.testDouble(longBitsToDouble(block.getLong(position))); } - if (type == REAL) { + if (type.equals(REAL)) { return filter.testFloat(intBitsToFloat(block.getInt(position))); } diff --git a/presto-kafka/src/main/java/com/facebook/presto/kafka/encoder/AbstractRowEncoder.java b/presto-kafka/src/main/java/com/facebook/presto/kafka/encoder/AbstractRowEncoder.java index 331b57db5426a..270c349f45a26 100644 --- a/presto-kafka/src/main/java/com/facebook/presto/kafka/encoder/AbstractRowEncoder.java +++ b/presto-kafka/src/main/java/com/facebook/presto/kafka/encoder/AbstractRowEncoder.java @@ -91,10 +91,10 @@ else if (type == SMALLINT) { else if (type == TINYINT) { appendByte(SignedBytes.checkedCast(type.getLong(block, position))); } - else if (type == DOUBLE) { + else if (type.equals(DOUBLE)) { appendDouble(type.getDouble(block, position)); } - else if (type == REAL) { + else if (type.equals(REAL)) { appendFloat(intBitsToFloat(toIntExact(type.getLong(block, position)))); } else if (isVarcharType(type)) { diff --git a/presto-kafka/src/main/java/com/facebook/presto/kafka/encoder/raw/RawRowEncoder.java b/presto-kafka/src/main/java/com/facebook/presto/kafka/encoder/raw/RawRowEncoder.java index 5d67bde135404..8aaec99b15369 100644 --- a/presto-kafka/src/main/java/com/facebook/presto/kafka/encoder/raw/RawRowEncoder.java +++ b/presto-kafka/src/main/java/com/facebook/presto/kafka/encoder/raw/RawRowEncoder.java @@ -196,7 +196,7 @@ else if (columnType == TINYINT) { else if (columnType == BOOLEAN) { checkFieldTypeOneOf(fieldType, columnName, columnType, FieldType.BYTE, FieldType.SHORT, FieldType.INT, FieldType.LONG); } - else if (columnType == DOUBLE) { + else if (columnType.equals(DOUBLE)) { checkFieldTypeOneOf(fieldType, columnName, columnType, FieldType.DOUBLE, FieldType.FLOAT); } else if (isVarcharType(columnType)) { diff --git a/presto-kudu/src/main/java/com/facebook/presto/kudu/TypeHelper.java b/presto-kudu/src/main/java/com/facebook/presto/kudu/TypeHelper.java index 8064da45709de..cccfe3ce4c2a6 100644 --- a/presto-kudu/src/main/java/com/facebook/presto/kudu/TypeHelper.java +++ b/presto-kudu/src/main/java/com/facebook/presto/kudu/TypeHelper.java @@ -65,10 +65,10 @@ else if (type == SmallintType.SMALLINT) { else if (type == TinyintType.TINYINT) { return org.apache.kudu.Type.INT8; } - else if (type == RealType.REAL) { + else if (type.equals(RealType.REAL)) { return org.apache.kudu.Type.FLOAT; } - else if (type == DoubleType.DOUBLE) { + else if (type.equals(DoubleType.DOUBLE)) { return org.apache.kudu.Type.DOUBLE; } else if (type == BooleanType.BOOLEAN) { @@ -146,10 +146,10 @@ else if (type == SmallintType.SMALLINT) { else if (type == TinyintType.TINYINT) { return ((Long) nativeValue).byteValue(); } - else if (type == DoubleType.DOUBLE) { + else if (type.equals(DoubleType.DOUBLE)) { return nativeValue; } - else if (type == RealType.REAL) { + else if (type.equals(RealType.REAL)) { // conversion can result in precision lost return intBitsToFloat(((Long) nativeValue).intValue()); } @@ -191,10 +191,10 @@ else if (type == SmallintType.SMALLINT) { else if (type == TinyintType.TINYINT) { return row.getByte(field); } - else if (type == DoubleType.DOUBLE) { + else if (type.equals(DoubleType.DOUBLE)) { return row.getDouble(field); } - else if (type == RealType.REAL) { + else if (type.equals(RealType.REAL)) { return row.getFloat(field); } else if (type == BooleanType.BOOLEAN) { @@ -229,7 +229,7 @@ else if (type == SmallintType.SMALLINT) { else if (type == TinyintType.TINYINT) { return row.getByte(field); } - else if (type == RealType.REAL) { + else if (type.equals(RealType.REAL)) { return floatToRawIntBits(row.getFloat(field)); } else if (type instanceof DecimalType) { @@ -258,7 +258,7 @@ public static boolean getBoolean(Type type, RowResult row, int field) public static double getDouble(Type type, RowResult row, int field) { - if (type == DoubleType.DOUBLE) { + if (type.equals(DoubleType.DOUBLE)) { return row.getDouble(field); } else { diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInTypeAndFunctionNamespaceManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInTypeAndFunctionNamespaceManager.java index c9c02abf6cec5..ab87beb5ff99d 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInTypeAndFunctionNamespaceManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInTypeAndFunctionNamespaceManager.java @@ -316,6 +316,7 @@ import static com.facebook.presto.common.type.BooleanType.BOOLEAN; import static com.facebook.presto.common.type.DateType.DATE; import static com.facebook.presto.common.type.DoubleType.DOUBLE; +import static com.facebook.presto.common.type.DoubleType.OLD_NAN_DOUBLE; import static com.facebook.presto.common.type.HyperLogLogType.HYPER_LOG_LOG; import static com.facebook.presto.common.type.IntegerType.INTEGER; import static com.facebook.presto.common.type.JsonType.JSON; @@ -323,6 +324,7 @@ import static com.facebook.presto.common.type.KllSketchParametricType.KLL_SKETCH; import static com.facebook.presto.common.type.P4HyperLogLogType.P4_HYPER_LOG_LOG; import static com.facebook.presto.common.type.QuantileDigestParametricType.QDIGEST; +import static com.facebook.presto.common.type.RealType.OLD_NAN_REAL; import static com.facebook.presto.common.type.RealType.REAL; import static com.facebook.presto.common.type.SmallintType.SMALLINT; import static com.facebook.presto.common.type.TDigestParametricType.TDIGEST; @@ -605,14 +607,14 @@ public BuiltInTypeAndFunctionNamespaceManager( .build(CacheLoader.from(this::instantiateParametricType)); registerBuiltInFunctions(getBuiltInFunctions(featuresConfig)); - registerBuiltInTypes(); + registerBuiltInTypes(featuresConfig); for (Type type : requireNonNull(types, "types is null")) { addType(type); } } - private void registerBuiltInTypes() + private void registerBuiltInTypes(FeaturesConfig featuresConfig) { // always add the built-in types; Presto will not function without these addType(UNKNOWN); @@ -621,8 +623,14 @@ private void registerBuiltInTypes() addType(INTEGER); addType(SMALLINT); addType(TINYINT); - addType(DOUBLE); - addType(REAL); + if(!featuresConfig.getUseNewNanDefinition()) { + addType(OLD_NAN_DOUBLE); + addType(OLD_NAN_REAL); + + } else { + addType(DOUBLE); + addType(REAL); + } addType(VARBINARY); addType(DATE); addType(TIME); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/DynamicFilterSourceOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/DynamicFilterSourceOperator.java index 2cc05aee94f4f..8645258ba7acd 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/DynamicFilterSourceOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/DynamicFilterSourceOperator.java @@ -191,7 +191,7 @@ private DynamicFilterSourceOperator( for (int channelIndex = 0; channelIndex < channels.size(); ++channelIndex) { Type type = channels.get(channelIndex).getType(); // Skipping DOUBLE and REAL in collectMinMaxValues to avoid dealing with NaN values - if (minMaxCollectionLimit > 0 && type.isOrderable() && type != DOUBLE && type != REAL) { + if (minMaxCollectionLimit > 0 && type.isOrderable() && !type.equals(DOUBLE) && !type.equals(REAL)) { minMaxChannelsBuilder.add(channelIndex); } this.blockBuilders[channelIndex] = type.createBlockBuilder(null, EXPECTED_BLOCK_BUILDER_SIZE); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java index 2b887077e84ac..40b4b98e8241b 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java @@ -844,7 +844,7 @@ protected Type visitLongLiteral(LongLiteral node, StackableAstVisitorContext context) { - return setExpressionType(node, DOUBLE); + return setExpressionType(node, functionAndTypeResolver.getType(DOUBLE.getTypeSignature())); } @Override diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlToRowExpressionTranslator.java b/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlToRowExpressionTranslator.java index 516266ee99951..31889637c4505 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlToRowExpressionTranslator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlToRowExpressionTranslator.java @@ -358,7 +358,7 @@ protected RowExpression visitLongLiteral(LongLiteral node, Context context) @Override protected RowExpression visitDoubleLiteral(DoubleLiteral node, Context context) { - return constant(node.getValue(), DOUBLE); + return constant(node.getValue(), functionAndTypeManager.getType(DOUBLE.getTypeSignature())); } @Override diff --git a/presto-main/src/test/java/com/facebook/presto/block/BlockAssertions.java b/presto-main/src/test/java/com/facebook/presto/block/BlockAssertions.java index 24997174e547d..299c196d96c68 100644 --- a/presto-main/src/test/java/com/facebook/presto/block/BlockAssertions.java +++ b/presto-main/src/test/java/com/facebook/presto/block/BlockAssertions.java @@ -781,7 +781,7 @@ public static Block createRandomBlockForType( else if (type == BIGINT) { block = createRandomLongsBlock(positionCount, primitiveNullRate); } - else if (type == INTEGER || type == REAL) { + else if (type == INTEGER || type.equals(REAL)) { block = createRandomIntsBlock(positionCount, primitiveNullRate); } else if (type == SMALLINT) { diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToArrayCast.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToArrayCast.java index bf1edd7162b4a..5ef9b93f111f7 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToArrayCast.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToArrayCast.java @@ -151,7 +151,7 @@ private static String generateRandomJsonValue(Type valueType) if (valueType == BIGINT) { return Long.toString(ThreadLocalRandom.current().nextLong()); } - else if (valueType == DOUBLE) { + else if (valueType.equals(DOUBLE)) { return Double.toString(ThreadLocalRandom.current().nextDouble()); } else if (valueType == VARCHAR) { diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToMapCast.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToMapCast.java index dac5dd062d631..9e3712ac72a98 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToMapCast.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToMapCast.java @@ -155,7 +155,7 @@ private static String generateRandomJsonValue(Type valueType) if (valueType == BIGINT) { return Long.toString(ThreadLocalRandom.current().nextLong()); } - else if (valueType == DOUBLE) { + else if (valueType.equals(DOUBLE)) { return Double.toString(ThreadLocalRandom.current().nextDouble()); } else if (valueType == VARCHAR) { diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/TestExpressionDomainTranslator.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/TestExpressionDomainTranslator.java index 8dac150e53b12..2686605fdc6d6 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/TestExpressionDomainTranslator.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/TestExpressionDomainTranslator.java @@ -1556,7 +1556,7 @@ public T getMax() public boolean isFractional() { - return type == DOUBLE || type == REAL || (type instanceof DecimalType && ((DecimalType) type).getScale() > 0); + return type.equals(DOUBLE) || type.equals(REAL) || (type instanceof DecimalType && ((DecimalType) type).getScale() > 0); } } } diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/TestRowExpressionDomainTranslator.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/TestRowExpressionDomainTranslator.java index 9c73eb2b4450c..1d12d1ddc002a 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/TestRowExpressionDomainTranslator.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/TestRowExpressionDomainTranslator.java @@ -201,9 +201,9 @@ public void testInOptimization() assertEquals(toPredicate(tupleDomain), and(lessThan(C_BIGINT, bigintLiteral(4L)), not(bigintIn(C_BIGINT, ImmutableList.of(1L, 2L, 3L))))); testDomain = Domain.create(ValueSet.ofRanges( - Range.range(BIGINT, 1L, true, 3L, true), - Range.range(BIGINT, 5L, true, 7L, true), - Range.range(BIGINT, 9L, true, 11L, true)), + Range.range(BIGINT, 1L, true, 3L, true), + Range.range(BIGINT, 5L, true, 7L, true), + Range.range(BIGINT, 9L, true, 11L, true)), false); tupleDomain = withColumnDomains(ImmutableMap.builder().put(C_BIGINT, testDomain).build()); @@ -212,7 +212,7 @@ public void testInOptimization() testDomain = Domain.create( ValueSet.ofRanges( - Range.lessThan(BIGINT, 4L)) + Range.lessThan(BIGINT, 4L)) .intersect(ValueSet.all(BIGINT) .subtract(ValueSet.ofRanges(Range.equal(BIGINT, 1L), Range.equal(BIGINT, 2L), Range.equal(BIGINT, 3L)))) .union(ValueSet.ofRanges(Range.range(BIGINT, 7L, true, 9L, true))), false); @@ -1444,7 +1444,7 @@ public T getMax() public boolean isFractional() { - return input.getType() == DOUBLE || input.getType() == REAL || (input.getType() instanceof DecimalType && ((DecimalType) input.getType()).getScale() > 0); + return input.getType().equals(DOUBLE) || input.getType().equals(REAL) || (input.getType() instanceof DecimalType && ((DecimalType) input.getType()).getScale() > 0); } } } diff --git a/presto-main/src/test/java/com/facebook/presto/type/khyperloglog/TestKHyperLogLogAggregationFunction.java b/presto-main/src/test/java/com/facebook/presto/type/khyperloglog/TestKHyperLogLogAggregationFunction.java index 9a774be56f8eb..078144583b11c 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/khyperloglog/TestKHyperLogLogAggregationFunction.java +++ b/presto-main/src/test/java/com/facebook/presto/type/khyperloglog/TestKHyperLogLogAggregationFunction.java @@ -173,7 +173,7 @@ private void testAggregation(Type valueType, List values, Type uiiType, List< private long toLong(Object value, Type type) { - if (type == DOUBLE) { + if (type.equals(DOUBLE)) { return Double.doubleToLongBits((double) value); } else if (type == VARCHAR) { @@ -186,7 +186,7 @@ else if (type == VARCHAR) { private Block buildBlock(List values, Type type) { - if (type == DOUBLE) { + if (type.equals(DOUBLE)) { return createDoublesBlock(values.stream().map(o -> (Double) o).collect(Collectors.toList())); } else if (type == VARCHAR) { diff --git a/presto-orc/src/main/java/com/facebook/presto/orc/OrcSelectiveRecordReader.java b/presto-orc/src/main/java/com/facebook/presto/orc/OrcSelectiveRecordReader.java index db6122eca009b..6575b340fd694 100644 --- a/presto-orc/src/main/java/com/facebook/presto/orc/OrcSelectiveRecordReader.java +++ b/presto-orc/src/main/java/com/facebook/presto/orc/OrcSelectiveRecordReader.java @@ -519,7 +519,7 @@ private static int scoreType(Type type) return 20; } - if (type == REAL || type == DOUBLE) { + if (type.equals(REAL) || type.equals(DOUBLE)) { return 30; } diff --git a/presto-orc/src/main/java/com/facebook/presto/orc/TupleDomainOrcPredicate.java b/presto-orc/src/main/java/com/facebook/presto/orc/TupleDomainOrcPredicate.java index ce53e37f9784e..f605dabd507c5 100644 --- a/presto-orc/src/main/java/com/facebook/presto/orc/TupleDomainOrcPredicate.java +++ b/presto-orc/src/main/java/com/facebook/presto/orc/TupleDomainOrcPredicate.java @@ -167,7 +167,7 @@ public static boolean checkInBloomFilter(BloomFilter bloomFilter, Object predica return bloomFilter.testLong(((Number) predicateValue).longValue()); } - if (sqlType == DOUBLE) { + if (sqlType.equals(DOUBLE)) { return bloomFilter.testDouble((Double) predicateValue); } diff --git a/presto-orc/src/main/java/com/facebook/presto/orc/metadata/statistics/DoubleStatisticsBuilder.java b/presto-orc/src/main/java/com/facebook/presto/orc/metadata/statistics/DoubleStatisticsBuilder.java index a99bf8c4cd0ae..e5f79a900fc74 100644 --- a/presto-orc/src/main/java/com/facebook/presto/orc/metadata/statistics/DoubleStatisticsBuilder.java +++ b/presto-orc/src/main/java/com/facebook/presto/orc/metadata/statistics/DoubleStatisticsBuilder.java @@ -38,7 +38,7 @@ public void addBlock(Type type, Block block) for (int position = 0; position < block.getPositionCount(); position++) { if (!block.isNull(position)) { double value; - if (type == RealType.REAL) { + if (type.equals(RealType.REAL)) { value = Float.intBitsToFloat((int) type.getLong(block, position)); } else { diff --git a/presto-orc/src/test/java/com/facebook/presto/orc/BenchmarkSelectiveStreamReaders.java b/presto-orc/src/test/java/com/facebook/presto/orc/BenchmarkSelectiveStreamReaders.java index b97907d2206d2..6aa01e2f3a4fa 100644 --- a/presto-orc/src/test/java/com/facebook/presto/orc/BenchmarkSelectiveStreamReaders.java +++ b/presto-orc/src/test/java/com/facebook/presto/orc/BenchmarkSelectiveStreamReaders.java @@ -340,11 +340,11 @@ private Optional getFilter(Type type, float filterRate, boole return Optional.of(BigintRange.of((long) (Byte.MIN_VALUE * selectionRateForNonNull), (long) (Byte.MAX_VALUE * selectionRateForNonNull), filterAllowNull)); } - if (type == REAL) { + if (type.equals(REAL)) { return Optional.of(FloatRange.of(0, false, false, selectionRateForNonNull, false, true, filterAllowNull)); } - if (type == DOUBLE) { + if (type.equals(DOUBLE)) { return Optional.of(DoubleRange.of(0, false, false, selectionRateForNonNull, false, true, filterAllowNull)); } @@ -423,11 +423,11 @@ private Object createValue(Type type, float filterRate) return new SqlTimestamp(value, TimeZoneKey.UTC_KEY, MILLISECONDS); } - if (type == REAL) { + if (type.equals(REAL)) { return random.nextFloat(); } - if (type == DOUBLE) { + if (type.equals(DOUBLE)) { return random.nextDouble(); } diff --git a/presto-orc/src/test/java/com/facebook/presto/orc/OrcTester.java b/presto-orc/src/test/java/com/facebook/presto/orc/OrcTester.java index 1d9f2eddcb429..3c6a2497b6b78 100644 --- a/presto-orc/src/test/java/com/facebook/presto/orc/OrcTester.java +++ b/presto-orc/src/test/java/com/facebook/presto/orc/OrcTester.java @@ -360,9 +360,8 @@ public void testRoundTrip(Type type, List readValues, List