uqa_sql/catalog/
analysis.rs1use super::resolution::RelationNameResolution;
10use crate::ast::ColumnDef;
11use crate::plan::QueryPlan;
12use crate::routines::SQLUserFunction;
13use crate::{ColumnType, SQLError};
14use std::sync::Arc;
15
16#[derive(Clone)]
17pub struct TableDefinition {
18 pub columns: Arc<Vec<ColumnDef>>,
19 pub columns_declared: bool,
20}
21
22#[derive(Clone)]
23pub struct ViewDefinition {
24 pub query: QueryPlan,
25 pub output_columns: Option<Vec<String>>,
26 pub materialized: bool,
27 pub materialized_column_types: Vec<Option<ColumnType>>,
28 pub materialized_column_collations: Option<Vec<u32>>,
29}
30
31pub trait AnalysisCatalog: Send + Sync {
33 fn relation_row_type(
35 &self,
36 _resolution: &RelationNameResolution,
37 _name: &str,
38 ) -> Result<Option<crate::ast::CompositeTypeReference>, SQLError> {
39 Ok(None)
40 }
41
42 fn prepared_dependency_snapshot(
44 &self,
45 _dependencies: &crate::prepared::dependencies::PreparedAnalysisDependencies,
46 ) -> Result<Option<crate::prepared::dependencies::PreparedDependencySnapshot>, SQLError> {
47 Ok(None)
48 }
49
50 fn relation_dependency(
52 &self,
53 _resolution: &RelationNameResolution,
54 _name: &str,
55 ) -> Result<Option<u32>, SQLError> {
56 Ok(None)
57 }
58
59 fn effective_search_path(
61 &self,
62 _resolution: &RelationNameResolution,
63 ) -> Result<Option<super::resolution::EffectiveSearchPath>, SQLError> {
64 Ok(None)
65 }
66
67 fn table_resolved(
68 &self,
69 resolution: &RelationNameResolution,
70 name: &str,
71 ) -> Result<Option<TableDefinition>, SQLError>;
72 fn table_name_resolved(
73 &self,
74 resolution: &RelationNameResolution,
75 name: &str,
76 ) -> Result<Option<String>, SQLError>;
77 fn view_resolved(
78 &self,
79 resolution: &RelationNameResolution,
80 name: &str,
81 ) -> Result<Option<ViewDefinition>, SQLError>;
82 fn foreign_table_resolved(
83 &self,
84 resolution: &RelationNameResolution,
85 name: &str,
86 ) -> Result<Option<TableDefinition>, SQLError>;
87 fn sequence_exists(
88 &self,
89 resolution: &RelationNameResolution,
90 name: &str,
91 ) -> Result<bool, SQLError>;
92 fn virtual_relation_schema(
93 &self,
94 resolution: &RelationNameResolution,
95 name: &str,
96 ) -> Result<Option<Vec<(String, ColumnType)>>, SQLError>;
97 fn sql_functions(
98 &self,
99 resolution: &RelationNameResolution,
100 name: &str,
101 ) -> Result<Option<Vec<Arc<SQLUserFunction>>>, SQLError>;
102
103 fn unopenable_relation(
105 &self,
106 _resolution: &RelationNameResolution,
107 _name: &str,
108 ) -> Result<Option<UnopenableRelation>, SQLError> {
109 Ok(None)
110 }
111}
112
113#[must_use]
115pub fn relkind_not_supported_detail(kind: &str) -> Option<String> {
116 let plural = match kind {
117 "table" => "tables",
118 "index" => "indexes",
119 "sequence" => "sequences",
120 "view" => "views",
121 "materialized view" => "materialized views",
122 "composite type" => "composite types",
123 "foreign table" => "foreign tables",
124 "partitioned table" => "partitioned tables",
125 _ => return None,
126 };
127 Some(format!("This operation is not supported for {plural}."))
128}
129
130#[derive(Debug, Clone, PartialEq, Eq)]
132pub struct UnopenableRelation {
133 pub name: String,
134 pub kinds: &'static str,
136}
137
138impl UnopenableRelation {
139 #[must_use]
141 pub fn error(&self) -> SQLError {
142 SQLError::Diagnostic {
143 sqlstate: "42809".into(),
144 message: format!("cannot open relation \"{}\"", self.name),
145 detail: Some(format!(
146 "This operation is not supported for {}.",
147 self.kinds
148 )),
149 hint: None,
150 }
151 }
152}
153
154pub type CatalogReadView = Arc<dyn AnalysisCatalog>;