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

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


The following commit(s) were added to refs/heads/master by this push:
     new e188287645f fix: Handle NaN results in approx_percentile evaluation
e188287645f is described below

commit e188287645fd2c08509d855a2b3f3357dab4102a
Author: FearfulTomcat27 <[email protected]>
AuthorDate: Fri Oct 10 17:32:11 2025 +0800

    fix: Handle NaN results in approx_percentile evaluation
---
 .../it/query/recent/IoTDBTableAggregationIT.java   | 36 +++++++++++-----------
 .../AbstractApproxPercentileAccumulator.java       | 13 +++++---
 ...AbstractGroupedApproxPercentileAccumulator.java | 13 +++++---
 3 files changed, 36 insertions(+), 26 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBTableAggregationIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBTableAggregationIT.java
index d684f83d36a..c6e5fc138ce 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBTableAggregationIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBTableAggregationIT.java
@@ -4321,26 +4321,26 @@ public class IoTDBTableAggregationIT {
         "select 
time,province,approx_percentile(s1,0.5),approx_percentile(s2,0.5) from table1 
group by 1,2 order by 2,1",
         new String[] {"time", "province", "_col2", "_col3"},
         new String[] {
-          "2024-09-24T06:15:30.000Z,beijing,30,0,",
-          "2024-09-24T06:15:31.000Z,beijing,0,31000,",
-          "2024-09-24T06:15:35.000Z,beijing,0,35000,",
-          "2024-09-24T06:15:36.000Z,beijing,36,0,",
+          "2024-09-24T06:15:30.000Z,beijing,30,null,",
+          "2024-09-24T06:15:31.000Z,beijing,null,31000,",
+          "2024-09-24T06:15:35.000Z,beijing,null,35000,",
+          "2024-09-24T06:15:36.000Z,beijing,36,null,",
           "2024-09-24T06:15:40.000Z,beijing,40,40000,",
-          "2024-09-24T06:15:41.000Z,beijing,41,0,",
-          "2024-09-24T06:15:46.000Z,beijing,0,46000,",
-          "2024-09-24T06:15:50.000Z,beijing,0,50000,",
-          "2024-09-24T06:15:51.000Z,beijing,0,0,",
-          "2024-09-24T06:15:55.000Z,beijing,55,0,",
-          "2024-09-24T06:15:30.000Z,shanghai,30,0,",
-          "2024-09-24T06:15:31.000Z,shanghai,0,31000,",
-          "2024-09-24T06:15:35.000Z,shanghai,0,35000,",
-          "2024-09-24T06:15:36.000Z,shanghai,36,0,",
+          "2024-09-24T06:15:41.000Z,beijing,41,null,",
+          "2024-09-24T06:15:46.000Z,beijing,null,46000,",
+          "2024-09-24T06:15:50.000Z,beijing,null,50000,",
+          "2024-09-24T06:15:51.000Z,beijing,null,null,",
+          "2024-09-24T06:15:55.000Z,beijing,55,null,",
+          "2024-09-24T06:15:30.000Z,shanghai,30,null,",
+          "2024-09-24T06:15:31.000Z,shanghai,null,31000,",
+          "2024-09-24T06:15:35.000Z,shanghai,null,35000,",
+          "2024-09-24T06:15:36.000Z,shanghai,36,null,",
           "2024-09-24T06:15:40.000Z,shanghai,40,40000,",
-          "2024-09-24T06:15:41.000Z,shanghai,41,0,",
-          "2024-09-24T06:15:46.000Z,shanghai,0,46000,",
-          "2024-09-24T06:15:50.000Z,shanghai,0,50000,",
-          "2024-09-24T06:15:51.000Z,shanghai,0,0,",
-          "2024-09-24T06:15:55.000Z,shanghai,55,0,",
+          "2024-09-24T06:15:41.000Z,shanghai,41,null,",
+          "2024-09-24T06:15:46.000Z,shanghai,null,46000,",
+          "2024-09-24T06:15:50.000Z,shanghai,null,50000,",
+          "2024-09-24T06:15:51.000Z,shanghai,null,null,",
+          "2024-09-24T06:15:55.000Z,shanghai,55,null,",
         },
         DATABASE_NAME);
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/AbstractApproxPercentileAccumulator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/AbstractApproxPercentileAccumulator.java
index 07d2fe83117..df8b7236382 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/AbstractApproxPercentileAccumulator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/AbstractApproxPercentileAccumulator.java
@@ -108,19 +108,24 @@ public abstract class AbstractApproxPercentileAccumulator 
implements TableAccumu
 
   @Override
   public void evaluateFinal(ColumnBuilder columnBuilder) {
+    double result = tDigest.quantile(percentage);
+    if (Double.isNaN(result)) {
+      columnBuilder.appendNull();
+      return;
+    }
     switch (seriesDataType) {
       case INT32:
-        columnBuilder.writeInt((int) tDigest.quantile(percentage));
+        columnBuilder.writeInt((int) result);
         break;
       case INT64:
       case TIMESTAMP:
-        columnBuilder.writeLong((long) tDigest.quantile(percentage));
+        columnBuilder.writeLong((long) result);
         break;
       case FLOAT:
-        columnBuilder.writeFloat((float) tDigest.quantile(percentage));
+        columnBuilder.writeFloat((float) result);
         break;
       case DOUBLE:
-        columnBuilder.writeDouble(tDigest.quantile(percentage));
+        columnBuilder.writeDouble(result);
         break;
       default:
         throw new UnSupportedDataTypeException(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/grouped/AbstractGroupedApproxPercentileAccumulator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/grouped/AbstractGroupedApproxPercentileAccumulator.java
index 85c92982b09..4350c7a7aed 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/grouped/AbstractGroupedApproxPercentileAccumulator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/grouped/AbstractGroupedApproxPercentileAccumulator.java
@@ -110,19 +110,24 @@ public abstract class 
AbstractGroupedApproxPercentileAccumulator implements Grou
   @Override
   public void evaluateFinal(int groupId, ColumnBuilder columnBuilder) {
     TDigest tDigest = array.get(groupId);
+    double result = tDigest.quantile(percentage);
+    if (Double.isNaN(result)) {
+      columnBuilder.appendNull();
+      return;
+    }
     switch (seriesDataType) {
       case INT32:
-        columnBuilder.writeInt((int) tDigest.quantile(percentage));
+        columnBuilder.writeInt((int) result);
         break;
       case INT64:
       case TIMESTAMP:
-        columnBuilder.writeLong((long) tDigest.quantile(percentage));
+        columnBuilder.writeLong((long) result);
         break;
       case FLOAT:
-        columnBuilder.writeFloat((float) tDigest.quantile(percentage));
+        columnBuilder.writeFloat((float) result);
         break;
       case DOUBLE:
-        columnBuilder.writeDouble(tDigest.quantile(percentage));
+        columnBuilder.writeDouble(result);
         break;
       default:
         throw new UnSupportedDataTypeException(

Reply via email to