Skip to content

Commit 3b55479

Browse files
committed
fix: forward RowBinaryDeserializer::deserialize_any to best-effort deserialize_* method
1 parent 6236870 commit 3b55479

File tree

2 files changed

+143
-2
lines changed

2 files changed

+143
-2
lines changed

src/rowbinary/de.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,35 @@ where
159159
impl_num!(f64, deserialize_f64, visit_f64, get_f64_le, SerdeType::F64);
160160

161161
#[inline(always)]
162-
fn deserialize_any<V: Visitor<'data>>(self, _: V) -> Result<V::Value> {
163-
Err(Error::DeserializeAnyNotSupported)
162+
fn deserialize_any<V: Visitor<'data>>(self, visitor: V) -> Result<V::Value> {
163+
match self
164+
.validator
165+
.peek()
166+
.ok_or(Error::DeserializeAnyNotSupported)?
167+
{
168+
SerdeType::Bool => self.deserialize_bool(visitor),
169+
SerdeType::I8 => self.deserialize_i8(visitor),
170+
SerdeType::I16 => self.deserialize_i16(visitor),
171+
SerdeType::I32 => self.deserialize_i32(visitor),
172+
SerdeType::I64 => self.deserialize_i64(visitor),
173+
SerdeType::I128 => self.deserialize_i128(visitor),
174+
SerdeType::U8 => self.deserialize_u8(visitor),
175+
SerdeType::U16 => self.deserialize_u16(visitor),
176+
SerdeType::U32 => self.deserialize_u32(visitor),
177+
SerdeType::U64 => self.deserialize_u64(visitor),
178+
SerdeType::U128 => self.deserialize_u128(visitor),
179+
SerdeType::F32 => self.deserialize_f32(visitor),
180+
SerdeType::F64 => self.deserialize_f64(visitor),
181+
SerdeType::Str => self.deserialize_str(visitor),
182+
SerdeType::String => self.deserialize_string(visitor),
183+
SerdeType::Option => self.deserialize_option(visitor),
184+
SerdeType::Enum => self.deserialize_enum("", &[], visitor),
185+
SerdeType::Bytes(_) => self.deserialize_bytes(visitor),
186+
SerdeType::ByteBuf(_) => self.deserialize_byte_buf(visitor),
187+
SerdeType::Tuple(len) => self.deserialize_tuple(len, visitor),
188+
SerdeType::Seq(_) => self.deserialize_seq(visitor),
189+
SerdeType::Map(_) => self.deserialize_map(visitor),
190+
}
164191
}
165192

166193
#[inline(always)]

src/rowbinary/validation.rs

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ pub(crate) trait SchemaValidator<R: Row>: Sized {
2929
/// the field order in the struct does not match the column order in the database schema.
3030
fn get_schema_index(&self, struct_idx: usize) -> usize;
3131
fn get_field_name(&self, struct_idx: usize) -> Option<&'static str>;
32+
fn peek(&self) -> Option<SerdeType>;
3233
}
3334

3435
pub(crate) struct DataTypeValidator<'cursor, R: Row> {
@@ -189,6 +190,30 @@ impl<'cursor, R: Row> SchemaValidator<R> for DataTypeValidator<'cursor, R> {
189190
self.metadata.get_field_name(struct_idx)
190191
}
191192

193+
fn peek(&self) -> Option<SerdeType> {
194+
match R::KIND {
195+
RowKind::Primitive => {
196+
let data_type = &self.metadata.columns[0].data_type;
197+
Some(data_type.into())
198+
}
199+
RowKind::Tuple => Some(SerdeType::Tuple(self.metadata.columns.len()).into()),
200+
RowKind::Vec => {
201+
let data_type = &self.metadata.columns[0].data_type;
202+
match data_type {
203+
DataTypeNode::Array(inner_type) => Some(From::from(&**inner_type)),
204+
_ => panic!(
205+
"Expected Array type when validating root level sequence, but got {}",
206+
self.metadata.columns[0].data_type
207+
),
208+
}
209+
}
210+
RowKind::Struct => {
211+
let current_column = &self.metadata.columns[self.current_column_idx];
212+
Some(From::from(&current_column.data_type))
213+
}
214+
}
215+
}
216+
192217
#[cold]
193218
fn validate_identifier<T: EnumOrVariantIdentifier>(&mut self, _value: T) {
194219
unreachable!()
@@ -402,6 +427,46 @@ impl<'cursor, R: Row> SchemaValidator<R> for Option<InnerDataTypeValidator<'_, '
402427
fn get_field_name(&self, _struct_idx: usize) -> Option<&'static str> {
403428
unreachable!()
404429
}
430+
431+
fn peek(&self) -> Option<SerdeType> {
432+
let inner = self.as_ref()?;
433+
match &inner.kind {
434+
InnerDataTypeValidatorKind::Map(kv, state) => match state {
435+
MapValidatorState::Key => Some(From::from(&*kv[0])),
436+
MapValidatorState::Value => Some(From::from(&*kv[1])),
437+
},
438+
InnerDataTypeValidatorKind::MapAsSequence(kv, state) => match state {
439+
MapAsSequenceValidatorState::Tuple | MapAsSequenceValidatorState::Key => {
440+
Some(From::from(&*kv[0]))
441+
}
442+
MapAsSequenceValidatorState::Value => Some(From::from(&*kv[1])),
443+
},
444+
InnerDataTypeValidatorKind::Array(inner_type) => Some(From::from(*inner_type)),
445+
InnerDataTypeValidatorKind::Nullable(inner_type) => Some(From::from(*inner_type)),
446+
InnerDataTypeValidatorKind::Tuple(elements_types) => {
447+
Some(From::from(&elements_types[0]))
448+
}
449+
InnerDataTypeValidatorKind::FixedString(_len) => None,
450+
InnerDataTypeValidatorKind::RootTuple(columns, current_index) => {
451+
Some(From::from(&columns[*current_index].data_type))
452+
}
453+
InnerDataTypeValidatorKind::RootArray(inner_data_type) => {
454+
Some(From::from(*inner_data_type))
455+
}
456+
InnerDataTypeValidatorKind::Variant(possible_types, state) => match state {
457+
VariantValidationState::Pending => {
458+
unreachable!()
459+
}
460+
VariantValidationState::Identifier(value) => {
461+
let data_type = &possible_types[*value as usize];
462+
Some(From::from(data_type))
463+
}
464+
},
465+
InnerDataTypeValidatorKind::Enum(_values_map) => {
466+
unreachable!()
467+
}
468+
}
469+
}
405470
}
406471

407472
impl<R: Row> Drop for InnerDataTypeValidator<'_, '_, R> {
@@ -651,6 +716,10 @@ impl<R: Row> SchemaValidator<R> for () {
651716
fn get_field_name(&self, _struct_idx: usize) -> Option<&'static str> {
652717
unreachable!()
653718
}
719+
720+
fn peek(&self) -> Option<SerdeType> {
721+
unreachable!()
722+
}
654723
}
655724

656725
/// Which Serde data type (De)serializer used for the given type.
@@ -690,6 +759,51 @@ pub(crate) enum SerdeType {
690759
// IgnoredAny,
691760
}
692761

762+
impl From<&DataTypeNode> for SerdeType {
763+
fn from(data_type: &DataTypeNode) -> Self {
764+
match dbg!(data_type.remove_low_cardinality()) {
765+
DataTypeNode::Bool => SerdeType::Bool,
766+
DataTypeNode::Int8 | DataTypeNode::Enum(EnumType::Enum8, _) => SerdeType::I8,
767+
DataTypeNode::Int16 | DataTypeNode::Enum(EnumType::Enum16, _) => SerdeType::I16,
768+
DataTypeNode::Int32
769+
| DataTypeNode::Date32
770+
| DataTypeNode::Time
771+
| DataTypeNode::Decimal(_, _, DecimalType::Decimal32) => SerdeType::I32,
772+
DataTypeNode::Int64
773+
| DataTypeNode::DateTime64(_, _)
774+
| DataTypeNode::Time64(_)
775+
| DataTypeNode::Decimal(_, _, DecimalType::Decimal64)
776+
| DataTypeNode::Interval(_) => SerdeType::I64,
777+
DataTypeNode::Int128 | DataTypeNode::Decimal(_, _, DecimalType::Decimal128) => {
778+
SerdeType::I128
779+
}
780+
DataTypeNode::UInt8 => SerdeType::U8,
781+
DataTypeNode::UInt16 | DataTypeNode::Date => SerdeType::U16,
782+
DataTypeNode::UInt32 | DataTypeNode::DateTime(_) | DataTypeNode::IPv4 => SerdeType::U32,
783+
DataTypeNode::UInt64 => SerdeType::U64,
784+
DataTypeNode::UInt128 => SerdeType::U128,
785+
DataTypeNode::Float32 => SerdeType::F32,
786+
DataTypeNode::Float64 => SerdeType::F64,
787+
DataTypeNode::String | DataTypeNode::JSON => SerdeType::String,
788+
DataTypeNode::Nullable(_) => SerdeType::Option,
789+
DataTypeNode::Array(_)
790+
| DataTypeNode::Ring
791+
| DataTypeNode::Polygon
792+
| DataTypeNode::MultiPolygon
793+
| DataTypeNode::LineString
794+
| DataTypeNode::MultiLineString => SerdeType::Seq(0),
795+
DataTypeNode::Tuple(elements) => SerdeType::Tuple(elements.len()),
796+
DataTypeNode::FixedString(len) => SerdeType::Tuple(*len),
797+
DataTypeNode::IPv6 => SerdeType::Tuple(16),
798+
DataTypeNode::UUID => SerdeType::Tuple(UUID_TUPLE_ELEMENTS.len()),
799+
DataTypeNode::Point => SerdeType::Tuple(POINT_TUPLE_ELEMENTS.len()),
800+
DataTypeNode::Map(_) => SerdeType::Map(0),
801+
DataTypeNode::Variant(_) => SerdeType::Enum,
802+
_ => unimplemented!(),
803+
}
804+
}
805+
}
806+
693807
impl Display for SerdeType {
694808
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
695809
match self {

0 commit comments

Comments
 (0)