@@ -586,11 +586,11 @@ impl<'a> Parser<'a> {
586586 Keyword::DISCARD => self.parse_discard(),
587587 Keyword::DECLARE => self.parse_declare(),
588588 Keyword::FETCH => self.parse_fetch_statement(),
589- Keyword::DELETE => self.parse_delete(),
590- Keyword::INSERT => self.parse_insert(),
591- Keyword::REPLACE => self.parse_replace(),
589+ Keyword::DELETE => self.parse_delete(next_token ),
590+ Keyword::INSERT => self.parse_insert(next_token ),
591+ Keyword::REPLACE => self.parse_replace(next_token ),
592592 Keyword::UNCACHE => self.parse_uncache_table(),
593- Keyword::UPDATE => self.parse_update(),
593+ Keyword::UPDATE => self.parse_update(next_token ),
594594 Keyword::ALTER => self.parse_alter(),
595595 Keyword::CALL => self.parse_call(),
596596 Keyword::COPY => self.parse_copy(),
@@ -11817,8 +11817,11 @@ impl<'a> Parser<'a> {
1181711817 /// Parse a DELETE statement, returning a `Box`ed SetExpr
1181811818 ///
1181911819 /// This is used to reduce the size of the stack frames in debug builds
11820- fn parse_delete_setexpr_boxed(&mut self) -> Result<Box<SetExpr>, ParserError> {
11821- Ok(Box::new(SetExpr::Delete(self.parse_delete()?)))
11820+ fn parse_delete_setexpr_boxed(
11821+ &mut self,
11822+ delete_token: TokenWithSpan,
11823+ ) -> Result<Box<SetExpr>, ParserError> {
11824+ Ok(Box::new(SetExpr::Delete(self.parse_delete(delete_token)?)))
1182211825 }
1182311826
1182411827 /// Parse a MERGE statement, returning a `Box`ed SetExpr
@@ -11828,7 +11831,7 @@ impl<'a> Parser<'a> {
1182811831 Ok(Box::new(SetExpr::Merge(self.parse_merge()?)))
1182911832 }
1183011833
11831- pub fn parse_delete(&mut self) -> Result<Statement, ParserError> {
11834+ pub fn parse_delete(&mut self, delete_token: TokenWithSpan ) -> Result<Statement, ParserError> {
1183211835 let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
1183311836 // `FROM` keyword is optional in BigQuery SQL.
1183411837 // https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#delete_statement
@@ -11871,6 +11874,7 @@ impl<'a> Parser<'a> {
1187111874 };
1187211875
1187311876 Ok(Statement::Delete(Delete {
11877+ delete_token: delete_token.into(),
1187411878 tables,
1187511879 from: if with_from_keyword {
1187611880 FromTable::WithFromKeyword(from)
@@ -12000,7 +12004,7 @@ impl<'a> Parser<'a> {
1200012004 if self.parse_keyword(Keyword::INSERT) {
1200112005 Ok(Query {
1200212006 with,
12003- body: self.parse_insert_setexpr_boxed()?,
12007+ body: self.parse_insert_setexpr_boxed(self.get_current_token().clone() )?,
1200412008 order_by: None,
1200512009 limit_clause: None,
1200612010 fetch: None,
@@ -12014,7 +12018,7 @@ impl<'a> Parser<'a> {
1201412018 } else if self.parse_keyword(Keyword::UPDATE) {
1201512019 Ok(Query {
1201612020 with,
12017- body: self.parse_update_setexpr_boxed()?,
12021+ body: self.parse_update_setexpr_boxed(self.get_current_token().clone() )?,
1201812022 order_by: None,
1201912023 limit_clause: None,
1202012024 fetch: None,
@@ -12028,7 +12032,7 @@ impl<'a> Parser<'a> {
1202812032 } else if self.parse_keyword(Keyword::DELETE) {
1202912033 Ok(Query {
1203012034 with,
12031- body: self.parse_delete_setexpr_boxed()?,
12035+ body: self.parse_delete_setexpr_boxed(self.get_current_token().clone() )?,
1203212036 limit_clause: None,
1203312037 order_by: None,
1203412038 fetch: None,
@@ -15470,15 +15474,18 @@ impl<'a> Parser<'a> {
1547015474 }
1547115475
1547215476 /// Parse an REPLACE statement
15473- pub fn parse_replace(&mut self) -> Result<Statement, ParserError> {
15477+ pub fn parse_replace(
15478+ &mut self,
15479+ replace_token: TokenWithSpan,
15480+ ) -> Result<Statement, ParserError> {
1547415481 if !dialect_of!(self is MySqlDialect | GenericDialect) {
1547515482 return parser_err!(
1547615483 "Unsupported statement REPLACE",
1547715484 self.peek_token().span.start
1547815485 );
1547915486 }
1548015487
15481- let mut insert = self.parse_insert()?;
15488+ let mut insert = self.parse_insert(replace_token )?;
1548215489 if let Statement::Insert(Insert { replace_into, .. }) = &mut insert {
1548315490 *replace_into = true;
1548415491 }
@@ -15489,12 +15496,15 @@ impl<'a> Parser<'a> {
1548915496 /// Parse an INSERT statement, returning a `Box`ed SetExpr
1549015497 ///
1549115498 /// This is used to reduce the size of the stack frames in debug builds
15492- fn parse_insert_setexpr_boxed(&mut self) -> Result<Box<SetExpr>, ParserError> {
15493- Ok(Box::new(SetExpr::Insert(self.parse_insert()?)))
15499+ fn parse_insert_setexpr_boxed(
15500+ &mut self,
15501+ insert_token: TokenWithSpan,
15502+ ) -> Result<Box<SetExpr>, ParserError> {
15503+ Ok(Box::new(SetExpr::Insert(self.parse_insert(insert_token)?)))
1549415504 }
1549515505
1549615506 /// Parse an INSERT statement
15497- pub fn parse_insert(&mut self) -> Result<Statement, ParserError> {
15507+ pub fn parse_insert(&mut self, insert_token: TokenWithSpan ) -> Result<Statement, ParserError> {
1549815508 let or = self.parse_conflict_clause();
1549915509 let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
1550015510 None
@@ -15663,6 +15673,7 @@ impl<'a> Parser<'a> {
1566315673 };
1566415674
1566515675 Ok(Statement::Insert(Insert {
15676+ insert_token: insert_token.into(),
1566615677 or,
1566715678 table: table_object,
1566815679 table_alias,
@@ -15754,11 +15765,14 @@ impl<'a> Parser<'a> {
1575415765 /// Parse an UPDATE statement, returning a `Box`ed SetExpr
1575515766 ///
1575615767 /// This is used to reduce the size of the stack frames in debug builds
15757- fn parse_update_setexpr_boxed(&mut self) -> Result<Box<SetExpr>, ParserError> {
15758- Ok(Box::new(SetExpr::Update(self.parse_update()?)))
15768+ fn parse_update_setexpr_boxed(
15769+ &mut self,
15770+ update_token: TokenWithSpan,
15771+ ) -> Result<Box<SetExpr>, ParserError> {
15772+ Ok(Box::new(SetExpr::Update(self.parse_update(update_token)?)))
1575915773 }
1576015774
15761- pub fn parse_update(&mut self) -> Result<Statement, ParserError> {
15775+ pub fn parse_update(&mut self, update_token: TokenWithSpan ) -> Result<Statement, ParserError> {
1576215776 let or = self.parse_conflict_clause();
1576315777 let table = self.parse_table_and_joins()?;
1576415778 let from_before_set = if self.parse_keyword(Keyword::FROM) {
@@ -15793,6 +15807,7 @@ impl<'a> Parser<'a> {
1579315807 None
1579415808 };
1579515809 Ok(Update {
15810+ update_token: update_token.into(),
1579615811 table,
1579715812 assignments,
1579815813 from,
0 commit comments