mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-09-20 12:49:47 +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,
|
||||
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
|
||||
///
|
||||
/// Note: This is a MySQL-specific statement.
|
||||
|
@ -1859,6 +1868,26 @@ impl fmt::Display for Statement {
|
|||
}
|
||||
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 } => {
|
||||
write!(f, "USE {}", db_name)?;
|
||||
Ok(())
|
||||
|
|
|
@ -3727,17 +3727,19 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
|
||||
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
|
||||
.parse_one_of_keywords(&[
|
||||
Keyword::EXTENDED,
|
||||
Keyword::FULL,
|
||||
Keyword::COLUMNS,
|
||||
Keyword::FIELDS,
|
||||
])
|
||||
.parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
|
||||
.is_some()
|
||||
{
|
||||
self.prev_token();
|
||||
Ok(self.parse_show_columns()?)
|
||||
Ok(self.parse_show_columns(extended, full)?)
|
||||
} 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() {
|
||||
Ok(self.parse_show_create()?)
|
||||
} else if self.parse_keyword(Keyword::VARIABLES)
|
||||
|
@ -3780,10 +3782,11 @@ impl<'a> Parser<'a> {
|
|||
Ok(Statement::ShowCreate { obj_type, obj_name })
|
||||
}
|
||||
|
||||
pub fn parse_show_columns(&mut self) -> Result<Statement, ParserError> {
|
||||
let extended = self.parse_keyword(Keyword::EXTENDED);
|
||||
let full = self.parse_keyword(Keyword::FULL);
|
||||
self.expect_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])?;
|
||||
pub fn parse_show_columns(
|
||||
&mut self,
|
||||
extended: bool,
|
||||
full: bool,
|
||||
) -> Result<Statement, ParserError> {
|
||||
self.expect_one_of_keywords(&[Keyword::FROM, Keyword::IN])?;
|
||||
let object_name = self.parse_object_name()?;
|
||||
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(
|
||||
&mut self,
|
||||
) -> 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]
|
||||
fn parse_show_create() {
|
||||
let obj_name = ObjectName(vec![Ident::new("myident")]);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue