Skip to main content

sql_fun_sqlast/sem/scalar_expr/
array.rs

1use sql_fun_core::IVec;
2
3use crate::{
4    sem::{
5        AnalysisError, ParseContext, SemScalarExpr, TypeReference, analyze_scaler_expr,
6        scalar_expr::{AnalyzeScalarExpr, SemScalarExprNode},
7    },
8    syn::{ListOpt, ScanToken},
9};
10
11/// array expression
12#[derive(Debug, Clone, Eq, Hash, PartialEq, serde::Serialize, serde::Deserialize)]
13pub struct ArrayExpr(Vec<SemScalarExpr>);
14
15impl SemScalarExprNode for ArrayExpr {
16    fn get_type(&self) -> Option<crate::sem::TypeReference> {
17        let elm_type = self.0.first()?.get_type()?;
18        Some(TypeReference::concrete_type_ref(elm_type.full_name(), true))
19    }
20
21    fn is_not_null(&self) -> Option<bool> {
22        todo!()
23    }
24}
25
26impl<TParseContext> AnalyzeScalarExpr<TParseContext, crate::syn::AArrayExpr> for ArrayExpr
27where
28    TParseContext: ParseContext,
29{
30    fn analyze_scalar_expr(
31        mut context: TParseContext,
32        with_clause: &crate::sem::WithClause,
33        from_clause: &crate::sem::FromClause,
34        syn: crate::syn::AArrayExpr,
35        tokens: &IVec<ScanToken>,
36    ) -> Result<(SemScalarExpr, TParseContext), AnalysisError> {
37        let Some(elements) = syn.get_elements().as_inner() else {
38            AnalysisError::raise_unexpected_none("a_array_expr.elements")?
39        };
40
41        let mut exprs = Vec::new();
42        for element in elements {
43            let (sem_elm, new_context) =
44                analyze_scaler_expr(context, with_clause, from_clause, element, tokens)?;
45            context = new_context;
46            exprs.push(sem_elm);
47        }
48
49        Ok((SemScalarExpr::Array(Self(exprs)), context))
50    }
51}