Skip to content
This repository was archived by the owner on Dec 25, 2019. It is now read-only.

Commit 2dbab6f

Browse files
author
Andi Wang
committed
Support the MySQL version of show indexes.
1 parent f5812b4 commit 2dbab6f

File tree

5 files changed

+102
-0
lines changed

5 files changed

+102
-0
lines changed

src/ast/mod.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,13 @@ pub enum Statement {
624624
object_type: ObjectType,
625625
filter: Option<ShowStatementFilter>,
626626
},
627+
/// `SHOW INDEX|INDEXES|KEYS`
628+
///
629+
/// Note: this is a MySQL-specific statement
630+
ShowIndexes {
631+
table_name: ObjectName,
632+
filter: Option<ShowStatementFilter>,
633+
},
627634
/// `SHOW COLUMNS`
628635
///
629636
/// Note: this is a MySQL-specific statement.
@@ -906,6 +913,13 @@ impl fmt::Display for Statement {
906913
}
907914
Ok(())
908915
}
916+
Statement::ShowIndexes { table_name, filter } => {
917+
write!(f, "SHOW INDEXES FROM {}", table_name)?;
918+
if let Some(filter) = filter {
919+
write!(f, " {}", filter)?;
920+
}
921+
Ok(())
922+
}
909923
Statement::ShowColumns {
910924
extended,
911925
full,

src/ast/visit_macro.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,10 @@ macro_rules! make_visitor {
509509
visit_show_objects(self, object_type, filter)
510510
}
511511

512+
fn visit_show_indexes(&mut self, table_name: &'ast $($mut)* ObjectName, filter: Option<&'ast $($mut)* ShowStatementFilter>) {
513+
visit_show_indexes(self, table_name, filter)
514+
}
515+
512516
fn visit_show_columns(
513517
&mut self,
514518
extended: bool,
@@ -666,6 +670,9 @@ macro_rules! make_visitor {
666670
Statement::ShowObjects { object_type, filter } => {
667671
visitor.visit_show_objects(*object_type, filter.as_auto_ref())
668672
}
673+
Statement::ShowIndexes { table_name, filter } => {
674+
visitor.visit_show_indexes(table_name, filter.as_auto_ref())
675+
}
669676
Statement::ShowColumns {
670677
extended,
671678
full,
@@ -1559,6 +1566,17 @@ macro_rules! make_visitor {
15591566
}
15601567
}
15611568

1569+
pub fn visit_show_indexes<'ast, V: $name<'ast> + ?Sized>(
1570+
visitor: &mut V,
1571+
table_name: &'ast $($mut)* ObjectName,
1572+
filter: Option<&'ast $($mut)* ShowStatementFilter>
1573+
) {
1574+
visitor.visit_object_name(table_name);
1575+
if let Some(filter) = filter {
1576+
visitor.visit_show_statement_filter(filter);
1577+
}
1578+
}
1579+
15621580
pub fn visit_show_columns<'ast, V: $name<'ast> + ?Sized>(
15631581
visitor: &mut V,
15641582
_extended: bool,

src/dialect/keywords.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ define_keywords!(
205205
IMMEDIATE,
206206
IN,
207207
INDEX,
208+
INDEXES,
208209
INDICATOR,
209210
INNER,
210211
INOUT,
@@ -220,6 +221,7 @@ define_keywords!(
220221
ISOLATION,
221222
JOIN,
222223
KEY,
224+
KEYS,
223225
LAG,
224226
LANGUAGE,
225227
LARGE,

src/parser.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2013,6 +2013,22 @@ impl Parser {
20132013
},
20142014
filter: self.parse_show_statement_filter()?,
20152015
})
2016+
} else if self
2017+
.parse_one_of_keywords(&["INDEX", "INDEXES", "KEYS"])
2018+
.is_some()
2019+
{
2020+
match self.parse_one_of_keywords(&["FROM", "IN"]) {
2021+
Some(_) => {
2022+
let table_name = self.parse_object_name()?;
2023+
let filter = if self.parse_keyword("WHERE") {
2024+
Some(ShowStatementFilter::Where(self.parse_expr()?))
2025+
} else {
2026+
None
2027+
};
2028+
Ok(Statement::ShowIndexes { table_name, filter })
2029+
}
2030+
None => self.expected("FROM or IN after SHOW INDEXES", self.peek_token()),
2031+
}
20162032
} else if self.parse_keywords(vec!["CREATE", "VIEW"]) {
20172033
Ok(Statement::ShowCreateView {
20182034
view_name: self.parse_object_name()?,

tests/sqlparser_common.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2007,6 +2007,58 @@ fn parse_show_objects_with_like_regex() {
20072007
}
20082008
}
20092009

2010+
#[test]
2011+
fn parse_show_indexes() {
2012+
let canonical_sql = "SHOW INDEXES FROM foo";
2013+
assert_eq!(
2014+
verified_stmt(&canonical_sql),
2015+
Statement::ShowIndexes {
2016+
table_name: ObjectName(vec!["foo".into()]),
2017+
filter: None,
2018+
}
2019+
);
2020+
one_statement_parses_to("SHOW INDEXES IN foo", &canonical_sql);
2021+
let index_alias = ["INDEX", "KEYS"];
2022+
let from_alias = ["FROM", "IN"];
2023+
for i in &index_alias {
2024+
for f in &from_alias {
2025+
let sql = format!("SHOW {} {} foo", i, f);
2026+
one_statement_parses_to(&sql, &canonical_sql);
2027+
}
2028+
}
2029+
}
2030+
2031+
#[test]
2032+
fn parse_show_indexes_with_where_expr() {
2033+
let canonical_sql = "SHOW INDEXES FROM foo WHERE index_name = 'bar'";
2034+
match verified_stmt(canonical_sql) {
2035+
Statement::ShowIndexes { table_name, filter } => {
2036+
assert_eq!(
2037+
filter.unwrap(),
2038+
ShowStatementFilter::Where(Expr::BinaryOp {
2039+
left: Box::new(Expr::Identifier(Ident::new("index_name"))),
2040+
op: BinaryOperator::Eq,
2041+
right: Box::new(Expr::Value(Value::SingleQuotedString("bar".to_string()))),
2042+
})
2043+
);
2044+
assert_eq!(table_name, ObjectName(vec!["foo".into()]));
2045+
}
2046+
_ => panic!("invalid SHOW INDEXES statement"),
2047+
}
2048+
one_statement_parses_to(
2049+
"SHOW INDEXES IN foo WHERE index_name = 'bar'",
2050+
&canonical_sql,
2051+
);
2052+
let index_alias = ["INDEX", "KEYS"];
2053+
let from_alias = ["FROM", "IN"];
2054+
for i in &index_alias {
2055+
for f in &from_alias {
2056+
let sql = format!("SHOW {} {} foo WHERE index_name = 'bar'", i, f);
2057+
one_statement_parses_to(&sql, &canonical_sql);
2058+
}
2059+
}
2060+
}
2061+
20102062
#[test]
20112063
fn parse_show_create_view() {
20122064
assert_eq!(

0 commit comments

Comments
 (0)