polyglot_sql/dialects/
drill.rs1use super::{DialectImpl, DialectType};
16use crate::error::Result;
17use crate::expressions::{Expression, Function};
18use crate::generator::{GeneratorConfig, NormalizeFunctions};
19use crate::tokens::TokenizerConfig;
20
21pub struct DrillDialect;
23
24impl DialectImpl for DrillDialect {
25 fn dialect_type(&self) -> DialectType {
26 DialectType::Drill
27 }
28
29 fn tokenizer_config(&self) -> TokenizerConfig {
30 let mut config = TokenizerConfig::default();
31 config.identifiers.insert('`', '`');
33 config
34 }
35
36 fn generator_config(&self) -> GeneratorConfig {
37 use crate::generator::IdentifierQuoteStyle;
38 GeneratorConfig {
39 identifier_quote: '`',
40 identifier_quote_style: IdentifierQuoteStyle::BACKTICK,
41 dialect: Some(DialectType::Drill),
42 normalize_functions: NormalizeFunctions::None,
44 ..Default::default()
45 }
46 }
47
48 fn transform_expr(&self, expr: Expression) -> Result<Expression> {
49 match expr {
50 Expression::TryCast(c) => Ok(Expression::Cast(c)),
52
53 Expression::SafeCast(c) => Ok(Expression::Cast(c)),
55
56 Expression::CurrentTimestamp(_) => Ok(Expression::CurrentTimestamp(
58 crate::expressions::CurrentTimestamp { precision: None, sysdate: false },
59 )),
60
61 Expression::ILike(op) => {
64 Ok(Expression::ILike(op))
66 }
67
68 Expression::Power(op) => Ok(Expression::Function(Box::new(Function::new(
70 "POW".to_string(),
71 vec![op.this, op.expression],
72 )))),
73
74 Expression::ArrayContains(f) => Ok(Expression::Function(Box::new(Function::new(
76 "REPEATED_CONTAINS".to_string(),
77 vec![f.this, f.expression],
78 )))),
79
80 Expression::Function(f) => self.transform_function(*f),
82
83 _ => Ok(expr),
85 }
86 }
87}
88
89impl DrillDialect {
90 fn transform_function(&self, f: Function) -> Result<Expression> {
91 let name_upper = f.name.to_uppercase();
92 match name_upper.as_str() {
93 "CURRENT_TIMESTAMP" => Ok(Expression::CurrentTimestamp(
95 crate::expressions::CurrentTimestamp { precision: None, sysdate: false },
96 )),
97
98 "ARRAY_SIZE" | "ARRAY_LENGTH" | "CARDINALITY" | "SIZE" => {
100 Ok(Expression::Function(Box::new(Function::new(
101 "REPEATED_COUNT".to_string(),
102 f.args,
103 ))))
104 }
105
106 "ARRAY_CONTAINS" | "CONTAINS" => Ok(Expression::Function(Box::new(Function::new(
108 "REPEATED_CONTAINS".to_string(),
109 f.args,
110 )))),
111
112 "POWER" => Ok(Expression::Function(Box::new(Function::new(
114 "POW".to_string(),
115 f.args,
116 )))),
117
118 "LEVENSHTEIN" => Ok(Expression::Function(Box::new(Function::new(
120 "LEVENSHTEIN_DISTANCE".to_string(),
121 f.args,
122 )))),
123
124 "REGEXP_LIKE" | "RLIKE" => Ok(Expression::Function(Box::new(Function::new(
126 "REGEXP_MATCHES".to_string(),
127 f.args,
128 )))),
129
130 "TO_TIMESTAMP" => Ok(Expression::Function(Box::new(f))),
132
133 "TO_DATE" => Ok(Expression::Function(Box::new(f))),
135
136 "DATE_FORMAT" => Ok(Expression::Function(Box::new(Function::new(
138 "TO_CHAR".to_string(),
139 f.args,
140 )))),
141
142 "STRFTIME" => Ok(Expression::Function(Box::new(Function::new(
144 "TO_CHAR".to_string(),
145 f.args,
146 )))),
147
148 "UNIX_TIMESTAMP" => Ok(Expression::Function(Box::new(f))),
150
151 "FROM_UNIXTIME" => Ok(Expression::Function(Box::new(f))),
153
154 "DATE_ADD" => Ok(Expression::Function(Box::new(f))),
156
157 "DATE_SUB" => Ok(Expression::Function(Box::new(f))),
159
160 "STRPOS" => Ok(Expression::Function(Box::new(f))),
162
163 "POSITION" => Ok(Expression::Function(Box::new(Function::new(
165 "STRPOS".to_string(),
166 f.args,
167 )))),
168
169 _ => Ok(Expression::Function(Box::new(f))),
171 }
172 }
173}