sql-script-parser iterates over SQL statements in SQL script

Legal

Dual-licensed under MIT or the UNLICENSE.

Features

Usage

Add dependency to Cargo.toml:

toml [dependencies] sql-script-parser = "0.1"

Parse SQL:

```rust use sqlscriptparser::sqlscriptparser;

let sql = include_bytes!("../tests/demo.sql");

let mut parser = sqlscriptparser(sql).map(|x| x.statement);

asserteq!(parser.next(), Some(&b"select 1;\n"[..])); asserteq!(parser.next(), Some(&b"select 2"[..])); assert_eq!(parser.next(), None); ```

Advanced - use custom tokenizer:

```rust use sqlscriptparser::*;

struct DmlDdlSqlScriptTokenizer;

struct SqlStatement<'a> { sql_script: SqlScript<'a>, kind: SqlStatementKind, }

[derive(Debug, PartialEq)]

enum SqlStatementKind { Ddl, Dml, }

impl<'a> SqlScriptTokenizer<'a, SqlStatement<'a>> for DmlDdlSqlScriptTokenizer { fn apply(&self, sqlscript: SqlScript<'a>, tokens: &[SqlToken]) -> SqlStatement<'a> { let mut tokensgeneral = tokens.iter().filter(|x| { [ SqlTokenKind::Word, SqlTokenKind::Symbol, SqlTokenKind::String, ] .contains(&x.kind) }); let kind = if let Some(firstkeyword) = tokensgeneral.next() { if firstkeyword.kind == SqlTokenKind::Word { let token = std::str::fromutf8(firstkeyword.extract(&sqlscript)) .unwrap() .tolowercase(); match token.asstr() { "alter" | "create" | "drop" => SqlStatementKind::Ddl, _ => SqlStatementKind::Dml, } } else { SqlStatementKind::Dml } } else { SqlStatementKind::Dml }; SqlStatement { sql_script, kind } } }

let sql = include_bytes!("../tests/custom.sql");

let mut parser = SqlScriptParser::new(DmlDdlSqlScriptTokenizer {}, sql).map(|x| x.kind);

asserteq!(parser.next(), Some(SqlStatementKind::Dml)); asserteq!(parser.next(), Some(SqlStatementKind::Ddl)); asserteq!(parser.next(), Some(SqlStatementKind::Dml)); asserteq!(parser.next(), Some(SqlStatementKind::Ddl)); assert_eq!(parser.next(), None); ```