Skip to main content

sql_fun_sqlast/sem/
variable_set.rs

1use sql_fun_core::IVec;
2
3use crate::{
4    sem::{AstAndContextPair, FromClause, SemScalarExpr, WithClause, analyze_scaler_expr},
5    syn::{ListOpt, ScanToken},
6};
7
8use super::{AnalysisError, ParseContext, SemAst};
9
10/// set a variable
11#[derive(Debug, Clone)]
12pub struct VariableSet {
13    name: String,
14    value: SemScalarExpr,
15}
16
17impl VariableSet {
18    /// name of variable
19    #[must_use]
20    pub fn name(&self) -> &str {
21        &self.name
22    }
23
24    /// value of variable
25    #[must_use]
26    pub fn value(&self) -> &SemScalarExpr {
27        &self.value
28    }
29}
30
31/// analyze `VariableSetStmt`
32///
33/// # Errors
34///
35/// Returns [`AnalysisError`] when the variable assignment is semantically invalid.
36pub fn analyze_variable_set<TParseContext>(
37    mut context: TParseContext,
38    syn: &crate::syn::VariableSetStmt,
39    tokens: &IVec<ScanToken>,
40) -> Result<AstAndContextPair<TParseContext>, AnalysisError>
41where
42    TParseContext: ParseContext,
43{
44    let name = syn.get_name();
45    let Some(args) = syn.get_args().as_inner() else {
46        AnalysisError::raise_unexpected_none("VariableSetStmt.args")?
47    };
48    if args.len() != 1 {
49        AnalysisError::raise_unexpected_input("VariableSetStmt.args len!=1")?;
50    }
51
52    let (value, new_context) = analyze_scaler_expr(
53        context,
54        &WithClause::default(),
55        &FromClause::default(),
56        args[0].clone(),
57        tokens,
58    )?;
59    context = new_context;
60
61    let var_set = VariableSet { name, value };
62    let result_context = context.apply_variable_set(&var_set)?;
63    Ok(AstAndContextPair::new(
64        SemAst::VariableSet(var_set),
65        result_context,
66    ))
67}