1use std::fmt::Write;
5
6pub fn values_placeholders(rows: usize, cols: usize) -> String {
7 let mut sql = String::with_capacity(rows * (cols * 2 + 2));
8 let mut n = 1usize;
9 for r in 0..rows {
10 if r > 0 {
11 sql.push(',');
12 }
13 sql.push('(');
14 for c in 0..cols {
15 if c > 0 {
16 sql.push(',');
17 }
18 write!(sql, "?{n}").unwrap();
19 n += 1;
20 }
21 sql.push(')');
22 }
23 sql
24}
25
26#[cfg(test)]
27mod tests {
28 use super::values_placeholders;
29
30 #[test]
31 fn one_row_one_column_is_a_single_placeholder() {
32 assert_eq!(values_placeholders(1, 1), "(?1)");
33 }
34
35 #[test]
36 fn one_row_three_columns_numbers_left_to_right() {
37 assert_eq!(values_placeholders(1, 3), "(?1,?2,?3)");
38 }
39
40 #[test]
41 fn three_rows_two_columns_numbers_contiguously_across_rows() {
42 assert_eq!(values_placeholders(3, 2), "(?1,?2),(?3,?4),(?5,?6)");
44 }
45
46 #[test]
47 fn zero_rows_is_empty() {
48 assert_eq!(values_placeholders(0, 3), "");
49 }
50}