Accept &str in Parse::parse_sql (#182)

It is more generic to accept a `&str` than a `String` in an API,
and avoids having to convert a string to a `String` when not
needed, avoiding a copy.
This commit is contained in:
Daniël Heres 2020-06-03 22:31:41 +02:00 committed by GitHub
parent b4699bd4a7
commit d32df527e6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 8 additions and 8 deletions

View file

@ -29,7 +29,7 @@ let sql = "SELECT a, b, 123, myfunc(b) \
let dialect = GenericDialect {}; // or AnsiDialect, or your own dialect ... let dialect = GenericDialect {}; // or AnsiDialect, or your own dialect ...
let ast = Parser::parse_sql(&dialect, sql.to_string()).unwrap(); let ast = Parser::parse_sql(&dialect, sql).unwrap();
println!("AST: {:?}", ast); println!("AST: {:?}", ast);
``` ```
@ -122,4 +122,4 @@ resources.
[LocustDB]: https://github.com/cswinter/LocustDB [LocustDB]: https://github.com/cswinter/LocustDB
[Pratt Parser]: https://tdop.github.io/ [Pratt Parser]: https://tdop.github.io/
[sql-2016-grammar]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html [sql-2016-grammar]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html
[sql-standard]: https://en.wikipedia.org/wiki/ISO/IEC_9075 [sql-standard]: https://en.wikipedia.org/wiki/ISO/IEC_9075

View file

@ -45,7 +45,7 @@ fn main() {
chars.next(); chars.next();
chars.as_str() chars.as_str()
}; };
let parse_result = Parser::parse_sql(&*dialect, without_bom.to_owned()); let parse_result = Parser::parse_sql(&*dialect, without_bom);
match parse_result { match parse_result {
Ok(statements) => { Ok(statements) => {
println!( println!(

View file

@ -23,7 +23,7 @@ fn main() {
let dialect = GenericDialect {}; let dialect = GenericDialect {};
let ast = Parser::parse_sql(&dialect, sql.to_string()).unwrap(); let ast = Parser::parse_sql(&dialect, sql).unwrap();
println!("AST: {:?}", ast); println!("AST: {:?}", ast);
} }

View file

@ -28,7 +28,7 @@
//! WHERE a > b AND b < 100 \ //! WHERE a > b AND b < 100 \
//! ORDER BY a DESC, b"; //! ORDER BY a DESC, b";
//! //!
//! let ast = Parser::parse_sql(&dialect, sql.to_string()).unwrap(); //! let ast = Parser::parse_sql(&dialect, sql).unwrap();
//! //!
//! println!("AST: {:?}", ast); //! println!("AST: {:?}", ast);
//! ``` //! ```

View file

@ -82,7 +82,7 @@ impl Parser {
} }
/// Parse a SQL statement and produce an Abstract Syntax Tree (AST) /// Parse a SQL statement and produce an Abstract Syntax Tree (AST)
pub fn parse_sql(dialect: &dyn Dialect, sql: String) -> Result<Vec<Statement>, ParserError> { pub fn parse_sql(dialect: &dyn Dialect, sql: &str) -> Result<Vec<Statement>, ParserError> {
let mut tokenizer = Tokenizer::new(dialect, &sql); let mut tokenizer = Tokenizer::new(dialect, &sql);
let tokens = tokenizer.tokenize()?; let tokens = tokenizer.tokenize()?;
let mut parser = Parser::new(tokens); let mut parser = Parser::new(tokens);

View file

@ -58,9 +58,9 @@ impl TestedDialects {
} }
pub fn parse_sql_statements(&self, sql: &str) -> Result<Vec<Statement>, ParserError> { pub fn parse_sql_statements(&self, sql: &str) -> Result<Vec<Statement>, ParserError> {
self.one_of_identical_results(|dialect| Parser::parse_sql(dialect, sql.to_string())) self.one_of_identical_results(|dialect| Parser::parse_sql(dialect, &sql))
// To fail the `ensure_multiple_dialects_are_tested` test: // To fail the `ensure_multiple_dialects_are_tested` test:
// Parser::parse_sql(&**self.dialects.first().unwrap(), sql.to_string()) // Parser::parse_sql(&**self.dialects.first().unwrap(), sql)
} }
/// Ensures that `sql` parses as a single statement, optionally checking /// Ensures that `sql` parses as a single statement, optionally checking