From 13d35d0f39378a35024ed3fe3357ce03407598d4 Mon Sep 17 00:00:00 2001 From: Yikun Chen <36026213+cykbls01@users.noreply.github.com> Date: Sat, 14 May 2022 07:20:30 -0400 Subject: [PATCH] refactor: binding struct values when they are parsed as row (#2508) Delete scalarImpl to datatype function since we can get the data type from literal. --- src/common/src/types/mod.rs | 12 +--------- src/common/src/types/scalar_impl.rs | 34 ----------------------------- src/frontend/src/binder/values.rs | 23 ++++++++++--------- 3 files changed, 12 insertions(+), 57 deletions(-) diff --git a/src/common/src/types/mod.rs b/src/common/src/types/mod.rs index 4cc675d4b98c8..c3b5722599e93 100644 --- a/src/common/src/types/mod.rs +++ b/src/common/src/types/mod.rs @@ -19,7 +19,7 @@ use bytes::{Buf, BufMut}; use risingwave_pb::data::DataType as ProstDataType; use serde::{Deserialize, Serialize}; -use crate::error::{internal_error, ErrorCode, Result, RwError}; +use crate::error::{ErrorCode, Result, RwError}; mod native_type; mod scalar_impl; @@ -326,16 +326,6 @@ for_all_scalar_variants! { scalar_impl_enum } pub type Datum = Option; pub type DatumRef<'a> = Option>; -pub fn get_data_type_from_datum(datum: &Datum) -> Result { - match datum { - // TODO: Predicate data type from None Datum - None => Err(internal_error( - "cannot get data type from None Datum".to_string(), - )), - Some(scalar) => scalar.data_type(), - } -} - /// Convert a [`Datum`] to a [`DatumRef`]. pub fn to_datum_ref(datum: &Datum) -> DatumRef<'_> { datum.as_ref().map(|d| d.as_scalar_ref_impl()) diff --git a/src/common/src/types/scalar_impl.rs b/src/common/src/types/scalar_impl.rs index f4dc72fc608be..c1fc04344e8a6 100644 --- a/src/common/src/types/scalar_impl.rs +++ b/src/common/src/types/scalar_impl.rs @@ -300,40 +300,6 @@ impl ScalarImpl { } for_all_scalar_variants! { impl_all_get_ident, self } } - - pub(crate) fn data_type(&self) -> Result { - let data_type = match self { - ScalarImpl::Int16(_) => DataType::Int16, - ScalarImpl::Int32(_) => DataType::Int32, - ScalarImpl::Int64(_) => DataType::Int64, - ScalarImpl::Float32(_) => DataType::Float32, - ScalarImpl::Float64(_) => DataType::Float64, - ScalarImpl::Utf8(_) => DataType::Varchar, - ScalarImpl::Bool(_) => DataType::Boolean, - ScalarImpl::Decimal(_) => DataType::Decimal, - ScalarImpl::Interval(_) => DataType::Interval, - ScalarImpl::NaiveDate(_) => DataType::Date, - ScalarImpl::NaiveDateTime(_) => DataType::Timestamp, - ScalarImpl::NaiveTime(_) => DataType::Time, - ScalarImpl::Struct(data) => { - let types = data - .fields() - .iter() - .map(get_data_type_from_datum) - .collect::>>()?; - DataType::Struct { - fields: types.into(), - } - } - ScalarImpl::List(data) => { - let data = data.values().get(0).ok_or_else(|| { - internal_error("cannot get data type from empty list".to_string()) - })?; - get_data_type_from_datum(data)? - } - }; - Ok(data_type) - } } impl<'scalar> ScalarRefImpl<'scalar> { diff --git a/src/frontend/src/binder/values.rs b/src/frontend/src/binder/values.rs index dc400ad478ad6..9fa1faba7775f 100644 --- a/src/frontend/src/binder/values.rs +++ b/src/frontend/src/binder/values.rs @@ -16,12 +16,12 @@ use itertools::Itertools; use risingwave_common::array::StructValue; use risingwave_common::catalog::{Field, Schema}; use risingwave_common::error::{ErrorCode, Result, TrackingIssue}; -use risingwave_common::types::{get_data_type_from_datum, DataType, Datum, Scalar}; +use risingwave_common::types::{DataType, Scalar}; use risingwave_sqlparser::ast::{Expr, Values}; use super::bind_context::Clause; use crate::binder::Binder; -use crate::expr::{align_types, ExprImpl, Literal}; +use crate::expr::{align_types, Expr as _, ExprImpl, Literal}; #[derive(Debug)] pub struct BoundValues { @@ -86,27 +86,27 @@ impl Binder { /// e.g. Row(1,2,(1,2,3)). /// Only accept value and row expr in row. pub fn bind_row(&mut self, exprs: &[Expr]) -> Result { - let datums = exprs + let literals = exprs .iter() .map(|e| match e { - Expr::Value(value) => Ok(self.bind_value(value.clone())?.get_data().clone()), - Expr::Row(expr) => Ok(self.bind_row(expr)?.get_data().clone()), + Expr::Value(value) => Ok(self.bind_value(value.clone())?), + Expr::Row(expr) => Ok(self.bind_row(expr)?), _ => Err(ErrorCode::NotImplemented( format!("unsupported expression {:?}", e), TrackingIssue::none(), ) .into()), }) - .collect::>>()?; - let value = StructValue::new(datums); + .collect::>>()?; let data_type = DataType::Struct { - fields: value - .fields() + fields: literals .iter() - .map(get_data_type_from_datum) - .collect::>>()? + .map(|l| l.return_type()) + .collect_vec() .into(), }; + let value = StructValue::new(literals.iter().map(|f| f.get_data().clone()).collect_vec()); + Ok(Literal::new(Some(value.to_scalar_value()), data_type)) } } @@ -119,7 +119,6 @@ mod tests { use super::*; use crate::binder::test_utils::mock_binder; - use crate::expr::Expr as _; #[test] fn test_bind_values() {