pub(crate) const QWP_MAGIC: [u8; 4] = *b"QWP1";
pub(crate) const QWP_VERSION_1: u8 = 1;
pub(crate) const QWP_FLAG_DEFER_COMMIT: u8 = 0x01;
pub(crate) const QWP_FLAG_DELTA_SYMBOL_DICT: u8 = 0x08;
pub(crate) const QWP_HEADER_LEN: usize = 12;
pub(crate) const QWP_TYPE_BOOLEAN: u8 = 0x01;
pub(crate) const QWP_TYPE_BYTE: u8 = 0x02;
pub(crate) const QWP_TYPE_SHORT: u8 = 0x03;
pub(crate) const QWP_TYPE_INT: u8 = 0x04;
pub(crate) const QWP_TYPE_LONG: u8 = 0x05;
pub(crate) const QWP_TYPE_FLOAT: u8 = 0x06;
pub(crate) const QWP_TYPE_DOUBLE: u8 = 0x07;
pub(crate) const QWP_TYPE_SYMBOL: u8 = 0x09;
pub(crate) const QWP_TYPE_TIMESTAMP: u8 = 0x0A;
pub(crate) const QWP_TYPE_DATE: u8 = 0x0B;
pub(crate) const QWP_TYPE_UUID: u8 = 0x0C;
pub(crate) const QWP_TYPE_LONG256: u8 = 0x0D;
pub(crate) const QWP_TYPE_GEOHASH: u8 = 0x0E;
pub(crate) const QWP_TYPE_VARCHAR: u8 = 0x0F;
pub(crate) const QWP_TYPE_TIMESTAMP_NANOS: u8 = 0x10;
pub(crate) const QWP_TYPE_DOUBLE_ARRAY: u8 = 0x11;
pub(crate) const QWP_TYPE_DECIMAL64: u8 = 0x13;
pub(crate) const QWP_TYPE_DECIMAL128: u8 = 0x14;
pub(crate) const QWP_TYPE_DECIMAL256: u8 = 0x15;
pub(crate) const QWP_TYPE_CHAR: u8 = 0x16;
pub(crate) const QWP_TYPE_BINARY: u8 = 0x17;
pub(crate) const QWP_TYPE_IPV4: u8 = 0x18;
pub(crate) const MAX_NAME_LEN: usize = 127;
pub(crate) const I8_NULL: i8 = 0;
pub(crate) const I16_NULL: i16 = 0;
pub(crate) const I32_NULL: i32 = i32::MIN;
pub(crate) const I64_NULL: i64 = i64::MIN;
pub(crate) const F32_NULL: f32 = f32::NAN;
pub(crate) const F64_NULL: f64 = f64::NAN;
#[inline]
pub(crate) fn write_qwp_varint(out: &mut Vec<u8>, mut value: u64) {
while value > 0x7F {
out.push(((value & 0x7F) as u8) | 0x80);
value >>= 7;
}
out.push(value as u8);
}
#[inline]
pub(crate) fn write_qwp_bytes(out: &mut Vec<u8>, bytes: &[u8]) {
write_qwp_varint(out, bytes.len() as u64);
out.extend_from_slice(bytes);
}
#[inline]
pub(crate) fn write_qwp_bitmap_invert(out: &mut Vec<u8>, src: &[u8], bit_len: usize) {
let full_bytes = bit_len / 8;
let trailing_bits = bit_len % 8;
let bitmap_bytes = full_bytes + usize::from(trailing_bits != 0);
let dst_start = out.len();
out.resize(dst_start + bitmap_bytes, 0);
let dst = &mut out[dst_start..dst_start + bitmap_bytes];
let mut i = 0;
while i + 8 <= full_bytes {
let w = u64::from_ne_bytes(src[i..i + 8].try_into().unwrap());
dst[i..i + 8].copy_from_slice(&(!w).to_ne_bytes());
i += 8;
}
for j in i..full_bytes {
dst[j] = !src[j];
}
if trailing_bits != 0 {
let mask = (1u8 << trailing_bits) - 1;
dst[full_bytes] = (!src[full_bytes]) & mask;
}
}
pub(crate) fn validate_table_name(name: &str) -> crate::Result<()> {
if name.len() > MAX_NAME_LEN {
return Err(crate::error::fmt!(
InvalidName,
"table name is too long: {} bytes (max {})",
name.len(),
MAX_NAME_LEN
));
}
crate::ingress::TableName::new(name)?;
Ok(())
}
pub(crate) fn validate_column_name(name: &str) -> crate::Result<()> {
if name.len() > MAX_NAME_LEN {
return Err(crate::error::fmt!(
InvalidName,
"column name is too long: {} bytes (max {})",
name.len(),
MAX_NAME_LEN
));
}
crate::ingress::ColumnName::new(name)?;
Ok(())
}