Skip to content

Commit 3cf517d

Browse files
committed
fix: fix ConstColumn(String) cast to StringColumn bug
1 parent 952070e commit 3cf517d

File tree

13 files changed

+102
-8
lines changed

13 files changed

+102
-8
lines changed

src/query/datavalues/src/columns/array/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ impl Column for ArrayColumn {
114114
self
115115
}
116116

117+
fn as_inner_any(&self) -> Option<&dyn std::any::Any> {
118+
Some(self.values.as_any())
119+
}
120+
117121
fn data_type(&self) -> DataTypeImpl {
118122
self.data_type.clone()
119123
}

src/query/datavalues/src/columns/boolean/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ impl Column for BooleanColumn {
7575
self
7676
}
7777

78+
fn as_inner_any(&self) -> Option<&dyn std::any::Any> {
79+
None
80+
}
81+
7882
fn data_type(&self) -> DataTypeImpl {
7983
BooleanType::new_impl()
8084
}

src/query/datavalues/src/columns/column.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ use crate::TypeID;
3131
pub type ColumnRef = Arc<dyn Column>;
3232
pub trait Column: Send + Sync {
3333
fn as_any(&self) -> &dyn Any;
34+
fn as_inner_any(&self) -> Option<&dyn Any>;
35+
3436
/// Type of data that column contains. It's an underlying physical type:
3537
/// Int32 for Date, Int64 for Timestamp, so on.
3638
fn data_type_id(&self) -> TypeID {

src/query/datavalues/src/columns/const_/mod.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ impl Column for ConstColumn {
4646
self
4747
}
4848

49+
fn as_inner_any(&self) -> Option<&dyn std::any::Any> {
50+
Some(self.column.as_any())
51+
}
52+
4953
fn data_type(&self) -> DataTypeImpl {
5054
self.column.data_type()
5155
}
@@ -143,3 +147,15 @@ impl Column for ConstColumn {
143147
self.column.serialize(vec, 0);
144148
}
145149
}
150+
151+
impl std::fmt::Debug for ConstColumn {
152+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
153+
write!(
154+
f,
155+
"ConstColumn \t typeid: {:?}\t len: {}\t data: [{:?}]",
156+
self.data_type_id(),
157+
self.len(),
158+
self.column,
159+
)
160+
}
161+
}

src/query/datavalues/src/columns/null/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ impl Column for NullColumn {
5151
self
5252
}
5353

54+
fn as_inner_any(&self) -> Option<&dyn std::any::Any> {
55+
None
56+
}
57+
5458
fn data_type(&self) -> DataTypeImpl {
5559
DataTypeImpl::Null(NullType {})
5660
}

src/query/datavalues/src/columns/nullable/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ impl Column for NullableColumn {
9494
self
9595
}
9696

97+
fn as_inner_any(&self) -> Option<&dyn std::any::Any> {
98+
Some(self.column.as_any())
99+
}
100+
97101
fn data_type(&self) -> DataTypeImpl {
98102
let nest = self.column.data_type();
99103
NullableType::new_impl(nest)

src/query/datavalues/src/columns/object/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ impl<T: ObjectType> Column for ObjectColumn<T> {
9797
self
9898
}
9999

100+
fn as_inner_any(&self) -> Option<&dyn std::any::Any> {
101+
None
102+
}
103+
100104
fn data_type(&self) -> DataTypeImpl {
101105
T::data_type()
102106
}

src/query/datavalues/src/columns/primitive/primitive.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,10 @@ impl<T: PrimitiveType> Column for PrimitiveColumn<T> {
162162
self
163163
}
164164

165+
fn as_inner_any(&self) -> Option<&dyn std::any::Any> {
166+
None
167+
}
168+
165169
fn data_type(&self) -> DataTypeImpl {
166170
create_primitive_datatype::<T>()
167171
}

src/query/datavalues/src/columns/series.rs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,27 @@ impl Series {
5757
}
5858

5959
pub fn check_get<T: 'static + Column>(column: &ColumnRef) -> Result<&T> {
60-
let arr = column.as_any().downcast_ref::<T>().ok_or_else(|| {
61-
ErrorCode::UnknownColumn(format!(
62-
"downcast column error, column type: {:?}, expected column: {:?}",
63-
column.column_type_name(),
64-
std::any::type_name::<T>(),
65-
))
66-
});
67-
arr
60+
match column.as_any().downcast_ref::<T>() {
61+
Some(arr) => Ok(arr),
62+
None => {
63+
if let Some(any_inner) = column.as_inner_any() {
64+
let arr = any_inner.downcast_ref::<T>().ok_or_else(|| {
65+
ErrorCode::UnknownColumn(format!(
66+
"downcast column error, column type: {:?}, expected column: {:?}",
67+
column.column_type_name(),
68+
std::any::type_name::<T>(),
69+
))
70+
});
71+
arr
72+
} else {
73+
Err(ErrorCode::UnknownColumn(format!(
74+
"downcast column error, column type: {:?}, expected column: {:?}",
75+
column.column_type_name(),
76+
std::any::type_name::<T>(),
77+
)))
78+
}
79+
}
80+
}
6881
}
6982

7083
pub fn check_get_mutable_column<T: 'static + MutableColumn>(

src/query/datavalues/src/columns/string/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@ impl Column for StringColumn {
139139
self
140140
}
141141

142+
fn as_inner_any(&self) -> Option<&dyn std::any::Any> {
143+
None
144+
}
145+
142146
fn data_type(&self) -> DataTypeImpl {
143147
StringType::new_impl()
144148
}

0 commit comments

Comments
 (0)