mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-22 15:04:04 +00:00
Add Postgres-specific PREPARE, EXECUTE and DEALLOCATE (#243)
Adds top-statements PREPARE, EXECUTE and DEALLOCATE for Postgres-specific feature prepared statement.
This commit is contained in:
parent
d2e4340a32
commit
8020b2e5f0
3 changed files with 212 additions and 2 deletions
|
@ -149,6 +149,11 @@ impl Parser {
|
|||
Keyword::COMMIT => Ok(self.parse_commit()?),
|
||||
Keyword::ROLLBACK => Ok(self.parse_rollback()?),
|
||||
Keyword::ASSERT => Ok(self.parse_assert()?),
|
||||
// `PREPARE`, `EXECUTE` and `DEALLOCATE` are Postgres-specific
|
||||
// syntaxes. They are used for Postgres prepared statement.
|
||||
Keyword::DEALLOCATE => Ok(self.parse_deallocate()?),
|
||||
Keyword::EXECUTE => Ok(self.parse_execute()?),
|
||||
Keyword::PREPARE => Ok(self.parse_prepare()?),
|
||||
_ => self.expected("an SQL statement", Token::Word(w)),
|
||||
},
|
||||
Token::LParen => {
|
||||
|
@ -2398,6 +2403,42 @@ impl Parser {
|
|||
Ok(false)
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_deallocate(&mut self) -> Result<Statement, ParserError> {
|
||||
let prepare = self.parse_keyword(Keyword::PREPARE);
|
||||
let name = self.parse_identifier()?;
|
||||
Ok(Statement::Deallocate { name, prepare })
|
||||
}
|
||||
|
||||
fn parse_execute(&mut self) -> Result<Statement, ParserError> {
|
||||
let name = self.parse_identifier()?;
|
||||
|
||||
let mut parameters = vec![];
|
||||
if self.consume_token(&Token::LParen) {
|
||||
parameters = self.parse_comma_separated(Parser::parse_expr)?;
|
||||
self.expect_token(&Token::RParen)?;
|
||||
}
|
||||
|
||||
Ok(Statement::Execute { name, parameters })
|
||||
}
|
||||
|
||||
fn parse_prepare(&mut self) -> Result<Statement, ParserError> {
|
||||
let name = self.parse_identifier()?;
|
||||
|
||||
let mut data_types = vec![];
|
||||
if self.consume_token(&Token::LParen) {
|
||||
data_types = self.parse_comma_separated(Parser::parse_data_type)?;
|
||||
self.expect_token(&Token::RParen)?;
|
||||
}
|
||||
|
||||
self.expect_keyword(Keyword::AS)?;
|
||||
let statement = Box::new(self.parse_statement()?);
|
||||
Ok(Statement::Prepare {
|
||||
name,
|
||||
data_types,
|
||||
statement,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl Word {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue