clickhouse_data_type/
low_cardinality.rs

1use 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// https://clickhouse.tech/docs/en/sql-reference/data-types/lowcardinality/
13#[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    //
32    //
33    //
34    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            //
67            //
68            //
69            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}