27 个版本 (破坏性更新)

0.20.0 2024年6月13日
0.18.0 2024年4月5日
0.17.0 2024年3月27日
0.16.0 2023年10月2日
0.4.0 2022年3月30日

#163数据库接口

Download history 116/week @ 2024-04-22 122/week @ 2024-04-29 62/week @ 2024-05-06 113/week @ 2024-05-13 109/week @ 2024-05-20 109/week @ 2024-05-27 138/week @ 2024-06-03 323/week @ 2024-06-10 106/week @ 2024-06-17 128/week @ 2024-06-24 3/week @ 2024-07-01 5/week @ 2024-07-08 22/week @ 2024-07-15 230/week @ 2024-07-29 14/week @ 2024-08-05

每月267次 下载
4 个 Crates 中使用 (2 个直接使用)

Apache-2.0 许可

330KB
9K SLoC

sql-parse

crates.io crates.io License actions-badge

将 SQL 解析成 AST

此 crate 提供了一个词法分析和解析器,可以将 SQL 解析成抽象语法树 (AST)。目前主要关注 MariaDB/Mysql。

示例代码

use sql_parse::{SQLDialect, SQLArguments, ParseOptions, parse_statement};

let options = ParseOptions::new()
    .dialect(SQLDialect::MariaDB)
    .arguments(SQLArguments::QuestionMark)
    .warn_unquoted_identifiers(true);

let mut issues = Vec::new();

let sql = "SELECT `monkey`,
           FROM `t1` LEFT JOIN `t2` ON `t2`.`id` = `t1.two`
           WHERE `t1`.`id` = ?";

let ast = parse_statement(sql, &mut issues, &options);

println!("Issues: {:#?}", issues);
println!("AST: {:#?}", ast);

功能

  • 良好的错误恢复:解析器实现了合理的错误恢复,如果内部发现错误,将继续解析长表达式。
  • 代码范围注释:所有 AST 节点都实现了 Spanned,从而在代码中生成字节数据范围。这意味着可以从解析中生成错误和警告,并以美观的方式呈现给用户。此外,AST 的用户还可以生成更多类似的问题,并以相同的方式美观地呈现。
  • 无依赖:我们使用 no-std 和 alloc,没有其他依赖。
  • 无 unsafe 代码:我们使用 #![forbid(unsafe_code)] 来保证没有 unsafe 代码。
  • 快速解析:解析器是一个手写的递归下降解析器。为了加快解析速度,解析表达式使用 O(1) 移位归约机制。

无运行时依赖