Skip to content

Commit b6e36ad

Browse files
authored
Support SHOW TABLES (apache#563)
1 parent 221e9c2 commit b6e36ad

File tree

3 files changed

+137
-12
lines changed

3 files changed

+137
-12
lines changed

src/ast/mod.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,6 +1027,15 @@ pub enum Statement {
10271027
table_name: ObjectName,
10281028
filter: Option<ShowStatementFilter>,
10291029
},
1030+
/// SHOW TABLES
1031+
///
1032+
/// Note: this is a MySQL-specific statement.
1033+
ShowTables {
1034+
extended: bool,
1035+
full: bool,
1036+
db_name: Option<Ident>,
1037+
filter: Option<ShowStatementFilter>,
1038+
},
10301039
/// USE
10311040
///
10321041
/// Note: This is a MySQL-specific statement.
@@ -1859,6 +1868,26 @@ impl fmt::Display for Statement {
18591868
}
18601869
Ok(())
18611870
}
1871+
Statement::ShowTables {
1872+
extended,
1873+
full,
1874+
db_name,
1875+
filter,
1876+
} => {
1877+
write!(
1878+
f,
1879+
"SHOW {extended}{full}TABLES",
1880+
extended = if *extended { "EXTENDED " } else { "" },
1881+
full = if *full { "FULL " } else { "" },
1882+
)?;
1883+
if let Some(db_name) = db_name {
1884+
write!(f, " FROM {}", db_name)?;
1885+
}
1886+
if let Some(filter) = filter {
1887+
write!(f, " {}", filter)?;
1888+
}
1889+
Ok(())
1890+
}
18621891
Statement::Use { db_name } => {
18631892
write!(f, "USE {}", db_name)?;
18641893
Ok(())

src/parser.rs

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3727,17 +3727,19 @@ impl<'a> Parser<'a> {
37273727
}
37283728

37293729
pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
3730+
let extended = self.parse_keyword(Keyword::EXTENDED);
3731+
let full = self.parse_keyword(Keyword::FULL);
37303732
if self
3731-
.parse_one_of_keywords(&[
3732-
Keyword::EXTENDED,
3733-
Keyword::FULL,
3734-
Keyword::COLUMNS,
3735-
Keyword::FIELDS,
3736-
])
3733+
.parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
37373734
.is_some()
37383735
{
3739-
self.prev_token();
3740-
Ok(self.parse_show_columns()?)
3736+
Ok(self.parse_show_columns(extended, full)?)
3737+
} else if self.parse_keyword(Keyword::TABLES) {
3738+
Ok(self.parse_show_tables(extended, full)?)
3739+
} else if extended || full {
3740+
Err(ParserError::ParserError(
3741+
"EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
3742+
))
37413743
} else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
37423744
Ok(self.parse_show_create()?)
37433745
} else if self.parse_keyword(Keyword::VARIABLES)
@@ -3780,10 +3782,11 @@ impl<'a> Parser<'a> {
37803782
Ok(Statement::ShowCreate { obj_type, obj_name })
37813783
}
37823784

3783-
pub fn parse_show_columns(&mut self) -> Result<Statement, ParserError> {
3784-
let extended = self.parse_keyword(Keyword::EXTENDED);
3785-
let full = self.parse_keyword(Keyword::FULL);
3786-
self.expect_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])?;
3785+
pub fn parse_show_columns(
3786+
&mut self,
3787+
extended: bool,
3788+
full: bool,
3789+
) -> Result<Statement, ParserError> {
37873790
self.expect_one_of_keywords(&[Keyword::FROM, Keyword::IN])?;
37883791
let object_name = self.parse_object_name()?;
37893792
let table_name = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
@@ -3804,6 +3807,24 @@ impl<'a> Parser<'a> {
38043807
})
38053808
}
38063809

3810+
pub fn parse_show_tables(
3811+
&mut self,
3812+
extended: bool,
3813+
full: bool,
3814+
) -> Result<Statement, ParserError> {
3815+
let db_name = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
3816+
Some(_) => Some(self.parse_identifier()?),
3817+
None => None,
3818+
};
3819+
let filter = self.parse_show_statement_filter()?;
3820+
Ok(Statement::ShowTables {
3821+
extended,
3822+
full,
3823+
db_name,
3824+
filter,
3825+
})
3826+
}
3827+
38073828
pub fn parse_show_statement_filter(
38083829
&mut self,
38093830
) -> Result<Option<ShowStatementFilter>, ParserError> {

tests/sqlparser_mysql.rs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,81 @@ fn parse_show_columns() {
116116
);
117117
}
118118

119+
#[test]
120+
fn parse_show_tables() {
121+
assert_eq!(
122+
mysql_and_generic().verified_stmt("SHOW TABLES"),
123+
Statement::ShowTables {
124+
extended: false,
125+
full: false,
126+
db_name: None,
127+
filter: None,
128+
}
129+
);
130+
assert_eq!(
131+
mysql_and_generic().verified_stmt("SHOW TABLES FROM mydb"),
132+
Statement::ShowTables {
133+
extended: false,
134+
full: false,
135+
db_name: Some(Ident::new("mydb")),
136+
filter: None,
137+
}
138+
);
139+
assert_eq!(
140+
mysql_and_generic().verified_stmt("SHOW EXTENDED TABLES"),
141+
Statement::ShowTables {
142+
extended: true,
143+
full: false,
144+
db_name: None,
145+
filter: None,
146+
}
147+
);
148+
assert_eq!(
149+
mysql_and_generic().verified_stmt("SHOW FULL TABLES"),
150+
Statement::ShowTables {
151+
extended: false,
152+
full: true,
153+
db_name: None,
154+
filter: None,
155+
}
156+
);
157+
assert_eq!(
158+
mysql_and_generic().verified_stmt("SHOW TABLES LIKE 'pattern'"),
159+
Statement::ShowTables {
160+
extended: false,
161+
full: false,
162+
db_name: None,
163+
filter: Some(ShowStatementFilter::Like("pattern".into())),
164+
}
165+
);
166+
assert_eq!(
167+
mysql_and_generic().verified_stmt("SHOW TABLES WHERE 1 = 2"),
168+
Statement::ShowTables {
169+
extended: false,
170+
full: false,
171+
db_name: None,
172+
filter: Some(ShowStatementFilter::Where(
173+
mysql_and_generic().verified_expr("1 = 2")
174+
)),
175+
}
176+
);
177+
mysql_and_generic().one_statement_parses_to("SHOW TABLES IN mydb", "SHOW TABLES FROM mydb");
178+
}
179+
180+
#[test]
181+
fn parse_show_extended_full() {
182+
assert!(mysql_and_generic()
183+
.parse_sql_statements("SHOW EXTENDED FULL TABLES")
184+
.is_ok());
185+
assert!(mysql_and_generic()
186+
.parse_sql_statements("SHOW EXTENDED FULL COLUMNS FROM mytable")
187+
.is_ok());
188+
// SHOW EXTENDED/FULL can only be used with COLUMNS and TABLES
189+
assert!(mysql_and_generic()
190+
.parse_sql_statements("SHOW EXTENDED FULL CREATE TABLE mytable")
191+
.is_err());
192+
}
193+
119194
#[test]
120195
fn parse_show_create() {
121196
let obj_name = ObjectName(vec![Ident::new("myident")]);

0 commit comments

Comments
 (0)