@@ -13289,6 +13289,15 @@ impl<'a> Parser<'a> {
1328913289 };
1329013290
1329113291 let from = self.parse_comma_separated(Parser::parse_table_and_joins)?;
13292+
13293+ // MSSQL OUTPUT clause appears after FROM table, before USING/WHERE
13294+ // https://learn.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql
13295+ let output = if self.parse_keyword(Keyword::OUTPUT) {
13296+ Some(self.parse_output(Keyword::OUTPUT, self.get_current_token().clone())?)
13297+ } else {
13298+ None
13299+ };
13300+
1329213301 let using = if self.parse_keyword(Keyword::USING) {
1329313302 Some(self.parse_comma_separated(Parser::parse_table_and_joins)?)
1329413303 } else {
@@ -13327,6 +13336,7 @@ impl<'a> Parser<'a> {
1332713336 using,
1332813337 selection,
1332913338 returning,
13339+ output,
1333013340 order_by,
1333113341 limit,
1333213342 }))
@@ -17255,10 +17265,10 @@ impl<'a> Parser<'a> {
1725517265
1725617266 let is_mysql = dialect_of!(self is MySqlDialect);
1725717267
17258- let (columns, partitioned, after_columns, source, assignments) = if self
17268+ let (columns, partitioned, after_columns, output, source, assignments) = if self
1725917269 .parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
1726017270 {
17261- (vec![], None, vec![], None, vec![])
17271+ (vec![], None, vec![], None, None, vec![])
1726217272 } else {
1726317273 let (columns, partitioned, after_columns) = if !self.peek_subquery_start() {
1726417274 let columns = self.parse_parenthesized_column_list(Optional, is_mysql)?;
@@ -17275,6 +17285,14 @@ impl<'a> Parser<'a> {
1727517285 Default::default()
1727617286 };
1727717287
17288+ // MSSQL OUTPUT clause appears between columns and source
17289+ // https://learn.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql
17290+ let output = if self.parse_keyword(Keyword::OUTPUT) {
17291+ Some(self.parse_output(Keyword::OUTPUT, self.get_current_token().clone())?)
17292+ } else {
17293+ None
17294+ };
17295+
1727817296 let (source, assignments) = if self.peek_keyword(Keyword::FORMAT)
1727917297 || self.peek_keyword(Keyword::SETTINGS)
1728017298 {
@@ -17285,7 +17303,14 @@ impl<'a> Parser<'a> {
1728517303 (Some(self.parse_query()?), vec![])
1728617304 };
1728717305
17288- (columns, partitioned, after_columns, source, assignments)
17306+ (
17307+ columns,
17308+ partitioned,
17309+ after_columns,
17310+ output,
17311+ source,
17312+ assignments,
17313+ )
1728917314 };
1729017315
1729117316 let (format_clause, settings) = if self.dialect.supports_insert_format() {
@@ -17387,6 +17412,7 @@ impl<'a> Parser<'a> {
1738717412 has_table_keyword: table,
1738817413 on,
1738917414 returning,
17415+ output,
1739017416 replace_into,
1739117417 priority,
1739217418 insert_alias,
@@ -17492,6 +17518,15 @@ impl<'a> Parser<'a> {
1749217518 };
1749317519 self.expect_keyword(Keyword::SET)?;
1749417520 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
17521+
17522+ // MSSQL OUTPUT clause appears after SET, before FROM/WHERE
17523+ // https://learn.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql
17524+ let output = if self.parse_keyword(Keyword::OUTPUT) {
17525+ Some(self.parse_output(Keyword::OUTPUT, self.get_current_token().clone())?)
17526+ } else {
17527+ None
17528+ };
17529+
1749517530 let from = if from_before_set.is_none() && self.parse_keyword(Keyword::FROM) {
1749617531 Some(UpdateTableFromKind::AfterSet(
1749717532 self.parse_table_with_joins()?,
@@ -17522,6 +17557,7 @@ impl<'a> Parser<'a> {
1752217557 from,
1752317558 selection,
1752417559 returning,
17560+ output,
1752517561 or,
1752617562 limit,
1752717563 }
0 commit comments