gluesql_core/
parse_sql.rs

1use {
2    crate::result::{Error, Result},
3    sqlparser::{
4        ast::{
5            Assignment as SqlAssignment, ColumnDef as SqlColumnDef, DataType as SqlDataType,
6            Expr as SqlExpr, Ident as SqlIdent, OrderByExpr as SqlOrderByExpr, Query as SqlQuery,
7            SelectItem as SqlSelectItem, Statement as SqlStatement,
8        },
9        dialect::PostgreSqlDialect,
10        parser::Parser,
11        tokenizer::Tokenizer,
12    },
13};
14
15const DIALECT: PostgreSqlDialect = PostgreSqlDialect {};
16
17pub fn parse<Sql: AsRef<str>>(sql: Sql) -> Result<Vec<SqlStatement>> {
18    Parser::parse_sql(&DIALECT, sql.as_ref()).map_err(|e| Error::Parser(format!("{e:#?}")))
19}
20
21macro_rules! generate_parse_fn {
22    ($fn_name: ident, $output_type: ty) => {
23        pub fn $fn_name<Sql: AsRef<str>>(sql_expr: Sql) -> Result<$output_type> {
24            let tokens = Tokenizer::new(&DIALECT, sql_expr.as_ref())
25                .tokenize()
26                .map_err(|e| Error::Parser(format!("{:#?}", e)))?;
27
28            Parser::new(&DIALECT)
29                .with_tokens(tokens)
30                .$fn_name()
31                .map_err(|e| Error::Parser(format!("{:#?}", e)))
32        }
33    };
34    ($fn_name: ident, $parse_fn_name: ident, $parse_fn_arg: ident, $output_type: ty) => {
35        pub fn $fn_name<Sql: AsRef<str>>(sql_expr: Sql) -> Result<$output_type> {
36            let tokens = Tokenizer::new(&DIALECT, sql_expr.as_ref())
37                .tokenize()
38                .map_err(|e| Error::Parser(format!("{:#?}", e)))?;
39
40            Parser::new(&DIALECT)
41                .with_tokens(tokens)
42                .$parse_fn_name(Parser::$parse_fn_arg)
43                .map_err(|e| Error::Parser(format!("{:#?}", e)))
44        }
45    };
46}
47
48generate_parse_fn!(parse_query, Box<SqlQuery>);
49generate_parse_fn!(parse_expr, SqlExpr);
50generate_parse_fn!(
51    parse_comma_separated_exprs,
52    parse_comma_separated,
53    parse_expr,
54    Vec<SqlExpr>
55);
56generate_parse_fn!(parse_select_item, SqlSelectItem);
57generate_parse_fn!(
58    parse_select_items,
59    parse_comma_separated,
60    parse_select_item,
61    Vec<SqlSelectItem>
62);
63generate_parse_fn!(parse_interval, SqlExpr);
64generate_parse_fn!(parse_order_by_expr, SqlOrderByExpr);
65generate_parse_fn!(
66    parse_order_by_exprs,
67    parse_comma_separated,
68    parse_order_by_expr,
69    Vec<SqlOrderByExpr>
70);
71generate_parse_fn!(parse_column_def, SqlColumnDef);
72generate_parse_fn!(parse_data_type, SqlDataType);
73generate_parse_fn!(parse_assignment, SqlAssignment);
74generate_parse_fn!(parse_identifiers, Vec<SqlIdent>);