#sql-parser #statement #mysql #nom #definition

sqlparser-mysql

基于nom的MySQL SQL解析器

2个版本

使用旧的Rust 2015

0.1.0 2024年3月17日
0.0.2 2024年4月16日
0.0.1 2024年4月15日

数据库接口 中排名第254

Download history 3/week @ 2024-04-26 2/week @ 2024-07-05

每月下载量133

Apache-2.0 OR MIT

435KB
11K SLoC

sqlparser-mysql Rust 覆盖率状态

基于nom的MySQL SQL解析器。用Rust编写。

项目状态

请注意,此仓库目前正在积极开发中。因此,它可能会在没有预先通知的情况下发生潜在的破坏性更改。我们正在努力改进项目并使其更加健壮。然而,在此阶段,我们可能会对代码库、功能和功能进行重大修改。

我们鼓励用户和贡献者在使用、分支或为此项目做出贡献时牢记这一点。我们对您的理解和耐心表示衷心的感谢,因为我们继续使此项目不断进化。

请关注更新,欢迎联系或为开发过程做出贡献!

免责声明

此项目处于预发布状态。它可能包含不完整的功能、错误和意外的行为。请自行承担风险使用。

快速入门

示例解析SQL

use sqlparser_mysql::parser::Parser;
use sqlparser_mysql::parser::ParseConfig;

let config = ParseConfig::default();
let sql = "SELECT a, b, 123, myfunc(b) \
            FROM table_1 \
            WHERE a > b AND b < 100 \
            ORDER BY a DESC, b";
// parse to a Statement
let ast = Parser::parse(&config, sql).unwrap();

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

输出应为

AST: Select(
    SelectStatement {
        tables: [
            Table {
                name: "table_1",
                alias: None,
                schema: None,
            },
        ],
        distinct: false,
        fields: [
            Col(
                Column {
                    name: "a",
                    alias: None,
                    table: None,
                    function: None,
                },
            ),
            Col(
                Column {
                    name: "b",
                    alias: None,
                    table: None,
                    function: None,
                },
            ),
            Value(
                Literal(
                    LiteralExpression {
                        value: Integer(
                            123,
                        ),
                        alias: None,
                    },
                ),
            ),
            Col(
                Column {
                    name: "myfunc(b)",
                    alias: None,
                    table: None,
                    function: Some(
                        Generic(
                            "myfunc",
                            FunctionArguments {
                                arguments: [
                                    Column(
                                        Column {
                                            name: "b",
                                            alias: None,
                                            table: None,
                                            function: None,
                                        },
                                    ),
                                ],
                            },
                        ),
                    ),
                },
            ),
        ],
        join: [],
        where_clause: Some(
            LogicalOp(
                ConditionTree {
                    operator: And,
                    left: ComparisonOp(
                        ConditionTree {
                            operator: Greater,
                            left: Base(
                                Field(
                                    Column {
                                        name: "a",
                                        alias: None,
                                        table: None,
                                        function: None,
                                    },
                                ),
                            ),
                            right: Base(
                                Field(
                                    Column {
                                        name: "b",
                                        alias: None,
                                        table: None,
                                        function: None,
                                    },
                                ),
                            ),
                        },
                    ),
                    right: ComparisonOp(
                        ConditionTree {
                            operator: Less,
                            left: Base(
                                Field(
                                    Column {
                                        name: "b",
                                        alias: None,
                                        table: None,
                                        function: None,
                                    },
                                ),
                            ),
                            right: Base(
                                Literal(
                                    Integer(
                                        100,
                                    ),
                                ),
                            ),
                        },
                    ),
                },
            ),
        ),
        group_by: None,
        order: Some(
            OrderClause {
                columns: [
                    (
                        Column {
                            name: "a",
                            alias: None,
                            table: None,
                            function: None,
                        },
                        Desc,
                    ),
                    (
                        Column {
                            name: "b",
                            alias: None,
                            table: None,
                            function: None,
                        },
                        Asc,
                    ),
                ],
            },
        ),
        limit: None,
    },
)

从AST创建SQL文本

use sqlparser_mysql::parser::Parser;
use sqlparser_mysql::parser::ParseConfig;

let sql = "SELECT a FROM table_1";
let config = ParseConfig::default();

// parse to a Statement
let ast = Parser::parse(&config, sql).unwrap();

// The original SQL text can be generated from the AST
assert_eq!(ast.to_string(), sql);

支持语句

数据定义语句

MySQL文档

  • 原子数据定义语句支持
  • ALTER DATABASE语句
  • ALTER EVENT语句
  • ALTER FUNCTION语句
  • ALTER INSTANCE语句
  • ALTER LOGFILE GROUP语句
  • ALTER PROCEDURE语句
  • ALTER SERVER语句
  • ALTER TABLE语句
  • ALTER TABLESPACE语句
  • ALTER VIEW语句
  • CREATE DATABASE语句
  • CREATE EVENT语句
  • CREATE FUNCTION语句
  • CREATE INDEX语句
  • CREATE LOGFILE GROUP语句
  • CREATE PROCEDURE和CREATE FUNCTION语句
  • CREATE SERVER语句
  • CREATE SPATIAL REFERENCE SYSTEM语句
  • CREATE TABLE语句
  • CREATE TABLESPACE语句
  • CREATE TRIGGER语句
  • CREATE VIEW语句
  • DROP DATABASE语句
  • DROP EVENT语句
  • DROP FUNCTION语句 --> "DROP PROCEDURE和DROP FUNCTION语句" && "可加载函数的DROP FUNCTION语句"
  • DROP INDEX语句
  • DROP LOGFILE GROUP语句
  • DROP PROCEDURE和DROP FUNCTION语句
  • DROP SERVER语句
  • DROP SPATIAL REFERENCE SYSTEM语句
  • 删除表语句
  • 删除表空间语句
  • 删除触发器语句
  • 删除视图语句
  • 重命名表语句
  • 截断表语句

数据库管理语句

  • SET语句

依赖

~1.2–2MB
~43K SLoC