Skip to main content

sql_fun_sqlast/sem/
create_schema.rs

1use sql_fun_core::IVec;
2
3use crate::{
4    sem::AstAndContextPair,
5    syn::{ListOpt, ScanToken},
6};
7
8use super::{AnalysisError, ParseContext, SemAst};
9
10/// analyzed [`crate::syn::CreateSchemaStmt`]
11#[derive(Debug, Clone)]
12pub struct CreateSchema {
13    name: String,
14    #[expect(dead_code)]
15    elements: Vec<SemAst>,
16}
17
18impl CreateSchema {
19    /// new instance
20    #[must_use]
21    pub fn name(&self) -> &str {
22        &self.name
23    }
24}
25
26/// analyze [`crate::syn::CreateSchemaStmt`]
27pub fn analyze_create_schema<TParseContext>(
28    mut context: TParseContext,
29    syn: crate::syn::CreateSchemaStmt,
30    tokens: &IVec<ScanToken>,
31) -> Result<AstAndContextPair<TParseContext>, AnalysisError>
32where
33    TParseContext: ParseContext,
34{
35    let name = syn.get_schemaname();
36    let schema_name = Some(name.clone());
37    let Some(elts) = syn.get_schema_elts().as_inner() else {
38        AnalysisError::raise_unexpected_none("create_schema_stmt.schema_elts")?
39    };
40
41    let mut sems = Vec::new();
42    for elt in elts {
43        let AstAndContextPair(sem, new_context) =
44            super::analyze_node(context, &schema_name, elt, tokens)?;
45        context = new_context;
46        sems.push(sem);
47    }
48    let schema = CreateSchema {
49        name: name.clone(),
50        elements: sems,
51    };
52    let context = context.apply_create_schema(&schema)?;
53    Ok(AstAndContextPair::new(
54        SemAst::CreateSchema(schema),
55        context,
56    ))
57}