Skip to content

Commit c3c9de0

Browse files
committed
feat: Support SHOW COLUMNS {FROM tbl} [FROM db] (#8)
* feat: Support SHOW COLUMNS FROM tbl FROM db * Fix formatting in SHOW COLUMNS
1 parent 65dff57 commit c3c9de0

File tree

2 files changed

+21
-10
lines changed

2 files changed

+21
-10
lines changed

src/parser.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3324,14 +3324,27 @@ impl<'a> Parser<'a> {
33243324
self.expect_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])?;
33253325
self.expect_one_of_keywords(&[Keyword::FROM, Keyword::IN])?;
33263326
let table_name = self.parse_object_name()?;
3327-
// MySQL also supports FROM <database> here. In other words, MySQL
3328-
// allows both FROM <table> FROM <database> and FROM <database>.<table>,
3329-
// while we only support the latter for now.
3327+
let double_from = self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]);
3328+
let db_name = if double_from.is_some() {
3329+
Some(self.parse_object_name()?)
3330+
} else {
3331+
None
3332+
};
3333+
let object_name = match db_name {
3334+
Some(db_name) => ObjectName(
3335+
db_name
3336+
.0
3337+
.into_iter()
3338+
.chain(table_name.0.into_iter())
3339+
.collect(),
3340+
),
3341+
None => table_name,
3342+
};
33303343
let filter = self.parse_show_statement_filter()?;
33313344
Ok(Statement::ShowColumns {
33323345
extended,
33333346
full,
3334-
table_name,
3347+
table_name: object_name,
33353348
filter,
33363349
})
33373350
}

tests/sqlparser_mysql.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,10 @@ fn parse_show_columns() {
9595
.one_statement_parses_to("SHOW COLUMNS IN mytable", "SHOW COLUMNS FROM mytable");
9696
mysql_and_generic()
9797
.one_statement_parses_to("SHOW FIELDS IN mytable", "SHOW COLUMNS FROM mytable");
98-
99-
// unhandled things are truly unhandled
100-
match mysql_and_generic().parse_sql_statements("SHOW COLUMNS FROM mytable FROM mydb") {
101-
Err(_) => {}
102-
Ok(val) => panic!("unexpected successful parse: {:?}", val),
103-
}
98+
mysql_and_generic().one_statement_parses_to(
99+
"SHOW COLUMNS FROM mytable FROM mydb",
100+
"SHOW COLUMNS FROM mydb.mytable",
101+
);
104102
}
105103

106104
#[test]

0 commit comments

Comments
 (0)