Skip to content

Commit 356308b

Browse files
IndexSeekiffyio
andauthored
feat: Include end token in ALTER TABLE statement (#1999)
Co-authored-by: Ifeanyi Ubah <[email protected]>
1 parent 27544f9 commit 356308b

File tree

5 files changed

+31
-1
lines changed

5 files changed

+31
-1
lines changed

src/ast/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3384,6 +3384,8 @@ pub enum Statement {
33843384
/// Snowflake "ICEBERG" clause for Iceberg tables
33853385
/// <https://docs.snowflake.com/en/sql-reference/sql/alter-iceberg-table>
33863386
iceberg: bool,
3387+
/// Token that represents the end of the statement (semicolon or EOF)
3388+
end_token: AttachedToken,
33873389
},
33883390
/// ```sql
33893391
/// ALTER INDEX
@@ -5442,6 +5444,7 @@ impl fmt::Display for Statement {
54425444
location,
54435445
on_cluster,
54445446
iceberg,
5447+
end_token: _,
54455448
} => {
54465449
if *iceberg {
54475450
write!(f, "ALTER ICEBERG TABLE ")?;

src/ast/spans.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,10 +435,12 @@ impl Spanned for Statement {
435435
location: _,
436436
on_cluster,
437437
iceberg: _,
438+
end_token,
438439
} => union_spans(
439440
core::iter::once(name.span())
440441
.chain(operations.iter().map(|i| i.span()))
441-
.chain(on_cluster.iter().map(|i| i.span)),
442+
.chain(on_cluster.iter().map(|i| i.span))
443+
.chain(core::iter::once(end_token.0.span)),
442444
),
443445
Statement::AlterIndex { name, operation } => name.span().union(&operation.span()),
444446
Statement::AlterView {
@@ -2553,4 +2555,20 @@ pub mod tests {
25532555
stmt => panic!("expected query; got {stmt:?}"),
25542556
}
25552557
}
2558+
2559+
#[test]
2560+
fn test_alter_table_multiline_span() {
2561+
let sql = r#"-- foo
2562+
ALTER TABLE users
2563+
ADD COLUMN foo
2564+
varchar; -- hi there"#;
2565+
2566+
let r = Parser::parse_sql(&crate::dialect::PostgreSqlDialect {}, sql).unwrap();
2567+
assert_eq!(1, r.len());
2568+
2569+
let stmt_span = r[0].span();
2570+
2571+
assert_eq!(stmt_span.start, (2, 13).into());
2572+
assert_eq!(stmt_span.end, (4, 11).into());
2573+
}
25562574
}

src/parser/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9263,6 +9263,12 @@ impl<'a> Parser<'a> {
92639263
});
92649264
}
92659265

9266+
let end_token = if self.peek_token_ref().token == Token::SemiColon {
9267+
self.peek_token_ref().clone()
9268+
} else {
9269+
self.get_current_token().clone()
9270+
};
9271+
92669272
Ok(Statement::AlterTable {
92679273
name: table_name,
92689274
if_exists,
@@ -9271,6 +9277,7 @@ impl<'a> Parser<'a> {
92719277
location,
92729278
on_cluster,
92739279
iceberg,
9280+
end_token: AttachedToken(end_token),
92749281
})
92759282
}
92769283

src/test_utils.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ pub fn alter_table_op_with_name(stmt: Statement, expected_name: &str) -> AlterTa
351351
on_cluster: _,
352352
location: _,
353353
iceberg,
354+
end_token: _,
354355
} => {
355356
assert_eq!(name.to_string(), expected_name);
356357
assert!(!if_exists);

tests/sqlparser_mysql.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2643,6 +2643,7 @@ fn parse_alter_table_add_column() {
26432643
iceberg,
26442644
location: _,
26452645
on_cluster: _,
2646+
end_token: _,
26462647
} => {
26472648
assert_eq!(name.to_string(), "tab");
26482649
assert!(!if_exists);

0 commit comments

Comments
 (0)