Skip to content

Commit 896d448

Browse files
MazterQyoumcheshkov
authored andcommitted
feat: Support SHOW TABLES
Can drop this after rebase on commit b6e36ad "Support SHOW TABLES (apache#563)", first released in 0.21.0
1 parent 4cf3852 commit 896d448

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
@@ -1018,6 +1018,15 @@ pub enum Statement {
10181018
table_name: ObjectName,
10191019
filter: Option<ShowStatementFilter>,
10201020
},
1021+
/// SHOW TABLES
1022+
///
1023+
/// Note: this is a MySQL-specific statement.
1024+
ShowTables {
1025+
extended: bool,
1026+
full: bool,
1027+
db_name: Option<Ident>,
1028+
filter: Option<ShowStatementFilter>,
1029+
},
10211030
/// USE
10221031
///
10231032
/// Note: this is a MySQL-specific statement.
@@ -1802,6 +1811,26 @@ impl fmt::Display for Statement {
18021811
}
18031812
Ok(())
18041813
}
1814+
Statement::ShowTables {
1815+
extended,
1816+
full,
1817+
db_name,
1818+
filter,
1819+
} => {
1820+
write!(
1821+
f,
1822+
"SHOW {extended}{full}TABLES",
1823+
extended = if *extended { "EXTENDED " } else { "" },
1824+
full = if *full { "FULL " } else { "" },
1825+
)?;
1826+
if let Some(db_name) = db_name {
1827+
write!(f, " FROM {}", db_name)?;
1828+
}
1829+
if let Some(filter) = filter {
1830+
write!(f, " {}", filter)?;
1831+
}
1832+
Ok(())
1833+
}
18051834
Statement::Use { db_name } => {
18061835
write!(f, "USE {}", db_name)?;
18071836
Ok(())

src/parser.rs

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

35453545
pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
3546+
let extended = self.parse_keyword(Keyword::EXTENDED);
3547+
let full = self.parse_keyword(Keyword::FULL);
35463548
if self
3547-
.parse_one_of_keywords(&[
3548-
Keyword::EXTENDED,
3549-
Keyword::FULL,
3550-
Keyword::COLUMNS,
3551-
Keyword::FIELDS,
3552-
])
3549+
.parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
35533550
.is_some()
35543551
{
3555-
self.prev_token();
3556-
Ok(self.parse_show_columns()?)
3552+
Ok(self.parse_show_columns(extended, full)?)
3553+
} else if self.parse_keyword(Keyword::TABLES) {
3554+
Ok(self.parse_show_tables(extended, full)?)
3555+
} else if extended || full {
3556+
Err(ParserError::ParserError(
3557+
"EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
3558+
))
35573559
} else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
35583560
Ok(self.parse_show_create()?)
35593561
} else if self.parse_one_of_keywords(&[Keyword::VARIABLES]).is_some() {
@@ -3591,10 +3593,7 @@ impl<'a> Parser<'a> {
35913593
Ok(Statement::ShowCreate { obj_type, obj_name })
35923594
}
35933595

3594-
pub fn parse_show_columns(&mut self) -> Result<Statement, ParserError> {
3595-
let extended = self.parse_keyword(Keyword::EXTENDED);
3596-
let full = self.parse_keyword(Keyword::FULL);
3597-
self.expect_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])?;
3596+
fn parse_show_columns(&mut self, extended: bool, full: bool) -> Result<Statement, ParserError> {
35983597
self.expect_one_of_keywords(&[Keyword::FROM, Keyword::IN])?;
35993598
let table_name = self.parse_object_name()?;
36003599
let double_from = self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]);
@@ -3622,9 +3621,21 @@ impl<'a> Parser<'a> {
36223621
})
36233622
}
36243623

3625-
pub fn parse_show_statement_filter(
3626-
&mut self,
3627-
) -> Result<Option<ShowStatementFilter>, ParserError> {
3624+
fn parse_show_tables(&mut self, extended: bool, full: bool) -> Result<Statement, ParserError> {
3625+
let db_name = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
3626+
Some(_) => Some(self.parse_identifier()?),
3627+
None => None,
3628+
};
3629+
let filter = self.parse_show_statement_filter()?;
3630+
Ok(Statement::ShowTables {
3631+
extended,
3632+
full,
3633+
db_name,
3634+
filter,
3635+
})
3636+
}
3637+
3638+
fn parse_show_statement_filter(&mut self) -> Result<Option<ShowStatementFilter>, ParserError> {
36283639
if self.parse_keyword(Keyword::LIKE) {
36293640
Ok(Some(ShowStatementFilter::Like(
36303641
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_use() {
106167
assert_eq!(

0 commit comments

Comments
 (0)