@@ -36,10 +36,7 @@ use datafusion_common::Result;
36
36
use crate :: datasource:: { MemTable , TableProvider } ;
37
37
use crate :: logical_expr:: TableType ;
38
38
39
- use super :: {
40
- catalog:: { CatalogList , CatalogProvider } ,
41
- schema:: SchemaProvider ,
42
- } ;
39
+ use super :: { catalog:: CatalogProvider , schema:: SchemaProvider } ;
43
40
44
41
use crate :: config:: ConfigOptions ;
45
42
@@ -52,22 +49,22 @@ const DF_SETTINGS: &str = "df_settings";
52
49
/// Wraps another [`CatalogProvider`] and adds a "information_schema"
53
50
/// schema that can introspect on tables in the catalog_list
54
51
pub ( crate ) struct CatalogWithInformationSchema {
55
- catalog_list : Weak < dyn CatalogList > ,
56
52
config_options : Weak < RwLock < ConfigOptions > > ,
57
53
/// wrapped provider
58
54
inner : Arc < dyn CatalogProvider > ,
55
+ catalog_name : String ,
59
56
}
60
57
61
58
impl CatalogWithInformationSchema {
62
59
pub ( crate ) fn new (
63
- catalog_list : Weak < dyn CatalogList > ,
60
+ catalog_name : String ,
64
61
config_options : Weak < RwLock < ConfigOptions > > ,
65
62
inner : Arc < dyn CatalogProvider > ,
66
63
) -> Self {
67
64
Self {
68
- catalog_list,
69
65
config_options,
70
66
inner,
67
+ catalog_name,
71
68
}
72
69
}
73
70
}
@@ -87,13 +84,12 @@ impl CatalogProvider for CatalogWithInformationSchema {
87
84
88
85
fn schema ( & self , name : & str ) -> Option < Arc < dyn SchemaProvider > > {
89
86
if name. eq_ignore_ascii_case ( INFORMATION_SCHEMA ) {
90
- Weak :: upgrade ( & self . catalog_list ) . and_then ( |catalog_list| {
91
- Weak :: upgrade ( & self . config_options ) . map ( |config_options| {
92
- Arc :: new ( InformationSchemaProvider {
93
- catalog_list,
94
- config_options,
95
- } ) as Arc < dyn SchemaProvider >
96
- } )
87
+ Weak :: upgrade ( & self . config_options ) . map ( |config_options| {
88
+ Arc :: new ( InformationSchemaProvider {
89
+ catalog : Arc :: clone ( & self . inner ) ,
90
+ catalog_name : self . catalog_name . clone ( ) ,
91
+ config_options,
92
+ } ) as Arc < dyn SchemaProvider >
97
93
} )
98
94
} else {
99
95
self . inner . schema ( name)
@@ -117,7 +113,8 @@ impl CatalogProvider for CatalogWithInformationSchema {
117
113
/// providers, they will appear the next time the `information_schema`
118
114
/// table is queried.
119
115
struct InformationSchemaProvider {
120
- catalog_list : Arc < dyn CatalogList > ,
116
+ catalog : Arc < dyn CatalogProvider > ,
117
+ catalog_name : String ,
121
118
config_options : Arc < RwLock < ConfigOptions > > ,
122
119
}
123
120
@@ -127,41 +124,47 @@ impl InformationSchemaProvider {
127
124
// create a mem table with the names of tables
128
125
let mut builder = InformationSchemaTablesBuilder :: new ( ) ;
129
126
130
- for catalog_name in self . catalog_list . catalog_names ( ) {
131
- let catalog = self . catalog_list . catalog ( & catalog_name) . unwrap ( ) ;
132
-
133
- for schema_name in catalog. schema_names ( ) {
134
- if schema_name != INFORMATION_SCHEMA {
135
- let schema = catalog. schema ( & schema_name) . unwrap ( ) ;
136
- for table_name in schema. table_names ( ) {
137
- let table = schema. table ( & table_name) . unwrap ( ) ;
138
- builder. add_table (
139
- & catalog_name,
140
- & schema_name,
141
- & table_name,
142
- table. table_type ( ) ,
143
- ) ;
144
- }
127
+ for schema_name in self . catalog . schema_names ( ) {
128
+ if schema_name != INFORMATION_SCHEMA {
129
+ let schema = self . catalog . schema ( & schema_name) . unwrap ( ) ;
130
+ for table_name in schema. table_names ( ) {
131
+ let table = schema. table ( & table_name) . unwrap ( ) ;
132
+ builder. add_table (
133
+ & self . catalog_name ,
134
+ & schema_name,
135
+ & table_name,
136
+ table. table_type ( ) ,
137
+ ) ;
145
138
}
146
139
}
147
-
148
- // Add a final list for the information schema tables themselves
149
- builder. add_table ( & catalog_name, INFORMATION_SCHEMA , TABLES , TableType :: View ) ;
150
- builder. add_table ( & catalog_name, INFORMATION_SCHEMA , VIEWS , TableType :: View ) ;
151
- builder. add_table (
152
- & catalog_name,
153
- INFORMATION_SCHEMA ,
154
- COLUMNS ,
155
- TableType :: View ,
156
- ) ;
157
- builder. add_table (
158
- & catalog_name,
159
- INFORMATION_SCHEMA ,
160
- DF_SETTINGS ,
161
- TableType :: View ,
162
- ) ;
163
140
}
164
141
142
+ // Add a final list for the information schema tables themselves
143
+ builder. add_table (
144
+ & self . catalog_name ,
145
+ INFORMATION_SCHEMA ,
146
+ TABLES ,
147
+ TableType :: View ,
148
+ ) ;
149
+ builder. add_table (
150
+ & self . catalog_name ,
151
+ INFORMATION_SCHEMA ,
152
+ VIEWS ,
153
+ TableType :: View ,
154
+ ) ;
155
+ builder. add_table (
156
+ & self . catalog_name ,
157
+ INFORMATION_SCHEMA ,
158
+ COLUMNS ,
159
+ TableType :: View ,
160
+ ) ;
161
+ builder. add_table (
162
+ & self . catalog_name ,
163
+ INFORMATION_SCHEMA ,
164
+ DF_SETTINGS ,
165
+ TableType :: View ,
166
+ ) ;
167
+
165
168
let mem_table: MemTable = builder. into ( ) ;
166
169
167
170
Arc :: new ( mem_table)
@@ -170,21 +173,17 @@ impl InformationSchemaProvider {
170
173
fn make_views ( & self ) -> Arc < dyn TableProvider > {
171
174
let mut builder = InformationSchemaViewBuilder :: new ( ) ;
172
175
173
- for catalog_name in self . catalog_list . catalog_names ( ) {
174
- let catalog = self . catalog_list . catalog ( & catalog_name) . unwrap ( ) ;
175
-
176
- for schema_name in catalog. schema_names ( ) {
177
- if schema_name != INFORMATION_SCHEMA {
178
- let schema = catalog. schema ( & schema_name) . unwrap ( ) ;
179
- for table_name in schema. table_names ( ) {
180
- let table = schema. table ( & table_name) . unwrap ( ) ;
181
- builder. add_view (
182
- & catalog_name,
183
- & schema_name,
184
- & table_name,
185
- table. get_table_definition ( ) ,
186
- )
187
- }
176
+ for schema_name in self . catalog . schema_names ( ) {
177
+ if schema_name != INFORMATION_SCHEMA {
178
+ let schema = self . catalog . schema ( & schema_name) . unwrap ( ) ;
179
+ for table_name in schema. table_names ( ) {
180
+ let table = schema. table ( & table_name) . unwrap ( ) ;
181
+ builder. add_view (
182
+ & self . catalog_name ,
183
+ & schema_name,
184
+ & table_name,
185
+ table. get_table_definition ( ) ,
186
+ )
188
187
}
189
188
}
190
189
}
@@ -197,25 +196,21 @@ impl InformationSchemaProvider {
197
196
fn make_columns ( & self ) -> Arc < dyn TableProvider > {
198
197
let mut builder = InformationSchemaColumnsBuilder :: new ( ) ;
199
198
200
- for catalog_name in self . catalog_list . catalog_names ( ) {
201
- let catalog = self . catalog_list . catalog ( & catalog_name) . unwrap ( ) ;
202
-
203
- for schema_name in catalog. schema_names ( ) {
204
- if schema_name != INFORMATION_SCHEMA {
205
- let schema = catalog. schema ( & schema_name) . unwrap ( ) ;
206
- for table_name in schema. table_names ( ) {
207
- let table = schema. table ( & table_name) . unwrap ( ) ;
208
- for ( i, field) in table. schema ( ) . fields ( ) . iter ( ) . enumerate ( ) {
209
- builder. add_column (
210
- & catalog_name,
211
- & schema_name,
212
- & table_name,
213
- field. name ( ) ,
214
- i,
215
- field. is_nullable ( ) ,
216
- field. data_type ( ) ,
217
- )
218
- }
199
+ for schema_name in self . catalog . schema_names ( ) {
200
+ if schema_name != INFORMATION_SCHEMA {
201
+ let schema = self . catalog . schema ( & schema_name) . unwrap ( ) ;
202
+ for table_name in schema. table_names ( ) {
203
+ let table = schema. table ( & table_name) . unwrap ( ) ;
204
+ for ( i, field) in table. schema ( ) . fields ( ) . iter ( ) . enumerate ( ) {
205
+ builder. add_column (
206
+ & self . catalog_name ,
207
+ & schema_name,
208
+ & table_name,
209
+ field. name ( ) ,
210
+ i,
211
+ field. is_nullable ( ) ,
212
+ field. data_type ( ) ,
213
+ )
219
214
}
220
215
}
221
216
}
0 commit comments