queryer_sql_polars/
dialect.rs

1use sqlparser::dialect::Dialect;
2
3#[derive(Debug, Default)]
4pub struct TyrDialect;
5
6// 创建自己的 sql 方言。TyrDialect 支持 identifier 可以是简单的 url
7impl Dialect for TyrDialect {
8    fn is_identifier_start(&self, ch: char) -> bool {
9        ('a'..='z').contains(&ch) || ('A'..='Z').contains(&ch) || ch == '_'
10    }
11
12    // identifier 可以有 ':', '/', '?', '&', '='
13    fn is_identifier_part(&self, ch: char) -> bool {
14        ('a'..='z').contains(&ch)
15            || ('A'..='Z').contains(&ch)
16            || ('0'..='9').contains(&ch)
17            || [':', '/', '?', '&', '=', '-', '_', '.'].contains(&ch)
18    }
19}
20
21/// 测试辅助函数
22#[allow(dead_code)]
23fn example_sql() -> String {
24    let url = "https://raw.githubusercontent.com/owid/covid-19-data/master/public/data/latest/owid-covid-latest.csv";
25
26    let sql = format!(
27        "SELECT location name, total_cases, new_cases, total_deaths, new_deaths \
28        FROM {} where new_deaths >= 500 ORDER BY new_cases DESC LIMIT 6 OFFSET 5",
29        url
30    );
31
32    sql
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38    use sqlparser::parser::Parser;
39
40    #[test]
41    fn it_works() {
42        assert!(Parser::parse_sql(&TyrDialect::default(), &example_sql()).is_ok());
43    }
44}