Dual-licensed under MIT
or the UNLICENSE.
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, }
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); ```