sql_fun_sqlast/sem/
variable_set.rs1use 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#[derive(Debug, Clone)]
12pub struct VariableSet {
13 name: String,
14 value: SemScalarExpr,
15}
16
17impl VariableSet {
18 #[must_use]
20 pub fn name(&self) -> &str {
21 &self.name
22 }
23
24 #[must_use]
26 pub fn value(&self) -> &SemScalarExpr {
27 &self.value
28 }
29}
30
31pub 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}