Skip to content

Commit dd8796f

Browse files
committed
Include INSERT keyword in statement span
1 parent de3b952 commit dd8796f

File tree

5 files changed

+27
-10
lines changed

5 files changed

+27
-10
lines changed

src/ast/dml.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ use super::{
3838
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3939
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4040
pub struct Insert {
41+
/// Token for the `INSERT` keyword (or its substitutes)
42+
pub insert_token: AttachedToken,
4143
/// Only for Sqlite
4244
pub or: Option<SqliteOnConflict>,
4345
/// Only for mysql

src/ast/spans.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1216,6 +1216,7 @@ impl Spanned for AlterIndexOperation {
12161216
impl Spanned for Insert {
12171217
fn span(&self) -> Span {
12181218
let Insert {
1219+
insert_token,
12191220
or: _, // enum, sqlite specific
12201221
ignore: _, // bool
12211222
into: _, // bool
@@ -1239,6 +1240,7 @@ impl Spanned for Insert {
12391240

12401241
union_spans(
12411242
core::iter::once(table.span())
1243+
.chain(core::iter::once(insert_token.0.span))
12421244
.chain(table_alias.as_ref().map(|i| i.span))
12431245
.chain(columns.iter().map(|i| i.span))
12441246
.chain(source.as_ref().map(|q| q.span()))

src/dialect/sqlite.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ impl Dialect for SQLiteDialect {
6868
fn parse_statement(&self, parser: &mut Parser) -> Option<Result<Statement, ParserError>> {
6969
if parser.parse_keyword(Keyword::REPLACE) {
7070
parser.prev_token();
71-
Some(parser.parse_insert())
71+
Some(parser.parse_insert(parser.get_current_token().clone()))
7272
} else {
7373
None
7474
}

src/parser/mod.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -587,8 +587,8 @@ impl<'a> Parser<'a> {
587587
Keyword::DECLARE => self.parse_declare(),
588588
Keyword::FETCH => self.parse_fetch_statement(),
589589
Keyword::DELETE => self.parse_delete(next_token),
590-
Keyword::INSERT => self.parse_insert(),
591-
Keyword::REPLACE => self.parse_replace(),
590+
Keyword::INSERT => self.parse_insert(next_token),
591+
Keyword::REPLACE => self.parse_replace(next_token),
592592
Keyword::UNCACHE => self.parse_uncache_table(),
593593
Keyword::UPDATE => self.parse_update(next_token),
594594
Keyword::ALTER => self.parse_alter(),
@@ -11996,7 +11996,7 @@ impl<'a> Parser<'a> {
1199611996
if self.parse_keyword(Keyword::INSERT) {
1199711997
Ok(Query {
1199811998
with,
11999-
body: self.parse_insert_setexpr_boxed()?,
11999+
body: self.parse_insert_setexpr_boxed(self.get_current_token().clone())?,
1200012000
order_by: None,
1200112001
limit_clause: None,
1200212002
fetch: None,
@@ -15451,15 +15451,15 @@ impl<'a> Parser<'a> {
1545115451
}
1545215452

1545315453
/// Parse an REPLACE statement
15454-
pub fn parse_replace(&mut self) -> Result<Statement, ParserError> {
15454+
pub fn parse_replace(&mut self, replace_token: TokenWithSpan) -> Result<Statement, ParserError> {
1545515455
if !dialect_of!(self is MySqlDialect | GenericDialect) {
1545615456
return parser_err!(
1545715457
"Unsupported statement REPLACE",
1545815458
self.peek_token().span.start
1545915459
);
1546015460
}
1546115461

15462-
let mut insert = self.parse_insert()?;
15462+
let mut insert = self.parse_insert(replace_token)?;
1546315463
if let Statement::Insert(Insert { replace_into, .. }) = &mut insert {
1546415464
*replace_into = true;
1546515465
}
@@ -15470,12 +15470,12 @@ impl<'a> Parser<'a> {
1547015470
/// Parse an INSERT statement, returning a `Box`ed SetExpr
1547115471
///
1547215472
/// This is used to reduce the size of the stack frames in debug builds
15473-
fn parse_insert_setexpr_boxed(&mut self) -> Result<Box<SetExpr>, ParserError> {
15474-
Ok(Box::new(SetExpr::Insert(self.parse_insert()?)))
15473+
fn parse_insert_setexpr_boxed(&mut self, insert_token: TokenWithSpan) -> Result<Box<SetExpr>, ParserError> {
15474+
Ok(Box::new(SetExpr::Insert(self.parse_insert(insert_token)?)))
1547515475
}
1547615476

1547715477
/// Parse an INSERT statement
15478-
pub fn parse_insert(&mut self) -> Result<Statement, ParserError> {
15478+
pub fn parse_insert(&mut self, insert_token: TokenWithSpan) -> Result<Statement, ParserError> {
1547915479
let or = self.parse_conflict_clause();
1548015480
let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
1548115481
None
@@ -15644,6 +15644,7 @@ impl<'a> Parser<'a> {
1564415644
};
1564515645

1564615646
Ok(Statement::Insert(Insert {
15647+
insert_token: insert_token.into(),
1564715648
or,
1564815649
table: table_object,
1564915650
table_alias,

tests/sqlparser_postgres.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
mod test_utils;
2424

2525
use helpers::attached_token::AttachedToken;
26-
use sqlparser::tokenizer::Span;
26+
use sqlparser::tokenizer::{Span, Token, TokenWithSpan};
2727
use test_utils::*;
2828

2929
use sqlparser::ast::*;
@@ -5140,6 +5140,10 @@ fn test_simple_postgres_insert_with_alias() {
51405140
assert_eq!(
51415141
statement,
51425142
Statement::Insert(Insert {
5143+
insert_token: AttachedToken(TokenWithSpan {
5144+
token: Token::make_keyword("INSERT"),
5145+
span: Span::new((1, 1).into(), (1, 7).into()),
5146+
}),
51435147
or: None,
51445148
ignore: false,
51455149
into: true,
@@ -5209,6 +5213,10 @@ fn test_simple_postgres_insert_with_alias() {
52095213
assert_eq!(
52105214
statement,
52115215
Statement::Insert(Insert {
5216+
insert_token: AttachedToken(TokenWithSpan {
5217+
token: Token::make_keyword("INSERT"),
5218+
span: Span::new((1, 1).into(), (1, 7).into()),
5219+
}),
52125220
or: None,
52135221
ignore: false,
52145222
into: true,
@@ -5280,6 +5288,10 @@ fn test_simple_insert_with_quoted_alias() {
52805288
assert_eq!(
52815289
statement,
52825290
Statement::Insert(Insert {
5291+
insert_token: AttachedToken(TokenWithSpan {
5292+
token: Token::make_keyword("INSERT"),
5293+
span: Span::new((1, 1).into(), (1, 7).into()),
5294+
}),
52835295
or: None,
52845296
ignore: false,
52855297
into: true,

0 commit comments

Comments
 (0)