Skip to main content

sql_fun_sqlast/sem/schema_file_context/
table_info.rs

1use crate::{
2    TrieMap,
3    sem::{
4        AlterTable, AnalysisError, AnalysisProblem, BaseParseContext, CreateTable, FullName,
5        ImplicitChange, TableInfoRead, TableInfoWrite, TableName,
6    },
7};
8
9use super::SchemaFileContext;
10
11#[derive(Debug, Default)]
12pub struct TableDefinitionCollection(TrieMap<CreateTable>);
13
14impl TableDefinitionCollection {
15    fn insert_create_table(&mut self, name: &FullName, create_table: &CreateTable) {
16        self.0.insert(&name.to_string(), create_table.clone());
17    }
18
19    fn get(&self, name: &str) -> Option<&CreateTable> {
20        self.0.get(name)
21    }
22
23    fn apply_alter(
24        &mut self,
25        alter_table: &AlterTable,
26        table_name: &TableName,
27        mut table: CreateTable,
28    ) -> Result<Vec<ImplicitChange>, AnalysisError> {
29        let implicit_changes = table.apply_alter(alter_table)?;
30        self.insert_create_table(table_name.full_name(), &table);
31        Ok(implicit_changes)
32    }
33}
34
35impl<TBaseContext> TableInfoRead for SchemaFileContext<TBaseContext>
36where
37    TBaseContext: BaseParseContext + std::fmt::Debug,
38{
39    fn get_table_impl(&self, key: &FullName) -> Option<&CreateTable> {
40        if let Some(v) = self.tables.get(&key.to_string()) {
41            Some(v)
42        } else {
43            self.base.get_table_impl(key)
44        }
45    }
46}
47
48impl<TBaseContext> TableInfoWrite for SchemaFileContext<TBaseContext>
49where
50    TBaseContext: BaseParseContext + std::fmt::Debug,
51{
52    fn insert_create_table(&mut self, name: &FullName, create_table: &CreateTable) {
53        self.tables.insert_create_table(name, create_table);
54    }
55
56    #[tracing::instrument(skip(self))]
57    fn apply_alter_table(mut self, alter_table: &AlterTable) -> Result<Self, AnalysisError> {
58        let table_name = alter_table.table();
59        let Some(table) = self.get_table(table_name).cloned() else {
60            self.report_problem(AnalysisProblem::table_not_found(table_name))?;
61            return Ok(self);
62        };
63
64        let implicit_changes = self.tables.apply_alter(alter_table, table_name, table)?;
65        let mut context = self;
66        for implicit_change in implicit_changes {
67            context = context.apply_implicit_change(implicit_change)?;
68        }
69        Ok(context)
70    }
71}