Skip to main content

sql_fun_sqlast/sem/scalar_expr/column_ref/
cte_column_ref.rs

1use crate::sem::{
2    ColumnDefinition, ColumnName, CteName, Nullable, TypeReference, data_source::AliasName,
3};
4
5/// Column reference for CTE source
6#[derive(Debug, Clone, Eq, Hash, PartialEq, serde::Serialize, serde::Deserialize)]
7pub struct CteColumnRef {
8    alias: AliasName,
9    cte_name: CteName,
10    column_name: ColumnName,
11    column_def: Option<ColumnDefinition>,
12    source_nullable: Nullable,
13}
14
15impl super::ColumnReference for CteColumnRef {
16    fn get_type(&self) -> Option<TypeReference> {
17        if let Some(col_def) = &self.column_def {
18            col_def.get_type()
19        } else {
20            None
21        }
22    }
23
24    fn is_not_null(&self) -> Option<bool> {
25        if self.source_nullable {
26            return Some(false);
27        }
28        let Some(column_def) = &self.column_def else {
29            // column definition not resolved, returns Unknown
30            return None;
31        };
32        // returns column nullability
33        column_def.is_not_null()
34    }
35
36    fn get_column_def(&self) -> &Option<ColumnDefinition> {
37        &self.column_def
38    }
39
40    fn get_column_name(&self) -> &ColumnName {
41        &self.column_name
42    }
43}
44
45impl CteColumnRef {
46    /// create instance
47    #[must_use]
48    pub fn new(
49        alias: &AliasName,
50        cte_name: &CteName,
51        column_name: &ColumnName,
52        column_def: Option<&ColumnDefinition>,
53        source_nullable: Nullable,
54    ) -> Self {
55        Self {
56            alias: alias.clone(),
57            cte_name: cte_name.clone(),
58            column_name: column_name.clone(),
59            column_def: column_def.cloned(),
60            source_nullable,
61        }
62    }
63}