This is an automated email from the ASF dual-hosted git repository.

xiangfu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 5baf56658c do not rewrite float double comparison in 
NumericalFilterOptimizer (#11493)
5baf56658c is described below

commit 5baf56658c8d8fd0173bdb15cabc2a96a98b600d
Author: Haitao Zhang <[email protected]>
AuthorDate: Tue Sep 5 00:02:57 2023 -0700

    do not rewrite float double comparison in NumericalFilterOptimizer (#11493)
---
 .../optimizer/filter/NumericalFilterOptimizer.java | 12 +++++------
 .../filter/NumericalFilterOptimizerTest.java       | 24 +++++++++++-----------
 2 files changed, 17 insertions(+), 19 deletions(-)

diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/optimizer/filter/NumericalFilterOptimizer.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/optimizer/filter/NumericalFilterOptimizer.java
index 5a8baeb3fa..9c21300642 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/optimizer/filter/NumericalFilterOptimizer.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/optimizer/filter/NumericalFilterOptimizer.java
@@ -334,14 +334,12 @@ public class NumericalFilterOptimizer extends 
BaseAndOrBooleanFilterOptimizer {
               // Literal value is less than the bounds of LONG.
               return getExpressionFromBoolean(
                   kind == FilterKind.GREATER_THAN || kind == 
FilterKind.GREATER_THAN_OR_EQUAL);
-            } else {
-              int comparison = Double.compare(actual, converted);
-              // Rewrite range operator
-              rewriteRangeOperator(range, kind, comparison);
-
-              // Rewrite range literal
-              rhs.getLiteral().setDoubleValue(converted);
             }
+            // Do not rewrite range operator since double has higher precision 
than float
+            // If we do, we may introduce problems.
+            // For example, in the previous logic, "> 0.05" will be converted 
into ">= 0.05000000074505806". When the
+            // query reaches a server, the server will convert it to ">= 0.05" 
in
+            // ColumnValueSegmentPruner#pruneRangePredicate, which is 
incorrect.
             break;
           }
           default:
diff --git 
a/pinot-core/src/test/java/org/apache/pinot/core/query/optimizer/filter/NumericalFilterOptimizerTest.java
 
b/pinot-core/src/test/java/org/apache/pinot/core/query/optimizer/filter/NumericalFilterOptimizerTest.java
index 913d14e61d..723890b1dc 100644
--- 
a/pinot-core/src/test/java/org/apache/pinot/core/query/optimizer/filter/NumericalFilterOptimizerTest.java
+++ 
b/pinot-core/src/test/java/org/apache/pinot/core/query/optimizer/filter/NumericalFilterOptimizerTest.java
@@ -216,29 +216,29 @@ public class NumericalFilterOptimizerTest {
             + " identifier:Identifier(name:floatColumn)), 
Expression(type:LITERAL, literal:<Literal doubleValue:-9"
             + ".223372036854776E18>)]))");
 
-    // Test FLOAT column with DOUBLE value that is within bounds of FLOAT.
+    // Test FLOAT column with DOUBLE value: no rewrite.
     Assert.assertEquals(rewrite("SELECT * FROM testTable WHERE floatColumn > 
-2100000000.5"),
-        "Expression(type:FUNCTION, 
functionCall:Function(operator:GREATER_THAN_OR_EQUAL, operands:[Expression"
+        "Expression(type:FUNCTION, 
functionCall:Function(operator:GREATER_THAN, operands:[Expression"
             + "(type:IDENTIFIER, identifier:Identifier(name:floatColumn)), 
Expression(type:LITERAL, literal:<Literal "
-            + "doubleValue:-2.1E9>)]))");
+            + "doubleValue:-2.1000000005E9>)]))");
 
-    // Test FLOAT column with DOUBLE value that is within bounds of FLOAT.
+    // Test FLOAT column with DOUBLE value: no rewrite.
     Assert.assertEquals(rewrite("SELECT * FROM testTable WHERE floatColumn < 
-2100000000.5"),
         "Expression(type:FUNCTION, functionCall:Function(operator:LESS_THAN, 
operands:[Expression(type:IDENTIFIER, "
-            + "identifier:Identifier(name:floatColumn)), 
Expression(type:LITERAL, literal:<Literal doubleValue:-2"
-            + ".1E9>)]))");
+            + "identifier:Identifier(name:floatColumn)), 
Expression(type:LITERAL, literal:<Literal doubleValue:"
+            + "-2.1000000005E9>)]))");
 
-    // Test FLOAT column with DOUBLE value that is within bounds of FLOAT.
+    // Test FLOAT column with DOUBLE value: no rewrite.
     Assert.assertEquals(rewrite("SELECT * FROM testTable WHERE floatColumn <= 
2100000000.5"),
         "Expression(type:FUNCTION, 
functionCall:Function(operator:LESS_THAN_OR_EQUAL, operands:[Expression"
             + "(type:IDENTIFIER, identifier:Identifier(name:floatColumn)), 
Expression(type:LITERAL, literal:<Literal "
-            + "doubleValue:2.1E9>)]))");
+            + "doubleValue:2.1000000005E9>)]))");
 
-    // Test FLOAT column with DOUBLE value that is within bounds of FLOAT.
+    // Test FLOAT column with DOUBLE value: no rewrite.
     Assert.assertEquals(rewrite("SELECT * FROM testTable WHERE floatColumn >= 
2100000000.5"),
-        "Expression(type:FUNCTION, 
functionCall:Function(operator:GREATER_THAN, 
operands:[Expression(type:IDENTIFIER,"
-            + " identifier:Identifier(name:floatColumn)), 
Expression(type:LITERAL, literal:<Literal doubleValue:2"
-            + ".1E9>)]))");
+        "Expression(type:FUNCTION, 
functionCall:Function(operator:GREATER_THAN_OR_EQUAL, operands:[Expression("
+            + "type:IDENTIFIER, identifier:Identifier(name:floatColumn)), 
Expression(type:LITERAL, literal:<Literal "
+            + "doubleValue:2.1000000005E9>)]))");
 
     // Test LONG column with DOUBLE value greater than Long.MAX_VALUE.
     Assert.assertEquals(rewrite("SELECT * FROM testTable WHERE longColumn > 
999999999999999999999999999999.9999"),


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to