文章

RisingLight 源码分析-2

在上一节中,我们探讨了 RisingLight 如何利用 sqlparser 实现 SQL 解析功能。现在,为了更好地组织代码,我们将此功能封装为一个独立的子模块,并将其命名为 parser。此命名旨在明确其作为数据库执行 SQL 语句首个阶段(解析)的核心作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Copyright 2024 RisingLight Project Authors. Licensed under Apache-2.0.

//! The parser module directly uses the [`sqlparser`] crate
//! and re-exports its AST types.

pub use sqlparser::ast::*;
use sqlparser::dialect::PostgreSqlDialect;
use sqlparser::parser::Parser;
pub use sqlparser::parser::ParserError;

/// Parse the SQL string into a list of ASTs.
pub fn parse(sql: &str) -> Result<Vec<Statement>, ParserError> {
    let dialect = PostgreSqlDialect {};
    Parser::parse_sql(&dialect, sql)
}

从上述代码可以看出,parse 函数直接封装了 sqlparser 提供的 SQL 解析功能。同时,为了便于其他模块使用,我们通过 pub use 语句重新导出了 sqlparser 中的抽象语法树(AST)相关类型和 ParserError 类型。接下来,我们将深入探讨数据库中的“类型”概念,它作为数据库的基础要素,决定了可存储数据的种类及其可执行的操作。

这里我们将 main.rs 中的代码修改位使用 parser 模块中的内容,这里还使用了 anyhow 来进行错误处理:

1
2
3
4
5
6
7
8
9
10
11
mod parser;
use crate::parser::parse;
use anyhow::Result;

fn main() -> Result<()> {
    let sql = "SELECT * from test_table";
    let ast = parse(sql)?;
    println!("{:?}", ast);
    Ok(())
}

本文由作者按照 CC BY 4.0 进行授权