mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-10-17 09:17:14 +00:00
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>
This commit is contained in:
parent
bb7b05e106
commit
0480ee9886
2 changed files with 65 additions and 3 deletions
|
@ -3941,9 +3941,15 @@ impl<'a> Parser<'a> {
|
||||||
match next_token.token {
|
match next_token.token {
|
||||||
Token::Word(w) if w.keyword == Keyword::PRIMARY || w.keyword == Keyword::UNIQUE => {
|
Token::Word(w) if w.keyword == Keyword::PRIMARY || w.keyword == Keyword::UNIQUE => {
|
||||||
let is_primary = w.keyword == Keyword::PRIMARY;
|
let is_primary = w.keyword == Keyword::PRIMARY;
|
||||||
if is_primary {
|
|
||||||
self.expect_keyword(Keyword::KEY)?;
|
// parse optional [KEY]
|
||||||
}
|
let _ = self.parse_keyword(Keyword::KEY);
|
||||||
|
|
||||||
|
// optional constraint name
|
||||||
|
let name = self
|
||||||
|
.maybe_parse(|parser| parser.parse_identifier())
|
||||||
|
.or(name);
|
||||||
|
|
||||||
let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
|
let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
|
||||||
Ok(Some(TableConstraint::Unique {
|
Ok(Some(TableConstraint::Unique {
|
||||||
name,
|
name,
|
||||||
|
|
|
@ -297,6 +297,62 @@ fn parse_create_table_auto_increment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_create_table_unique_key() {
|
||||||
|
let sql = "CREATE TABLE foo (id INT PRIMARY KEY AUTO_INCREMENT, bar INT NOT NULL, UNIQUE KEY bar_key (bar))";
|
||||||
|
let canonical = "CREATE TABLE foo (id INT PRIMARY KEY AUTO_INCREMENT, bar INT NOT NULL, CONSTRAINT bar_key UNIQUE (bar))";
|
||||||
|
match mysql().one_statement_parses_to(sql, canonical) {
|
||||||
|
Statement::CreateTable {
|
||||||
|
name,
|
||||||
|
columns,
|
||||||
|
constraints,
|
||||||
|
..
|
||||||
|
} => {
|
||||||
|
assert_eq!(name.to_string(), "foo");
|
||||||
|
assert_eq!(
|
||||||
|
vec![TableConstraint::Unique {
|
||||||
|
name: Some(Ident::new("bar_key")),
|
||||||
|
columns: vec![Ident::new("bar")],
|
||||||
|
is_primary: false
|
||||||
|
}],
|
||||||
|
constraints
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
vec![
|
||||||
|
ColumnDef {
|
||||||
|
name: Ident::new("id"),
|
||||||
|
data_type: DataType::Int(None),
|
||||||
|
collation: None,
|
||||||
|
options: vec![
|
||||||
|
ColumnOptionDef {
|
||||||
|
name: None,
|
||||||
|
option: ColumnOption::Unique { is_primary: true },
|
||||||
|
},
|
||||||
|
ColumnOptionDef {
|
||||||
|
name: None,
|
||||||
|
option: ColumnOption::DialectSpecific(vec![Token::make_keyword(
|
||||||
|
"AUTO_INCREMENT"
|
||||||
|
)]),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
ColumnDef {
|
||||||
|
name: Ident::new("bar"),
|
||||||
|
data_type: DataType::Int(None),
|
||||||
|
collation: None,
|
||||||
|
options: vec![ColumnOptionDef {
|
||||||
|
name: None,
|
||||||
|
option: ColumnOption::NotNull,
|
||||||
|
},],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
columns
|
||||||
|
);
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_create_table_comment() {
|
fn parse_create_table_comment() {
|
||||||
let canonical = "CREATE TABLE foo (bar INT) COMMENT 'baz'";
|
let canonical = "CREATE TABLE foo (bar INT) COMMENT 'baz'";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue