diff --git a/proto/data.proto b/proto/data.proto index fba6ec6f4c1c0..a7cda61540361 100644 --- a/proto/data.proto +++ b/proto/data.proto @@ -50,6 +50,7 @@ message DataType { LIST = 16; BYTEA = 17; JSONB = 18; + SERIAL = 19; } TypeName type_name = 1; // Data length for char. diff --git a/src/common/src/hash/dispatcher.rs b/src/common/src/hash/dispatcher.rs index f4eaba71da1ca..d104fa1b3ce1e 100644 --- a/src/common/src/hash/dispatcher.rs +++ b/src/common/src/hash/dispatcher.rs @@ -13,6 +13,7 @@ // limitations under the License. use super::HashKey; +use crate::array::serial_array::Serial; use crate::hash; use crate::types::DataType; @@ -90,6 +91,7 @@ fn hash_key_size(data_type: &DataType) -> HashKeySize { DataType::Int16 => HashKeySize::Fixed(size_of::()), DataType::Int32 => HashKeySize::Fixed(size_of::()), DataType::Int64 => HashKeySize::Fixed(size_of::()), + DataType::Serial => HashKeySize::Fixed(size_of::()), DataType::Float32 => HashKeySize::Fixed(size_of::()), DataType::Float64 => HashKeySize::Fixed(size_of::()), DataType::Decimal => HashKeySize::Fixed(size_of::()), diff --git a/src/common/src/types/mod.rs b/src/common/src/types/mod.rs index 088abd7f5eb86..1423b0f43b26c 100644 --- a/src/common/src/types/mod.rs +++ b/src/common/src/types/mod.rs @@ -132,6 +132,9 @@ pub enum DataType { #[display("jsonb")] #[from_str(regex = "(?i)^jsonb$")] Jsonb, + #[display("serial")] + #[from_str(regex = "(?i)^serial$")] + Serial, } impl std::str::FromStr for Box { @@ -149,6 +152,7 @@ impl DataTypeName { | DataTypeName::Int16 | DataTypeName::Int32 | DataTypeName::Int64 + | DataTypeName::Serial | DataTypeName::Decimal | DataTypeName::Float32 | DataTypeName::Float64 @@ -171,6 +175,7 @@ impl DataTypeName { DataTypeName::Int16 => DataType::Int16, DataTypeName::Int32 => DataType::Int32, DataTypeName::Int64 => DataType::Int64, + DataTypeName::Serial => DataType::Serial, DataTypeName::Decimal => DataType::Decimal, DataTypeName::Float32 => DataType::Float32, DataTypeName::Float64 => DataType::Float64, @@ -209,6 +214,7 @@ impl From<&ProstDataType> for DataType { TypeName::Int16 => DataType::Int16, TypeName::Int32 => DataType::Int32, TypeName::Int64 => DataType::Int64, + TypeName::Serial => DataType::Serial, TypeName::Float => DataType::Float32, TypeName::Double => DataType::Float64, TypeName::Boolean => DataType::Boolean, @@ -243,6 +249,7 @@ impl DataType { DataType::Int16 => PrimitiveArrayBuilder::::new(capacity).into(), DataType::Int32 => PrimitiveArrayBuilder::::new(capacity).into(), DataType::Int64 => PrimitiveArrayBuilder::::new(capacity).into(), + DataType::Serial => PrimitiveArrayBuilder::::new(capacity).into(), DataType::Float32 => PrimitiveArrayBuilder::::new(capacity).into(), DataType::Float64 => PrimitiveArrayBuilder::::new(capacity).into(), DataType::Decimal => DecimalArrayBuilder::new(capacity).into(), @@ -272,6 +279,7 @@ impl DataType { DataType::Int16 => TypeName::Int16, DataType::Int32 => TypeName::Int32, DataType::Int64 => TypeName::Int64, + DataType::Serial => TypeName::Serial, DataType::Float32 => TypeName::Float, DataType::Float64 => TypeName::Double, DataType::Boolean => TypeName::Boolean, @@ -314,6 +322,7 @@ impl DataType { DataType::Int16 | DataType::Int32 | DataType::Int64 + | DataType::Serial | DataType::Float32 | DataType::Float64 | DataType::Decimal @@ -354,6 +363,7 @@ impl DataType { DataType::Int16 => ScalarImpl::Int16(i16::MIN), DataType::Int32 => ScalarImpl::Int32(i32::MIN), DataType::Int64 => ScalarImpl::Int64(i64::MIN), + DataType::Serial => ScalarImpl::Serial(Serial::from(i64::MIN)), DataType::Float32 => ScalarImpl::Float32(OrderedF32::neg_infinity()), DataType::Float64 => ScalarImpl::Float64(OrderedF64::neg_infinity()), DataType::Boolean => ScalarImpl::Bool(false), @@ -883,6 +893,7 @@ impl ScalarImpl { Ty::Int16 => Self::Int16(i16::deserialize(de)?), Ty::Int32 => Self::Int32(i32::deserialize(de)?), Ty::Int64 => Self::Int64(i64::deserialize(de)?), + Ty::Serial => todo!("SERIAL"), Ty::Float32 => Self::Float32(f32::deserialize(de)?.into()), Ty::Float64 => Self::Float64(f64::deserialize(de)?.into()), Ty::Varchar => Self::Utf8(Box::::deserialize(de)?), @@ -933,6 +944,7 @@ impl ScalarImpl { DataType::Int16 => size_of::(), DataType::Int32 => size_of::(), DataType::Int64 => size_of::(), + DataType::Serial => size_of::(), DataType::Float32 => size_of::(), DataType::Float64 => size_of::(), DataType::Date => size_of::(), @@ -993,6 +1005,7 @@ pub fn literal_type_match(data_type: &DataType, literal: Option<&ScalarImpl>) -> | (DataType::Int16, ScalarImpl::Int16(_)) | (DataType::Int32, ScalarImpl::Int32(_)) | (DataType::Int64, ScalarImpl::Int64(_)) + | (DataType::Serial, ScalarImpl::Serial(_)) | (DataType::Float32, ScalarImpl::Float32(_)) | (DataType::Float64, ScalarImpl::Float64(_)) | (DataType::Varchar, ScalarImpl::Utf8(_)) @@ -1172,6 +1185,7 @@ mod tests { DataTypeName::Int16 => (ScalarImpl::Int16(233), DataType::Int16), DataTypeName::Int32 => (ScalarImpl::Int32(233333), DataType::Int32), DataTypeName::Int64 => (ScalarImpl::Int64(233333333333), DataType::Int64), + DataTypeName::Serial => (ScalarImpl::Serial(233333333333.into()), DataType::Serial), DataTypeName::Float32 => (ScalarImpl::Float32(23.33.into()), DataType::Float32), DataTypeName::Float64 => ( ScalarImpl::Float64(23.333333333333.into()), diff --git a/src/common/src/types/postgres_type.rs b/src/common/src/types/postgres_type.rs index c520260ca91f8..b0716098a56ea 100644 --- a/src/common/src/types/postgres_type.rs +++ b/src/common/src/types/postgres_type.rs @@ -22,6 +22,7 @@ impl DataType { DataType::Boolean => 1, DataType::Int16 => 2, DataType::Int32 | DataType::Float32 | DataType::Date => 4, + DataType::Serial => todo!(), DataType::Int64 | DataType::Float64 | DataType::Timestamp @@ -114,6 +115,7 @@ impl DataType { DataType::Int16 => 21, DataType::Int32 => 23, DataType::Int64 => 20, + DataType::Serial => todo!("SERIAL"), DataType::Float32 => 700, DataType::Float64 => 701, DataType::Decimal => 1700, @@ -133,6 +135,7 @@ impl DataType { DataType::Int16 => 1005, DataType::Int32 => 1007, DataType::Int64 => 1016, + DataType::Serial => todo!("SERIAL"), DataType::Float32 => 1021, DataType::Float64 => 1022, DataType::Decimal => 1231, diff --git a/src/common/src/util/value_encoding/mod.rs b/src/common/src/util/value_encoding/mod.rs index 7ca9ea69798d7..f4985330eec18 100644 --- a/src/common/src/util/value_encoding/mod.rs +++ b/src/common/src/util/value_encoding/mod.rs @@ -22,7 +22,7 @@ use bytes::{Buf, BufMut}; use chrono::{Datelike, Timelike}; use itertools::Itertools; -use crate::array::{JsonbVal, ListRef, ListValue, StructRef, StructValue}; +use crate::array::{serial_array, JsonbVal, ListRef, ListValue, StructRef, StructValue}; use crate::catalog::ColumnId; use crate::row::{Row, RowDeserializer as BasicDeserializer}; use crate::types::struct_type::StructType; @@ -33,6 +33,8 @@ use crate::types::{ pub mod error; use error::ValueEncodingError; +use serial_array::Serial; + pub mod column_aware_row_encoding; pub type Result = std::result::Result; @@ -223,6 +225,7 @@ fn deserialize_value(ty: &DataType, data: &mut impl Buf) -> Result { DataType::Int16 => ScalarImpl::Int16(data.get_i16_le()), DataType::Int32 => ScalarImpl::Int32(data.get_i32_le()), DataType::Int64 => ScalarImpl::Int64(data.get_i64_le()), + DataType::Serial => ScalarImpl::Serial(Serial::from(data.get_i64_le())), DataType::Float32 => ScalarImpl::Float32(OrderedF32::from(data.get_f32_le())), DataType::Float64 => ScalarImpl::Float64(OrderedF64::from(data.get_f64_le())), DataType::Varchar => ScalarImpl::Utf8(deserialize_str(data)?), diff --git a/src/connector/src/parser/common.rs b/src/connector/src/parser/common.rs index ccc696509761c..669f5b98b1918 100644 --- a/src/connector/src/parser/common.rs +++ b/src/connector/src/parser/common.rs @@ -42,6 +42,7 @@ fn do_parse_simd_json_value(dtype: &DataType, v: &BorrowedValue<'_>) -> Result ensure_int!(v, i64).into(), + DataType::Serial => ensure_int!(v, i64).into(), DataType::Float32 => ScalarImpl::Float32((simd_json_ensure_float!(v, f32) as f32).into()), DataType::Float64 => ScalarImpl::Float64((simd_json_ensure_float!(v, f64)).into()), // FIXME: decimal should have more precision than f64 diff --git a/src/expr/src/expr/expr_binary_nullable.rs b/src/expr/src/expr/expr_binary_nullable.rs index 6e3748f2d1852..9a17cbf4d7736 100644 --- a/src/expr/src/expr/expr_binary_nullable.rs +++ b/src/expr/src/expr/expr_binary_nullable.rs @@ -16,6 +16,7 @@ use std::sync::Arc; +use risingwave_common::array::serial_array::SerialArray; use risingwave_common::array::*; use risingwave_common::buffer::Bitmap; use risingwave_common::row::OwnedRow; @@ -201,6 +202,7 @@ fn build_array_access_expr( DataType::Int16 => array_access_expression!(I16Array), DataType::Int32 => array_access_expression!(I32Array), DataType::Int64 => array_access_expression!(I64Array), + DataType::Serial => array_access_expression!(SerialArray), DataType::Float32 => array_access_expression!(F32Array), DataType::Float64 => array_access_expression!(F64Array), DataType::Decimal => array_access_expression!(DecimalArray), diff --git a/src/expr/src/vector_op/cast.rs b/src/expr/src/vector_op/cast.rs index 7ab68cca3b271..0d1ed1abbbea4 100644 --- a/src/expr/src/vector_op/cast.rs +++ b/src/expr/src/vector_op/cast.rs @@ -449,6 +449,7 @@ pub fn literal_parsing( DataType::Int16 => str_parse::(s)?.into(), DataType::Int32 => str_parse::(s)?.into(), DataType::Int64 => str_parse::(s)?.into(), + DataType::Serial => str_parse::(s)?.into(), DataType::Decimal => str_parse::(s)?.into(), DataType::Float32 => str_parse::(s)?.into(), DataType::Float64 => str_parse::(s)?.into(), diff --git a/src/frontend/src/expr/literal.rs b/src/frontend/src/expr/literal.rs index d695805ad8287..716b1d096fdc4 100644 --- a/src/frontend/src/expr/literal.rs +++ b/src/frontend/src/expr/literal.rs @@ -42,6 +42,7 @@ impl std::fmt::Debug for Literal { DataType::Int16 | DataType::Int32 | DataType::Int64 + | DataType::Serial | DataType::Decimal | DataType::Float32 | DataType::Float64 => write!(f, "{}", v.as_scalar_ref_impl().to_text()), diff --git a/src/frontend/src/optimizer/rule/index_selection_rule.rs b/src/frontend/src/optimizer/rule/index_selection_rule.rs index 909b47d0f67ff..d83218d1288b7 100644 --- a/src/frontend/src/optimizer/rule/index_selection_rule.rs +++ b/src/frontend/src/optimizer/rule/index_selection_rule.rs @@ -52,6 +52,7 @@ use std::collections::{BTreeMap, HashMap, HashSet}; use std::rc::Rc; use itertools::Itertools; +use risingwave_common::array::serial_array::Serial; use risingwave_common::catalog::Schema; use risingwave_common::types::{ DataType, Decimal, IntervalUnit, NaiveDateTimeWrapper, NaiveDateWrapper, NaiveTimeWrapper, @@ -702,6 +703,7 @@ impl<'a> TableScanIoEstimator<'a> { DataType::Int16 => size_of::(), DataType::Int32 => size_of::(), DataType::Int64 => size_of::(), + DataType::Serial => size_of::(), DataType::Float32 => size_of::(), DataType::Float64 => size_of::(), DataType::Decimal => size_of::(), diff --git a/src/tests/sqlsmith/src/sql_gen/types.rs b/src/tests/sqlsmith/src/sql_gen/types.rs index 9e9535f99b546..d02894904be5d 100644 --- a/src/tests/sqlsmith/src/sql_gen/types.rs +++ b/src/tests/sqlsmith/src/sql_gen/types.rs @@ -33,6 +33,7 @@ pub(super) fn data_type_to_ast_data_type(data_type: &DataType) -> AstDataType { DataType::Int16 => AstDataType::SmallInt, DataType::Int32 => AstDataType::Int, DataType::Int64 => AstDataType::BigInt, + DataType::Serial => AstDataType::Custom(vec!["SERIAL".into()].into()), DataType::Decimal => AstDataType::Decimal(None, None), DataType::Float32 => AstDataType::Real, DataType::Float64 => AstDataType::Double, diff --git a/src/utils/pgwire/src/pg_extended.rs b/src/utils/pgwire/src/pg_extended.rs index 6fb6aa4b24e87..7912db43bbfcd 100644 --- a/src/utils/pgwire/src/pg_extended.rs +++ b/src/utils/pgwire/src/pg_extended.rs @@ -415,6 +415,7 @@ impl PreparedStatement { }; format!("{}::INT8", tmp) } + DataType::Serial => todo!("SERIAL"), DataType::Int16 => { let tmp = match param_format { Format::Binary => { @@ -542,6 +543,7 @@ impl PreparedStatement { match oid { DataType::Boolean => params.push("false".to_string()), DataType::Int64 => params.push("0::BIGINT".to_string()), + DataType::Serial => todo!("SERIAL"), DataType::Int16 => params.push("0::SMALLINT".to_string()), DataType::Int32 => params.push("0::INT".to_string()), DataType::Float32 => params.push("0::FLOAT4".to_string()),