Skip to content

Commit 88888e9

Browse files
IndexSeekiffyio
authored andcommitted
feat: Include end token in ALTER TABLE statement (apache#1999)
Co-authored-by: Ifeanyi Ubah <ify1992@yahoo.com>
1 parent 17dfa9a commit 88888e9

5 files changed

Lines changed: 31 additions & 1 deletion

File tree

src/ast/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3413,6 +3413,8 @@ pub enum Statement {
34133413
/// Snowflake "ICEBERG" clause for Iceberg tables
34143414
/// <https://docs.snowflake.com/en/sql-reference/sql/alter-iceberg-table>
34153415
iceberg: bool,
3416+
/// Token that represents the end of the statement (semicolon or EOF)
3417+
end_token: AttachedToken,
34163418
},
34173419
/// ```sql
34183420
/// ALTER INDEX
@@ -5471,6 +5473,7 @@ impl fmt::Display for Statement {
54715473
location,
54725474
on_cluster,
54735475
iceberg,
5476+
end_token: _,
54745477
} => {
54755478
if *iceberg {
54765479
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 {
@@ -2562,4 +2564,20 @@ pub mod tests {
25622564
stmt => panic!("expected query; got {stmt:?}"),
25632565
}
25642566
}
2567+
2568+
#[test]
2569+
fn test_alter_table_multiline_span() {
2570+
let sql = r#"-- foo
2571+
ALTER TABLE users
2572+
ADD COLUMN foo
2573+
varchar; -- hi there"#;
2574+
2575+
let r = Parser::parse_sql(&crate::dialect::PostgreSqlDialect {}, sql).unwrap();
2576+
assert_eq!(1, r.len());
2577+
2578+
let stmt_span = r[0].span();
2579+
2580+
assert_eq!(stmt_span.start, (2, 13).into());
2581+
assert_eq!(stmt_span.end, (4, 11).into());
2582+
}
25652583
}

src/parser/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9294,6 +9294,12 @@ impl<'a> Parser<'a> {
92949294
});
92959295
}
92969296

9297+
let end_token = if self.peek_token_ref().token == Token::SemiColon {
9298+
self.peek_token_ref().clone()
9299+
} else {
9300+
self.get_current_token().clone()
9301+
};
9302+
92979303
Ok(Statement::AlterTable {
92989304
name: table_name,
92999305
if_exists,
@@ -9302,6 +9308,7 @@ impl<'a> Parser<'a> {
93029308
location,
93039309
on_cluster,
93049310
iceberg,
9311+
end_token: AttachedToken(end_token),
93059312
})
93069313
}
93079314

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)