Skip to main content

sql_fun_sqlast/sem/scalar_expr/column_ref/
subquery_column_ref.rs

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