(&mut self)
| 378 | // ── ALTER ARRAY ──────────────────────────────────────────── |
| 379 | |
| 380 | pub(super) fn parse_alter(&mut self) -> Result<AlterArrayAst> { |
| 381 | let name = self.expect_ident()?; |
| 382 | self.expect_kw("SET")?; |
| 383 | self.expect(&Tok::LParen)?; |
| 384 | let mut set = Vec::new(); |
| 385 | loop { |
| 386 | let key = self.expect_ident()?; |
| 387 | self.expect(&Tok::Eq)?; |
| 388 | let value = match self.peek() { |
| 389 | Some(Tok::Null) => { |
| 390 | self.i += 1; |
| 391 | None |
| 392 | } |
| 393 | Some(Tok::Int(_)) => { |
| 394 | let n = self.expect_int()?; |
| 395 | Some(n) |
| 396 | } |
| 397 | other => { |
| 398 | return Err(self.err(format!( |
| 399 | "SET {key}: expected integer or NULL, got {other:?}" |
| 400 | ))); |
| 401 | } |
| 402 | }; |
| 403 | let key_lower = key.to_ascii_lowercase(); |
| 404 | match key_lower.as_str() { |
| 405 | "audit_retain_ms" => { |
| 406 | if let Some(n) = value |
| 407 | && n < 0 |
| 408 | { |
| 409 | return Err( |
| 410 | self.err(format!("SET audit_retain_ms = {n}: must be >= 0 or NULL")) |
| 411 | ); |
| 412 | } |
| 413 | } |
| 414 | "minimum_audit_retain_ms" => match value { |
| 415 | Some(n) if n < 0 => { |
| 416 | return Err( |
| 417 | self.err(format!("SET minimum_audit_retain_ms = {n}: must be >= 0")) |
| 418 | ); |
| 419 | } |
| 420 | None => { |
| 421 | return Err(self.err( |
| 422 | "SET minimum_audit_retain_ms = NULL: floor cannot be NULL".to_string(), |
| 423 | )); |
| 424 | } |
| 425 | _ => {} |
| 426 | }, |
| 427 | other => { |
| 428 | return Err(self.err(format!( |
| 429 | "SET: unknown key `{other}`; expected `audit_retain_ms` \ |
| 430 | or `minimum_audit_retain_ms`" |
| 431 | ))); |
| 432 | } |
| 433 | } |
| 434 | set.push((key_lower, value)); |
| 435 | if !self.match_token(&Tok::Comma) { |
| 436 | break; |
| 437 | } |
no test coverage detected