Parse a `DECLARE` statement, assuming that the `DECLARE` token has already been consumed.
(&mut self)
| 9301 | /// Parse a `DECLARE` statement, assuming that the `DECLARE` token |
| 9302 | /// has already been consumed. |
| 9303 | fn parse_declare(&mut self) -> Result<Statement<Raw>, ParserStatementError> { |
| 9304 | let name = self |
| 9305 | .parse_identifier() |
| 9306 | .map_parser_err(StatementKind::Declare)?; |
| 9307 | self.expect_keyword(CURSOR) |
| 9308 | .map_parser_err(StatementKind::Declare)?; |
| 9309 | if self.parse_keyword(WITH) { |
| 9310 | let err = parser_err!( |
| 9311 | self, |
| 9312 | self.peek_prev_pos(), |
| 9313 | format!("WITH HOLD is unsupported for cursors") |
| 9314 | ) |
| 9315 | .map_parser_err(StatementKind::Declare); |
| 9316 | self.expect_keyword(HOLD) |
| 9317 | .map_parser_err(StatementKind::Declare)?; |
| 9318 | return err; |
| 9319 | } |
| 9320 | // WITHOUT HOLD is optional and the default behavior so we can ignore it. |
| 9321 | let _ = self.parse_keywords(&[WITHOUT, HOLD]); |
| 9322 | self.expect_keyword(FOR) |
| 9323 | .map_parser_err(StatementKind::Declare)?; |
| 9324 | let StatementParseResult { ast, sql } = self.parse_statement()?; |
| 9325 | Ok(Statement::Declare(DeclareStatement { |
| 9326 | name, |
| 9327 | stmt: Box::new(ast), |
| 9328 | sql: sql.to_string(), |
| 9329 | })) |
| 9330 | } |
| 9331 | |
| 9332 | /// Parse a `CLOSE` statement, assuming that the `CLOSE` token |
| 9333 | /// has already been consumed. |
no test coverage detected