Skip to content

Commit 7abfa96

Browse files
authored
feat(query): support SHOW DROP DATABASES (#16811)
add system.databases_with_history
1 parent 65b5b3d commit 7abfa96

File tree

31 files changed

+906
-568
lines changed

31 files changed

+906
-568
lines changed

src/meta/api/src/schema_api_impl.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,6 @@ impl<KV: kvapi::KVApi<Error = MetaError> + ?Sized> SchemaApi for KV {
669669
name_ident: DatabaseNameIdent::new_from(db_id_list_key.clone()),
670670
meta: db_meta,
671671
};
672-
673672
dbs.insert(db_id.db_id, Arc::new(db));
674673
}
675674
}

src/query/ast/src/ast/statements/database.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,26 @@ impl Display for ShowDatabasesStmt {
4949
}
5050
}
5151

52+
#[derive(Debug, Clone, PartialEq, Drive, DriveMut)]
53+
pub struct ShowDropDatabasesStmt {
54+
pub catalog: Option<Identifier>,
55+
pub limit: Option<ShowLimit>,
56+
}
57+
58+
impl Display for ShowDropDatabasesStmt {
59+
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
60+
write!(f, "SHOW DROP DATABASES")?;
61+
if let Some(catalog) = &self.catalog {
62+
write!(f, " FROM {catalog}")?;
63+
}
64+
if let Some(limit) = &self.limit {
65+
write!(f, " {limit}")?;
66+
}
67+
68+
Ok(())
69+
}
70+
}
71+
5272
#[derive(Debug, Clone, PartialEq, Eq, Drive, DriveMut)]
5373
pub struct ShowCreateDatabaseStmt {
5474
pub catalog: Option<Identifier>,

src/query/ast/src/ast/statements/statement.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ pub enum Statement {
127127

128128
// Databases
129129
ShowDatabases(ShowDatabasesStmt),
130+
ShowDropDatabases(ShowDropDatabasesStmt),
130131
ShowCreateDatabase(ShowCreateDatabaseStmt),
131132
CreateDatabase(CreateDatabaseStmt),
132133
DropDatabase(DropDatabaseStmt),
@@ -548,6 +549,7 @@ impl Display for Statement {
548549
Statement::CreateCatalog(stmt) => write!(f, "{stmt}")?,
549550
Statement::DropCatalog(stmt) => write!(f, "{stmt}")?,
550551
Statement::ShowDatabases(stmt) => write!(f, "{stmt}")?,
552+
Statement::ShowDropDatabases(stmt) => write!(f, "{stmt}")?,
551553
Statement::ShowCreateDatabase(stmt) => write!(f, "{stmt}")?,
552554
Statement::CreateDatabase(stmt) => write!(f, "{stmt}")?,
553555
Statement::DropDatabase(stmt) => write!(f, "{stmt}")?,

src/query/ast/src/ast/statements/table.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ pub struct ShowDropTablesStmt {
116116

117117
impl Display for ShowDropTablesStmt {
118118
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
119-
write!(f, "SHOW DROP TABLE")?;
119+
write!(f, "SHOW DROP TABLES")?;
120120
if let Some(database) = &self.database {
121121
write!(f, " FROM {database}")?;
122122
}

src/query/ast/src/parser/statement.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,19 @@ pub fn statement_body(i: Input) -> IResult<Statement> {
529529
})
530530
},
531531
);
532+
533+
let show_drop_databases = map(
534+
rule! {
535+
SHOW ~ DROP ~ ( DATABASES | DATABASES ) ~ ( FROM ~ ^#ident )? ~ #show_limit?
536+
},
537+
|(_, _, _, opt_catalog, limit)| {
538+
Statement::ShowDropDatabases(ShowDropDatabasesStmt {
539+
catalog: opt_catalog.map(|(_, catalog)| catalog),
540+
limit,
541+
})
542+
},
543+
);
544+
532545
let show_create_database = map(
533546
rule! {
534547
SHOW ~ CREATE ~ ( DATABASE | SCHEMA ) ~ #dot_separated_idents_1_to_2
@@ -2284,6 +2297,7 @@ pub fn statement_body(i: Input) -> IResult<Statement> {
22842297
#show_databases : "`SHOW [FULL] DATABASES [(FROM | IN) <catalog>] [<show_limit>]`"
22852298
| #undrop_database : "`UNDROP DATABASE <database>`"
22862299
| #show_create_database : "`SHOW CREATE DATABASE <database>`"
2300+
| #show_drop_databases : "`SHOW DROP DATABASES [FROM <database>] [<show_limit>]`"
22872301
| #create_database : "`CREATE [OR REPLACE] DATABASE [IF NOT EXISTS] <database> [ENGINE = <engine>]`"
22882302
| #drop_database : "`DROP DATABASE [IF EXISTS] <database>`"
22892303
| #alter_database : "`ALTER DATABASE [IF EXISTS] <action>`"

src/query/ast/tests/it/parser.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ fn test_statement() {
8787
let file = &mut mint.new_goldenfile("stmt.txt").unwrap();
8888
let cases = &[
8989
r#"show databases"#,
90+
r#"show drop databases"#,
91+
r#"show drop databases like 'db%'"#,
9092
r#"show databases format TabSeparatedWithNamesAndTypes;"#,
9193
r#"show tables"#,
9294
r#"show drop tables"#,

src/query/ast/tests/it/testdata/stmt.txt

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,36 @@ ShowDatabases(
1212
)
1313

1414

15+
---------- Input ----------
16+
show drop databases
17+
---------- Output ---------
18+
SHOW DROP DATABASES
19+
---------- AST ------------
20+
ShowDropDatabases(
21+
ShowDropDatabasesStmt {
22+
catalog: None,
23+
limit: None,
24+
},
25+
)
26+
27+
28+
---------- Input ----------
29+
show drop databases like 'db%'
30+
---------- Output ---------
31+
SHOW DROP DATABASES LIKE 'db%'
32+
---------- AST ------------
33+
ShowDropDatabases(
34+
ShowDropDatabasesStmt {
35+
catalog: None,
36+
limit: Some(
37+
Like {
38+
pattern: "db%",
39+
},
40+
),
41+
},
42+
)
43+
44+
1545
---------- Input ----------
1646
show databases format TabSeparatedWithNamesAndTypes;
1747
---------- Output ---------
@@ -49,7 +79,7 @@ ShowTables(
4979
---------- Input ----------
5080
show drop tables
5181
---------- Output ---------
52-
SHOW DROP TABLE
82+
SHOW DROP TABLES
5383
---------- AST ------------
5484
ShowDropTables(
5585
ShowDropTablesStmt {
@@ -62,7 +92,7 @@ ShowDropTables(
6292
---------- Input ----------
6393
show drop tables like 't%'
6494
---------- Output ---------
65-
SHOW DROP TABLE LIKE 't%'
95+
SHOW DROP TABLES LIKE 't%'
6696
---------- AST ------------
6797
ShowDropTables(
6898
ShowDropTablesStmt {
@@ -79,7 +109,7 @@ ShowDropTables(
79109
---------- Input ----------
80110
show drop tables where name='t'
81111
---------- Output ---------
82-
SHOW DROP TABLE WHERE name = 't'
112+
SHOW DROP TABLES WHERE name = 't'
83113
---------- AST ------------
84114
ShowDropTables(
85115
ShowDropTablesStmt {

src/query/catalog/src/catalog/interface.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,9 @@ pub trait Catalog: DynClone + Send + Sync + Debug {
152152
// Get the database by name.
153153
async fn get_database(&self, tenant: &Tenant, db_name: &str) -> Result<Arc<dyn Database>>;
154154

155+
// List all databases history
156+
async fn list_databases_history(&self, tenant: &Tenant) -> Result<Vec<Arc<dyn Database>>>;
157+
155158
// Get all the databases.
156159
async fn list_databases(&self, tenant: &Tenant) -> Result<Vec<Arc<dyn Database>>>;
157160

src/query/service/src/catalogs/default/database_catalog.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,17 @@ impl Catalog for DatabaseCatalog {
187187
}
188188
}
189189

190+
#[async_backtrace::framed]
191+
async fn list_databases_history(&self, tenant: &Tenant) -> Result<Vec<Arc<dyn Database>>> {
192+
let mut dbs = self
193+
.immutable_catalog
194+
.list_databases_history(tenant)
195+
.await?;
196+
let mut other = self.mutable_catalog.list_databases_history(tenant).await?;
197+
dbs.append(&mut other);
198+
Ok(dbs)
199+
}
200+
190201
#[async_backtrace::framed]
191202
async fn list_databases(&self, tenant: &Tenant) -> Result<Vec<Arc<dyn Database>>> {
192203
let mut dbs = self.immutable_catalog.list_databases(tenant).await?;

src/query/service/src/catalogs/default/immutable_catalog.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,10 @@ impl Catalog for ImmutableCatalog {
170170
}
171171
}
172172

173+
async fn list_databases_history(&self, _tenant: &Tenant) -> Result<Vec<Arc<dyn Database>>> {
174+
Ok(vec![self.sys_db.clone(), self.info_schema_db.clone()])
175+
}
176+
173177
#[async_backtrace::framed]
174178
async fn list_databases(&self, _tenant: &Tenant) -> Result<Vec<Arc<dyn Database>>> {
175179
Ok(vec![self.sys_db.clone(), self.info_schema_db.clone()])

0 commit comments

Comments
 (0)