Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions src/query/expression/src/block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -182,13 +182,13 @@ impl BlockEntry {
}
}

pub fn downcast<T: AccessType>(&self) -> Option<ColumnView<T>> {
pub fn downcast<T: AccessType>(&self) -> Result<ColumnView<T>> {
match self {
BlockEntry::Const(scalar, _, num_rows) => T::try_downcast_scalar(&scalar.as_ref())
.map(|s| ColumnView::Const(T::to_owned_scalar(s), *num_rows)),
BlockEntry::Column(column) => {
T::try_downcast_column(column).map(|c| ColumnView::Column(c))
}
BlockEntry::Const(scalar, _, num_rows) => Ok(ColumnView::Const(
T::to_owned_scalar(T::try_downcast_scalar(&scalar.as_ref())?),
*num_rows,
)),
BlockEntry::Column(column) => Ok(ColumnView::Column(T::try_downcast_column(column)?)),
}
}
}
Expand Down
27 changes: 12 additions & 15 deletions src/query/expression/src/register.rs
Original file line number Diff line number Diff line change
Expand Up @@ -912,21 +912,18 @@ fn erase_function_generic_0_arg<O: ArgType>(
fn erase_function_generic_1_arg<I1: ArgType, O: ArgType>(
func: impl for<'a> Fn(Value<I1>, &mut EvalContext) -> Value<O>,
) -> impl Fn(&[Value<AnyType>], &mut EvalContext) -> Value<AnyType> {
move |args, ctx| {
let arg1 = match args[0].try_downcast() {
Some(arg1) => arg1,
None => match &args[0] {
Value::Scalar(scalar) => {
unreachable!("can't downcast from {scalar:?} to {}", I1::data_type())
}
Value::Column(column) => unreachable!(
"can't downcast from {} to {}",
column.data_type(),
I1::data_type()
),
},
};
Value::upcast(func(arg1, ctx))
move |args, ctx| match args[0].try_downcast() {
Ok(arg1) => Value::upcast(func(arg1, ctx)),
Err(_) => match &args[0] {
Value::Scalar(scalar) => {
unreachable!("can't downcast from {scalar:?} to {}", I1::data_type())
}
Value::Column(column) => unreachable!(
"can't downcast from {} to {}",
column.data_type(),
I1::data_type()
),
},
}
}

Expand Down
34 changes: 29 additions & 5 deletions src/query/expression/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ impl DataType {
DataType::Number(NumberDataType::Int64) => {
Ok(Scalar::Number(NumberScalar::Int64(i64::MAX)))
}
_ => Result::Err(format!(
_ => Err(format!(
"only support numeric types and time types, but got {:?}",
self
)),
Expand Down Expand Up @@ -305,7 +305,7 @@ impl DataType {
DataType::Number(NumberDataType::Int64) => {
Ok(Scalar::Number(NumberScalar::Int64(i64::MIN)))
}
_ => Result::Err(format!(
_ => Err(format!(
"only support numeric types and time types, but got {:?}",
self
)),
Expand Down Expand Up @@ -579,10 +579,10 @@ pub trait AccessType: Debug + Clone + PartialEq + Sized + 'static {
fn to_owned_scalar(scalar: Self::ScalarRef<'_>) -> Self::Scalar;
fn to_scalar_ref(scalar: &Self::Scalar) -> Self::ScalarRef<'_>;

fn try_downcast_scalar<'a>(scalar: &ScalarRef<'a>) -> Option<Self::ScalarRef<'a>>;
fn try_downcast_domain(domain: &Domain) -> Option<Self::Domain>;
fn try_downcast_scalar<'a>(scalar: &ScalarRef<'a>) -> Result<Self::ScalarRef<'a>, ErrorCode>;
fn try_downcast_domain(domain: &Domain) -> Result<Self::Domain, ErrorCode>;

fn try_downcast_column(col: &Column) -> Option<Self::Column>;
fn try_downcast_column(col: &Column) -> Result<Self::Column, ErrorCode>;

fn column_len(col: &Self::Column) -> usize;
fn index_column(col: &Self::Column, index: usize) -> Option<Self::ScalarRef<'_>>;
Expand Down Expand Up @@ -650,6 +650,30 @@ pub trait AccessType: Debug + Clone + PartialEq + Sized + 'static {
}
}

fn scalar_type_error<T>(value: &ScalarRef<'_>) -> ErrorCode {
ErrorCode::BadDataValueType(format!(
"failed to downcast scalar {:?} into {}",
value,
std::any::type_name::<T>()
))
}

fn column_type_error<T>(value: &Column) -> ErrorCode {
ErrorCode::BadDataValueType(format!(
"failed to downcast column {:?} into {}",
value,
std::any::type_name::<T>()
))
}

fn domain_type_error<T>(value: &Domain) -> ErrorCode {
ErrorCode::BadDataValueType(format!(
"failed to downcast domain {:?} into {}",
value,
std::any::type_name::<T>()
))
}

/// [ValueType] includes the builder method of a data type based on [AccessType].
pub trait ValueType: AccessType {
type ColumnBuilder: Debug + Clone;
Expand Down
22 changes: 12 additions & 10 deletions src/query/expression/src/types/any.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@
use std::cmp::Ordering;
use std::ops::Range;

use databend_common_exception::Result;

use super::AccessType;
use super::BuilderMut;
use super::DataType;
use super::ValueType;
use crate::property::Domain;
use crate::types::AccessType;
use crate::types::BuilderMut;
use crate::types::DataType;
use crate::types::ValueType;
use crate::values::Column;
use crate::values::Scalar;
use crate::ColumnBuilder;
Expand All @@ -44,16 +46,16 @@ impl AccessType for AnyType {
scalar.as_ref()
}

fn try_downcast_scalar<'a>(scalar: &ScalarRef<'a>) -> Option<Self::ScalarRef<'a>> {
Some(scalar.clone())
fn try_downcast_scalar<'a>(scalar: &ScalarRef<'a>) -> Result<Self::ScalarRef<'a>> {
Ok(scalar.clone())
}

fn try_downcast_column(col: &Column) -> Option<Self::Column> {
Some(col.clone())
fn try_downcast_column(col: &Column) -> Result<Self::Column> {
Ok(col.clone())
}

fn try_downcast_domain(domain: &Domain) -> Option<Self::Domain> {
Some(domain.clone())
fn try_downcast_domain(domain: &Domain) -> Result<Self::Domain> {
Ok(domain.clone())
}

fn column_len(col: &Self::Column) -> usize {
Expand Down
44 changes: 25 additions & 19 deletions src/query/expression/src/types/array.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,21 @@ use databend_common_column::buffer::Buffer;
use databend_common_exception::ErrorCode;
use databend_common_exception::Result;

use super::column_type_error;
use super::domain_type_error;
use super::scalar_type_error;
use super::AccessType;
use super::AnyType;
use super::ArgType;
use super::BuilderExt;
use super::Column;
use super::DataType;
use super::GenericMap;
use super::ReturnType;
use super::Scalar;
use super::ScalarRef;
use super::ValueType;
use crate::property::Domain;
use crate::types::AccessType;
use crate::types::ArgType;
use crate::types::BuilderExt;
use crate::types::DataType;
use crate::types::GenericMap;
use crate::types::Scalar;
use crate::types::ScalarRef;
use crate::types::ValueType;
use crate::values::Column;
use crate::ColumnBuilder;

#[derive(Debug, Clone, PartialEq, Eq)]
Expand All @@ -54,22 +57,25 @@ impl<T: AccessType> AccessType for ArrayType<T> {
scalar.clone()
}

fn try_downcast_scalar<'a>(scalar: &ScalarRef<'a>) -> Option<Self::ScalarRef<'a>> {
fn try_downcast_scalar<'a>(scalar: &ScalarRef<'a>) -> Result<Self::ScalarRef<'a>> {
match scalar {
ScalarRef::Array(array) => T::try_downcast_column(array),
_ => None,
_ => Err(scalar_type_error::<Self>(scalar)),
}
}

fn try_downcast_column(col: &Column) -> Option<Self::Column> {
ArrayColumn::try_downcast(col.as_array()?)
fn try_downcast_column(col: &Column) -> Result<Self::Column> {
let array = col
.as_array()
.ok_or_else(|| column_type_error::<Self>(col))?;
ArrayColumn::try_downcast(array)
}

fn try_downcast_domain(domain: &Domain) -> Option<Self::Domain> {
fn try_downcast_domain(domain: &Domain) -> Result<Self::Domain> {
match domain {
Domain::Array(Some(domain)) => Some(Some(T::try_downcast_domain(domain)?)),
Domain::Array(None) => Some(None),
_ => None,
Domain::Array(Some(domain)) => Ok(Some(T::try_downcast_domain(domain)?)),
Domain::Array(None) => Ok(None),
_ => Err(domain_type_error::<Self>(domain)),
}
}

Expand Down Expand Up @@ -333,8 +339,8 @@ impl<T: ValueType> ArrayColumn<T> {
}

impl ArrayColumn<AnyType> {
pub fn try_downcast<T: AccessType>(&self) -> Option<ArrayColumn<T>> {
Some(ArrayColumn {
pub fn try_downcast<T: AccessType>(&self) -> Result<ArrayColumn<T>> {
Ok(ArrayColumn {
values: T::try_downcast_column(&self.values)?,
offsets: self.offsets.clone(),
})
Expand Down
38 changes: 24 additions & 14 deletions src/query/expression/src/types/binary.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,20 @@
use std::cmp::Ordering;
use std::ops::Range;

use databend_common_exception::Result;

use super::column_type_error;
use super::domain_type_error;
use super::scalar_type_error;
use super::AccessType;
use super::ArgType;
use super::BuilderMut;
use super::DataType;
use super::GenericMap;
use super::ReturnType;
use super::ScalarRef;
use super::ValueType;
use crate::property::Domain;
use crate::types::ArgType;
use crate::types::BuilderMut;
use crate::types::DataType;
use crate::types::GenericMap;
use crate::types::ReturnType;
use crate::types::ScalarRef;
use crate::types::ValueType;
use crate::values::Column;
use crate::values::Scalar;
use crate::ColumnBuilder;
Expand All @@ -50,19 +55,24 @@ impl AccessType for BinaryType {
scalar
}

fn try_downcast_scalar<'a>(scalar: &ScalarRef<'a>) -> Option<Self::ScalarRef<'a>> {
scalar.as_binary().cloned()
fn try_downcast_scalar<'a>(scalar: &ScalarRef<'a>) -> Result<Self::ScalarRef<'a>> {
scalar
.as_binary()
.cloned()
.ok_or_else(|| scalar_type_error::<Self>(scalar))
}

fn try_downcast_column(col: &Column) -> Option<Self::Column> {
col.as_binary().cloned()
fn try_downcast_column(col: &Column) -> Result<Self::Column> {
col.as_binary()
.cloned()
.ok_or_else(|| column_type_error::<Self>(col))
}

fn try_downcast_domain(domain: &Domain) -> Option<Self::Domain> {
fn try_downcast_domain(domain: &Domain) -> Result<Self::Domain> {
if domain.is_undefined() {
Some(())
Ok(())
} else {
None
Err(domain_type_error::<Self>(domain))
}
}

Expand Down
38 changes: 24 additions & 14 deletions src/query/expression/src/types/bitmap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,22 @@
use std::cmp::Ordering;
use std::ops::Range;

use databend_common_exception::Result;

use super::binary::BinaryColumn;
use super::binary::BinaryColumnBuilder;
use super::binary::BinaryColumnIter;
use super::column_type_error;
use super::domain_type_error;
use super::scalar_type_error;
use super::AccessType;
use super::ArgType;
use super::BuilderMut;
use super::DataType;
use super::GenericMap;
use super::ReturnType;
use super::ValueType;
use crate::property::Domain;
use crate::types::AccessType;
use crate::types::ArgType;
use crate::types::BuilderMut;
use crate::types::DataType;
use crate::types::GenericMap;
use crate::types::ReturnType;
use crate::types::ValueType;
use crate::values::Column;
use crate::values::Scalar;
use crate::ColumnBuilder;
Expand All @@ -49,19 +54,24 @@ impl AccessType for BitmapType {
scalar
}

fn try_downcast_scalar<'a>(scalar: &ScalarRef<'a>) -> Option<Self::ScalarRef<'a>> {
scalar.as_bitmap().cloned()
fn try_downcast_scalar<'a>(scalar: &ScalarRef<'a>) -> Result<Self::ScalarRef<'a>> {
scalar
.as_bitmap()
.cloned()
.ok_or_else(|| scalar_type_error::<Self>(scalar))
}

fn try_downcast_column(col: &Column) -> Option<Self::Column> {
col.as_bitmap().cloned()
fn try_downcast_column(col: &Column) -> Result<Self::Column> {
col.as_bitmap()
.cloned()
.ok_or_else(|| column_type_error::<Self>(col))
}

fn try_downcast_domain(domain: &Domain) -> Option<Self::Domain> {
fn try_downcast_domain(domain: &Domain) -> Result<Self::Domain> {
if domain.is_undefined() {
Some(())
Ok(())
} else {
None
Err(domain_type_error::<Self>(domain))
}
}

Expand Down
Loading
Loading