Skip to content

Commit fb41f0c

Browse files
committed
fix test
1 parent d996147 commit fb41f0c

File tree

4 files changed

+61
-36
lines changed

4 files changed

+61
-36
lines changed

src/query/storages/fuse/src/io/write/stream/column_ndv_estimator.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -94,15 +94,17 @@ where
9494
for<'a> T::ScalarRef<'a>: Hash,
9595
{
9696
fn update_column(&mut self, column: &Column) {
97-
let (column, validity) = if let Column::Nullable(box inner) = column {
98-
let validity = if inner.validity.null_count() == 0 {
99-
None
100-
} else {
101-
Some(&inner.validity)
102-
};
103-
(&inner.column, validity)
104-
} else {
105-
(column, None)
97+
let (column, validity) = match column {
98+
Column::Nullable(box inner) => {
99+
let validity = if inner.validity.null_count() == 0 {
100+
None
101+
} else {
102+
Some(&inner.validity)
103+
};
104+
(&inner.column, validity)
105+
}
106+
Column::Null { .. } => return,
107+
column => (column, None),
106108
};
107109

108110
let column = T::try_downcast_column(column).unwrap();

src/query/storages/fuse/src/io/write/stream/column_statistics_builder.rs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -212,15 +212,23 @@ where
212212
{
213213
fn update_column(&mut self, column: &Column) {
214214
self.in_memory_size += column.memory_size();
215-
let (column, validity) = if let Column::Nullable(box inner) = column {
216-
let validity = if inner.validity.null_count() == 0 {
217-
None
218-
} else {
219-
Some(&inner.validity)
220-
};
221-
(&inner.column, validity)
222-
} else {
223-
(column, None)
215+
if column.len() == 0 {
216+
return;
217+
}
218+
let (column, validity) = match column {
219+
Column::Nullable(box inner) => {
220+
let validity = if inner.validity.null_count() == 0 {
221+
None
222+
} else {
223+
Some(&inner.validity)
224+
};
225+
(&inner.column, validity)
226+
}
227+
Column::Null { len } => {
228+
self.null_count += *len;
229+
return;
230+
}
231+
col => (col, None),
224232
};
225233
self.null_count += validity.map_or(0, |v| v.null_count());
226234

src/query/storages/fuse/src/io/write/stream/column_statistics_state.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,22 @@ impl ColumnStatisticsState {
9292
for (id, stats) in self.col_stats {
9393
let mut col_stats = stats.finalize()?;
9494
if let Some(count) = column_distinct_count.get(&id) {
95-
col_stats.distinct_of_values = Some(*count as u64);
95+
// value calculated by xor hash function include NULL, need to subtract one.
96+
let distinct_of_values = if col_stats.null_count > 0 {
97+
*count as u64 - 1
98+
} else {
99+
*count as u64
100+
};
101+
col_stats.distinct_of_values = Some(distinct_of_values);
96102
} else if let Some(estimator) = self.distinct_columns.get(&id) {
97103
col_stats.distinct_of_values = Some(estimator.finalize());
104+
} else {
105+
assert_eq!(col_stats.min, col_stats.max);
106+
if col_stats.min.is_null() {
107+
col_stats.distinct_of_values = Some(0);
108+
} else {
109+
col_stats.distinct_of_values = Some(1);
110+
}
98111
}
99112
statistics.insert(id, col_stats);
100113
}

src/query/storages/fuse/src/statistics/column_statistic.rs

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -83,37 +83,39 @@ pub fn gen_columns_statistics(
8383
let mut min = Scalar::Null;
8484
let mut max = Scalar::Null;
8585

86-
let (mins, _) = eval_aggr("min", vec![], &[col.clone().into()], rows, vec![])?;
87-
let (maxs, _) = eval_aggr("max", vec![], &[col.clone().into()], rows, vec![])?;
86+
if col.len() > 0 {
87+
let (mins, _) = eval_aggr("min", vec![], &[col.clone().into()], rows, vec![])?;
88+
let (maxs, _) = eval_aggr("max", vec![], &[col.clone().into()], rows, vec![])?;
8889

89-
if mins.len() > 0 {
90-
min = if let Some(v) = mins.index(0) {
91-
if let Some(v) = v.to_owned().trim_min() {
92-
v
90+
if mins.len() > 0 {
91+
min = if let Some(v) = mins.index(0) {
92+
if let Some(v) = v.to_owned().trim_min() {
93+
v
94+
} else {
95+
continue;
96+
}
9397
} else {
9498
continue;
9599
}
96-
} else {
97-
continue;
98100
}
99-
}
100101

101-
if maxs.len() > 0 {
102-
max = if let Some(v) = maxs.index(0) {
103-
if let Some(v) = v.to_owned().trim_max() {
104-
v
102+
if maxs.len() > 0 {
103+
max = if let Some(v) = maxs.index(0) {
104+
if let Some(v) = v.to_owned().trim_max() {
105+
v
106+
} else {
107+
continue;
108+
}
105109
} else {
106110
continue;
107111
}
108-
} else {
109-
continue;
110112
}
111113
}
112114

113115
let (is_all_null, bitmap) = col.validity();
114116
let unset_bits = match (is_all_null, bitmap) {
115-
(true, _) => rows,
116-
(false, Some(bitmap)) => bitmap.null_count(),
117+
(_, Some(bitmap)) => bitmap.null_count(),
118+
(true, None) => rows,
117119
(false, None) => 0,
118120
};
119121

0 commit comments

Comments
 (0)