@@ -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(),
@@ -11848,8 +11848,11 @@ impl<'a> Parser<'a> {
1184811848 /// Parse a DELETE statement, returning a `Box`ed SetExpr
1184911849 ///
1185011850 /// This is used to reduce the size of the stack frames in debug builds
11851- fn parse_delete_setexpr_boxed(&mut self) -> Result<Box<SetExpr>, ParserError> {
11852- Ok(Box::new(SetExpr::Delete(self.parse_delete()?)))
11851+ fn parse_delete_setexpr_boxed(
11852+ &mut self,
11853+ delete_token: TokenWithSpan,
11854+ ) -> Result<Box<SetExpr>, ParserError> {
11855+ Ok(Box::new(SetExpr::Delete(self.parse_delete(delete_token)?)))
1185311856 }
1185411857
1185511858 /// Parse a MERGE statement, returning a `Box`ed SetExpr
@@ -11859,7 +11862,7 @@ impl<'a> Parser<'a> {
1185911862 Ok(Box::new(SetExpr::Merge(self.parse_merge()?)))
1186011863 }
1186111864
11862- pub fn parse_delete(&mut self) -> Result<Statement, ParserError> {
11865+ pub fn parse_delete(&mut self, delete_token: TokenWithSpan ) -> Result<Statement, ParserError> {
1186311866 let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
1186411867 // `FROM` keyword is optional in BigQuery SQL.
1186511868 // https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#delete_statement
@@ -11902,6 +11905,7 @@ impl<'a> Parser<'a> {
1190211905 };
1190311906
1190411907 Ok(Statement::Delete(Delete {
11908+ delete_token: delete_token.into(),
1190511909 tables,
1190611910 from: if with_from_keyword {
1190711911 FromTable::WithFromKeyword(from)
@@ -12031,7 +12035,7 @@ impl<'a> Parser<'a> {
1203112035 if self.parse_keyword(Keyword::INSERT) {
1203212036 Ok(Query {
1203312037 with,
12034- body: self.parse_insert_setexpr_boxed()?,
12038+ body: self.parse_insert_setexpr_boxed(self.get_current_token().clone() )?,
1203512039 order_by: None,
1203612040 limit_clause: None,
1203712041 fetch: None,
@@ -12045,7 +12049,7 @@ impl<'a> Parser<'a> {
1204512049 } else if self.parse_keyword(Keyword::UPDATE) {
1204612050 Ok(Query {
1204712051 with,
12048- body: self.parse_update_setexpr_boxed()?,
12052+ body: self.parse_update_setexpr_boxed(self.get_current_token().clone() )?,
1204912053 order_by: None,
1205012054 limit_clause: None,
1205112055 fetch: None,
@@ -12059,7 +12063,7 @@ impl<'a> Parser<'a> {
1205912063 } else if self.parse_keyword(Keyword::DELETE) {
1206012064 Ok(Query {
1206112065 with,
12062- body: self.parse_delete_setexpr_boxed()?,
12066+ body: self.parse_delete_setexpr_boxed(self.get_current_token().clone() )?,
1206312067 limit_clause: None,
1206412068 order_by: None,
1206512069 fetch: None,
@@ -15502,15 +15506,18 @@ impl<'a> Parser<'a> {
1550215506 }
1550315507
1550415508 /// Parse an REPLACE statement
15505- pub fn parse_replace(&mut self) -> Result<Statement, ParserError> {
15509+ pub fn parse_replace(
15510+ &mut self,
15511+ replace_token: TokenWithSpan,
15512+ ) -> Result<Statement, ParserError> {
1550615513 if !dialect_of!(self is MySqlDialect | GenericDialect) {
1550715514 return parser_err!(
1550815515 "Unsupported statement REPLACE",
1550915516 self.peek_token().span.start
1551015517 );
1551115518 }
1551215519
15513- let mut insert = self.parse_insert()?;
15520+ let mut insert = self.parse_insert(replace_token )?;
1551415521 if let Statement::Insert(Insert { replace_into, .. }) = &mut insert {
1551515522 *replace_into = true;
1551615523 }
@@ -15521,12 +15528,15 @@ impl<'a> Parser<'a> {
1552115528 /// Parse an INSERT statement, returning a `Box`ed SetExpr
1552215529 ///
1552315530 /// This is used to reduce the size of the stack frames in debug builds
15524- fn parse_insert_setexpr_boxed(&mut self) -> Result<Box<SetExpr>, ParserError> {
15525- Ok(Box::new(SetExpr::Insert(self.parse_insert()?)))
15531+ fn parse_insert_setexpr_boxed(
15532+ &mut self,
15533+ insert_token: TokenWithSpan,
15534+ ) -> Result<Box<SetExpr>, ParserError> {
15535+ Ok(Box::new(SetExpr::Insert(self.parse_insert(insert_token)?)))
1552615536 }
1552715537
1552815538 /// Parse an INSERT statement
15529- pub fn parse_insert(&mut self) -> Result<Statement, ParserError> {
15539+ pub fn parse_insert(&mut self, insert_token: TokenWithSpan ) -> Result<Statement, ParserError> {
1553015540 let or = self.parse_conflict_clause();
1553115541 let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
1553215542 None
@@ -15695,6 +15705,7 @@ impl<'a> Parser<'a> {
1569515705 };
1569615706
1569715707 Ok(Statement::Insert(Insert {
15708+ insert_token: insert_token.into(),
1569815709 or,
1569915710 table: table_object,
1570015711 table_alias,
@@ -15786,11 +15797,14 @@ impl<'a> Parser<'a> {
1578615797 /// Parse an UPDATE statement, returning a `Box`ed SetExpr
1578715798 ///
1578815799 /// This is used to reduce the size of the stack frames in debug builds
15789- fn parse_update_setexpr_boxed(&mut self) -> Result<Box<SetExpr>, ParserError> {
15790- Ok(Box::new(SetExpr::Update(self.parse_update()?)))
15800+ fn parse_update_setexpr_boxed(
15801+ &mut self,
15802+ update_token: TokenWithSpan,
15803+ ) -> Result<Box<SetExpr>, ParserError> {
15804+ Ok(Box::new(SetExpr::Update(self.parse_update(update_token)?)))
1579115805 }
1579215806
15793- pub fn parse_update(&mut self) -> Result<Statement, ParserError> {
15807+ pub fn parse_update(&mut self, update_token: TokenWithSpan ) -> Result<Statement, ParserError> {
1579415808 let or = self.parse_conflict_clause();
1579515809 let table = self.parse_table_and_joins()?;
1579615810 let from_before_set = if self.parse_keyword(Keyword::FROM) {
@@ -15825,6 +15839,7 @@ impl<'a> Parser<'a> {
1582515839 None
1582615840 };
1582715841 Ok(Update {
15842+ update_token: update_token.into(),
1582815843 table,
1582915844 assignments,
1583015845 from,
0 commit comments