Skip to content

Commit 75fa8d6

Browse files
authored
Merge pull request #25 from antialize/update_returning
Update returning
2 parents c94035f + fe0a80b commit 75fa8d6

File tree

8 files changed

+30
-25
lines changed

8 files changed

+30
-25
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "sql-parse"
3-
version = "0.24.0"
3+
version = "0.25.0"
44
edition = "2021"
55
authors = ["Jakob Truelsen <[email protected]>"]
66
keywords = [ "mysql", "postgresql", "sql", "lexer", "parser" ]

src/alter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -757,7 +757,7 @@ fn parse_alter_table<'a>(
757757
Token::Ident(_, Keyword::DEFAULT) => {
758758
let drop_default_span = parser.consume().join_span(&set_span);
759759
AlterColumnAction::DropDefault {
760-
drop_default_span: drop_default_span,
760+
drop_default_span,
761761
}
762762
}
763763
Token::Ident(_, Keyword::NOT) => {

src/lexer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ impl<'a> Lexer<'a> {
216216
}
217217
// Data ends at EOF without NL '\' '.' [NL].
218218
let span = start..self.src.len();
219-
return (self.s(span.clone()), span);
219+
(self.s(span.clone()), span)
220220
}
221221

222222
pub fn next_token(&mut self) -> (Token<'a>, Span) {

src/parser.rs

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
// See the License for the specific language governing permissions and
1111
// limitations under the License.
1212

13-
use alloc::{borrow::Cow, fmt::Write, format, string::String, vec::Vec};
13+
use alloc::{borrow::Cow, format, string::String, vec::Vec};
1414

1515
use crate::{
1616
issue::{IssueHandle, Issues},
@@ -75,21 +75,6 @@ pub(crate) fn decode_double_quoted_string(s: &str) -> Cow<'_, str> {
7575
}
7676
}
7777

78-
pub(crate) struct SingleQuotedString<'a>(pub(crate) &'a str);
79-
80-
impl<'a> alloc::fmt::Display for SingleQuotedString<'a> {
81-
fn fmt(&self, f: &mut alloc::fmt::Formatter<'_>) -> alloc::fmt::Result {
82-
f.write_char('\'')?;
83-
for c in self.0.chars() {
84-
if c == '\'' {
85-
f.write_char('\'')?;
86-
}
87-
f.write_char(c)?;
88-
}
89-
f.write_char('\'')
90-
}
91-
}
92-
9378
impl<'a, 'b> Parser<'a, 'b> {
9479
pub(crate) fn new(src: &'a str, issues: &'b mut Issues<'a>, options: &'b ParseOptions) -> Self {
9580
let mut lexer = Lexer::new(src);

src/span.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ use alloc::{boxed::Box, vec::Vec};
1616
pub type Span = core::ops::Range<usize>;
1717

1818
/// Compute an optional byte span of an ast fragment
19-
2019
pub trait OptSpanned {
2120
/// Compute an optional byte span of an ast fragment
2221
fn opt_span(&self) -> Option<Span>;
@@ -123,7 +122,7 @@ impl<S: Spanned> Spanned for (bool, S) {
123122
}
124123
}
125124

126-
impl<'a, S: Spanned> Spanned for (&'a str, S) {
125+
impl<S: Spanned> Spanned for (& str, S) {
127126
fn span(&self) -> Span {
128127
self.1.span()
129128
}

src/statement.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,7 @@ fn parse_signal<'a>(parser: &mut Parser<'a, '_>) -> Result<Signal<'a>, ParseErro
381381
}
382382

383383
/// SQL statement
384+
#[allow(clippy::large_enum_variant)]
384385
#[derive(Clone, Debug)]
385386
pub enum Statement<'a> {
386387
CreateIndex(CreateIndex<'a>),

src/update.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ use crate::{
1818
keywords::Keyword,
1919
lexer::Token,
2020
parser::{ParseError, Parser},
21-
select::{parse_table_reference, TableReference},
21+
select::{parse_select_expr, parse_table_reference, TableReference},
2222
span::OptSpanned,
23-
Identifier, Span, Spanned,
23+
Identifier, SelectExpr, Span, Spanned,
2424
};
2525

2626
/// Flags specified after "UPDATE"
@@ -71,6 +71,8 @@ pub struct Update<'a> {
7171
pub set: Vec<(Vec<Identifier<'a>>, Expression<'a>)>,
7272
/// Where expression and span of "WHERE" if specified
7373
pub where_: Option<(Expression<'a>, Span)>,
74+
/// Span of "RETURNING" and select expressions after "RETURNING", if "RETURNING" is present
75+
pub returning: Option<(Span, Vec<SelectExpr<'a>>)>,
7476
}
7577

7678
impl<'a> Spanned for Update<'a> {
@@ -86,6 +88,7 @@ impl<'a> Spanned for Update<'a> {
8688
.join_span(&self.set_span)
8789
.join_span(&set_span)
8890
.join_span(&self.where_)
91+
.join_span(&self.returning)
8992
}
9093
}
9194

@@ -134,13 +137,30 @@ pub(crate) fn parse_update<'a>(parser: &mut Parser<'a, '_>) -> Result<Update<'a>
134137
None
135138
};
136139

140+
let returning = if let Some(returning_span) = parser.skip_keyword(Keyword::RETURNING) {
141+
let mut returning_exprs = Vec::new();
142+
loop {
143+
returning_exprs.push(parse_select_expr(parser)?);
144+
if parser.skip_token(Token::Comma).is_none() {
145+
break;
146+
}
147+
}
148+
if !parser.options.dialect.is_postgresql() {
149+
parser.err("Only support by postgesql", &returning_span);
150+
}
151+
Some((returning_span, returning_exprs))
152+
} else {
153+
None
154+
};
155+
137156
Ok(Update {
138157
flags,
139158
update_span,
140159
tables,
141160
set_span,
142161
set,
143162
where_,
163+
returning,
144164
})
145165
}
146166

0 commit comments

Comments
 (0)