Skip to content

Commit 9a5716d

Browse files
authored
feat: Support SHOW CREATE TABLE|EVENT|FUNCTION (MySQL specific) (apache#338)
* feat: Support SHOW CREATE TABLE|EVENT|FUNCTION (MySQL specific) * misc: Simplify test with loop over enum values
1 parent 69af5a1 commit 9a5716d

File tree

4 files changed

+87
-1
lines changed

4 files changed

+87
-1
lines changed

src/ast/mod.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,28 @@ impl fmt::Display for AddDropSync {
523523
}
524524
}
525525

526+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
527+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
528+
pub enum ShowCreateObject {
529+
Event,
530+
Function,
531+
Procedure,
532+
Table,
533+
Trigger,
534+
}
535+
536+
impl fmt::Display for ShowCreateObject {
537+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
538+
match self {
539+
ShowCreateObject::Event => f.write_str("EVENT"),
540+
ShowCreateObject::Function => f.write_str("FUNCTION"),
541+
ShowCreateObject::Procedure => f.write_str("PROCEDURE"),
542+
ShowCreateObject::Table => f.write_str("TABLE"),
543+
ShowCreateObject::Trigger => f.write_str("TRIGGER"),
544+
}
545+
}
546+
}
547+
526548
/// A top-level statement (SELECT, INSERT, CREATE, etc.)
527549
#[allow(clippy::large_enum_variant)]
528550
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -685,6 +707,13 @@ pub enum Statement {
685707
///
686708
/// Note: this is a PostgreSQL-specific statement.
687709
ShowVariable { variable: Vec<Ident> },
710+
/// SHOW CREATE TABLE
711+
///
712+
/// Note: this is a MySQL-specific statement.
713+
ShowCreate {
714+
obj_type: ShowCreateObject,
715+
obj_name: ObjectName,
716+
},
688717
/// SHOW COLUMNS
689718
///
690719
/// Note: this is a MySQL-specific statement.
@@ -1196,6 +1225,15 @@ impl fmt::Display for Statement {
11961225
}
11971226
Ok(())
11981227
}
1228+
Statement::ShowCreate { obj_type, obj_name } => {
1229+
write!(
1230+
f,
1231+
"SHOW CREATE {obj_type} {obj_name}",
1232+
obj_type = obj_type,
1233+
obj_name = obj_name,
1234+
)?;
1235+
Ok(())
1236+
}
11991237
Statement::ShowColumns {
12001238
extended,
12011239
full,

src/dialect/keywords.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ define_keywords!(
193193
EQUALS,
194194
ERROR,
195195
ESCAPE,
196+
EVENT,
196197
EVERY,
197198
EXCEPT,
198199
EXEC,

src/parser.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2541,14 +2541,40 @@ impl<'a> Parser<'a> {
25412541
.is_some()
25422542
{
25432543
self.prev_token();
2544-
self.parse_show_columns()
2544+
Ok(self.parse_show_columns()?)
2545+
} else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
2546+
Ok(self.parse_show_create()?)
25452547
} else {
25462548
Ok(Statement::ShowVariable {
25472549
variable: self.parse_identifiers()?,
25482550
})
25492551
}
25502552
}
25512553

2554+
fn parse_show_create(&mut self) -> Result<Statement, ParserError> {
2555+
let obj_type = match self.expect_one_of_keywords(&[
2556+
Keyword::TABLE,
2557+
Keyword::TRIGGER,
2558+
Keyword::FUNCTION,
2559+
Keyword::PROCEDURE,
2560+
Keyword::EVENT,
2561+
])? {
2562+
Keyword::TABLE => Ok(ShowCreateObject::Table),
2563+
Keyword::TRIGGER => Ok(ShowCreateObject::Trigger),
2564+
Keyword::FUNCTION => Ok(ShowCreateObject::Function),
2565+
Keyword::PROCEDURE => Ok(ShowCreateObject::Procedure),
2566+
Keyword::EVENT => Ok(ShowCreateObject::Event),
2567+
keyword => Err(ParserError::ParserError(format!(
2568+
"Unable to map keyword to ShowCreateObject: {:?}",
2569+
keyword
2570+
))),
2571+
}?;
2572+
2573+
let obj_name = self.parse_object_name()?;
2574+
2575+
Ok(Statement::ShowCreate { obj_type, obj_name })
2576+
}
2577+
25522578
fn parse_show_columns(&mut self) -> Result<Statement, ParserError> {
25532579
let extended = self.parse_keyword(Keyword::EXTENDED);
25542580
let full = self.parse_keyword(Keyword::FULL);

tests/sqlparser_mysql.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,27 @@ fn parse_show_columns() {
100100
}
101101
}
102102

103+
#[test]
104+
fn parse_show_create() {
105+
let obj_name = ObjectName(vec![Ident::new("myident")]);
106+
107+
for obj_type in &vec![
108+
ShowCreateObject::Table,
109+
ShowCreateObject::Trigger,
110+
ShowCreateObject::Event,
111+
ShowCreateObject::Function,
112+
ShowCreateObject::Procedure,
113+
] {
114+
assert_eq!(
115+
mysql_and_generic().verified_stmt(format!("SHOW CREATE {} myident", obj_type).as_str()),
116+
Statement::ShowCreate {
117+
obj_type: obj_type.clone(),
118+
obj_name: obj_name.clone(),
119+
}
120+
);
121+
}
122+
}
123+
103124
#[test]
104125
fn parse_create_table_auto_increment() {
105126
let sql = "CREATE TABLE foo (bar INT PRIMARY KEY AUTO_INCREMENT)";

0 commit comments

Comments
 (0)