Skip to content

Commit 9aac761

Browse files
authored
Merge pull request #2 from MaterializeInc/show-columns
Support `SHOW COLUMNS FROM mytable`
2 parents 6439120 + 1a8a132 commit 9aac761

File tree

5 files changed

+61
-0
lines changed

5 files changed

+61
-0
lines changed

src/ast/mod.rs

+8
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,13 @@ pub enum Statement {
450450
Peek { name: ObjectName },
451451
/// TAIL
452452
Tail { name: ObjectName },
453+
/// The mysql-ish `SHOW COLUMNS FROM`
454+
///
455+
/// ```sql
456+
/// SHOW COLUMNS FROM mydb.mytable;
457+
/// ```
458+
/// Limitations: doesn't support `LIKE`, `WHERE` or `SHOW COLUMNS FROM mytable FROM mydb;`
459+
ShowColumns { table_name: ObjectName },
453460
}
454461

455462
impl fmt::Display for Statement {
@@ -655,6 +662,7 @@ impl fmt::Display for Statement {
655662
write!(f, "ROLLBACK{}", if *chain { " AND CHAIN" } else { "" },)
656663
}
657664
Statement::Peek { name } => write!(f, "PEEK {}", name),
665+
Statement::ShowColumns { table_name } => write!(f, "SHOW COLUMNS FROM {}", table_name),
658666
Statement::Tail { name } => write!(f, "TAIL {}", name),
659667
}
660668
}

src/ast/visit.rs

+9
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,10 @@ pub trait Visit<'ast> {
465465
visit_peek(self, name)
466466
}
467467

468+
fn visit_show_columns(&mut self, name: &'ast ObjectName) {
469+
visit_show_columns(self, name)
470+
}
471+
468472
fn visit_tail(&mut self, name: &'ast ObjectName) {
469473
visit_tail(self, name)
470474
}
@@ -542,6 +546,7 @@ pub fn visit_statement<'ast, V: Visit<'ast> + ?Sized>(visitor: &mut V, statement
542546
Statement::Peek { name } => {
543547
visitor.visit_peek(name);
544548
}
549+
Statement::ShowColumns { table_name } => visitor.visit_show_columns(table_name),
545550
Statement::Tail { name } => {
546551
visitor.visit_tail(name);
547552
}
@@ -1366,6 +1371,10 @@ pub fn visit_peek<'ast, V: Visit<'ast> + ?Sized>(visitor: &mut V, name: &'ast Ob
13661371
visitor.visit_object_name(name);
13671372
}
13681373

1374+
pub fn visit_show_columns<'ast, V: Visit<'ast> + ?Sized>(visitor: &mut V, name: &'ast ObjectName) {
1375+
visitor.visit_object_name(name);
1376+
}
1377+
13691378
pub fn visit_tail<'ast, V: Visit<'ast> + ?Sized>(visitor: &mut V, name: &'ast ObjectName) {
13701379
visitor.visit_object_name(name);
13711380
}

src/dialect/keywords.rs

+2
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ define_keywords!(
102102
COLLATE,
103103
COLLECT,
104104
COLUMN,
105+
COLUMNS,
105106
COMMIT,
106107
COMMITTED,
107108
CONDITION,
@@ -337,6 +338,7 @@ define_keywords!(
337338
SERIALIZABLE,
338339
SESSION_USER,
339340
SET,
341+
SHOW,
340342
SIMILAR,
341343
SINK,
342344
SMALLINT,

src/parser.rs

+20
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ impl Parser {
137137
"PEEK" => Ok(Statement::Peek {
138138
name: self.parse_object_name()?,
139139
}),
140+
"SHOW" => Ok(self.parse_show()?),
140141
"TAIL" => Ok(Statement::Tail {
141142
name: self.parse_object_name()?,
142143
}),
@@ -1663,6 +1664,25 @@ impl Parser {
16631664
})
16641665
}
16651666

1667+
pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
1668+
if self.parse_keyword("COLUMNS") {
1669+
self.parse_show_columns()
1670+
} else {
1671+
self.expected("COLUMNS", self.peek_token())
1672+
}
1673+
}
1674+
1675+
fn parse_show_columns(&mut self) -> Result<Statement, ParserError> {
1676+
if !self.parse_keyword("FROM") {
1677+
return self.expected("FROM", self.peek_token());
1678+
}
1679+
let table_or_schema = self.parse_object_name()?;
1680+
1681+
Ok(Statement::ShowColumns {
1682+
table_name: table_or_schema,
1683+
})
1684+
}
1685+
16661686
pub fn parse_table_and_joins(&mut self) -> Result<TableWithJoins, ParserError> {
16671687
let relation = self.parse_table_factor()?;
16681688

tests/sqlparser_common.rs

+22
Original file line numberDiff line numberDiff line change
@@ -1459,6 +1459,28 @@ fn parse_searched_case_expr() {
14591459
);
14601460
}
14611461

1462+
#[test]
1463+
fn parse_show_columns() {
1464+
assert_eq!(
1465+
verified_stmt("SHOW COLUMNS FROM mytable"),
1466+
Statement::ShowColumns {
1467+
table_name: ObjectName(vec!["mytable".to_string()])
1468+
}
1469+
);
1470+
assert_eq!(
1471+
verified_stmt("SHOW COLUMNS FROM mydb.mytable"),
1472+
Statement::ShowColumns {
1473+
table_name: ObjectName(vec!["mydb".to_string(), "mytable".to_string()])
1474+
}
1475+
);
1476+
1477+
// unhandled things are truly unhandled
1478+
match parse_sql_statements("SHOW COLUMNS FROM mytable FROM mydb") {
1479+
Err(_) => {}
1480+
Ok(val) => panic!("unexpected successful parse: {:?}", val),
1481+
}
1482+
}
1483+
14621484
#[test]
14631485
fn parse_simple_case_expr() {
14641486
// ANSI calls a CASE expression with an operand "<simple case>"

0 commit comments

Comments
 (0)