pub(crate) fn replace_pg_placeholders(sql: &str) -> String {
let mut result = String::with_capacity(sql.len());
let mut chars = sql.chars().peekable();
while let Some(ch) = chars.next() {
if ch == '$' {
let mut digits = String::new();
while let Some(&d) = chars.peek() {
if d.is_ascii_digit() {
digits.push(d);
chars.next();
} else {
break;
}
}
if digits.is_empty() {
result.push(ch); } else {
result.push('?');
result.push_str(&digits);
}
} else {
result.push(ch);
}
}
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn replace_basic() {
assert_eq!(
replace_pg_placeholders("SELECT * FROM users WHERE id = $1"),
"SELECT * FROM users WHERE id = ?1"
);
}
#[test]
fn replace_multi() {
assert_eq!(
replace_pg_placeholders("INSERT INTO t (a, b, c) VALUES ($1, $2, $3)"),
"INSERT INTO t (a, b, c) VALUES (?1, ?2, ?3)"
);
}
#[test]
fn replace_no_dollar() {
let sql = "SELECT 1";
assert_eq!(replace_pg_placeholders(sql), sql);
}
#[test]
fn replace_bare_dollar() {
assert_eq!(
replace_pg_placeholders("SELECT $ FROM t"),
"SELECT $ FROM t"
);
}
}