@@ -18,9 +18,9 @@ use crate::{
1818 keywords:: Keyword ,
1919 lexer:: Token ,
2020 parser:: { ParseError , Parser } ,
21- select:: { parse_table_reference, TableReference } ,
21+ select:: { parse_select_expr , parse_table_reference, TableReference } ,
2222 span:: OptSpanned ,
23- Identifier , Span , Spanned ,
23+ Identifier , SelectExpr , Span , Spanned ,
2424} ;
2525
2626/// Flags specified after "UPDATE"
@@ -71,6 +71,8 @@ pub struct Update<'a> {
7171 pub set : Vec < ( Vec < Identifier < ' a > > , Expression < ' a > ) > ,
7272 /// Where expression and span of "WHERE" if specified
7373 pub where_ : Option < ( Expression < ' a > , Span ) > ,
74+ /// Span of "RETURNING" and select expressions after "RETURNING", if "RETURNING" is present
75+ pub returning : Option < ( Span , Vec < SelectExpr < ' a > > ) > ,
7476}
7577
7678impl < ' a > Spanned for Update < ' a > {
@@ -86,6 +88,7 @@ impl<'a> Spanned for Update<'a> {
8688 . join_span ( & self . set_span )
8789 . join_span ( & set_span)
8890 . join_span ( & self . where_ )
91+ . join_span ( & self . returning )
8992 }
9093}
9194
@@ -134,13 +137,30 @@ pub(crate) fn parse_update<'a>(parser: &mut Parser<'a, '_>) -> Result<Update<'a>
134137 None
135138 } ;
136139
140+ let returning = if let Some ( returning_span) = parser. skip_keyword ( Keyword :: RETURNING ) {
141+ let mut returning_exprs = Vec :: new ( ) ;
142+ loop {
143+ returning_exprs. push ( parse_select_expr ( parser) ?) ;
144+ if parser. skip_token ( Token :: Comma ) . is_none ( ) {
145+ break ;
146+ }
147+ }
148+ if !parser. options . dialect . is_postgresql ( ) {
149+ parser. err ( "Only support by postgesql" , & returning_span) ;
150+ }
151+ Some ( ( returning_span, returning_exprs) )
152+ } else {
153+ None
154+ } ;
155+
137156 Ok ( Update {
138157 flags,
139158 update_span,
140159 tables,
141160 set_span,
142161 set,
143162 where_,
163+ returning,
144164 } )
145165}
146166
0 commit comments