@@ -28,7 +28,7 @@ use test_utils::*;
2828use sqlparser:: ast:: SelectItem :: UnnamedExpr ;
2929use sqlparser:: ast:: Value :: Placeholder ;
3030use sqlparser:: ast:: * ;
31- use sqlparser:: dialect:: { GenericDialect , SQLiteDialect } ;
31+ use sqlparser:: dialect:: { Dialect , GenericDialect , SQLiteDialect } ;
3232use sqlparser:: parser:: { ParserError , ParserOptions } ;
3333use sqlparser:: tokenizer:: Token ;
3434
@@ -485,7 +485,8 @@ fn parse_update_tuple_row_values() {
485485 joins: vec![ ] ,
486486 } ,
487487 from: None ,
488- returning: None
488+ returning: None ,
489+ limit: None
489490 }
490491 ) ;
491492}
@@ -592,6 +593,41 @@ fn test_regexp_operator() {
592593 sqlite ( ) . verified_only_select ( r#"SELECT count(*) FROM messages WHERE msg_text REGEXP '\d+'"# ) ;
593594}
594595
596+ #[ test]
597+ fn test_update_delete_limit ( ) {
598+ #[ derive( Debug ) ]
599+ struct SQLiteDialect ;
600+ impl Dialect for SQLiteDialect {
601+ fn is_identifier_start ( & self , ch : char ) -> bool {
602+ ch. is_ascii_lowercase ( ) || ch. is_ascii_uppercase ( )
603+ }
604+
605+ fn is_identifier_part ( & self , ch : char ) -> bool {
606+ self . is_identifier_start ( ch)
607+ }
608+
609+ fn supports_update_delete_limit ( & self ) -> bool {
610+ true
611+ }
612+ }
613+
614+ let sqlite = TestedDialects :: new ( vec ! [ Box :: new( SQLiteDialect { } ) ] ) ;
615+
616+ match sqlite. verified_stmt ( "UPDATE foo SET bar = 1 LIMIT 99" ) {
617+ Statement :: Update { limit, .. } => {
618+ assert_eq ! ( limit, Some ( Expr :: value( number( "99" ) ) ) ) ;
619+ }
620+ _ => unreachable ! ( ) ,
621+ }
622+
623+ match sqlite. verified_stmt ( "DELETE FROM foo LIMIT 99" ) {
624+ Statement :: Delete ( Delete { limit, .. } ) => {
625+ assert_eq ! ( limit, Some ( Expr :: value( number( "99" ) ) ) ) ;
626+ }
627+ _ => unreachable ! ( ) ,
628+ }
629+ }
630+
595631fn sqlite ( ) -> TestedDialects {
596632 TestedDialects :: new ( vec ! [ Box :: new( SQLiteDialect { } ) ] )
597633}
0 commit comments