diff --git a/src/sqlparser.rs b/src/sqlparser.rs index 4694a094..4736f31a 100644 --- a/src/sqlparser.rs +++ b/src/sqlparser.rs @@ -109,7 +109,7 @@ impl Parser { match self.next_token() { Some(t) => match t { Token::SQLWord(ref w) if w.keyword != "" => match w.keyword.as_ref() { - "SELECT" | "WITH" => { + "SELECT" | "WITH" | "VALUES" => { self.prev_token(); Ok(SQLStatement::SQLQuery(Box::new(self.parse_query()?))) } @@ -133,6 +133,10 @@ impl Parser { w.to_string() )), }, + Token::LParen => { + self.prev_token(); + Ok(SQLStatement::SQLQuery(Box::new(self.parse_query()?))) + } unexpected => self.expected( "a keyword at the beginning of a statement", Some(unexpected), diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 4318f4dc..6da8ee3e 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -181,6 +181,14 @@ fn parse_where_delete_statement() { } } +#[test] +fn parse_top_level() { + verified_stmt("SELECT 1"); + verified_stmt("(SELECT 1)"); + verified_stmt("((SELECT 1))"); + verified_stmt("VALUES (1)"); +} + #[test] fn parse_simple_select() { let sql = "SELECT id, fname, lname FROM customer WHERE id = 1 LIMIT 5";