@@ -7919,7 +7919,7 @@ impl<'a> Parser<'a> {
7919
7919
}
7920
7920
7921
7921
pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
7922
- let name = self.parse_identifier()?;
7922
+ let col_name = self.parse_identifier()?;
7923
7923
let data_type = if self.is_column_type_sqlite_unspecified() {
7924
7924
DataType::Unspecified
7925
7925
} else {
@@ -7929,22 +7929,22 @@ impl<'a> Parser<'a> {
7929
7929
loop {
7930
7930
if self.parse_keyword(Keyword::CONSTRAINT) {
7931
7931
let name = Some(self.parse_identifier()?);
7932
- if let Some(option) = self.parse_optional_column_option()? {
7932
+ if let Some(option) = self.parse_optional_column_option(&col_name )? {
7933
7933
options.push(ColumnOptionDef { name, option });
7934
7934
} else {
7935
7935
return self.expected(
7936
7936
"constraint details after CONSTRAINT <name>",
7937
7937
self.peek_token(),
7938
7938
);
7939
7939
}
7940
- } else if let Some(option) = self.parse_optional_column_option()? {
7940
+ } else if let Some(option) = self.parse_optional_column_option(&col_name )? {
7941
7941
options.push(ColumnOptionDef { name: None, option });
7942
7942
} else {
7943
7943
break;
7944
7944
};
7945
7945
}
7946
7946
Ok(ColumnDef {
7947
- name,
7947
+ name: col_name ,
7948
7948
data_type,
7949
7949
options,
7950
7950
})
@@ -7973,20 +7973,26 @@ impl<'a> Parser<'a> {
7973
7973
}
7974
7974
}
7975
7975
7976
- pub fn parse_optional_column_option(&mut self) -> Result<Option<ColumnOption>, ParserError> {
7976
+ pub fn parse_optional_column_option(
7977
+ &mut self,
7978
+ column_name: &Ident,
7979
+ ) -> Result<Option<ColumnOption>, ParserError> {
7977
7980
if let Some(option) = self.dialect.parse_column_option(self)? {
7978
7981
return option;
7979
7982
}
7980
7983
7981
7984
self.with_state(
7982
7985
ColumnDefinition,
7983
7986
|parser| -> Result<Option<ColumnOption>, ParserError> {
7984
- parser.parse_optional_column_option_inner()
7987
+ parser.parse_optional_column_option_inner(column_name )
7985
7988
},
7986
7989
)
7987
7990
}
7988
7991
7989
- fn parse_optional_column_option_inner(&mut self) -> Result<Option<ColumnOption>, ParserError> {
7992
+ fn parse_optional_column_option_inner(
7993
+ &mut self,
7994
+ column_name: &Ident,
7995
+ ) -> Result<Option<ColumnOption>, ParserError> {
7990
7996
if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
7991
7997
Ok(Some(ColumnOption::CharacterSet(
7992
7998
self.parse_object_name(false)?,
@@ -8029,16 +8035,32 @@ impl<'a> Parser<'a> {
8029
8035
}
8030
8036
} else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
8031
8037
let characteristics = self.parse_constraint_characteristics()?;
8032
- Ok(Some(ColumnOption::Unique {
8033
- is_primary: true,
8034
- characteristics,
8035
- }))
8038
+ Ok(Some(
8039
+ PrimaryKeyConstraint {
8040
+ name: None,
8041
+ index_name: None,
8042
+ index_type: None,
8043
+ columns: vec![column_name.clone().into()],
8044
+ index_options: vec![],
8045
+ characteristics,
8046
+ }
8047
+ .into(),
8048
+ ))
8036
8049
} else if self.parse_keyword(Keyword::UNIQUE) {
8037
8050
let characteristics = self.parse_constraint_characteristics()?;
8038
- Ok(Some(ColumnOption::Unique {
8039
- is_primary: false,
8040
- characteristics,
8041
- }))
8051
+ Ok(Some(
8052
+ UniqueConstraint {
8053
+ name: None,
8054
+ index_name: None,
8055
+ index_type_display: KeyOrIndexDisplay::None,
8056
+ index_type: None,
8057
+ columns: vec![column_name.clone().into()],
8058
+ index_options: vec![],
8059
+ characteristics,
8060
+ nulls_distinct: NullsDistinctOption::None,
8061
+ }
8062
+ .into(),
8063
+ ))
8042
8064
} else if self.parse_keyword(Keyword::REFERENCES) {
8043
8065
let foreign_table = self.parse_object_name(false)?;
8044
8066
// PostgreSQL allows omitting the column list and
@@ -9046,7 +9068,7 @@ impl<'a> Parser<'a> {
9046
9068
let new_name = self.parse_identifier()?;
9047
9069
let data_type = self.parse_data_type()?;
9048
9070
let mut options = vec![];
9049
- while let Some(option) = self.parse_optional_column_option()? {
9071
+ while let Some(option) = self.parse_optional_column_option(&new_name )? {
9050
9072
options.push(option);
9051
9073
}
9052
9074
@@ -9064,7 +9086,7 @@ impl<'a> Parser<'a> {
9064
9086
let col_name = self.parse_identifier()?;
9065
9087
let data_type = self.parse_data_type()?;
9066
9088
let mut options = vec![];
9067
- while let Some(option) = self.parse_optional_column_option()? {
9089
+ while let Some(option) = self.parse_optional_column_option(&col_name )? {
9068
9090
options.push(option);
9069
9091
}
9070
9092
@@ -11325,7 +11347,7 @@ impl<'a> Parser<'a> {
11325
11347
/// Parses a column definition within a view.
11326
11348
fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
11327
11349
let name = self.parse_identifier()?;
11328
- let options = self.parse_view_column_options()?;
11350
+ let options = self.parse_view_column_options(&name )?;
11329
11351
let data_type = if dialect_of!(self is ClickHouseDialect) {
11330
11352
Some(self.parse_data_type()?)
11331
11353
} else {
@@ -11338,10 +11360,13 @@ impl<'a> Parser<'a> {
11338
11360
})
11339
11361
}
11340
11362
11341
- fn parse_view_column_options(&mut self) -> Result<Option<ColumnOptions>, ParserError> {
11363
+ fn parse_view_column_options(
11364
+ &mut self,
11365
+ column_name: &Ident,
11366
+ ) -> Result<Option<ColumnOptions>, ParserError> {
11342
11367
let mut options = Vec::new();
11343
11368
loop {
11344
- let option = self.parse_optional_column_option()?;
11369
+ let option = self.parse_optional_column_option(column_name )?;
11345
11370
if let Some(option) = option {
11346
11371
options.push(option);
11347
11372
} else {
0 commit comments