Skip to content

Commit 0480ee9

Browse files
artorias1024yukunpengalamb
authored
feat: Add support for parsing the syntax of MySQL UNIQUE KEY. (#962)
Co-authored-by: yukunpeng <yukunpeng@zhoupudata.com> Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org>
1 parent bb7b05e commit 0480ee9

File tree

2 files changed

+65
-3
lines changed

2 files changed

+65
-3
lines changed

src/parser/mod.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3941,9 +3941,15 @@ impl<'a> Parser<'a> {
39413941
match next_token.token {
39423942
Token::Word(w) if w.keyword == Keyword::PRIMARY || w.keyword == Keyword::UNIQUE => {
39433943
let is_primary = w.keyword == Keyword::PRIMARY;
3944-
if is_primary {
3945-
self.expect_keyword(Keyword::KEY)?;
3946-
}
3944+
3945+
// parse optional [KEY]
3946+
let _ = self.parse_keyword(Keyword::KEY);
3947+
3948+
// optional constraint name
3949+
let name = self
3950+
.maybe_parse(|parser| parser.parse_identifier())
3951+
.or(name);
3952+
39473953
let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
39483954
Ok(Some(TableConstraint::Unique {
39493955
name,

tests/sqlparser_mysql.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,62 @@ fn parse_create_table_auto_increment() {
297297
}
298298
}
299299

300+
#[test]
301+
fn parse_create_table_unique_key() {
302+
let sql = "CREATE TABLE foo (id INT PRIMARY KEY AUTO_INCREMENT, bar INT NOT NULL, UNIQUE KEY bar_key (bar))";
303+
let canonical = "CREATE TABLE foo (id INT PRIMARY KEY AUTO_INCREMENT, bar INT NOT NULL, CONSTRAINT bar_key UNIQUE (bar))";
304+
match mysql().one_statement_parses_to(sql, canonical) {
305+
Statement::CreateTable {
306+
name,
307+
columns,
308+
constraints,
309+
..
310+
} => {
311+
assert_eq!(name.to_string(), "foo");
312+
assert_eq!(
313+
vec![TableConstraint::Unique {
314+
name: Some(Ident::new("bar_key")),
315+
columns: vec![Ident::new("bar")],
316+
is_primary: false
317+
}],
318+
constraints
319+
);
320+
assert_eq!(
321+
vec![
322+
ColumnDef {
323+
name: Ident::new("id"),
324+
data_type: DataType::Int(None),
325+
collation: None,
326+
options: vec![
327+
ColumnOptionDef {
328+
name: None,
329+
option: ColumnOption::Unique { is_primary: true },
330+
},
331+
ColumnOptionDef {
332+
name: None,
333+
option: ColumnOption::DialectSpecific(vec![Token::make_keyword(
334+
"AUTO_INCREMENT"
335+
)]),
336+
},
337+
],
338+
},
339+
ColumnDef {
340+
name: Ident::new("bar"),
341+
data_type: DataType::Int(None),
342+
collation: None,
343+
options: vec![ColumnOptionDef {
344+
name: None,
345+
option: ColumnOption::NotNull,
346+
},],
347+
},
348+
],
349+
columns
350+
);
351+
}
352+
_ => unreachable!(),
353+
}
354+
}
355+
300356
#[test]
301357
fn parse_create_table_comment() {
302358
let canonical = "CREATE TABLE foo (bar INT) COMMENT 'baz'";

0 commit comments

Comments
 (0)