Skip to content

Commit 195adc3

Browse files
authored
fix(query): show catalog support iceberg engine (#17569)
1. use unknown db return error 2. fix show tables outputs duplicated table names 3. fix in iceberg catalog select from other catalog error 4. information_schema view assign default catalog 5. show catalog support iceberg engine
1 parent b444c5b commit 195adc3

File tree

14 files changed

+100
-25
lines changed

14 files changed

+100
-25
lines changed

src/query/sql/src/planner/binder/ddl/catalog.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,13 @@ impl Binder {
5959
) -> Result<Plan> {
6060
let ShowCatalogsStmt { limit } = stmt;
6161
let mut query = String::new();
62-
write!(query, "SELECT name AS Catalogs FROM system.catalogs").unwrap();
62+
let default_catalog = self.ctx.get_default_catalog()?.name();
63+
write!(
64+
query,
65+
"SELECT name AS Catalogs FROM {}.system.catalogs",
66+
default_catalog
67+
)
68+
.unwrap();
6369
match limit {
6470
Some(ShowLimit::Like { pattern }) => {
6571
write!(query, " WHERE name LIKE '{pattern}'").unwrap();

src/query/sql/src/planner/binder/ddl/column.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@ impl Binder {
6767
table
6868
};
6969

70-
let mut select_builder = SelectBuilder::from("information_schema.columns");
70+
let default_catalog = self.ctx.get_default_catalog()?.name();
71+
let mut select_builder =
72+
SelectBuilder::from(&format!("{}.information_schema.columns", default_catalog));
7173

7274
select_builder
7375
.with_column("column_name AS `Field`")

src/query/sql/src/planner/binder/ddl/database.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ impl Binder {
5959
limit,
6060
} = stmt;
6161

62-
let mut select_builder = SelectBuilder::from("default.system.databases");
62+
let default_catalog = self.ctx.get_default_catalog()?.name();
63+
let mut select_builder =
64+
SelectBuilder::from(&format!("{}.system.databases", default_catalog));
6365

6466
let ctl = if let Some(ctl) = catalog {
6567
normalize_identifier(ctl, &self.name_resolution_ctx).name
@@ -101,7 +103,11 @@ impl Binder {
101103
stmt: &ShowDropDatabasesStmt,
102104
) -> Result<Plan> {
103105
let ShowDropDatabasesStmt { catalog, limit } = stmt;
104-
let mut select_builder = SelectBuilder::from("default.system.databases_with_history");
106+
let default_catalog = self.ctx.get_default_catalog()?.name();
107+
let mut select_builder = SelectBuilder::from(&format!(
108+
"{}.system.databases_with_history",
109+
default_catalog
110+
));
105111

106112
let ctl = if let Some(ctl) = catalog {
107113
normalize_identifier(ctl, &self.name_resolution_ctx).name

src/query/sql/src/planner/binder/ddl/table.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -171,12 +171,13 @@ impl Binder {
171171
with_history,
172172
} = stmt;
173173

174+
let default_catalog = self.ctx.get_default_catalog()?.name();
174175
let database = self.check_database_exist(catalog, database).await?;
175176

176177
let mut select_builder = if stmt.with_history {
177-
SelectBuilder::from("default.system.tables_with_history")
178+
SelectBuilder::from(&format!("{}.system.tables_with_history", default_catalog))
178179
} else {
179-
SelectBuilder::from("default.system.tables")
180+
SelectBuilder::from(&format!("{}.system.tables", default_catalog))
180181
};
181182

182183
if *full {
@@ -308,6 +309,7 @@ impl Binder {
308309
) -> Result<Plan> {
309310
let ShowTablesStatusStmt { database, limit } = stmt;
310311

312+
let default_catalog = self.ctx.get_default_catalog()?.name();
311313
let database = self.check_database_exist(&None, database).await?;
312314

313315
let select_cols = "name AS Name, engine AS Engine, 0 AS Version, \
@@ -325,18 +327,18 @@ impl Binder {
325327
// (unlike mysql, alias of derived table is not required in databend).
326328
let query = match limit {
327329
None => format!(
328-
"SELECT {} FROM default.system.tables WHERE database = '{}' ORDER BY Name",
329-
select_cols, database
330+
"SELECT {} FROM {}.system.tables WHERE database = '{}' ORDER BY Name",
331+
select_cols, default_catalog, database
330332
),
331333
Some(ShowLimit::Like { pattern }) => format!(
332-
"SELECT * from (SELECT {} FROM default.system.tables WHERE database = '{}') \
334+
"SELECT * from (SELECT {} FROM {}.system.tables WHERE database = '{}') \
333335
WHERE Name LIKE '{}' ORDER BY Name",
334-
select_cols, database, pattern
336+
select_cols, default_catalog, database, pattern
335337
),
336338
Some(ShowLimit::Where { selection }) => format!(
337-
"SELECT * from (SELECT {} FROM default.system.tables WHERE database = '{}') \
339+
"SELECT * from (SELECT {} FROM {}.system.tables WHERE database = '{}') \
338340
WHERE ({}) ORDER BY Name",
339-
select_cols, database, selection
341+
select_cols, default_catalog, database, selection
340342
),
341343
};
342344

@@ -353,9 +355,11 @@ impl Binder {
353355
) -> Result<Plan> {
354356
let ShowDropTablesStmt { database, limit } = stmt;
355357

358+
let default_catalog = self.ctx.get_default_catalog()?.name();
356359
let database = self.check_database_exist(&None, database).await?;
357360

358-
let mut select_builder = SelectBuilder::from("default.system.tables_with_history");
361+
let mut select_builder =
362+
SelectBuilder::from(&format!("{}.system.tables_with_history", default_catalog));
359363

360364
select_builder
361365
.with_column("name AS Tables")

src/query/storages/iceberg/src/catalog.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,22 @@ impl Catalog for IcebergCatalog {
247247
#[fastrace::trace]
248248
#[async_backtrace::framed]
249249
async fn get_database(&self, _tenant: &Tenant, db_name: &str) -> Result<Arc<dyn Database>> {
250-
Ok(Arc::new(IcebergDatabase::create(self.clone(), db_name)))
250+
let db_names = self
251+
.iceberg_catalog()
252+
.list_namespaces(None)
253+
.await
254+
.map_err(|err| {
255+
ErrorCode::Internal(format!("Iceberg catalog load database failed: {err:?}"))
256+
})?;
257+
258+
if db_names.iter().any(|name| name.to_url_string() == db_name) {
259+
Ok(Arc::new(IcebergDatabase::create(self.clone(), db_name)))
260+
} else {
261+
Err(ErrorCode::UnknownDatabase(format!(
262+
"Unknown database '{}'",
263+
db_name
264+
)))
265+
}
251266
}
252267

253268
async fn list_databases_history(&self, _tenant: &Tenant) -> Result<Vec<Arc<dyn Database>>> {

src/query/storages/information_schema/src/columns_table.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,12 @@ impl ColumnsTable {
5959
NULL AS privileges,
6060
default_expression as default,
6161
NULL AS extra
62-
FROM system.columns;";
62+
FROM default.system.columns;";
6363

6464
let mut options = BTreeMap::new();
6565
options.insert(QUERY.to_string(), query.to_string());
6666
let table_info = TableInfo {
67-
desc: "'information_schema'.'columns'".to_string(),
67+
desc: "'default'.'information_schema'.'columns'".to_string(),
6868
name: "columns".to_string(),
6969
ident: TableIdent::new(table_id, 0),
7070
meta: TableMeta {

src/query/storages/information_schema/src/key_column_usage_table.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ impl KeyColumnUsageTable {
4444
let mut options = BTreeMap::new();
4545
options.insert(QUERY.to_string(), query);
4646
let table_info = TableInfo {
47-
desc: "'information_schema'.'key_column_usage'".to_string(),
47+
desc: "'default'.'information_schema'.'key_column_usage'".to_string(),
4848
name: "key_column_usage".to_string(),
4949
ident: TableIdent::new(table_id, 0),
5050
meta: TableMeta {

src/query/storages/information_schema/src/keywords_table.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ impl KeywordsTable {
3434
let mut options = BTreeMap::new();
3535
options.insert(QUERY.to_string(), query);
3636
let table_info = TableInfo {
37-
desc: "'information_schema'.'keywords'".to_string(),
37+
desc: "'default'.'information_schema'.'keywords'".to_string(),
3838
name: "keywords".to_string(),
3939
ident: TableIdent::new(table_id, 0),
4040
meta: TableMeta {

src/query/storages/information_schema/src/schemata_table.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ impl SchemataTable {
3535
NULL AS default_character_set_name,
3636
NULL AS default_collation_name,
3737
NULL AS sql_path
38-
FROM system.databases;";
38+
FROM default.system.databases;";
3939

4040
let mut options = BTreeMap::new();
4141
options.insert(QUERY.to_string(), query.to_string());
4242
let table_info = TableInfo {
43-
desc: "'information_schema'.'schemata'".to_string(),
43+
desc: "'default'.'information_schema'.'schemata'".to_string(),
4444
name: "schemata".to_string(),
4545
ident: TableIdent::new(table_id, 0),
4646
meta: TableMeta {

src/query/storages/information_schema/src/statistics_table.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ impl StatisticsTable {
4848
let mut options = BTreeMap::new();
4949
options.insert(QUERY.to_string(), query);
5050
let table_info = TableInfo {
51-
desc: "'information_schema'.'statistics'".to_string(),
51+
desc: "'default'.'information_schema'.'statistics'".to_string(),
5252
name: "statistics".to_string(),
5353
ident: TableIdent::new(table_id, 0),
5454
meta: TableMeta {

0 commit comments

Comments
 (0)