use std::borrow::Cow;
use crate::Dialect;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NormalizationStrategy {
Lowercase,
Uppercase,
CaseInsensitive,
CaseSensitive,
}
impl NormalizationStrategy {
pub fn apply<'a>(&self, s: &'a str) -> Cow<'a, str> {
match self {
Self::CaseSensitive => Cow::Borrowed(s),
Self::Lowercase | Self::CaseInsensitive => {
if s.chars().any(|c| c.is_uppercase()) {
Cow::Owned(s.to_lowercase())
} else {
Cow::Borrowed(s)
}
}
Self::Uppercase => {
if s.chars().any(|c| c.is_lowercase()) {
Cow::Owned(s.to_uppercase())
} else {
Cow::Borrowed(s)
}
}
}
}
}
impl Dialect {
pub const fn normalization_strategy(&self) -> NormalizationStrategy {
match self {
Dialect::Bigquery => NormalizationStrategy::CaseInsensitive,
Dialect::Clickhouse => NormalizationStrategy::CaseSensitive,
Dialect::Databricks => NormalizationStrategy::CaseInsensitive,
Dialect::Duckdb => NormalizationStrategy::CaseInsensitive,
Dialect::Hive => NormalizationStrategy::CaseInsensitive,
Dialect::Mssql => NormalizationStrategy::CaseInsensitive,
Dialect::Mysql => NormalizationStrategy::CaseSensitive,
Dialect::Oracle => NormalizationStrategy::Uppercase,
Dialect::Postgres => NormalizationStrategy::Lowercase,
Dialect::Redshift => NormalizationStrategy::CaseInsensitive,
Dialect::Snowflake => NormalizationStrategy::Uppercase,
Dialect::Sqlite => NormalizationStrategy::CaseInsensitive,
Dialect::Generic => NormalizationStrategy::CaseInsensitive,
Dialect::Ansi => NormalizationStrategy::Uppercase,
}
}
pub const fn has_custom_normalization(&self) -> bool {
matches!(self, Dialect::Bigquery)
}
pub fn pseudocolumns(&self) -> &'static [&'static str] {
match self {
Dialect::Bigquery => &[
"_FILE_NAME",
"_PARTITIONDATE",
"_PARTITIONTIME",
"_TABLE_SUFFIX",
],
Dialect::Oracle => &[
"LEVEL",
"OBJECT_ID",
"OBJECT_VALUE",
"ROWID",
"ROWNUM",
"SYSDATE",
"SYSTIMESTAMP",
],
Dialect::Snowflake => &["LEVEL"],
_ => &[],
}
}
pub fn pseudo_tables(&self) -> &'static [&'static str] {
match self {
Dialect::Oracle => &["DUAL"],
_ => &[],
}
}
pub fn identifier_quotes(&self) -> &'static [&'static str] {
match self {
Dialect::Bigquery => &["`"],
Dialect::Clickhouse => &["\"", "`"],
Dialect::Databricks => &["`"],
Dialect::Duckdb => &["\""],
Dialect::Hive => &["`"],
Dialect::Mssql => &["[", "\""],
Dialect::Mysql => &["`"],
Dialect::Oracle => &["\""],
Dialect::Postgres => &["\""],
Dialect::Redshift => &["\""],
Dialect::Snowflake => &["\""],
Dialect::Sqlite => &["\"", "[", "`"],
_ => &["\""],
}
}
}