@@ -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(),
@@ -11833,8 +11833,11 @@ impl<'a> Parser<'a> {
1183311833 /// Parse a DELETE statement, returning a `Box`ed SetExpr
1183411834 ///
1183511835 /// This is used to reduce the size of the stack frames in debug builds
11836- fn parse_delete_setexpr_boxed(&mut self) -> Result<Box<SetExpr>, ParserError> {
11837- Ok(Box::new(SetExpr::Delete(self.parse_delete()?)))
11836+ fn parse_delete_setexpr_boxed(
11837+ &mut self,
11838+ delete_token: TokenWithSpan,
11839+ ) -> Result<Box<SetExpr>, ParserError> {
11840+ Ok(Box::new(SetExpr::Delete(self.parse_delete(delete_token)?)))
1183811841 }
1183911842
1184011843 /// Parse a MERGE statement, returning a `Box`ed SetExpr
@@ -11844,7 +11847,7 @@ impl<'a> Parser<'a> {
1184411847 Ok(Box::new(SetExpr::Merge(self.parse_merge()?)))
1184511848 }
1184611849
11847- pub fn parse_delete(&mut self) -> Result<Statement, ParserError> {
11850+ pub fn parse_delete(&mut self, delete_token: TokenWithSpan ) -> Result<Statement, ParserError> {
1184811851 let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
1184911852 // `FROM` keyword is optional in BigQuery SQL.
1185011853 // https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#delete_statement
@@ -11887,6 +11890,7 @@ impl<'a> Parser<'a> {
1188711890 };
1188811891
1188911892 Ok(Statement::Delete(Delete {
11893+ delete_token: delete_token.into(),
1189011894 tables,
1189111895 from: if with_from_keyword {
1189211896 FromTable::WithFromKeyword(from)
@@ -12016,7 +12020,7 @@ impl<'a> Parser<'a> {
1201612020 if self.parse_keyword(Keyword::INSERT) {
1201712021 Ok(Query {
1201812022 with,
12019- body: self.parse_insert_setexpr_boxed()?,
12023+ body: self.parse_insert_setexpr_boxed(self.get_current_token().clone() )?,
1202012024 order_by: None,
1202112025 limit_clause: None,
1202212026 fetch: None,
@@ -12030,7 +12034,7 @@ impl<'a> Parser<'a> {
1203012034 } else if self.parse_keyword(Keyword::UPDATE) {
1203112035 Ok(Query {
1203212036 with,
12033- body: self.parse_update_setexpr_boxed()?,
12037+ body: self.parse_update_setexpr_boxed(self.get_current_token().clone() )?,
1203412038 order_by: None,
1203512039 limit_clause: None,
1203612040 fetch: None,
@@ -12044,7 +12048,7 @@ impl<'a> Parser<'a> {
1204412048 } else if self.parse_keyword(Keyword::DELETE) {
1204512049 Ok(Query {
1204612050 with,
12047- body: self.parse_delete_setexpr_boxed()?,
12051+ body: self.parse_delete_setexpr_boxed(self.get_current_token().clone() )?,
1204812052 limit_clause: None,
1204912053 order_by: None,
1205012054 fetch: None,
@@ -15486,15 +15490,18 @@ impl<'a> Parser<'a> {
1548615490 }
1548715491
1548815492 /// Parse an REPLACE statement
15489- pub fn parse_replace(&mut self) -> Result<Statement, ParserError> {
15493+ pub fn parse_replace(
15494+ &mut self,
15495+ replace_token: TokenWithSpan,
15496+ ) -> Result<Statement, ParserError> {
1549015497 if !dialect_of!(self is MySqlDialect | GenericDialect) {
1549115498 return parser_err!(
1549215499 "Unsupported statement REPLACE",
1549315500 self.peek_token().span.start
1549415501 );
1549515502 }
1549615503
15497- let mut insert = self.parse_insert()?;
15504+ let mut insert = self.parse_insert(replace_token )?;
1549815505 if let Statement::Insert(Insert { replace_into, .. }) = &mut insert {
1549915506 *replace_into = true;
1550015507 }
@@ -15505,12 +15512,15 @@ impl<'a> Parser<'a> {
1550515512 /// Parse an INSERT statement, returning a `Box`ed SetExpr
1550615513 ///
1550715514 /// This is used to reduce the size of the stack frames in debug builds
15508- fn parse_insert_setexpr_boxed(&mut self) -> Result<Box<SetExpr>, ParserError> {
15509- Ok(Box::new(SetExpr::Insert(self.parse_insert()?)))
15515+ fn parse_insert_setexpr_boxed(
15516+ &mut self,
15517+ insert_token: TokenWithSpan,
15518+ ) -> Result<Box<SetExpr>, ParserError> {
15519+ Ok(Box::new(SetExpr::Insert(self.parse_insert(insert_token)?)))
1551015520 }
1551115521
1551215522 /// Parse an INSERT statement
15513- pub fn parse_insert(&mut self) -> Result<Statement, ParserError> {
15523+ pub fn parse_insert(&mut self, insert_token: TokenWithSpan ) -> Result<Statement, ParserError> {
1551415524 let or = self.parse_conflict_clause();
1551515525 let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
1551615526 None
@@ -15679,6 +15689,7 @@ impl<'a> Parser<'a> {
1567915689 };
1568015690
1568115691 Ok(Statement::Insert(Insert {
15692+ insert_token: insert_token.into(),
1568215693 or,
1568315694 table: table_object,
1568415695 table_alias,
@@ -15770,11 +15781,14 @@ impl<'a> Parser<'a> {
1577015781 /// Parse an UPDATE statement, returning a `Box`ed SetExpr
1577115782 ///
1577215783 /// This is used to reduce the size of the stack frames in debug builds
15773- fn parse_update_setexpr_boxed(&mut self) -> Result<Box<SetExpr>, ParserError> {
15774- Ok(Box::new(SetExpr::Update(self.parse_update()?)))
15784+ fn parse_update_setexpr_boxed(
15785+ &mut self,
15786+ update_token: TokenWithSpan,
15787+ ) -> Result<Box<SetExpr>, ParserError> {
15788+ Ok(Box::new(SetExpr::Update(self.parse_update(update_token)?)))
1577515789 }
1577615790
15777- pub fn parse_update(&mut self) -> Result<Statement, ParserError> {
15791+ pub fn parse_update(&mut self, update_token: TokenWithSpan ) -> Result<Statement, ParserError> {
1577815792 let or = self.parse_conflict_clause();
1577915793 let table = self.parse_table_and_joins()?;
1578015794 let from_before_set = if self.parse_keyword(Keyword::FROM) {
@@ -15809,6 +15823,7 @@ impl<'a> Parser<'a> {
1580915823 None
1581015824 };
1581115825 Ok(Update {
15826+ update_token: update_token.into(),
1581215827 table,
1581315828 assignments,
1581415829 from,
0 commit comments