Skip to content

Commit 05d78b4

Browse files
authored
fix: LR Delete incorrect query construction (#866)
`DELETE` queries in LR were using non-identity columns in `WHERE` filter, mixing up parameters.
1 parent ab561be commit 05d78b4

1 file changed

Lines changed: 35 additions & 1 deletion

File tree

  • pgdog/src/backend/replication/logical/publisher

pgdog/src/backend/replication/logical/publisher/table.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ impl Table {
158158
let where_clause = self
159159
.columns
160160
.iter()
161+
.filter(|c| c.identity)
161162
.enumerate()
162-
.filter(|(_, c)| c.identity)
163163
.map(|(i, c)| format!("\"{}\" = ${}", escape_identifier(&c.name), i + 1))
164164
.collect::<Vec<_>>()
165165
.join(" AND ");
@@ -334,6 +334,40 @@ mod test {
334334
assert!(pg_query::parse(&delete).is_ok(), "delete: {}", delete);
335335
}
336336

337+
#[test]
338+
fn test_delete_sequential_params_identity_not_first() {
339+
// Regression: when identity columns aren't at the start of the column list,
340+
// delete() must still produce sequential $1, $2, ... parameters.
341+
let table = make_table(vec![("name", false), ("value", false), ("id", true)]);
342+
let delete = table.delete();
343+
assert!(delete.contains("$1"), "expected $1 in delete: {}", delete);
344+
assert!(
345+
!delete.contains("$3"),
346+
"delete should not skip to $3: {}",
347+
delete
348+
);
349+
assert!(pg_query::parse(&delete).is_ok(), "delete: {}", delete);
350+
}
351+
352+
#[test]
353+
fn test_delete_sequential_params_composite_key() {
354+
// Regression: composite key with non-contiguous identity columns
355+
// must produce $1, $2 not $1, $3.
356+
let table = make_table(vec![("id", true), ("name", false), ("version", true)]);
357+
let delete = table.delete();
358+
assert!(
359+
delete.contains("$1") && delete.contains("$2"),
360+
"expected $1 and $2 in delete: {}",
361+
delete
362+
);
363+
assert!(
364+
!delete.contains("$3"),
365+
"delete should not reference $3: {}",
366+
delete
367+
);
368+
assert!(pg_query::parse(&delete).is_ok(), "delete: {}", delete);
369+
}
370+
337371
#[test]
338372
fn test_sql_generation_special_chars() {
339373
let table = make_table(vec![

0 commit comments

Comments
 (0)