Skip to content

Commit

Permalink
Change equality defintion for double and real types
Browse files Browse the repository at this point in the history
  • Loading branch information
rschlussel committed Jun 6, 2024
1 parent 6ee846e commit 49d7d3c
Show file tree
Hide file tree
Showing 6 changed files with 1,102 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
import com.facebook.presto.common.function.SqlFunctionProperties;

import static com.facebook.presto.common.type.TypeSignature.parseTypeSignature;
import static com.facebook.presto.common.type.TypeUtils.doubleCompare;
import static com.facebook.presto.common.type.TypeUtils.doubleEquals;
import static com.facebook.presto.common.type.TypeUtils.doubleHashCode;
import static java.lang.Double.doubleToLongBits;
import static java.lang.Double.longBitsToDouble;

Expand Down Expand Up @@ -72,25 +75,27 @@ public boolean equalTo(Block leftBlock, int leftPosition, Block rightBlock, int
{
double leftValue = longBitsToDouble(leftBlock.getLong(leftPosition));
double rightValue = longBitsToDouble(rightBlock.getLong(rightPosition));

// direct equality is correct here
// noinspection FloatingPointEquality
return leftValue == rightValue;
if (!useNewNanDefintion) {
// direct equality is correct here
// noinspection FloatingPointEquality
return leftValue == rightValue;
}
return doubleEquals(leftValue, rightValue);
}

@Override
public long hash(Block block, int position)
{
// convert to canonical NaN if necessary
return AbstractLongType.hash(doubleToLongBits(longBitsToDouble(block.getLong(position))));
return doubleHashCode(longBitsToDouble(block.getLong(position)));
}

@Override
public int compareTo(Block leftBlock, int leftPosition, Block rightBlock, int rightPosition)
{
double leftValue = longBitsToDouble(leftBlock.getLong(leftPosition));
double rightValue = longBitsToDouble(rightBlock.getLong(rightPosition));
return Double.compare(leftValue, rightValue);
return doubleCompare(leftValue, rightValue);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
import com.facebook.presto.common.function.SqlFunctionProperties;

import static com.facebook.presto.common.type.TypeSignature.parseTypeSignature;
import static java.lang.Float.floatToIntBits;
import static com.facebook.presto.common.type.TypeUtils.realCompare;
import static com.facebook.presto.common.type.TypeUtils.realEquals;
import static com.facebook.presto.common.type.TypeUtils.realHashCode;
import static java.lang.Float.intBitsToFloat;
import static java.lang.Math.toIntExact;
import static java.lang.String.format;
Expand Down Expand Up @@ -51,17 +53,18 @@ public boolean equalTo(Block leftBlock, int leftPosition, Block rightBlock, int
{
float leftValue = intBitsToFloat(leftBlock.getInt(leftPosition));
float rightValue = intBitsToFloat(rightBlock.getInt(rightPosition));

// direct equality is correct here
// noinspection FloatingPointEquality
return leftValue == rightValue;
if (!useNewNanDefinition) {
// direct equality is correct here
// noinspection FloatingPointEquality
return leftValue == rightValue;
}
return realEquals(leftValue, rightValue);
}

@Override
public long hash(Block block, int position)
{
// convert to canonical NaN if necessary
return hash(floatToIntBits(intBitsToFloat(block.getInt(position))));
return realHashCode(intBitsToFloat(block.getInt(position)));
}

@Override
Expand All @@ -71,7 +74,7 @@ public int compareTo(Block leftBlock, int leftPosition, Block rightBlock, int ri
// function being the equivalence of internal long representation.
float leftValue = intBitsToFloat(leftBlock.getInt(leftPosition));
float rightValue = intBitsToFloat(rightBlock.getInt(rightPosition));
return Float.compare(leftValue, rightValue);
return realCompare(leftValue, rightValue);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public void testBasic()
assertFunction(
"MAP_KEY_EXISTS(MAP(ARRAY[NAN(), 123.21], ARRAY['val1', 'val2']), NAN())",
BOOLEAN,
false);
true);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1632,8 +1632,8 @@ public void testArrayRemove()
assertFunction("ARRAY_REMOVE(ARRAY [-1.23E0, 3.14E0], 3.14E0)", new ArrayType(DOUBLE), ImmutableList.of(-1.23));
assertFunction("ARRAY_REMOVE(ARRAY [3.14E0], 0.0E0)", new ArrayType(DOUBLE), ImmutableList.of(3.14));
assertFunction("ARRAY_REMOVE(ARRAY [sqrt(-1), 3.14E0], 3.14E0)", new ArrayType(DOUBLE), ImmutableList.of(NaN));
assertFunction("ARRAY_REMOVE(ARRAY [-1.23E0, sqrt(-1)], nan())", new ArrayType(DOUBLE), ImmutableList.of(-1.23, NaN));
assertFunction("ARRAY_REMOVE(ARRAY [-1.23E0, nan()], nan())", new ArrayType(DOUBLE), ImmutableList.of(-1.23, NaN));
assertFunction("ARRAY_REMOVE(ARRAY [-1.23E0, sqrt(-1)], nan())", new ArrayType(DOUBLE), ImmutableList.of(-1.23));
assertFunction("ARRAY_REMOVE(ARRAY [-1.23E0, nan()], nan())", new ArrayType(DOUBLE), ImmutableList.of(-1.23));
assertFunction("ARRAY_REMOVE(ARRAY [-1.23E0, infinity()], -1.23E0)", new ArrayType(DOUBLE), ImmutableList.of(POSITIVE_INFINITY));
assertFunction("ARRAY_REMOVE(ARRAY [infinity(), 3.14E0], infinity())", new ArrayType(DOUBLE), ImmutableList.of(3.14));
assertFunction("ARRAY_REMOVE(ARRAY [-1.23E0, NULL, 3.14E0], 3.14E0)", new ArrayType(DOUBLE), asList(-1.23, null));
Expand Down
Loading

0 comments on commit 49d7d3c

Please sign in to comment.