@@ -13309,6 +13309,15 @@ impl<'a> Parser<'a> {
1330913309 };
1331013310
1331113311 let from = self.parse_comma_separated(Parser::parse_table_and_joins)?;
13312+
13313+ // MSSQL OUTPUT clause appears after FROM table, before USING/WHERE
13314+ // https://learn.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql
13315+ let output = if self.parse_keyword(Keyword::OUTPUT) {
13316+ Some(self.parse_output(Keyword::OUTPUT, self.get_current_token().clone())?)
13317+ } else {
13318+ None
13319+ };
13320+
1331213321 let using = if self.parse_keyword(Keyword::USING) {
1331313322 Some(self.parse_comma_separated(Parser::parse_table_and_joins)?)
1331413323 } else {
@@ -13347,6 +13356,7 @@ impl<'a> Parser<'a> {
1334713356 using,
1334813357 selection,
1334913358 returning,
13359+ output,
1335013360 order_by,
1335113361 limit,
1335213362 }))
@@ -17275,10 +17285,10 @@ impl<'a> Parser<'a> {
1727517285
1727617286 let is_mysql = dialect_of!(self is MySqlDialect);
1727717287
17278- let (columns, partitioned, after_columns, source, assignments) = if self
17288+ let (columns, partitioned, after_columns, output, source, assignments) = if self
1727917289 .parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
1728017290 {
17281- (vec![], None, vec![], None, vec![])
17291+ (vec![], None, vec![], None, None, vec![])
1728217292 } else {
1728317293 let (columns, partitioned, after_columns) = if !self.peek_subquery_start() {
1728417294 let columns = self.parse_parenthesized_column_list(Optional, is_mysql)?;
@@ -17295,6 +17305,14 @@ impl<'a> Parser<'a> {
1729517305 Default::default()
1729617306 };
1729717307
17308+ // MSSQL OUTPUT clause appears between columns and source
17309+ // https://learn.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql
17310+ let output = if self.parse_keyword(Keyword::OUTPUT) {
17311+ Some(self.parse_output(Keyword::OUTPUT, self.get_current_token().clone())?)
17312+ } else {
17313+ None
17314+ };
17315+
1729817316 let (source, assignments) = if self.peek_keyword(Keyword::FORMAT)
1729917317 || self.peek_keyword(Keyword::SETTINGS)
1730017318 {
@@ -17305,7 +17323,14 @@ impl<'a> Parser<'a> {
1730517323 (Some(self.parse_query()?), vec![])
1730617324 };
1730717325
17308- (columns, partitioned, after_columns, source, assignments)
17326+ (
17327+ columns,
17328+ partitioned,
17329+ after_columns,
17330+ output,
17331+ source,
17332+ assignments,
17333+ )
1730917334 };
1731017335
1731117336 let (format_clause, settings) = if self.dialect.supports_insert_format() {
@@ -17407,6 +17432,7 @@ impl<'a> Parser<'a> {
1740717432 has_table_keyword: table,
1740817433 on,
1740917434 returning,
17435+ output,
1741017436 replace_into,
1741117437 priority,
1741217438 insert_alias,
@@ -17512,6 +17538,15 @@ impl<'a> Parser<'a> {
1751217538 };
1751317539 self.expect_keyword(Keyword::SET)?;
1751417540 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
17541+
17542+ // MSSQL OUTPUT clause appears after SET, before FROM/WHERE
17543+ // https://learn.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql
17544+ let output = if self.parse_keyword(Keyword::OUTPUT) {
17545+ Some(self.parse_output(Keyword::OUTPUT, self.get_current_token().clone())?)
17546+ } else {
17547+ None
17548+ };
17549+
1751517550 let from = if from_before_set.is_none() && self.parse_keyword(Keyword::FROM) {
1751617551 Some(UpdateTableFromKind::AfterSet(
1751717552 self.parse_table_with_joins()?,
@@ -17542,6 +17577,7 @@ impl<'a> Parser<'a> {
1754217577 from,
1754317578 selection,
1754417579 returning,
17580+ output,
1754517581 or,
1754617582 limit,
1754717583 }
0 commit comments