@@ -58,8 +58,8 @@ impl Spanned for InsertReplaceType {
5858
5959#[ derive( Clone , Debug ) ]
6060pub enum OnConflictTarget < ' a > {
61- Column {
62- name : Identifier < ' a > ,
61+ Columns {
62+ names : Vec < Identifier < ' a > > ,
6363 } ,
6464 OnConstraint {
6565 on_constraint_span : Span ,
@@ -71,7 +71,7 @@ pub enum OnConflictTarget<'a> {
7171impl < ' a > OptSpanned for OnConflictTarget < ' a > {
7272 fn opt_span ( & self ) -> Option < Span > {
7373 match self {
74- OnConflictTarget :: Column { name } => Some ( name . span ( ) ) ,
74+ OnConflictTarget :: Columns { names } => names . opt_span ( ) ,
7575 OnConflictTarget :: OnConstraint {
7676 on_constraint_span : token,
7777 name,
@@ -426,9 +426,13 @@ pub(crate) fn parse_insert_replace<'a>(
426426 let target = match & parser. token {
427427 Token :: LParen => {
428428 parser. consume_token ( Token :: LParen ) ?;
429- let name = parser. consume_plain_identifier ( ) ?;
429+ let mut names = Vec :: new ( ) ;
430+ names. push ( parser. consume_plain_identifier ( ) ?) ;
431+ while parser. skip_token ( Token :: Comma ) . is_some ( ) {
432+ names. push ( parser. consume_plain_identifier ( ) ?) ;
433+ }
430434 parser. consume_token ( Token :: RParen ) ?;
431- OnConflictTarget :: Column { name }
435+ OnConflictTarget :: Columns { names }
432436 }
433437 Token :: Ident ( _, Keyword :: ON ) => {
434438 let on_constraint =
0 commit comments