Skip to content

Commit e190e33

Browse files
committed
feat: Support SHOW TABLES
1 parent f38efdb commit e190e33

File tree

3 files changed

+116
-15
lines changed

3 files changed

+116
-15
lines changed

src/ast/mod.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -881,6 +881,15 @@ pub enum Statement {
881881
table_name: ObjectName,
882882
filter: Option<ShowStatementFilter>,
883883
},
884+
/// SHOW TABLES
885+
///
886+
/// Note: this is a MySQL-specific statement.
887+
ShowTables {
888+
extended: bool,
889+
full: bool,
890+
db_name: Option<Ident>,
891+
filter: Option<ShowStatementFilter>,
892+
},
884893
/// `{ BEGIN [ TRANSACTION | WORK ] | START TRANSACTION } ...`
885894
StartTransaction { modes: Vec<TransactionMode> },
886895
/// `SET TRANSACTION ...`
@@ -1573,6 +1582,26 @@ impl fmt::Display for Statement {
15731582
}
15741583
Ok(())
15751584
}
1585+
Statement::ShowTables {
1586+
extended,
1587+
full,
1588+
db_name,
1589+
filter,
1590+
} => {
1591+
write!(
1592+
f,
1593+
"SHOW {extended}{full}TABLES",
1594+
extended = if *extended { "EXTENDED " } else { "" },
1595+
full = if *full { "FULL " } else { "" },
1596+
)?;
1597+
if let Some(db_name) = db_name {
1598+
write!(f, " FROM {}", db_name)?;
1599+
}
1600+
if let Some(filter) = filter {
1601+
write!(f, " {}", filter)?;
1602+
}
1603+
Ok(())
1604+
}
15761605
Statement::StartTransaction { modes } => {
15771606
write!(f, "START TRANSACTION")?;
15781607
if !modes.is_empty() {

src/parser.rs

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3270,17 +3270,19 @@ impl<'a> Parser<'a> {
32703270
}
32713271

32723272
pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
3273+
let extended = self.parse_keyword(Keyword::EXTENDED);
3274+
let full = self.parse_keyword(Keyword::FULL);
32733275
if self
3274-
.parse_one_of_keywords(&[
3275-
Keyword::EXTENDED,
3276-
Keyword::FULL,
3277-
Keyword::COLUMNS,
3278-
Keyword::FIELDS,
3279-
])
3276+
.parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
32803277
.is_some()
32813278
{
3282-
self.prev_token();
3283-
Ok(self.parse_show_columns()?)
3279+
Ok(self.parse_show_columns(extended, full)?)
3280+
} else if self.parse_keyword(Keyword::TABLES) {
3281+
Ok(self.parse_show_tables(extended, full)?)
3282+
} else if extended || full {
3283+
Err(ParserError::ParserError(
3284+
"EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
3285+
))
32843286
} else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
32853287
Ok(self.parse_show_create()?)
32863288
} else if self.parse_one_of_keywords(&[Keyword::VARIABLES]).is_some() {
@@ -3318,10 +3320,7 @@ impl<'a> Parser<'a> {
33183320
Ok(Statement::ShowCreate { obj_type, obj_name })
33193321
}
33203322

3321-
pub fn parse_show_columns(&mut self) -> Result<Statement, ParserError> {
3322-
let extended = self.parse_keyword(Keyword::EXTENDED);
3323-
let full = self.parse_keyword(Keyword::FULL);
3324-
self.expect_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])?;
3323+
fn parse_show_columns(&mut self, extended: bool, full: bool) -> Result<Statement, ParserError> {
33253324
self.expect_one_of_keywords(&[Keyword::FROM, Keyword::IN])?;
33263325
let table_name = self.parse_object_name()?;
33273326
let double_from = self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]);
@@ -3349,9 +3348,21 @@ impl<'a> Parser<'a> {
33493348
})
33503349
}
33513350

3352-
pub fn parse_show_statement_filter(
3353-
&mut self,
3354-
) -> Result<Option<ShowStatementFilter>, ParserError> {
3351+
fn parse_show_tables(&mut self, extended: bool, full: bool) -> Result<Statement, ParserError> {
3352+
let db_name = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
3353+
Some(_) => Some(self.parse_identifier()?),
3354+
None => None,
3355+
};
3356+
let filter = self.parse_show_statement_filter()?;
3357+
Ok(Statement::ShowTables {
3358+
extended,
3359+
full,
3360+
db_name,
3361+
filter,
3362+
})
3363+
}
3364+
3365+
fn parse_show_statement_filter(&mut self) -> Result<Option<ShowStatementFilter>, ParserError> {
33553366
if self.parse_keyword(Keyword::LIKE) {
33563367
Ok(Some(ShowStatementFilter::Like(
33573368
self.parse_literal_string()?,

tests/sqlparser_mysql.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,67 @@ fn parse_show_columns() {
101101
);
102102
}
103103

104+
#[test]
105+
fn parse_show_tables() {
106+
assert_eq!(
107+
mysql_and_generic().verified_stmt("SHOW TABLES"),
108+
Statement::ShowTables {
109+
extended: false,
110+
full: false,
111+
db_name: None,
112+
filter: None,
113+
}
114+
);
115+
assert_eq!(
116+
mysql_and_generic().verified_stmt("SHOW TABLES FROM mydb"),
117+
Statement::ShowTables {
118+
extended: false,
119+
full: false,
120+
db_name: Some(Ident::new("mydb")),
121+
filter: None,
122+
}
123+
);
124+
assert_eq!(
125+
mysql_and_generic().verified_stmt("SHOW EXTENDED TABLES"),
126+
Statement::ShowTables {
127+
extended: true,
128+
full: false,
129+
db_name: None,
130+
filter: None,
131+
}
132+
);
133+
assert_eq!(
134+
mysql_and_generic().verified_stmt("SHOW FULL TABLES"),
135+
Statement::ShowTables {
136+
extended: false,
137+
full: true,
138+
db_name: None,
139+
filter: None,
140+
}
141+
);
142+
assert_eq!(
143+
mysql_and_generic().verified_stmt("SHOW TABLES LIKE 'pattern'"),
144+
Statement::ShowTables {
145+
extended: false,
146+
full: false,
147+
db_name: None,
148+
filter: Some(ShowStatementFilter::Like("pattern".into())),
149+
}
150+
);
151+
assert_eq!(
152+
mysql_and_generic().verified_stmt("SHOW TABLES WHERE 1 = 2"),
153+
Statement::ShowTables {
154+
extended: false,
155+
full: false,
156+
db_name: None,
157+
filter: Some(ShowStatementFilter::Where(
158+
mysql_and_generic().verified_expr("1 = 2")
159+
)),
160+
}
161+
);
162+
mysql_and_generic().one_statement_parses_to("SHOW TABLES IN mydb", "SHOW TABLES FROM mydb");
163+
}
164+
104165
#[test]
105166
fn parse_show_create() {
106167
let obj_name = ObjectName(vec![Ident::new("myident")]);

0 commit comments

Comments
 (0)