Parse UPDATE statement to extract column assignments
(sql: &str)
| 530 | |
| 531 | /// Parse UPDATE statement to extract column assignments |
| 532 | fn parse_update_statement(sql: &str) -> Option<Vec<(String, String)>> { |
| 533 | // Simple regex-based parser for UPDATE statements |
| 534 | // This handles: UPDATE table SET col1 = val1, col2 = val2 |
| 535 | static UPDATE_REGEX: Lazy<Regex> = Lazy::new(|| { |
| 536 | Regex::new(r"(?i)UPDATE\s+\w+\s+SET\s+(.+?)(?:\s+WHERE|$)").unwrap() |
| 537 | }); |
| 538 | |
| 539 | let caps = UPDATE_REGEX.captures(sql)?; |
| 540 | let assignments_str = caps.get(1)?.as_str(); |
| 541 | |
| 542 | let mut result = Vec::new(); |
| 543 | |
| 544 | // Split by comma but handle values that might contain commas |
| 545 | let assignments = split_assignments(assignments_str); |
| 546 | |
| 547 | for assignment in assignments { |
| 548 | let parts: Vec<&str> = assignment.splitn(2, '=').collect(); |
| 549 | if parts.len() == 2 { |
| 550 | let col_name = parts[0].trim().to_string(); |
| 551 | let value_with_quotes = parts[1].trim().to_string(); |
| 552 | |
| 553 | // Skip validation for computed expressions or column references |
| 554 | if is_computed_expression(&value_with_quotes) { |
| 555 | continue; // Don't validate computed expressions |
| 556 | } |
| 557 | |
| 558 | // Only remove quotes after validation check |
| 559 | let value = value_with_quotes.trim_matches('\'').to_string(); |
| 560 | result.push((col_name, value)); |
| 561 | } |
| 562 | } |
| 563 | |
| 564 | Some(result) |
| 565 | } |
| 566 | |
| 567 | |
| 568 | /// Check if a value is a computed expression that shouldn't be validated |