sqruff_lib_core/parser/segments/
select.rs

1use crate::dialects::common::ColumnAliasInfo;
2use crate::dialects::syntax::{SyntaxKind, SyntaxSet};
3use crate::parser::segments::ErasedSegment;
4
5#[derive(Clone)]
6pub struct SelectClauseElementSegment(pub ErasedSegment);
7
8impl SelectClauseElementSegment {
9    pub fn alias(&self) -> Option<ColumnAliasInfo> {
10        let alias_expression_segment = self
11            .0
12            .recursive_crawl(
13                const { &SyntaxSet::new(&[SyntaxKind::AliasExpression]) },
14                true,
15                &SyntaxSet::EMPTY,
16                true,
17            )
18            .first()?
19            .clone();
20
21        let alias_identifier_segment = alias_expression_segment.segments().iter().find(|it| {
22            matches!(
23                it.get_type(),
24                SyntaxKind::NakedIdentifier | SyntaxKind::Identifier
25            )
26        })?;
27
28        let aliased_segment = self
29            .0
30            .segments()
31            .iter()
32            .find(|&s| !s.is_whitespace() && !s.is_meta() && s != &alias_expression_segment)
33            .unwrap();
34
35        let mut column_reference_segments = Vec::new();
36        if aliased_segment.is_type(SyntaxKind::ColumnReference) {
37            column_reference_segments.push(aliased_segment.clone());
38        } else {
39            column_reference_segments.extend(aliased_segment.recursive_crawl(
40                const { &SyntaxSet::new(&[SyntaxKind::ColumnReference]) },
41                true,
42                &SyntaxSet::EMPTY,
43                true,
44            ));
45        }
46
47        Some(ColumnAliasInfo {
48            alias_identifier_name: alias_identifier_segment.raw().clone(),
49            aliased_segment: aliased_segment.clone(),
50            column_reference_segments,
51        })
52    }
53}