sql_parse/
rename.rs

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    /// Span of "TO"
15    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/// Represent a rename table statement
28/// ```
29/// # use sql_parse::{SQLDialect, SQLArguments, ParseOptions, parse_statements, RenameTable, Statement, Issues};
30/// # let options = ParseOptions::new().dialect(SQLDialect::MariaDB);
31/// #
32/// let sql = "RENAME TABLE `t1` TO `t2`;";
33/// let mut issues = Issues::new(sql);
34/// let mut stmts = parse_statements(sql, &mut issues, &options);
35///
36/// # assert!(issues.is_ok(), "Issues: {}", issues);
37/// #
38/// let rename_table: RenameTable = match stmts.pop() {
39///     Some(Statement::RenameTable(c)) => c,
40///     _ => panic!("We should get a rename table statement")
41/// };
42///
43/// assert!(rename_table.table_to_tables.get(0).unwrap().table.identifier.as_str() == "t1");
44///
45///
46
47#[derive(Debug, Clone)]
48pub struct RenameTable<'a> {
49    /// Span of "RENAME"
50    pub rename_span: Span,
51    /// Span of "TABLE" if specified
52    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}