File tree Expand file tree Collapse file tree 6 files changed +36
-1
lines changed Expand file tree Collapse file tree 6 files changed +36
-1
lines changed Original file line number Diff line number Diff line change @@ -3238,6 +3238,8 @@ pub enum Statement {
3238
3238
returning : Option < Vec < SelectItem > > ,
3239
3239
/// SQLite-specific conflict resolution clause
3240
3240
or : Option < SqliteOnConflict > ,
3241
+ /// LIMIT
3242
+ limit : Option < Expr > ,
3241
3243
} ,
3242
3244
/// ```sql
3243
3245
/// DELETE
@@ -4810,6 +4812,7 @@ impl fmt::Display for Statement {
4810
4812
selection,
4811
4813
returning,
4812
4814
or,
4815
+ limit,
4813
4816
} => {
4814
4817
f. write_str ( "UPDATE " ) ?;
4815
4818
if let Some ( or) = or {
@@ -4843,6 +4846,10 @@ impl fmt::Display for Statement {
4843
4846
f. write_str ( "RETURNING" ) ?;
4844
4847
indented_list ( f, returning) ?;
4845
4848
}
4849
+ if let Some ( limit) = limit {
4850
+ SpaceOrNewline . fmt ( f) ?;
4851
+ write ! ( f, "LIMIT {limit}" ) ?;
4852
+ }
4846
4853
Ok ( ( ) )
4847
4854
}
4848
4855
Statement :: Delete ( delete) => delete. fmt ( f) ,
Original file line number Diff line number Diff line change @@ -378,6 +378,7 @@ impl Spanned for Statement {
378
378
selection,
379
379
returning,
380
380
or : _,
381
+ limit : _,
381
382
} => union_spans (
382
383
core:: iter:: once ( table. span ( ) )
383
384
. chain ( assignments. iter ( ) . map ( |i| i. span ( ) ) )
Original file line number Diff line number Diff line change @@ -15152,13 +15152,19 @@ impl<'a> Parser<'a> {
15152
15152
} else {
15153
15153
None
15154
15154
};
15155
+ let limit = if self.parse_keyword(Keyword::LIMIT) {
15156
+ Some(self.parse_expr()?)
15157
+ } else {
15158
+ None
15159
+ };
15155
15160
Ok(Statement::Update {
15156
15161
table,
15157
15162
assignments,
15158
15163
from,
15159
15164
selection,
15160
15165
returning,
15161
15166
or,
15167
+ limit,
15162
15168
})
15163
15169
}
15164
15170
Original file line number Diff line number Diff line change @@ -515,6 +515,7 @@ fn parse_update_set_from() {
515
515
}),
516
516
returning: None,
517
517
or: None,
518
+ limit: None
518
519
}
519
520
);
520
521
@@ -533,6 +534,7 @@ fn parse_update_with_table_alias() {
533
534
selection,
534
535
returning,
535
536
or: None,
537
+ limit: None,
536
538
} => {
537
539
assert_eq!(
538
540
TableWithJoins {
Original file line number Diff line number Diff line change @@ -2516,6 +2516,7 @@ fn parse_update_with_joins() {
2516
2516
selection,
2517
2517
returning,
2518
2518
or : None ,
2519
+ limit : None ,
2519
2520
} => {
2520
2521
assert_eq ! (
2521
2522
TableWithJoins {
Original file line number Diff line number Diff line change @@ -485,7 +485,8 @@ fn parse_update_tuple_row_values() {
485
485
joins: vec![ ] ,
486
486
} ,
487
487
from: None ,
488
- returning: None
488
+ returning: None ,
489
+ limit: None
489
490
}
490
491
) ;
491
492
}
@@ -592,6 +593,23 @@ fn test_regexp_operator() {
592
593
sqlite ( ) . verified_only_select ( r#"SELECT count(*) FROM messages WHERE msg_text REGEXP '\d+'"# ) ;
593
594
}
594
595
596
+ #[ test]
597
+ fn test_update_delete_limit ( ) {
598
+ match sqlite ( ) . verified_stmt ( "UPDATE foo SET bar = 1 LIMIT 99" ) {
599
+ Statement :: Update { limit, .. } => {
600
+ assert_eq ! ( limit, Some ( Expr :: value( number( "99" ) ) ) ) ;
601
+ }
602
+ _ => unreachable ! ( ) ,
603
+ }
604
+
605
+ match sqlite ( ) . verified_stmt ( "DELETE FROM foo LIMIT 99" ) {
606
+ Statement :: Delete ( Delete { limit, .. } ) => {
607
+ assert_eq ! ( limit, Some ( Expr :: value( number( "99" ) ) ) ) ;
608
+ }
609
+ _ => unreachable ! ( ) ,
610
+ }
611
+ }
612
+
595
613
fn sqlite ( ) -> TestedDialects {
596
614
TestedDialects :: new ( vec ! [ Box :: new( SQLiteDialect { } ) ] )
597
615
}
You can’t perform that action at this time.
0 commit comments