Skip to main content

sql_fun_sqlast/
sem.rs

1#![doc = include_str!("sem.md")]
2
3mod alter_owner;
4mod alter_seq;
5mod alter_table;
6mod base_context;
7mod cast;
8mod comment;
9mod constraint;
10mod create_comp_type;
11mod create_domain;
12mod create_enum_type;
13mod create_extension;
14mod create_function;
15mod create_index;
16mod create_schema;
17mod create_seq;
18mod create_table;
19mod create_table_as;
20mod create_view;
21mod cte;
22mod data_source;
23mod def_elem;
24mod delete_statement;
25mod error;
26mod from_clause;
27mod insert_statement;
28mod names;
29mod operators;
30mod parse_context;
31mod pg_type;
32mod scalar_expr;
33mod schema_file_context;
34mod search_path;
35mod select_statement;
36mod top_level_statement;
37mod type_system;
38mod update_statement;
39mod variable_set;
40mod view_like;
41
42pub mod problem;
43
44pub use self::{
45    alter_owner::{AlterOwner, analyze_alter_owner},
46    alter_seq::{AlterSequence, analyze_alter_seq},
47    alter_table::{AlterTable, AlterView, analyze_alter_statement},
48    base_context::BaseContext,
49    cast::{CastContext, CastDefinition},
50    comment::{Comment, analyze_comment},
51    constraint::{AnalizeConstraint, Constraint, PrimaryKeyConstraint},
52    create_comp_type::{CreateCompositType, analyze_create_comp_type},
53    create_domain::{CreateDomain, analyze_create_domain},
54    create_enum_type::{CreateEnum, analyze_create_enum_type},
55    create_extension::{CreateExtension, analyze_create_extension},
56    create_function::{CreateFunction, analyze_create_function},
57    create_index::{
58        CreateIndex, IndexElement, IndexElementWithOrder, SortOrder, analyze_index_stmt,
59    },
60    create_schema::{CreateSchema, analyze_create_schema},
61    create_seq::{CreateSequence, analyze_create_seq},
62    create_table::{
63        ColumnCollection, ColumnDefinition, ColumnName, CreateTable, TableName, ViewName,
64        analyze_create_stmt,
65    },
66    create_table_as::{CreateTableAs, analyze_create_table_as},
67    create_view::{CreateView, analyze_create_view},
68    cte::{CteName, CteStatement, WithClause},
69    data_source::{
70        AliasSpec, DataSource, DataSourceRowFunctions, DataSourceRowsFromFunc, JoinKind, Nullable,
71    },
72    def_elem::{DefElemKey, DefElemList, analyze_def_elem_list},
73    delete_statement::{DeleteStatement, analyze_delete_statement},
74    error::AnalysisError,
75    from_clause::FromClause,
76    insert_statement::{InsertStatement, analyze_insert_statement},
77    names::{CatalogName, FullName, LocalName, OperatorName, SchemaName, ValidOperatorName},
78    operators::{BinaryOperatorDefinition, OperatorDefinition, UnaryOperatorDefinition},
79    parse_context::{
80        BaseParseContext, CastInfoRead, DefaultSourceAccessService, FunctionInfoRead,
81        FunctionInfoWrite, IndexInfoRead, OperatorInfoRead, ParseContext, SearchPathRead,
82        SequenceInfoRead, SequenceInfoWrite, SourceAccessService, TableInfoRead, TableInfoWrite,
83        TypeInfoRead, TypeInfoWrite, ViewInfoRead, ViewInfoWrite,
84    },
85    pg_type::{PgBuiltInType, TypeDefinition, TypeReference},
86    problem::AnalysisProblem,
87    scalar_expr::{
88        ArithExpr, ArrayExpr, BooleanExpr, CaseExpr, CoalesceExpr, CollateExpr,
89        ColumnReferenceExpr, CteColumnRef, FuncCallExpr, ImplicitCastExpr, IndirectionExpr,
90        MinMaxExpr, NamedArgExpr, NullTestExpr, ParamRef, ScalarConstExpr, SemScalarExpr,
91        SqlValueExpr, SubLinkExpr, SubQueryColumnRef, TableColumnRef, TypeCastExpr,
92        analyze_scaler_expr,
93    },
94    schema_file_context::SchemaFileContext,
95    select_statement::{SelectStatement, analyze_select},
96    top_level_statement::{analyze_node, semantic_analysis},
97    type_system::{FunctionOverloadCollection, FunctionParam, OverloadVariant},
98    update_statement::{UpdateStatement, analyze_update_statement},
99    variable_set::{VariableSet, analyze_variable_set},
100    view_like::ViewLike,
101};
102pub use crate::AstAndContextPair;
103
104use std::fmt::Debug;
105
106/// constraint related schema change
107#[derive(Debug, Clone)]
108pub enum ImplicitChange {
109    /// create an index
110    CreateIndex(CreateIndex),
111}
112
113impl From<CreateIndex> for ImplicitChange {
114    fn from(value: CreateIndex) -> Self {
115        Self::CreateIndex(value)
116    }
117}
118
119/// Semantic AST for top-level statement
120#[derive(Debug, Clone)]
121pub enum SemAst {
122    /// `alter owner` statement
123    AlterOwner(AlterOwner),
124
125    /// `alter sequence` statement
126    AlterSequence(AlterSequence),
127
128    /// `alter table` statement
129    AlterTable(AlterTable),
130
131    /// `alter view` statement
132    AlterView(AlterView),
133
134    /// `comment` statement
135    Comment(Comment),
136
137    /// `create type` (composite type variant) statement
138    CreateCompType(CreateCompositType),
139
140    /// `create type` (enum type variant) statement
141    CreateEnum(CreateEnum),
142
143    /// `create function` / `create procedure` statement
144    CreateFunction(CreateFunction),
145
146    /// `create domain` statement
147    CreateDomain(CreateDomain),
148
149    /// `create schema` statement
150    CreateSchema(CreateSchema),
151
152    /// `create sequence` statemnt
153    CreateSequence(CreateSequence),
154
155    /// `create table` statement
156    CreateTable(CreateTable),
157
158    /// `create materialized view` etc.
159    CreateTableAs(CreateTableAs),
160
161    /// `create view` statement
162    CreateView(CreateView),
163
164    /// `create index` statement
165    CreateIndex(CreateIndex),
166
167    /// `select` statement
168    SelectStatement(SelectStatement),
169
170    /// `insert` statement
171    InsertStatement(InsertStatement),
172
173    /// `update` statement
174    UpdateStatement(UpdateStatement),
175
176    /// `delete` statement
177    DeleteStatement(DeleteStatement),
178
179    /// `create extension` statement
180    CreateExtension(CreateExtension),
181
182    /// variable set statement
183    VariableSet(VariableSet),
184}
185
186impl SemAst {
187    /// unwrap node as `SelectStatement`
188    #[must_use]
189    pub fn into_select_statemtnt(self) -> Option<SelectStatement> {
190        match self {
191            SemAst::SelectStatement(select_statement) => Some(select_statement),
192            _ => None,
193        }
194    }
195}