Skip to content

Commit ea876d0

Browse files
authored
chore(query): refactoring ValueType, pass a data type parameter to upcast method (#18082)
1 parent 36236d0 commit ea876d0

File tree

84 files changed

+708
-639
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+708
-639
lines changed

src/common/native/src/read/array/double.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ use std::io::Cursor;
1717
use std::marker::PhantomData;
1818

1919
use databend_common_column::buffer::Buffer;
20+
use databend_common_expression::types::ArgType;
2021
use databend_common_expression::types::Number;
2122
use databend_common_expression::types::NumberType;
22-
use databend_common_expression::types::ValueType;
2323
use databend_common_expression::Column;
2424
use databend_common_expression::TableDataType;
2525

src/common/native/src/read/array/interval.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ use std::io::Cursor;
1616

1717
use databend_common_column::buffer::Buffer;
1818
use databend_common_column::types::months_days_micros;
19+
use databend_common_expression::types::ArgType;
1920
use databend_common_expression::types::IntervalType;
20-
use databend_common_expression::types::ValueType;
2121
use databend_common_expression::Column;
2222
use databend_common_expression::TableDataType;
2323

src/common/native/src/write/serialize.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use databend_common_column::bitmap::Bitmap;
1818
use databend_common_column::buffer::Buffer;
1919
use databend_common_column::types::i256;
2020
use databend_common_expression::types::AnyType;
21+
use databend_common_expression::types::DataType;
2122
use databend_common_expression::types::DecimalColumn;
2223
use databend_common_expression::types::GeographyColumn;
2324
use databend_common_expression::types::NullableColumn;
@@ -78,7 +79,7 @@ impl<'a, W: Write> ValueVisitor for WriteVisitor<'a, W> {
7879
unreachable!()
7980
}
8081

81-
fn visit_typed_column<T: ValueType>(&mut self, _column: T::Column) -> Result<()> {
82+
fn visit_typed_column<T: ValueType>(&mut self, _: T::Column, _: &DataType) -> Result<()> {
8283
unreachable!()
8384
}
8485

src/query/catalog/src/plan/internal_column.rs

Lines changed: 9 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
use databend_common_exception::ErrorCode;
1616
use databend_common_exception::Result;
1717
use databend_common_expression::types::number::F32;
18-
use databend_common_expression::types::string::StringColumnBuilder;
1918
use databend_common_expression::types::DataType;
2019
use databend_common_expression::types::DecimalDataType;
2120
use databend_common_expression::types::DecimalSize;
@@ -226,35 +225,17 @@ impl InternalColumn {
226225
}
227226
}
228227

229-
BlockEntry::new(
230-
DataType::Number(NumberDataType::UInt64),
231-
Value::Column(UInt64Type::from_data(row_ids)),
232-
)
228+
UInt64Type::from_data(row_ids).into()
233229
}
234230
InternalColumnType::BlockName => {
235-
let mut builder = StringColumnBuilder::with_capacity(1);
236-
builder.put_and_commit(&meta.block_location);
237-
BlockEntry::new(
238-
DataType::String,
239-
Value::Scalar(Scalar::String(builder.build_scalar())),
240-
)
231+
BlockEntry::from_arg_scalar::<StringType>(meta.block_location.clone())
241232
}
242233
InternalColumnType::SegmentName => {
243-
let mut builder = StringColumnBuilder::with_capacity(1);
244-
builder.put_and_commit(&meta.segment_location);
245-
BlockEntry::new(
246-
DataType::String,
247-
Value::Scalar(Scalar::String(builder.build_scalar())),
248-
)
249-
}
250-
InternalColumnType::SnapshotName => {
251-
let mut builder = StringColumnBuilder::with_capacity(1);
252-
builder.put_and_commit(meta.snapshot_location.clone().unwrap_or("".to_string()));
253-
BlockEntry::new(
254-
DataType::String,
255-
Value::Scalar(Scalar::String(builder.build_scalar())),
256-
)
234+
BlockEntry::from_arg_scalar::<StringType>(meta.segment_location.clone())
257235
}
236+
InternalColumnType::SnapshotName => BlockEntry::from_arg_scalar::<StringType>(
237+
meta.snapshot_location.clone().unwrap_or_default(),
238+
),
258239
InternalColumnType::BaseRowId => {
259240
let uuid =
260241
try_extract_uuid_str_from_path(&meta.block_location).unwrap_or_else(|e| {
@@ -275,10 +256,7 @@ impl InternalColumn {
275256
row_ids.push(row_id);
276257
}
277258
}
278-
BlockEntry::new(
279-
DataType::String,
280-
Value::Column(StringType::from_data(row_ids)),
281-
)
259+
StringType::from_data(row_ids).into()
282260
}
283261
InternalColumnType::BaseBlockIds => {
284262
assert!(meta.base_block_ids.is_some());
@@ -295,10 +273,7 @@ impl InternalColumn {
295273
for (idx, _) in matched_rows.iter() {
296274
bitmap.set(*idx, true);
297275
}
298-
BlockEntry::new(
299-
DataType::Boolean,
300-
Value::Column(Column::Boolean(bitmap.into())),
301-
)
276+
Column::Boolean(bitmap.into()).into()
302277
}
303278
InternalColumnType::SearchScore => {
304279
assert!(meta.matched_rows.is_some());
@@ -311,10 +286,7 @@ impl InternalColumn {
311286
*val = F32::from(*score.unwrap());
312287
}
313288
}
314-
BlockEntry::new(
315-
DataType::Number(NumberDataType::Float32),
316-
Value::Column(Float32Type::from_data(scores)),
317-
)
289+
Float32Type::from_data(scores).into()
318290
}
319291
InternalColumnType::FileName | InternalColumnType::FileRowNumber => {
320292
todo!("generate_column_values not support for file related")

src/query/expression/src/aggregate/group_hash.rs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ use crate::types::BinaryColumn;
2727
use crate::types::BinaryType;
2828
use crate::types::BitmapType;
2929
use crate::types::BooleanType;
30+
use crate::types::DataType;
3031
use crate::types::DateType;
3132
use crate::types::Decimal64As128Type;
3233
use crate::types::DecimalColumn;
@@ -85,8 +86,14 @@ impl<const IS_FIRST: bool> ValueVisitor for HashVisitor<'_, IS_FIRST> {
8586
unreachable!()
8687
}
8788

88-
fn visit_typed_column<T: ValueType>(&mut self, column: T::Column) -> Result<()> {
89-
self.combine_group_hash_type_column::<AnyType>(&T::upcast_column(column));
89+
fn visit_typed_column<T: ValueType>(
90+
&mut self,
91+
column: T::Column,
92+
data_type: &DataType,
93+
) -> Result<()> {
94+
self.combine_group_hash_type_column::<AnyType>(&T::upcast_column_with_type(
95+
column, data_type,
96+
));
9097
Ok(())
9198
}
9299

@@ -386,11 +393,16 @@ where I: Index
386393
}
387394
}
388395

389-
fn visit_typed_column<T: ValueType>(&mut self, column: T::Column) -> Result<()> {
396+
fn visit_typed_column<T: ValueType>(
397+
&mut self,
398+
column: T::Column,
399+
data_type: &DataType,
400+
) -> Result<()> {
390401
self.visit_indices(|i| {
391-
let x = T::upcast_scalar(T::to_owned_scalar(
392-
T::index_column(&column, i.to_usize()).unwrap(),
393-
));
402+
let x = T::upcast_scalar_with_type(
403+
T::to_owned_scalar(T::index_column(&column, i.to_usize()).unwrap()),
404+
data_type,
405+
);
394406
x.as_ref().agg_hash()
395407
})
396408
}
@@ -628,8 +640,11 @@ mod tests {
628640

629641
{
630642
let c = Int32Type::from_data(vec![3, 1, 2]);
631-
let c = NullableColumn::<AnyType>::new(c, Bitmap::from([true, true, false]));
632-
let nc = NullableType::<AnyType>::upcast_column(c);
643+
let c = NullableColumn::new(c, Bitmap::from([true, true, false]));
644+
let nc = NullableType::<AnyType>::upcast_column_with_type(
645+
c,
646+
&Int32Type::data_type().wrap_nullable(),
647+
);
633648

634649
let indices = [0, 1, 2];
635650
let mut target = vec![0; 3];

src/query/expression/src/block.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use databend_common_exception::Result;
2323

2424
use crate::schema::DataSchema;
2525
use crate::types::AnyType;
26+
use crate::types::ArgType;
2627
use crate::types::DataType;
2728
use crate::Column;
2829
use crate::ColumnBuilder;
@@ -71,6 +72,14 @@ impl BlockEntry {
7172
Self { data_type, value }
7273
}
7374

75+
pub fn from_arg_value<T: ArgType>(value: Value<T>) -> Self {
76+
Self::new(T::data_type(), value.upcast())
77+
}
78+
79+
pub fn from_arg_scalar<T: ArgType>(scalar: T::Scalar) -> Self {
80+
Self::new(T::data_type(), Value::Scalar(T::upcast_scalar(scalar)))
81+
}
82+
7483
pub fn remove_nullable(self) -> Self {
7584
match self.value {
7685
Value::Column(Column::Nullable(col)) => {
@@ -89,6 +98,12 @@ impl BlockEntry {
8998
}
9099
}
91100

101+
impl From<Column> for BlockEntry {
102+
fn from(v: Column) -> Self {
103+
Self::new(v.data_type(), Value::Column(v))
104+
}
105+
}
106+
92107
#[typetag::serde(tag = "type")]
93108
pub trait BlockMetaInfo: Debug + Send + Sync + Any + 'static {
94109
#[allow(clippy::borrowed_box)]

src/query/expression/src/evaluator.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2646,7 +2646,11 @@ impl ValueVisitor for CheckStrictValue {
26462646
self.visit_column(column.column)
26472647
}
26482648

2649-
fn visit_typed_column<T: ValueType>(&mut self, _: T::Column) -> std::result::Result<(), ()> {
2649+
fn visit_typed_column<T: ValueType>(
2650+
&mut self,
2651+
_: T::Column,
2652+
_: &DataType,
2653+
) -> std::result::Result<(), ()> {
26502654
Ok(())
26512655
}
26522656
}

src/query/expression/src/function.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,8 @@ impl Function {
320320
debug_assert!(!self.signature.return_type.is_nullable_or_null());
321321

322322
let mut signature = self.signature;
323-
signature.return_type = signature.return_type.wrap_nullable();
323+
let return_type = signature.return_type;
324+
signature.return_type = return_type.wrap_nullable();
324325

325326
let (calc_domain, eval) = self.eval.into_scalar().unwrap();
326327

@@ -332,7 +333,10 @@ impl Function {
332333
has_null: false,
333334
value: Some(Box::new(domain)),
334335
};
335-
FunctionDomain::Domain(NullableType::<AnyType>::upcast_domain(new_domain))
336+
FunctionDomain::Domain(NullableType::<AnyType>::upcast_domain_with_type(
337+
new_domain,
338+
&return_type,
339+
))
336340
}
337341
FunctionDomain::Full | FunctionDomain::MayThrow => FunctionDomain::Full,
338342
}
@@ -787,13 +791,13 @@ pub fn error_to_null<I1: AccessType, O: ArgType>(
787791
match output {
788792
Value::Scalar(_) => Value::Scalar(None),
789793
Value::Column(column) => {
790-
Value::Column(NullableColumn::new(column, validity.into()))
794+
Value::Column(NullableColumn::new_unchecked(column, validity.into()))
791795
}
792796
}
793797
} else {
794798
match output {
795799
Value::Scalar(scalar) => Value::Scalar(Some(scalar)),
796-
Value::Column(column) => Value::Column(NullableColumn::new(
800+
Value::Column(column) => Value::Column(NullableColumn::new_unchecked(
797801
column,
798802
Bitmap::new_constant(true, ctx.num_rows),
799803
)),

src/query/expression/src/kernels/concat.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use crate::types::number::NumberColumn;
3232
use crate::types::vector::VectorColumnBuilder;
3333
use crate::types::AccessType;
3434
use crate::types::AnyType;
35+
use crate::types::ArgType;
3536
use crate::types::ArrayType;
3637
use crate::types::BooleanType;
3738
use crate::types::DataType;
@@ -128,6 +129,7 @@ impl Column {
128129
Some(col) => col,
129130
};
130131
let capacity = columns_iter_clone.fold(first_column.len(), |acc, x| acc + x.len());
132+
let data_type = first_column.data_type();
131133
let column = match first_column {
132134
Column::Null { .. } => Column::Null { len: capacity },
133135
Column::EmptyArray { .. } => Column::EmptyArray { len: capacity },
@@ -182,7 +184,7 @@ impl Column {
182184
offsets.push(0);
183185
let builder = ColumnBuilder::with_capacity(&col.values().data_type(), capacity);
184186
let builder = ArrayColumnBuilder { builder, offsets };
185-
Self::concat_value_types::<ArrayType<AnyType>>(builder, columns)
187+
Self::concat_value_types::<ArrayType<AnyType>>(builder, columns, &data_type)
186188
}
187189
Column::Map(col) => {
188190
let mut offsets = Vec::with_capacity(capacity + 1);
@@ -199,7 +201,7 @@ impl Column {
199201
values: val_builder,
200202
};
201203
let builder = ArrayColumnBuilder { builder, offsets };
202-
Self::concat_value_types::<MapType<AnyType, AnyType>>(builder, columns)
204+
Self::concat_value_types::<MapType<AnyType, AnyType>>(builder, columns, &data_type)
203205
}
204206
Column::Nullable(_) => {
205207
let column: Vec<Column> = columns
@@ -291,11 +293,12 @@ impl Column {
291293
fn concat_value_types<T: ValueType>(
292294
mut builder: T::ColumnBuilder,
293295
columns: impl Iterator<Item = Column>,
296+
data_type: &DataType,
294297
) -> Column {
295298
let columns = columns.map(|c| T::try_downcast_column(&c).unwrap());
296299
for col in columns {
297300
T::append_column(&mut builder, &col);
298301
}
299-
T::upcast_column(T::build_column(builder))
302+
T::upcast_column_with_type(T::build_column(builder), data_type)
300303
}
301304
}

src/query/expression/src/kernels/filter.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,12 @@ impl ValueVisitor for FilterVisitor<'_> {
203203
Ok(())
204204
}
205205

206-
fn visit_typed_column<T: ValueType>(&mut self, column: T::Column) -> Result<()> {
207-
let c = T::upcast_column(column.clone());
206+
fn visit_typed_column<T: ValueType>(
207+
&mut self,
208+
column: T::Column,
209+
data_type: &DataType,
210+
) -> Result<()> {
211+
let c = T::upcast_column_with_type(column.clone(), data_type);
208212
let builder = ColumnBuilder::with_capacity(&c.data_type(), c.len());
209213
let mut builder = T::try_downcast_owned_builder(builder).unwrap();
210214
match self.strategy {
@@ -224,7 +228,10 @@ impl ValueVisitor for FilterVisitor<'_> {
224228
}
225229
}
226230

227-
self.result = Some(Value::Column(T::upcast_column(T::build_column(builder))));
231+
self.result = Some(Value::Column(T::upcast_column_with_type(
232+
T::build_column(builder),
233+
data_type,
234+
)));
228235
Ok(())
229236
}
230237

0 commit comments

Comments
 (0)