diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/NumericLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/NumericLiteral.java index 802721b15b36db..652fa876247966 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/NumericLiteral.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/NumericLiteral.java @@ -65,7 +65,10 @@ public int compareTo(ComparableLiteral other) { || other instanceof DecimalLiteral || other instanceof DecimalV3Literal) { return this.getBigDecimalValue().compareTo(((NumericLiteral) other).getBigDecimalValue()); } - return Double.compare(this.getDouble(), ((Literal) other).getDouble()); + double left = this.getDouble(); + double right = ((Literal) other).getDouble(); + // SQL treats signed zeros as equal, while Double.compare distinguishes them. + return left == right ? 0 : Double.compare(left, right); } if (other instanceof NullLiteral) { return 1; diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java index cdcab9efc177c4..ddd4e92b40301e 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java @@ -142,6 +142,26 @@ class FoldConstantTest extends ExpressionRewriteTestHelper { + @Test + void testSignedZeroComparisonFold() { + executor = new ExpressionRuleExecutor(ImmutableList.of( + bottomUp(FoldConstantRuleOnFE.VISITOR_INSTANCE) + )); + for (String type : ImmutableList.of("float", "double")) { + for (String zero : ImmutableList.of("0.0", "-0.0")) { + String left = "cast('" + zero + "' as " + type + ")"; + String right = "cast('" + (zero.equals("0.0") ? "-0.0" : "0.0") + "' as " + type + ")"; + assertRewriteAfterTypeCoercion(left + " = " + right, "true"); + assertRewriteAfterTypeCoercion(left + " <=> " + right, "true"); + assertRewriteAfterTypeCoercion(left + " != " + right, "false"); + assertRewriteAfterTypeCoercion(left + " < " + right, "false"); + assertRewriteAfterTypeCoercion(left + " > " + right, "false"); + assertRewriteAfterTypeCoercion(left + " <= " + right, "true"); + assertRewriteAfterTypeCoercion(left + " >= " + right, "true"); + } + } + } + @Test void testCaseWhenFold() { executor = new ExpressionRuleExecutor(ImmutableList.of(