clickhouse_data_type/
low_cardinality.rs1use chrono_tz::Tz;
2use pest::iterators::{Pair, Pairs};
3
4use crate::{
5 date_time,
6 fixed_string::{self, FixedStringN},
7 nullable::{self, NullableTypeName},
8 type_name_parser::Rule,
9 ParseError,
10};
11
12#[derive(PartialEq, Eq, Debug, Clone)]
14pub enum LowCardinalityDataType {
15 UInt8,
16 UInt16,
17 UInt32,
18 UInt64,
19 Int8,
20 Int16,
21 Int32,
22 Int64,
23 Float32,
24 Float64,
25 String,
26 FixedString(FixedStringN),
27 Date,
28 DateTime(Option<Tz>),
29 Ipv4,
30 Ipv6,
31 Nullable(NullableTypeName),
35}
36
37impl TryFrom<Pair<'_, Rule>> for LowCardinalityDataType {
38 type Error = ParseError;
39
40 fn try_from(pair: Pair<'_, Rule>) -> Result<Self, Self::Error> {
41 match pair.as_rule() {
42 Rule::UInt8 => Ok(Self::UInt8),
43 Rule::UInt16 => Ok(Self::UInt16),
44 Rule::UInt32 => Ok(Self::UInt32),
45 Rule::UInt64 => Ok(Self::UInt64),
46 Rule::Int8 => Ok(Self::Int8),
47 Rule::Int16 => Ok(Self::Int16),
48 Rule::Int32 => Ok(Self::Int32),
49 Rule::Int64 => Ok(Self::Int64),
50 Rule::Float32 => Ok(Self::Float32),
51 Rule::Float64 => Ok(Self::Float64),
52 Rule::String => Ok(Self::String),
53 Rule::FixedString => {
54 let n = fixed_string::get_n(pair.into_inner())?;
55
56 Ok(Self::FixedString(n))
57 }
58 Rule::Date => Ok(Self::Date),
59 Rule::DateTime => {
60 let timezone = date_time::get_timezone(pair.into_inner())?;
61
62 Ok(Self::DateTime(timezone))
63 }
64 Rule::IPv4 => Ok(Self::Ipv4),
65 Rule::IPv6 => Ok(Self::Ipv6),
66 Rule::Nullable => {
70 let data_type = nullable::get_type_name(pair.into_inner())?;
71
72 Ok(Self::Nullable(data_type))
73 }
74 _ => Err(ParseError::Unknown),
75 }
76 }
77}
78
79pub(crate) fn get_data_type(
80 mut low_cardinality_pairs: Pairs<'_, Rule>,
81) -> Result<LowCardinalityDataType, ParseError> {
82 let low_cardinality_pair = low_cardinality_pairs.next().ok_or(ParseError::Unknown)?;
83
84 let mut data_type_pairs = low_cardinality_pair.into_inner();
85 let data_type_pair = data_type_pairs.next().ok_or(ParseError::Unknown)?;
86
87 let data_type = LowCardinalityDataType::try_from(data_type_pair)?;
88
89 Ok(data_type)
90}