gluesql_core/
parse_sql.rs1use {
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>);