Skip to content

Commit d07c8ea

Browse files
branch-4.1: [Fix](FoldConst) Preserve NaN in numeric constant folding #63870 (#63909)
Cherry-picked from #63870 Co-authored-by: linrrarity <linzhenqi@selectdb.com>
1 parent d53b2f0 commit d07c8ea

3 files changed

Lines changed: 29 additions & 1 deletion

File tree

fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/NumericArithmetic.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,9 @@ public static Boolean inputOutOfBound(Literal input, double lowerBound, double u
324324
boolean isLowerInclusive, boolean isUpperInclusive) {
325325
if (input instanceof DoubleLiteral) {
326326
double inputValue = ((DoubleLiteral) input).getValue();
327+
if (Double.isNaN(inputValue)) {
328+
return false;
329+
}
327330
boolean lowerCheck = isLowerInclusive ? (inputValue >= lowerBound) : (inputValue > lowerBound);
328331
// Check upper bound
329332
boolean upperCheck = isUpperInclusive ? (inputValue <= upperBound) : (inputValue < upperBound);

fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -772,30 +772,48 @@ void testleFoldNumeric() {
772772
exExp = new Ln(new DoubleLiteral(-1d));
773773
rewritten = executor.rewrite(exExp, context);
774774
Assertions.assertEquals(new NullLiteral(DoubleType.INSTANCE), rewritten);
775+
exExp = new Ln(new DoubleLiteral(Double.NaN));
776+
rewritten = executor.rewrite(exExp, context);
777+
Assertions.assertEquals(new DoubleLiteral(Double.NaN), rewritten);
775778
exExp = new Log(new DoubleLiteral(1.0d), new DoubleLiteral(1.0d));
776779
rewritten = executor.rewrite(exExp, context);
777780
Assertions.assertEquals(new NullLiteral(DoubleType.INSTANCE), rewritten);
778781
exExp = new Log(new DoubleLiteral(10d), new DoubleLiteral(Double.POSITIVE_INFINITY));
779782
rewritten = executor.rewrite(exExp, context);
780783
Assertions.assertEquals(new DoubleLiteral(Double.POSITIVE_INFINITY), rewritten);
784+
exExp = new Log(new DoubleLiteral(2d), new DoubleLiteral(Double.NaN));
785+
rewritten = executor.rewrite(exExp, context);
786+
Assertions.assertEquals(new DoubleLiteral(Double.NaN), rewritten);
787+
exExp = new Log(new DoubleLiteral(Double.NaN), new DoubleLiteral(2d));
788+
rewritten = executor.rewrite(exExp, context);
789+
Assertions.assertEquals(new DoubleLiteral(Double.NaN), rewritten);
781790
exExp = new Log2(new DoubleLiteral(Double.POSITIVE_INFINITY));
782791
rewritten = executor.rewrite(exExp, context);
783792
Assertions.assertEquals(new DoubleLiteral(Double.POSITIVE_INFINITY), rewritten);
784793
exExp = new Log2(new DoubleLiteral(-1d));
785794
rewritten = executor.rewrite(exExp, context);
786795
Assertions.assertEquals(new NullLiteral(DoubleType.INSTANCE), rewritten);
796+
exExp = new Log2(new DoubleLiteral(Double.NaN));
797+
rewritten = executor.rewrite(exExp, context);
798+
Assertions.assertEquals(new DoubleLiteral(Double.NaN), rewritten);
787799
exExp = new Log10(new DoubleLiteral(Double.POSITIVE_INFINITY));
788800
rewritten = executor.rewrite(exExp, context);
789801
Assertions.assertEquals(new DoubleLiteral(Double.POSITIVE_INFINITY), rewritten);
790802
exExp = new Log10(new DoubleLiteral(-1d));
791803
rewritten = executor.rewrite(exExp, context);
792804
Assertions.assertEquals(new NullLiteral(DoubleType.INSTANCE), rewritten);
805+
exExp = new Log10(new DoubleLiteral(Double.NaN));
806+
rewritten = executor.rewrite(exExp, context);
807+
Assertions.assertEquals(new DoubleLiteral(Double.NaN), rewritten);
793808
exExp = new Dlog10(new DoubleLiteral(Double.POSITIVE_INFINITY));
794809
rewritten = executor.rewrite(exExp, context);
795810
Assertions.assertEquals(new DoubleLiteral(Double.POSITIVE_INFINITY), rewritten);
796811
exExp = new Dlog10(new DoubleLiteral(-1d));
797812
rewritten = executor.rewrite(exExp, context);
798813
Assertions.assertEquals(new NullLiteral(DoubleType.INSTANCE), rewritten);
814+
exExp = new Dlog10(new DoubleLiteral(Double.NaN));
815+
rewritten = executor.rewrite(exExp, context);
816+
Assertions.assertEquals(new DoubleLiteral(Double.NaN), rewritten);
799817

800818
Sqrt sqrt = new Sqrt(new DoubleLiteral(16d));
801819
rewritten = executor.rewrite(sqrt, context);
@@ -846,7 +864,7 @@ void testleFoldNumeric() {
846864
Assertions.assertEquals(exExp, rewritten);
847865
exExp = new Power(new DoubleLiteral(-1d), new DoubleLiteral(Double.NaN));
848866
rewritten = executor.rewrite(exExp, context);
849-
Assertions.assertEquals(exExp, rewritten);
867+
Assertions.assertEquals(new DoubleLiteral(Double.NaN), rewritten);
850868

851869
Sin sin = new Sin(new DoubleLiteral(Math.PI / 2));
852870
rewritten = executor.rewrite(sin, context);

regression-test/suites/nereids_p0/expression/fold_constant/fold_constant_numeric_arithmatic.groovy

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ suite("fold_constant_numeric_arithmatic") {
356356
testFoldConst("SELECT POWER(1E-308, 2)") // Very small base
357357
testFoldConst("SELECT POWER(2, -1E308)") // Very small negative exponent
358358
testFoldConst("SELECT POWER(-1.1, 3.2)") // NaN
359+
testFoldConst("SELECT POWER(-1, cast('nan' as double))")
359360
testFoldConst("SELECT POWER(1, 1e1000)")
360361

361362
//Ln function cases
@@ -371,6 +372,7 @@ suite("fold_constant_numeric_arithmatic") {
371372
testFoldConst("SELECT LN(2)") // ln(2)
372373
testFoldConst("SELECT LN(0.1)") // Small decimal
373374
testFoldConst("SELECT LN(100)") // Larger number
375+
testFoldConst("SELECT LN(cast('nan' as double))")
374376

375377
//dlog1 function cases
376378
testFoldConst("SELECT dlog1(1)")
@@ -400,6 +402,8 @@ suite("fold_constant_numeric_arithmatic") {
400402
testFoldConst("SELECT LOG(100, 1E308)") // Very large base
401403
testFoldConst("SELECT LOG(1E-308, 10)") // Very small number
402404
testFoldConst("SELECT LOG(100, 1E-308)") // Very small base
405+
testFoldConst("SELECT LOG(2, cast('nan' as double))")
406+
testFoldConst("SELECT LOG(cast('nan' as double), 2)")
403407

404408
//Log10 function cases
405409
testFoldConst("SELECT LOG10(100) AS log10_case_1") //log10(100) = 2
@@ -416,6 +420,8 @@ suite("fold_constant_numeric_arithmatic") {
416420
testFoldConst("SELECT LOG10(1E-308)") // Very small positive number
417421
testFoldConst("SELECT LOG10(0.1)") // Decimal less than 1
418422
testFoldConst("SELECT LOG10(0.01)") // Small decimal
423+
testFoldConst("SELECT LOG10(cast('nan' as double))")
424+
testFoldConst("SELECT DLOG10(cast('nan' as double))")
419425

420426
//Log2 function cases
421427
testFoldConst("SELECT LOG2(2) AS log2_case_1") //log2(2) = 1
@@ -430,6 +436,7 @@ suite("fold_constant_numeric_arithmatic") {
430436
testFoldConst("SELECT LOG2(0.5)") // Fraction
431437
testFoldConst("SELECT LOG2(32)") // Power of 2
432438
testFoldConst("SELECT LOG2(1024)") // Larger power of 2
439+
testFoldConst("SELECT LOG2(cast('nan' as double))")
433440

434441
//Money_format function cases
435442
testFoldConst("SELECT money_format(1234.56), money_format(-1234.56), money_format(0.99), money_format(1234.5678)")

0 commit comments

Comments
 (0)