sql_fun_sqlast/sem/problem/
name_resolution.rs1mod column_not_found;
2use miette::GraphicalReportHandler;
3
4use super::{AnalysisProblem, Problem, RenderProblemReport};
5
6use crate::{
7 StringSpan,
8 sem::{
9 AnalysisError, CteName, FullName, TableName, TypeReference,
10 create_table::{ColumnName, ViewName},
11 data_source::AliasName,
12 },
13};
14
15#[derive(Debug, Clone)]
17pub struct DomainBaseTypeNameNotFound {
18 domain_type_name: FullName,
19 base_type_name: String,
20 base_type_name_span: StringSpan,
21}
22
23impl DomainBaseTypeNameNotFound {
24 pub fn new(
26 domain_type_name: &FullName,
27 base_type_name: &str,
28 base_type_name_span: &StringSpan,
29 ) -> Self {
30 Self {
31 domain_type_name: domain_type_name.clone(),
32 base_type_name: base_type_name.to_string(),
33 base_type_name_span: *base_type_name_span,
34 }
35 }
36
37 pub fn domain_type_name(&self) -> &FullName {
39 &self.domain_type_name
40 }
41
42 pub fn base_type_name(&self) -> &str {
44 &self.base_type_name
45 }
46}
47
48impl Problem for DomainBaseTypeNameNotFound {
49 const CODE: &'static str = "SF000001";
50 const SEVERITY: miette::Severity = miette::Severity::Error;
51 const MESSAGE: &'static str = "Domain base type not found";
52 const SPAN_LABEL: &'static str = "base type name";
53
54 fn get_problem_span(&self) -> StringSpan {
55 self.base_type_name_span
56 }
57}
58
59impl RenderProblemReport for DomainBaseTypeNameNotFound {}
60
61#[derive(Debug, Clone)]
62pub struct FunctionNotFound {
63 function_name: FullName,
64 function_span: StringSpan,
65}
66
67impl FunctionNotFound {
68 pub fn new(function_name: &FullName, function_span: &StringSpan) -> Self {
70 Self {
71 function_name: function_name.clone(),
72 function_span: *function_span,
73 }
74 }
75
76 pub fn function_name(&self) -> &FullName {
78 &self.function_name
79 }
80
81 pub fn function_span(&self) -> &StringSpan {
83 &self.function_span
84 }
85}
86
87impl Problem for FunctionNotFound {
88 const CODE: &'static str = "SF00002";
89 const MESSAGE: &'static str = "Function not found";
90 const SEVERITY: miette::Severity = miette::Severity::Error;
91 const SPAN_LABEL: &'static str = "function name";
92
93 fn get_problem_span(&self) -> StringSpan {
94 self.function_span
95 }
96}
97
98impl RenderProblemReport for FunctionNotFound {}
99
100#[derive(Debug, Clone)]
102pub enum NameResolution {
103 #[doc = include_str!("domain_type_name_not_found.md")]
104 DomainTypeNameNotFound(DomainBaseTypeNameNotFound),
105
106 #[doc = include_str!("function_not_found.md")]
107 FunctionNotFound(FunctionNotFound),
108
109 TableFunctionNotFound(FullName),
111
112 UndefinedColumn(String),
114
115 ColumnTypeNotFound(TableName, ColumnName, FullName),
117
118 ColumnNotFoundInTableFunction(AliasName, ColumnName),
120
121 ColumnNotFoundInTable(TableName, ColumnName),
123
124 ColumnNotFoundInCte(CteName, ColumnName),
126
127 ColumnNotFoundInSubQuery(AliasName, ColumnName),
129
130 ColumnNotFoundInSource(ColumnName),
132
133 ColumnNotFoundInView(ViewName, ColumnName),
135
136 AmbiguousColumn(ColumnName),
138
139 DuplicateAlias(AliasName),
141
142 UndefinedAlias(String),
144
145 RelationNotFound(String),
147
148 ViewNotFound(ViewName),
150
151 IndexNotFound(String),
153
154 SequenceNotFound(FullName),
156
157 TableNotFound(TableName),
159
160 CompositeTypeFieldNotFound(TypeReference, String),
162}
163
164impl NameResolution {
165 pub(crate) fn render_report(
166 &self,
167 report_handler: &GraphicalReportHandler,
168 source: String,
169 ) -> Result<String, AnalysisError> {
170 match self {
171 Self::DomainTypeNameNotFound(d) => d.generate_report(report_handler, source),
172 Self::FunctionNotFound(d) => d.generate_report(report_handler, source),
173 _ => todo!(),
174 }
175 }
176
177 pub(crate) fn duplicate_alias(alias_name: &AliasName) -> Self {
178 Self::DuplicateAlias(alias_name.clone())
179 }
180
181 pub(crate) fn composite_type_field_not_found(
182 type_ref: &TypeReference,
183 field_name: &str,
184 ) -> Self {
185 Self::CompositeTypeFieldNotFound(type_ref.clone(), field_name.to_string())
186 }
187
188 pub(crate) fn ambiguous_column(column_name: &ColumnName) -> Self {
189 Self::AmbiguousColumn(column_name.clone())
190 }
191
192 pub(crate) fn table_not_found(table_name: &TableName) -> Self {
193 Self::TableNotFound(table_name.clone())
194 }
195
196 pub(crate) fn sequence_not_found(sequence_name: &FullName) -> Self {
197 Self::SequenceNotFound(sequence_name.clone())
198 }
199
200 pub(crate) fn index_not_found(index_name: &str) -> Self {
201 Self::IndexNotFound(index_name.to_string())
202 }
203
204 pub(crate) fn view_not_found(view_name: &ViewName) -> Self {
205 Self::ViewNotFound(view_name.clone())
206 }
207
208 #[tracing::instrument()]
210 pub fn domain_type_name_not_found(
211 domain_name: &FullName,
212 type_name: &crate::syn::TypeName,
213 type_name_span: &StringSpan,
214 ) -> Self {
215 let problem = DomainBaseTypeNameNotFound::new(
216 domain_name,
217 type_name.full_name().as_str(),
218 type_name_span,
219 );
220
221 Self::DomainTypeNameNotFound(problem)
222 }
223
224 #[tracing::instrument()]
226 pub fn relation_not_found(table_name: &TableName) -> Self {
227 Self::RelationNotFound(table_name.to_string())
228 }
229
230 pub fn function_not_found(func_name: &FullName, func_span: &StringSpan) -> Self {
232 Self::FunctionNotFound(FunctionNotFound::new(func_name, func_span))
233 }
234
235 pub fn table_function_not_found(call: &FullName) -> Self {
237 Self::TableFunctionNotFound(call.clone())
238 }
239
240 #[tracing::instrument()]
242 pub fn column_type_not_found(
243 table_name: &TableName,
244 colname: &ColumnName,
245 type_name: &FullName,
246 ) -> Self {
247 Self::ColumnTypeNotFound(table_name.clone(), colname.clone(), type_name.clone())
248 }
249
250 pub fn undefined_alias(alias_name: &str) -> Self {
252 Self::UndefinedAlias(alias_name.to_owned())
253 }
254}
255
256impl AnalysisProblem {
257 #[tracing::instrument()]
259 pub fn duplicate_alias(alias_name: &AliasName) -> Self {
260 Self::NameResolution(NameResolution::duplicate_alias(alias_name))
261 }
262
263 #[track_caller]
265 #[tracing::instrument()]
266 pub fn composite_type_field_not_found(
267 composite_type: &TypeReference,
268 field_name: &str,
269 ) -> Self {
270 tracing::warn!(
271 "complex type member not found {composite_type:?} member_name: {field_name}"
272 );
273 Self::NameResolution(NameResolution::composite_type_field_not_found(
274 composite_type,
275 field_name,
276 ))
277 }
278
279 #[tracing::instrument()]
281 pub fn ambiguous_column(column: &ColumnName) -> Self {
282 Self::NameResolution(NameResolution::ambiguous_column(column))
283 }
284
285 #[tracing::instrument()]
287 pub fn table_not_found(table_name: &TableName) -> Self {
288 Self::NameResolution(NameResolution::table_not_found(table_name))
289 }
290
291 #[tracing::instrument()]
293 pub fn sequence_not_found(seq_name: &FullName) -> Self {
294 Self::NameResolution(NameResolution::sequence_not_found(seq_name))
295 }
296
297 #[tracing::instrument()]
299 pub fn index_not_found(index_name: &str) -> Self {
300 Self::NameResolution(NameResolution::index_not_found(index_name))
301 }
302
303 #[track_caller]
305 #[tracing::instrument()]
306 pub fn view_not_found(view_name: &ViewName) -> Self {
307 Self::NameResolution(NameResolution::view_not_found(view_name))
308 }
309
310 #[tracing::instrument()]
312 pub fn domain_type_name_not_found(
313 domain_name: &FullName,
314 type_name: &crate::syn::TypeName,
315 type_name_span: &StringSpan,
316 ) -> Self {
317 Self::NameResolution(NameResolution::domain_type_name_not_found(
318 domain_name,
319 type_name,
320 type_name_span,
321 ))
322 }
323
324 #[tracing::instrument()]
326 pub fn relation_not_found(table_name: &TableName) -> Self {
327 Self::NameResolution(NameResolution::relation_not_found(table_name))
328 }
329
330 #[track_caller]
332 #[tracing::instrument()]
333 pub fn function_not_found(func_name: &FullName, func_span: &StringSpan) -> Self {
334 Self::NameResolution(NameResolution::function_not_found(func_name, func_span))
335 }
336
337 #[track_caller]
339 #[tracing::instrument()]
340 pub fn table_function_not_found(func: &FullName) -> Self {
341 Self::NameResolution(NameResolution::table_function_not_found(func))
342 }
343
344 #[tracing::instrument()]
346 pub fn column_type_not_found(
347 table_name: &TableName,
348 colname: &ColumnName,
349 type_name: &FullName,
350 ) -> Self {
351 Self::NameResolution(NameResolution::column_type_not_found(
352 table_name, colname, type_name,
353 ))
354 }
355
356 #[must_use]
358 pub fn undefined_alias(alias_name: String) -> Self {
359 Self::NameResolution(NameResolution::undefined_alias(&alias_name))
360 }
361}