sql_fun_sqlast/sem/schema_file_context/
table_info.rs1use 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}