Skip to content

Commit 2059d71

Browse files
authored
chore(query): returns nan for aggregate_kurtosis and aggregate_skewness (#16688)
* chore: returns nan for aggregate_kurtosis and aggregate_skewness * chore: returns nan for aggregate_kurtosis and aggregate_skewness
1 parent 78629a5 commit 2059d71

File tree

3 files changed

+43
-28
lines changed

3 files changed

+43
-28
lines changed

src/query/functions/src/aggregates/aggregate_kurtosis.rs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ use crate::aggregates::AggregateFunctionRef;
3232
#[derive(Default, BorshSerialize, BorshDeserialize)]
3333
struct KurtosisState {
3434
pub n: u64,
35-
pub sum: f64,
36-
pub sum_sqr: f64,
37-
pub sum_cub: f64,
38-
pub sum_four: f64,
35+
pub sum: F64,
36+
pub sum_sqr: F64,
37+
pub sum_cub: F64,
38+
pub sum_four: F64,
3939
}
4040

4141
impl<T> UnaryState<T, Float64Type> for KurtosisState
@@ -78,27 +78,34 @@ where
7878
builder.push(F64::from(0_f64));
7979
return Ok(());
8080
}
81-
let n = self.n as f64;
81+
82+
let (n, sum, sum_sqr, sum_cub, sum_four) = (
83+
self.n as f64,
84+
*self.sum,
85+
*self.sum_sqr,
86+
*self.sum_cub,
87+
*self.sum_four,
88+
);
89+
8290
let temp = 1.0 / n;
83-
if self.sum_sqr - self.sum * self.sum * temp == 0.0 {
91+
if sum_sqr - sum * sum * temp == 0.0 {
8492
builder.push(F64::from(0_f64));
8593
return Ok(());
8694
}
8795
let m4 = temp
88-
* (self.sum_four - 4.0 * self.sum_cub * self.sum * temp
89-
+ 6.0 * self.sum_sqr * self.sum * self.sum * temp * temp
90-
- 3.0 * self.sum.powi(4) * temp.powi(3));
91-
let m2 = temp * (self.sum_sqr - self.sum * self.sum * temp);
96+
* (sum_four - 4.0 * sum_cub * sum * temp + 6.0 * sum_sqr * sum * sum * temp * temp
97+
- 3.0 * sum.powi(4) * temp.powi(3));
98+
let m2 = temp * (sum_sqr - sum * sum * temp);
9299
if m2 <= 0.0 || (n - 2.0) * (n - 3.0) == 0.0 {
93100
builder.push(F64::from(0_f64));
94101
return Ok(());
95102
}
96103
let value =
97104
(n - 1.0) * ((n + 1.0) * m4 / (m2 * m2) - 3.0 * (n - 1.0)) / ((n - 2.0) * (n - 3.0));
98-
if value.is_infinite() || value.is_nan() {
99-
return Err(ErrorCode::SemanticError("Kurtosis is out of range!"));
100-
} else {
105+
if value.is_finite() {
101106
builder.push(F64::from(value));
107+
} else {
108+
builder.push(F64::from(f64::NAN));
102109
}
103110
Ok(())
104111
}

src/query/functions/src/aggregates/aggregate_skewness.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ use crate::aggregates::aggregate_unary::UnaryState;
3232
#[derive(Default, BorshSerialize, BorshDeserialize)]
3333
pub struct SkewnessStateV2 {
3434
pub n: u64,
35-
pub sum: f64,
36-
pub sum_sqr: f64,
37-
pub sum_cub: f64,
35+
pub sum: F64,
36+
pub sum_sqr: F64,
37+
pub sum_cub: F64,
3838
}
3939

4040
impl<T> UnaryState<T, Float64Type> for SkewnessStateV2
@@ -75,25 +75,23 @@ where
7575
builder.push(F64::from(0_f64));
7676
return Ok(());
7777
}
78-
let n = self.n as f64;
78+
79+
let (n, sum, sum_sqr, sum_cub) = (self.n as f64, *self.sum, *self.sum_sqr, *self.sum_cub);
7980
let temp = 1.0 / n;
80-
let div = (temp * (self.sum_sqr - self.sum * self.sum * temp))
81-
.powi(3)
82-
.sqrt();
81+
let div = (temp * (sum_sqr - sum * sum * temp)).powi(3).sqrt();
8382
if div == 0.0 {
8483
builder.push(F64::from(0_f64));
8584
return Ok(());
8685
}
8786
let temp1 = (n * (n - 1.0)).sqrt() / (n - 2.0);
88-
let value = temp1
89-
* temp
90-
* (self.sum_cub - 3.0 * self.sum_sqr * self.sum * temp
91-
+ 2.0 * self.sum.powi(3) * temp * temp)
92-
/ div;
93-
if value.is_infinite() || value.is_nan() {
94-
return Err(ErrorCode::SemanticError("Skew is out of range!"));
95-
} else {
87+
let value =
88+
temp1 * temp * (sum_cub - 3.0 * sum_sqr * sum * temp + 2.0 * sum.powi(3) * temp * temp)
89+
/ div;
90+
91+
if value.is_finite() {
9692
builder.push(F64::from(value));
93+
} else {
94+
builder.push(F64::from(f64::NAN));
9795
}
9896
Ok(())
9997
}

tests/sqllogictests/suites/query/functions/02_0000_function_aggregate_mix.test

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,16 @@ select skewness (10) from numbers(5)
317317
----
318318
0.0
319319

320+
query I
321+
select skewness(number), kurtosis(number) from (select if(number > 5, number::double, 'NAN'::Double) as number from numbers(100));
322+
----
323+
NaN NaN
324+
325+
query I
326+
select skewness(number), kurtosis(number) from (select if(number > 5, number::double, 'INF'::Double) as number from numbers(100));
327+
----
328+
NaN NaN
329+
320330
query III
321331
select skewness(k), skewness(v), skewness(v2) from aggr
322332
----

0 commit comments

Comments
 (0)