@@ -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