sqlx_named_bind/
builder.rs

1use regex::Regex;
2
3/// Converts named placeholders (`:name`) to positional placeholders (`?`) for MySQL.
4///
5/// This function is used internally by `PreparedQuery` and `PreparedQueryAs`.
6///
7/// # Examples
8///
9/// ```
10/// use sqlx_named_bind::builder::build_query;
11///
12/// let sql = build_query("SELECT * FROM users WHERE id = :id AND name = :name")?;
13/// assert_eq!(sql, "SELECT * FROM users WHERE id = ? AND name = ?");
14/// # Ok::<(), sqlx_named_bind::Error>(())
15/// ```
16pub fn build_query(template: &str) -> crate::Result<String> {
17    let regex = Regex::new(r":[a-zA-Z0-9_]+")?;
18    let replaced = regex.replace_all(template, "?").into_owned();
19    Ok(replaced)
20}
21
22#[cfg(test)]
23mod tests {
24    use super::*;
25
26    #[test]
27    fn test_build_query_single_param() {
28        let result = build_query("SELECT * FROM users WHERE id = :id").unwrap();
29        assert_eq!(result, "SELECT * FROM users WHERE id = ?");
30    }
31
32    #[test]
33    fn test_build_query_multiple_params() {
34        let result = build_query("SELECT * FROM users WHERE id = :id AND name = :name").unwrap();
35        assert_eq!(result, "SELECT * FROM users WHERE id = ? AND name = ?");
36    }
37
38    #[test]
39    fn test_build_query_repeated_params() {
40        let result = build_query("SELECT * FROM users WHERE id = :id OR user_id = :id").unwrap();
41        assert_eq!(result, "SELECT * FROM users WHERE id = ? OR user_id = ?");
42    }
43
44    #[test]
45    fn test_build_query_no_params() {
46        let result = build_query("SELECT * FROM users").unwrap();
47        assert_eq!(result, "SELECT * FROM users");
48    }
49
50    #[test]
51    fn test_build_query_with_underscores() {
52        let result = build_query("SELECT * FROM users WHERE user_id = :user_id").unwrap();
53        assert_eq!(result, "SELECT * FROM users WHERE user_id = ?");
54    }
55}