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
19 changes: 19 additions & 0 deletions src/constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,22 @@ pub(crate) const TYPE_DATE: &str = "DATE";
pub(crate) const TYPE_TIMESTAMP: &str = "TIMESTAMP";
pub(crate) const TYPE_TIMESTAMP_TZ: &str = "TIMESTAMP_TZ";
pub(crate) const TYPE_INTERVAL: &str = "INTERVAL";

pub(crate) const MAX_DECIMAL64_PRECISION: usize = 18;
pub(crate) const MAX_DECIMAL128_PRECISION: usize = 38;
pub(crate) const MAX_DECIMAL256_PRECISION: usize = 76;

pub(crate) const UINT64_MIN: i128 = 0i128;
pub(crate) const UINT64_MAX: i128 = 18_446_744_073_709_551_615i128;
pub(crate) const INT64_MIN: i128 = -9_223_372_036_854_775_808i128;
pub(crate) const INT64_MAX: i128 = 9_223_372_036_854_775_807i128;
pub(crate) const DECIMAL64_MIN: i128 = -999_999_999_999_999_999i128;
pub(crate) const DECIMAL64_MAX: i128 = 999_999_999_999_999_999i128;
pub(crate) const DECIMAL128_MIN: i128 = -99_999_999_999_999_999_999_999_999_999_999_999_999i128;
pub(crate) const DECIMAL128_MAX: i128 = 99_999_999_999_999_999_999_999_999_999_999_999_999i128;

pub(crate) const NUMBER_STRUCT_TOKEN: &str = "$jsonb::private::Number";
pub(crate) const NUMBER_STRUCT_FIELD_SCALE: &str = "$jsonb::private::Number::Scale";
pub(crate) const NUMBER_STRUCT_FIELD_VALUE: &str = "$jsonb::private::Number::Value";
pub(crate) const NUMBER_STRUCT_FIELD_HIGH_VALUE: &str = "$jsonb::private::Number::High_Value";
pub(crate) const NUMBER_STRUCT_FIELD_LOW_VALUE: &str = "$jsonb::private::Number::Low_Value";
38 changes: 27 additions & 11 deletions src/core/databend/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ use byteorder::WriteBytesExt;

use super::constants::*;
use super::jentry::JEntry;
use crate::core::ExtensionItem;
use crate::core::JsonbItem;
use crate::core::NumberItem;
use crate::error::Error;
use crate::error::Result;
use crate::OwnedJsonb;
Expand Down Expand Up @@ -189,21 +191,35 @@ fn append_jsonb_item(buf: &mut Vec<u8>, jentry_index: &mut usize, item: JsonbIte
};
replace_jentry(buf, jentry, jentry_index);
}
JsonbItem::Number(data) => {
let jentry = JEntry::make_number_jentry(data.len());
replace_jentry(buf, jentry, jentry_index);
buf.extend_from_slice(data);
}
JsonbItem::Number(num) => match num {
NumberItem::Raw(data) => {
let jentry = JEntry::make_number_jentry(data.len());
replace_jentry(buf, jentry, jentry_index);
buf.extend_from_slice(data);
}
NumberItem::Number(num) => {
let len = num.compact_encode(&mut *buf)?;
let jentry = JEntry::make_number_jentry(len);
replace_jentry(buf, jentry, jentry_index);
}
},
JsonbItem::String(data) => {
let jentry = JEntry::make_string_jentry(data.len());
replace_jentry(buf, jentry, jentry_index);
buf.extend_from_slice(data);
}
JsonbItem::Extension(data) => {
let jentry = JEntry::make_extension_jentry(data.len());
replace_jentry(buf, jentry, jentry_index);
buf.extend_from_slice(data);
buf.extend_from_slice(data.as_bytes());
}
JsonbItem::Extension(ext) => match ext {
ExtensionItem::Raw(data) => {
let jentry = JEntry::make_extension_jentry(data.len());
replace_jentry(buf, jentry, jentry_index);
buf.extend_from_slice(data);
}
ExtensionItem::Extension(ext) => {
let len = ext.compact_encode(&mut *buf)?;
let jentry = JEntry::make_extension_jentry(len);
replace_jentry(buf, jentry, jentry_index);
}
},
JsonbItem::Raw(raw_jsonb) => {
append_raw_jsonb_data(buf, jentry_index, raw_jsonb)?;
}
Expand Down
16 changes: 7 additions & 9 deletions src/core/databend/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ impl<'de> Deserializer<'de> {
self.index == self.raw.len()
}

fn read_header(&mut self) -> Result<(u32, u32)> {
fn read_header(&mut self) -> Result<(u32, usize)> {
let header = self.raw.read_header(self.index)?;
self.index += 4;
Ok(header)
Expand Down Expand Up @@ -377,12 +377,11 @@ impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
}
}
ARRAY_CONTAINER_TAG => {
let jentries = self.read_array_jentries(header_len as usize)?;
let jentries = self.read_array_jentries(header_len)?;
visitor.visit_seq(ArrayDeserializer::new(self, jentries))
}
OBJECT_CONTAINER_TAG => {
let (key_jentries, value_jentries) =
self.read_object_jentries(header_len as usize)?;
let (key_jentries, value_jentries) = self.read_object_jentries(header_len)?;

let origin_index = self.index;
let key_length: usize = key_jentries.iter().map(|j| j.length as usize).sum();
Expand Down Expand Up @@ -564,7 +563,7 @@ impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
let (header_type, header_len) = self.read_header()?;
match header_type {
ARRAY_CONTAINER_TAG => {
let jentries = self.read_array_jentries(header_len as usize)?;
let jentries = self.read_array_jentries(header_len)?;
visitor.visit_seq(ArrayDeserializer::new(self, jentries))
}
SCALAR_CONTAINER_TAG | OBJECT_CONTAINER_TAG => Err(Error::UnexpectedType),
Expand Down Expand Up @@ -598,8 +597,7 @@ impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
let (header_type, header_len) = self.read_header()?;
match header_type {
OBJECT_CONTAINER_TAG => {
let (key_jentries, value_jentries) =
self.read_object_jentries(header_len as usize)?;
let (key_jentries, value_jentries) = self.read_object_jentries(header_len)?;

let origin_index = self.index;
let key_length: usize = key_jentries.iter().map(|j| j.length as usize).sum();
Expand Down Expand Up @@ -861,7 +859,7 @@ impl<'de> de::VariantAccess<'de> for EnumDeserializer<'_, 'de> {
let (header_type, header_len) = self.de.read_header()?;
match header_type {
ARRAY_CONTAINER_TAG => {
let jentries = self.de.read_array_jentries(header_len as usize)?;
let jentries = self.de.read_array_jentries(header_len)?;
visitor.visit_seq(ArrayDeserializer::new(self.de, jentries))
}
SCALAR_CONTAINER_TAG | OBJECT_CONTAINER_TAG => Err(Error::UnexpectedType),
Expand All @@ -883,7 +881,7 @@ impl<'de> de::VariantAccess<'de> for EnumDeserializer<'_, 'de> {
match header_type {
OBJECT_CONTAINER_TAG => {
let (key_jentries, value_jentries) =
self.de.read_object_jentries(header_len as usize)?;
self.de.read_object_jentries(header_len)?;

let origin_index = self.de.index;
let key_length: usize = key_jentries.iter().map(|j| j.length as usize).sum();
Expand Down
18 changes: 9 additions & 9 deletions src/core/databend/iterator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,12 @@ impl<'a> ArrayIterator<'a> {
let (header_type, header_len) = raw_jsonb.read_header(0)?;
if header_type == ARRAY_CONTAINER_TAG {
let jentry_offset = 4;
let item_offset = 4 + 4 * header_len as usize;
let item_offset = 4 + 4 * header_len;
Ok(Some(Self {
raw_jsonb,
jentry_offset,
item_offset,
length: header_len as usize,
length: header_len,
index: 0,
}))
} else {
Expand Down Expand Up @@ -97,12 +97,12 @@ impl<'a> ObjectKeyIterator<'a> {
let (header_type, header_len) = raw_jsonb.read_header(0)?;
if header_type == OBJECT_CONTAINER_TAG {
let jentry_offset = 4;
let item_offset = 4 + 8 * header_len as usize;
let item_offset = 4 + 8 * header_len;
Ok(Some(Self {
raw_jsonb,
jentry_offset,
item_offset,
length: header_len as usize,
length: header_len,
index: 0,
}))
} else {
Expand Down Expand Up @@ -159,7 +159,7 @@ impl<'a> ObjectValueIterator<'a> {
let (header_type, header_len) = raw_jsonb.read_header(0)?;
if header_type == OBJECT_CONTAINER_TAG {
let mut jentry_offset = 4;
let mut item_offset = 4 + 8 * header_len as usize;
let mut item_offset = 4 + 8 * header_len;
for _ in 0..header_len {
let key_jentry = raw_jsonb.read_jentry(jentry_offset)?;
jentry_offset += 4;
Expand All @@ -170,7 +170,7 @@ impl<'a> ObjectValueIterator<'a> {
raw_jsonb,
jentry_offset,
item_offset,
length: header_len as usize,
length: header_len,
index: 0,
}))
} else {
Expand Down Expand Up @@ -229,14 +229,14 @@ impl<'a> ObjectIterator<'a> {
let (header_type, header_len) = raw_jsonb.read_header(0)?;
if header_type == OBJECT_CONTAINER_TAG {
let mut jentry_offset = 4;
let mut key_jentries = VecDeque::with_capacity(header_len as usize);
let mut key_jentries = VecDeque::with_capacity(header_len);
for _ in 0..header_len {
let key_jentry = raw_jsonb.read_jentry(jentry_offset)?;
jentry_offset += 4;
key_jentries.push_back(key_jentry);
}
let key_length: usize = key_jentries.iter().map(|j| j.length as usize).sum();
let key_offset = 4 + 8 * header_len as usize;
let key_offset = 4 + 8 * header_len;
let val_offset = key_offset + key_length;

Ok(Some(Self {
Expand All @@ -245,7 +245,7 @@ impl<'a> ObjectIterator<'a> {
jentry_offset,
key_offset,
val_offset,
length: header_len as usize,
length: header_len,
}))
} else {
Ok(None)
Expand Down
Loading