`FOR var IN [REVERSE] start..end LOOP ... END LOOP;`
(tokens: &[Token], pos: &mut usize)
| 174 | |
| 175 | /// `FOR var IN [REVERSE] start..end LOOP ... END LOOP;` |
| 176 | fn parse_for(tokens: &[Token], pos: &mut usize) -> Result<Statement, ProceduralError> { |
| 177 | *pos += 1; |
| 178 | let var = expect_ident(tokens, pos)?; |
| 179 | expect_token(tokens, pos, &Token::In)?; |
| 180 | let reverse = if matches!(tokens.get(*pos), Some(Token::Reverse)) { |
| 181 | *pos += 1; |
| 182 | true |
| 183 | } else { |
| 184 | false |
| 185 | }; |
| 186 | let start = collect_sql_until(tokens, pos, &[Token::DotDot])?; |
| 187 | expect_token(tokens, pos, &Token::DotDot)?; |
| 188 | let end = collect_sql_until(tokens, pos, &[Token::Loop])?; |
| 189 | expect_token(tokens, pos, &Token::Loop)?; |
| 190 | let body = super::parse_statements(tokens, pos)?; |
| 191 | expect_token(tokens, pos, &Token::EndLoop)?; |
| 192 | skip_if(tokens, pos, &Token::Semicolon); |
| 193 | Ok(Statement::For { |
| 194 | var, |
| 195 | start, |
| 196 | end, |
| 197 | reverse, |
| 198 | body, |
| 199 | }) |
| 200 | } |
| 201 | |
| 202 | /// `LOOP ... END LOOP;` |
| 203 | fn parse_loop(tokens: &[Token], pos: &mut usize) -> Result<Statement, ProceduralError> { |
no test coverage detected