1use alloc::vec::Vec;
2
3use crate::{
4 keywords::Keyword,
5 lexer::Token,
6 parser::{ParseError, Parser},
7 qualified_name::parse_qualified_name,
8 QualifiedName, Span, Spanned,
9};
10
11#[derive(Debug, Clone)]
12pub struct TableToTable<'a> {
13 pub table: QualifiedName<'a>,
14 pub to_span: Span,
16 pub new_table: QualifiedName<'a>,
17}
18
19impl<'a> Spanned for TableToTable<'a> {
20 fn span(&self) -> Span {
21 self.table
22 .join_span(&self.to_span)
23 .join_span(&self.new_table)
24 }
25}
26
27#[derive(Debug, Clone)]
48pub struct RenameTable<'a> {
49 pub rename_span: Span,
51 pub table_span: Option<Span>,
53 pub table_to_tables: Vec<TableToTable<'a>>,
54}
55
56impl<'a> Spanned for RenameTable<'a> {
57 fn span(&self) -> Span {
58 self.rename_span
59 .join_span(&self.table_span)
60 .join_span(&self.table_to_tables)
61 }
62}
63
64pub(crate) fn parse_rename_table<'a>(
65 parser: &mut Parser<'a, '_>,
66) -> Result<RenameTable<'a>, ParseError> {
67 let rename_span = parser.consume_keyword(Keyword::RENAME)?;
68 let table_span = parser.skip_keyword(Keyword::TABLE);
69 let mut table_to_tables = Vec::new();
70 loop {
71 let table = parse_qualified_name(parser)?;
72 let to_span = parser.consume_keyword(Keyword::TO)?;
73 let new_table = parse_qualified_name(parser)?;
74 table_to_tables.push(TableToTable {
75 table,
76 to_span,
77 new_table,
78 });
79 if parser.skip_token(Token::Comma).is_none() {
80 break;
81 }
82 }
83 Ok(RenameTable {
84 rename_span,
85 table_span,
86 table_to_tables,
87 })
88}