mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-09-21 13:19:46 +00:00
Support SHOW TABLES
(#563)
This commit is contained in:
parent
221e9c2bab
commit
b6e36ad760
3 changed files with 137 additions and 12 deletions
|
@ -1027,6 +1027,15 @@ pub enum Statement {
|
||||||
table_name: ObjectName,
|
table_name: ObjectName,
|
||||||
filter: Option<ShowStatementFilter>,
|
filter: Option<ShowStatementFilter>,
|
||||||
},
|
},
|
||||||
|
/// SHOW TABLES
|
||||||
|
///
|
||||||
|
/// Note: this is a MySQL-specific statement.
|
||||||
|
ShowTables {
|
||||||
|
extended: bool,
|
||||||
|
full: bool,
|
||||||
|
db_name: Option<Ident>,
|
||||||
|
filter: Option<ShowStatementFilter>,
|
||||||
|
},
|
||||||
/// USE
|
/// USE
|
||||||
///
|
///
|
||||||
/// Note: This is a MySQL-specific statement.
|
/// Note: This is a MySQL-specific statement.
|
||||||
|
@ -1859,6 +1868,26 @@ impl fmt::Display for Statement {
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Statement::ShowTables {
|
||||||
|
extended,
|
||||||
|
full,
|
||||||
|
db_name,
|
||||||
|
filter,
|
||||||
|
} => {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"SHOW {extended}{full}TABLES",
|
||||||
|
extended = if *extended { "EXTENDED " } else { "" },
|
||||||
|
full = if *full { "FULL " } else { "" },
|
||||||
|
)?;
|
||||||
|
if let Some(db_name) = db_name {
|
||||||
|
write!(f, " FROM {}", db_name)?;
|
||||||
|
}
|
||||||
|
if let Some(filter) = filter {
|
||||||
|
write!(f, " {}", filter)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
Statement::Use { db_name } => {
|
Statement::Use { db_name } => {
|
||||||
write!(f, "USE {}", db_name)?;
|
write!(f, "USE {}", db_name)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -3727,17 +3727,19 @@ impl<'a> Parser<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
|
pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
|
||||||
|
let extended = self.parse_keyword(Keyword::EXTENDED);
|
||||||
|
let full = self.parse_keyword(Keyword::FULL);
|
||||||
if self
|
if self
|
||||||
.parse_one_of_keywords(&[
|
.parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
|
||||||
Keyword::EXTENDED,
|
|
||||||
Keyword::FULL,
|
|
||||||
Keyword::COLUMNS,
|
|
||||||
Keyword::FIELDS,
|
|
||||||
])
|
|
||||||
.is_some()
|
.is_some()
|
||||||
{
|
{
|
||||||
self.prev_token();
|
Ok(self.parse_show_columns(extended, full)?)
|
||||||
Ok(self.parse_show_columns()?)
|
} else if self.parse_keyword(Keyword::TABLES) {
|
||||||
|
Ok(self.parse_show_tables(extended, full)?)
|
||||||
|
} else if extended || full {
|
||||||
|
Err(ParserError::ParserError(
|
||||||
|
"EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
|
||||||
|
))
|
||||||
} else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
|
} else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
|
||||||
Ok(self.parse_show_create()?)
|
Ok(self.parse_show_create()?)
|
||||||
} else if self.parse_keyword(Keyword::VARIABLES)
|
} else if self.parse_keyword(Keyword::VARIABLES)
|
||||||
|
@ -3780,10 +3782,11 @@ impl<'a> Parser<'a> {
|
||||||
Ok(Statement::ShowCreate { obj_type, obj_name })
|
Ok(Statement::ShowCreate { obj_type, obj_name })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_show_columns(&mut self) -> Result<Statement, ParserError> {
|
pub fn parse_show_columns(
|
||||||
let extended = self.parse_keyword(Keyword::EXTENDED);
|
&mut self,
|
||||||
let full = self.parse_keyword(Keyword::FULL);
|
extended: bool,
|
||||||
self.expect_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])?;
|
full: bool,
|
||||||
|
) -> Result<Statement, ParserError> {
|
||||||
self.expect_one_of_keywords(&[Keyword::FROM, Keyword::IN])?;
|
self.expect_one_of_keywords(&[Keyword::FROM, Keyword::IN])?;
|
||||||
let object_name = self.parse_object_name()?;
|
let object_name = self.parse_object_name()?;
|
||||||
let table_name = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
|
let table_name = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
|
||||||
|
@ -3804,6 +3807,24 @@ impl<'a> Parser<'a> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn parse_show_tables(
|
||||||
|
&mut self,
|
||||||
|
extended: bool,
|
||||||
|
full: bool,
|
||||||
|
) -> Result<Statement, ParserError> {
|
||||||
|
let db_name = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
|
||||||
|
Some(_) => Some(self.parse_identifier()?),
|
||||||
|
None => None,
|
||||||
|
};
|
||||||
|
let filter = self.parse_show_statement_filter()?;
|
||||||
|
Ok(Statement::ShowTables {
|
||||||
|
extended,
|
||||||
|
full,
|
||||||
|
db_name,
|
||||||
|
filter,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
pub fn parse_show_statement_filter(
|
pub fn parse_show_statement_filter(
|
||||||
&mut self,
|
&mut self,
|
||||||
) -> Result<Option<ShowStatementFilter>, ParserError> {
|
) -> Result<Option<ShowStatementFilter>, ParserError> {
|
||||||
|
|
|
@ -116,6 +116,81 @@ fn parse_show_columns() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_show_tables() {
|
||||||
|
assert_eq!(
|
||||||
|
mysql_and_generic().verified_stmt("SHOW TABLES"),
|
||||||
|
Statement::ShowTables {
|
||||||
|
extended: false,
|
||||||
|
full: false,
|
||||||
|
db_name: None,
|
||||||
|
filter: None,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
mysql_and_generic().verified_stmt("SHOW TABLES FROM mydb"),
|
||||||
|
Statement::ShowTables {
|
||||||
|
extended: false,
|
||||||
|
full: false,
|
||||||
|
db_name: Some(Ident::new("mydb")),
|
||||||
|
filter: None,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
mysql_and_generic().verified_stmt("SHOW EXTENDED TABLES"),
|
||||||
|
Statement::ShowTables {
|
||||||
|
extended: true,
|
||||||
|
full: false,
|
||||||
|
db_name: None,
|
||||||
|
filter: None,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
mysql_and_generic().verified_stmt("SHOW FULL TABLES"),
|
||||||
|
Statement::ShowTables {
|
||||||
|
extended: false,
|
||||||
|
full: true,
|
||||||
|
db_name: None,
|
||||||
|
filter: None,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
mysql_and_generic().verified_stmt("SHOW TABLES LIKE 'pattern'"),
|
||||||
|
Statement::ShowTables {
|
||||||
|
extended: false,
|
||||||
|
full: false,
|
||||||
|
db_name: None,
|
||||||
|
filter: Some(ShowStatementFilter::Like("pattern".into())),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
mysql_and_generic().verified_stmt("SHOW TABLES WHERE 1 = 2"),
|
||||||
|
Statement::ShowTables {
|
||||||
|
extended: false,
|
||||||
|
full: false,
|
||||||
|
db_name: None,
|
||||||
|
filter: Some(ShowStatementFilter::Where(
|
||||||
|
mysql_and_generic().verified_expr("1 = 2")
|
||||||
|
)),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
mysql_and_generic().one_statement_parses_to("SHOW TABLES IN mydb", "SHOW TABLES FROM mydb");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_show_extended_full() {
|
||||||
|
assert!(mysql_and_generic()
|
||||||
|
.parse_sql_statements("SHOW EXTENDED FULL TABLES")
|
||||||
|
.is_ok());
|
||||||
|
assert!(mysql_and_generic()
|
||||||
|
.parse_sql_statements("SHOW EXTENDED FULL COLUMNS FROM mytable")
|
||||||
|
.is_ok());
|
||||||
|
// SHOW EXTENDED/FULL can only be used with COLUMNS and TABLES
|
||||||
|
assert!(mysql_and_generic()
|
||||||
|
.parse_sql_statements("SHOW EXTENDED FULL CREATE TABLE mytable")
|
||||||
|
.is_err());
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_show_create() {
|
fn parse_show_create() {
|
||||||
let obj_name = ObjectName(vec![Ident::new("myident")]);
|
let obj_name = ObjectName(vec![Ident::new("myident")]);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue