Skip to content

Commit 047d7fb

Browse files
Alex Sarapulov0x501D
authored andcommitted
feat: support parsing with prepared tokens
1 parent df5b5dc commit 047d7fb

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ rand = "0.8"
137137
regex = "1.8"
138138
rstest = "0.22.0"
139139
serde_json = "1"
140-
sqlparser = { version = "0.50.0", features = ["visitor"] }
140+
sqlparser = { git = "https://github.com/tarantool/datafusion-sqlparser-rs.git", features = ["visitor"], branch = "release-0.50.0" }
141141
tempfile = "3"
142142
thiserror = "1.0.44"
143143
tokio = { version = "1.36", features = ["macros", "rt", "sync"] }

datafusion/sql/src/parser.rs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -279,12 +279,17 @@ impl<'a> DFParser<'a> {
279279
sql: &str,
280280
dialect: &'a dyn Dialect,
281281
) -> Result<Self, ParserError> {
282-
let mut tokenizer = Tokenizer::new(dialect, sql);
283-
let tokens = tokenizer.tokenize()?;
282+
let tokens = Tokenizer::new(dialect, sql).into_tokens().collect::<Result<_, _>>()?;
283+
Ok(Self::from_dialect_and_tokens(dialect, tokens))
284+
}
284285

285-
Ok(DFParser {
286-
parser: Parser::new(dialect).with_tokens(tokens),
287-
})
286+
/// Create a new parser from specified dialect and tokens.
287+
pub fn from_dialect_and_tokens(
288+
dialect: &'a dyn Dialect,
289+
tokens: Vec<Token>,
290+
) -> Self {
291+
let parser = Parser::new(dialect).with_tokens(tokens);
292+
DFParser { parser }
288293
}
289294

290295
/// Parse a sql string into one or [`Statement`]s using the
@@ -300,7 +305,18 @@ impl<'a> DFParser<'a> {
300305
sql: &str,
301306
dialect: &dyn Dialect,
302307
) -> Result<VecDeque<Statement>, ParserError> {
303-
let mut parser = DFParser::new_with_dialect(sql, dialect)?;
308+
let tokenizer = Tokenizer::new(dialect, sql);
309+
let tokens = tokenizer.into_tokens().collect::<Result<_, _>>()?;
310+
Self::parse_tokens_with_dialect(tokens, dialect)
311+
}
312+
313+
/// Parse SQL tokens and produce one or more [`Statement`]s with
314+
/// the specified dialect.
315+
pub fn parse_tokens_with_dialect(
316+
tokens: Vec<Token>,
317+
dialect: &dyn Dialect,
318+
) -> Result<VecDeque<Statement>, ParserError> {
319+
let mut parser = DFParser::from_dialect_and_tokens(dialect, tokens);
304320
let mut stmts = VecDeque::new();
305321
let mut expecting_statement_delimiter = false;
306322
loop {

0 commit comments

Comments
 (0)