Skip to content

Commit 1634386

Browse files
guan404mingiffyio
andcommitted
Apply fix
Co-authored-by: Ifeanyi Ubah <ifeanyi@validio.io> Signed-off-by: Guan-Ming (Wesley) Chiu <105915352+guan404ming@users.noreply.github.com>
1 parent 0d25d93 commit 1634386

3 files changed

Lines changed: 20 additions & 21 deletions

File tree

src/ast/dml.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ pub struct Insert {
8080
/// RETURNING
8181
pub returning: Option<Vec<SelectItem>>,
8282
/// OUTPUT (MSSQL)
83+
/// See <https://learn.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql>
8384
pub output: Option<OutputClause>,
8485
/// Only for mysql
8586
pub replace_into: bool,
@@ -297,6 +298,7 @@ pub struct Delete {
297298
/// RETURNING
298299
pub returning: Option<Vec<SelectItem>>,
299300
/// OUTPUT (MSSQL)
301+
/// See <https://learn.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql>
300302
pub output: Option<OutputClause>,
301303
/// ORDER BY (MySQL)
302304
pub order_by: Vec<OrderByExpr>,
@@ -381,6 +383,7 @@ pub struct Update {
381383
/// RETURNING
382384
pub returning: Option<Vec<SelectItem>>,
383385
/// OUTPUT (MSSQL)
386+
/// See <https://learn.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql>
384387
pub output: Option<OutputClause>,
385388
/// SQLite-specific conflict resolution clause
386389
pub or: Option<SqliteOnConflict>,

src/parser/merge.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,20 @@ impl Parser<'_> {
218218
self.parse_parenthesized_qualified_column_list(IsOptional::Optional, allow_empty)
219219
}
220220

221+
/// Parses an `OUTPUT` clause if present (MSSQL).
222+
pub(super) fn maybe_parse_output_clause(
223+
&mut self,
224+
) -> Result<Option<OutputClause>, ParserError> {
225+
if self.parse_keyword(Keyword::OUTPUT) {
226+
Ok(Some(self.parse_output(
227+
Keyword::OUTPUT,
228+
self.get_current_token().clone(),
229+
)?))
230+
} else {
231+
Ok(None)
232+
}
233+
}
234+
221235
pub(super) fn parse_output(
222236
&mut self,
223237
start_keyword: Keyword,

src/parser/mod.rs

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13310,13 +13310,7 @@ impl<'a> Parser<'a> {
1331013310

1331113311
let from = self.parse_comma_separated(Parser::parse_table_and_joins)?;
1331213312

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-
};
13313+
let output = self.maybe_parse_output_clause()?;
1332013314

1332113315
let using = if self.parse_keyword(Keyword::USING) {
1332213316
Some(self.parse_comma_separated(Parser::parse_table_and_joins)?)
@@ -17305,13 +17299,7 @@ impl<'a> Parser<'a> {
1730517299
Default::default()
1730617300
};
1730717301

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-
};
17302+
let output = self.maybe_parse_output_clause()?;
1731517303

1731617304
let (source, assignments) = if self.peek_keyword(Keyword::FORMAT)
1731717305
|| self.peek_keyword(Keyword::SETTINGS)
@@ -17539,13 +17527,7 @@ impl<'a> Parser<'a> {
1753917527
self.expect_keyword(Keyword::SET)?;
1754017528
let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
1754117529

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-
};
17530+
let output = self.maybe_parse_output_clause()?;
1754917531

1755017532
let from = if from_before_set.is_none() && self.parse_keyword(Keyword::FROM) {
1755117533
Some(UpdateTableFromKind::AfterSet(

0 commit comments

Comments
 (0)