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(