sql_fun_sqlast/sem/scalar_expr/
array.rs1use 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#[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}