Skip to content

Commit e78679a

Browse files
committed
fuzz test and refactor
fmt: cleanup
1 parent 6e45328 commit e78679a

File tree

2 files changed

+420
-112
lines changed

2 files changed

+420
-112
lines changed

core/translate/alter.rs

Lines changed: 34 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -2571,133 +2571,55 @@ pub fn walk_upsert_for_table_rename(
25712571
///
25722572
/// `old_table_norm`: Normalized (lowercase) name of the table being renamed.
25732573
/// `new_table_name`: New name for the table (will be double-quoted in output).
2574+
///
2575+
/// This function uses `walk_expr_mut` from `expr.rs` to traverse all expression
2576+
/// variants automatically, including WINDOW clauses and frame bounds. Only the
2577+
/// special cases (table-qualified names) are handled in the callback.
25742578
pub fn rewrite_expr_table_refs_for_rename(
25752579
expr: &mut Box<ast::Expr>,
25762580
old_table_norm: &str,
25772581
new_table_name: &str,
25782582
) -> bool {
25792583
let mut changed = false;
25802584

2581-
match expr.as_mut() {
2582-
ast::Expr::Qualified(ref mut tbl_name, _) => {
2583-
if normalize_ident(tbl_name.as_str()) == old_table_norm {
2584-
// Wrap new name in double quotes to handle special characters/keywords
2585-
*tbl_name = ast::Name::from_string(format!("\"{new_table_name}\""));
2586-
changed = true;
2587-
}
2588-
}
2589-
2590-
ast::Expr::DoublyQualified(_, ref mut tbl_name, _) => {
2591-
if normalize_ident(tbl_name.as_str()) == old_table_norm {
2592-
*tbl_name = ast::Name::from_string(format!("\"{new_table_name}\""));
2593-
changed = true;
2594-
}
2595-
}
2596-
ast::Expr::Between {
2597-
lhs, start, end, ..
2598-
} => {
2599-
changed |= rewrite_expr_table_refs_for_rename(lhs, old_table_norm, new_table_name);
2600-
changed |= rewrite_expr_table_refs_for_rename(start, old_table_norm, new_table_name);
2601-
changed |= rewrite_expr_table_refs_for_rename(end, old_table_norm, new_table_name);
2602-
}
2603-
ast::Expr::Binary(lhs, _, rhs) => {
2604-
changed |= rewrite_expr_table_refs_for_rename(lhs, old_table_norm, new_table_name);
2605-
changed |= rewrite_expr_table_refs_for_rename(rhs, old_table_norm, new_table_name);
2606-
}
2607-
ast::Expr::Case {
2608-
base,
2609-
when_then_pairs,
2610-
else_expr,
2611-
..
2612-
} => {
2613-
if let Some(b) = base {
2614-
changed |= rewrite_expr_table_refs_for_rename(b, old_table_norm, new_table_name);
2615-
}
2616-
for (when_expr, then_expr) in when_then_pairs {
2617-
changed |=
2618-
rewrite_expr_table_refs_for_rename(when_expr, old_table_norm, new_table_name);
2619-
changed |=
2620-
rewrite_expr_table_refs_for_rename(then_expr, old_table_norm, new_table_name);
2585+
// Use walk_expr_mut to traverse ALL expression types automatically.
2586+
// This handles WINDOW clauses, frame bounds, and all other nested expressions.
2587+
let _ = walk_expr_mut(expr, &mut |e: &mut ast::Expr| -> Result<WalkControl> {
2588+
match e {
2589+
// Handle table-qualified column references: tbl.col -> "new_tbl".col
2590+
ast::Expr::Qualified(ref mut tbl_name, _) => {
2591+
if normalize_ident(tbl_name.as_str()) == old_table_norm {
2592+
*tbl_name = ast::Name::from_string(format!("\"{new_table_name}\""));
2593+
changed = true;
2594+
}
26212595
}
2622-
if let Some(else_e) = else_expr {
2623-
changed |=
2624-
rewrite_expr_table_refs_for_rename(else_e, old_table_norm, new_table_name);
2596+
// Handle doubly-qualified references: db.tbl.col -> db."new_tbl".col
2597+
ast::Expr::DoublyQualified(_, ref mut tbl_name, _) => {
2598+
if normalize_ident(tbl_name.as_str()) == old_table_norm {
2599+
*tbl_name = ast::Name::from_string(format!("\"{new_table_name}\""));
2600+
changed = true;
2601+
}
26252602
}
2626-
}
2627-
ast::Expr::Cast { expr: inner, .. } => {
2628-
changed |= rewrite_expr_table_refs_for_rename(inner, old_table_norm, new_table_name);
2629-
}
2630-
ast::Expr::Collate(inner, _) => {
2631-
changed |= rewrite_expr_table_refs_for_rename(inner, old_table_norm, new_table_name);
2632-
}
2633-
ast::Expr::FunctionCall {
2634-
args, filter_over, ..
2635-
} => {
2636-
for arg in args {
2637-
changed |= rewrite_expr_table_refs_for_rename(arg, old_table_norm, new_table_name);
2603+
// Handle `x IN tbl` - the table reference is not a sub-expression
2604+
ast::Expr::InTable { rhs, .. } => {
2605+
if normalize_ident(rhs.name.as_str()) == old_table_norm {
2606+
rhs.name = ast::Name::from_string(format!("\"{new_table_name}\""));
2607+
changed = true;
2608+
}
26382609
}
2639-
if let Some(ref mut filter_expr) = filter_over.filter_clause {
2610+
// Handle subqueries - walk_expr_mut doesn't descend into SELECT statements
2611+
ast::Expr::InSelect { rhs, .. } => {
26402612
changed |=
2641-
rewrite_expr_table_refs_for_rename(filter_expr, old_table_norm, new_table_name);
2613+
rewrite_select_table_refs_for_rename(rhs, old_table_norm, new_table_name);
26422614
}
2643-
}
2644-
ast::Expr::FunctionCallStar { filter_over, .. } => {
2645-
if let Some(ref mut filter_expr) = filter_over.filter_clause {
2615+
ast::Expr::Subquery(select) | ast::Expr::Exists(select) => {
26462616
changed |=
2647-
rewrite_expr_table_refs_for_rename(filter_expr, old_table_norm, new_table_name);
2648-
}
2649-
}
2650-
ast::Expr::InList { lhs, rhs, .. } => {
2651-
changed |= rewrite_expr_table_refs_for_rename(lhs, old_table_norm, new_table_name);
2652-
for item in rhs {
2653-
changed |= rewrite_expr_table_refs_for_rename(item, old_table_norm, new_table_name);
2617+
rewrite_select_table_refs_for_rename(select, old_table_norm, new_table_name);
26542618
}
2619+
_ => {}
26552620
}
2656-
ast::Expr::InSelect { lhs, rhs, .. } => {
2657-
changed |= rewrite_expr_table_refs_for_rename(lhs, old_table_norm, new_table_name);
2658-
changed |= rewrite_select_table_refs_for_rename(rhs, old_table_norm, new_table_name);
2659-
}
2660-
ast::Expr::InTable { lhs, rhs, .. } => {
2661-
changed |= rewrite_expr_table_refs_for_rename(lhs, old_table_norm, new_table_name);
2662-
// `x IN tbl` - the table reference is not qualified, rewrite directly
2663-
if normalize_ident(rhs.name.as_str()) == old_table_norm {
2664-
rhs.name = ast::Name::from_string(format!("\"{new_table_name}\""));
2665-
changed = true;
2666-
}
2667-
}
2668-
ast::Expr::IsNull(inner) | ast::Expr::NotNull(inner) => {
2669-
changed |= rewrite_expr_table_refs_for_rename(inner, old_table_norm, new_table_name);
2670-
}
2671-
ast::Expr::Like {
2672-
lhs, rhs, escape, ..
2673-
} => {
2674-
changed |= rewrite_expr_table_refs_for_rename(lhs, old_table_norm, new_table_name);
2675-
changed |= rewrite_expr_table_refs_for_rename(rhs, old_table_norm, new_table_name);
2676-
if let Some(ref mut esc) = escape {
2677-
changed |= rewrite_expr_table_refs_for_rename(esc, old_table_norm, new_table_name);
2678-
}
2679-
}
2680-
ast::Expr::Parenthesized(inner) => {
2681-
for e in inner {
2682-
changed |= rewrite_expr_table_refs_for_rename(e, old_table_norm, new_table_name);
2683-
}
2684-
}
2685-
ast::Expr::Subquery(select) | ast::Expr::Exists(select) => {
2686-
changed |= rewrite_select_table_refs_for_rename(select, old_table_norm, new_table_name);
2687-
}
2688-
ast::Expr::Unary(_, inner) => {
2689-
changed |= rewrite_expr_table_refs_for_rename(inner, old_table_norm, new_table_name);
2690-
}
2691-
ast::Expr::Id(_)
2692-
| ast::Expr::Literal(_)
2693-
| ast::Expr::Name(_)
2694-
| ast::Expr::Variable(_)
2695-
| ast::Expr::Raise(_, _)
2696-
| ast::Expr::Register(_)
2697-
| ast::Expr::Column { .. }
2698-
| ast::Expr::RowId { .. }
2699-
| ast::Expr::SubqueryResult { .. } => {}
2700-
}
2621+
Ok(WalkControl::Continue)
2622+
});
27012623

27022624
changed
27032625
}

0 commit comments

Comments
 (0)