Skip to content

Commit ebe6a9e

Browse files
Now ForeignKeyConstraint include the ident of the column
1 parent 353b07d commit ebe6a9e

File tree

2 files changed

+24
-15
lines changed

2 files changed

+24
-15
lines changed

src/parser/mod.rs

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7919,7 +7919,7 @@ impl<'a> Parser<'a> {
79197919
}
79207920

79217921
pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
7922-
let name = self.parse_identifier()?;
7922+
let col_name = self.parse_identifier()?;
79237923
let data_type = if self.is_column_type_sqlite_unspecified() {
79247924
DataType::Unspecified
79257925
} else {
@@ -7929,22 +7929,22 @@ impl<'a> Parser<'a> {
79297929
loop {
79307930
if self.parse_keyword(Keyword::CONSTRAINT) {
79317931
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)? {
79337933
options.push(ColumnOptionDef { name, option });
79347934
} else {
79357935
return self.expected(
79367936
"constraint details after CONSTRAINT <name>",
79377937
self.peek_token(),
79387938
);
79397939
}
7940-
} else if let Some(option) = self.parse_optional_column_option()? {
7940+
} else if let Some(option) = self.parse_optional_column_option(&col_name)? {
79417941
options.push(ColumnOptionDef { name: None, option });
79427942
} else {
79437943
break;
79447944
};
79457945
}
79467946
Ok(ColumnDef {
7947-
name,
7947+
name: col_name,
79487948
data_type,
79497949
options,
79507950
})
@@ -7973,20 +7973,26 @@ impl<'a> Parser<'a> {
79737973
}
79747974
}
79757975

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_ident: &Ident,
7979+
) -> Result<Option<ColumnOption>, ParserError> {
79777980
if let Some(option) = self.dialect.parse_column_option(self)? {
79787981
return option;
79797982
}
79807983

79817984
self.with_state(
79827985
ColumnDefinition,
79837986
|parser| -> Result<Option<ColumnOption>, ParserError> {
7984-
parser.parse_optional_column_option_inner()
7987+
parser.parse_optional_column_option_inner(column_ident)
79857988
},
79867989
)
79877990
}
79887991

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_ident: &Ident,
7995+
) -> Result<Option<ColumnOption>, ParserError> {
79907996
if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
79917997
Ok(Some(ColumnOption::CharacterSet(
79927998
self.parse_object_name(false)?,
@@ -8068,7 +8074,7 @@ impl<'a> Parser<'a> {
80688074
ForeignKeyConstraint {
80698075
name: None, // Column-level constraints don't have names
80708076
index_name: None, // Not applicable for column-level constraints
8071-
columns: vec![], // Column is implicit for column-level constraints
8077+
columns: vec![column_ident.clone()],
80728078
foreign_table,
80738079
referred_columns,
80748080
on_delete,
@@ -9076,7 +9082,7 @@ impl<'a> Parser<'a> {
90769082
let new_name = self.parse_identifier()?;
90779083
let data_type = self.parse_data_type()?;
90789084
let mut options = vec![];
9079-
while let Some(option) = self.parse_optional_column_option()? {
9085+
while let Some(option) = self.parse_optional_column_option(&new_name)? {
90809086
options.push(option);
90819087
}
90829088

@@ -9094,7 +9100,7 @@ impl<'a> Parser<'a> {
90949100
let col_name = self.parse_identifier()?;
90959101
let data_type = self.parse_data_type()?;
90969102
let mut options = vec![];
9097-
while let Some(option) = self.parse_optional_column_option()? {
9103+
while let Some(option) = self.parse_optional_column_option(&col_name)? {
90989104
options.push(option);
90999105
}
91009106

@@ -11355,7 +11361,7 @@ impl<'a> Parser<'a> {
1135511361
/// Parses a column definition within a view.
1135611362
fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
1135711363
let name = self.parse_identifier()?;
11358-
let options = self.parse_view_column_options()?;
11364+
let options = self.parse_view_column_options(&name)?;
1135911365
let data_type = if dialect_of!(self is ClickHouseDialect) {
1136011366
Some(self.parse_data_type()?)
1136111367
} else {
@@ -11368,10 +11374,13 @@ impl<'a> Parser<'a> {
1136811374
})
1136911375
}
1137011376

11371-
fn parse_view_column_options(&mut self) -> Result<Option<ColumnOptions>, ParserError> {
11377+
fn parse_view_column_options(
11378+
&mut self,
11379+
column_ident: &Ident,
11380+
) -> Result<Option<ColumnOptions>, ParserError> {
1137211381
let mut options = Vec::new();
1137311382
loop {
11374-
let option = self.parse_optional_column_option()?;
11383+
let option = self.parse_optional_column_option(column_ident)?;
1137511384
if let Some(option) = option {
1137611385
options.push(option);
1137711386
} else {

tests/sqlparser_common.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3793,7 +3793,7 @@ fn parse_create_table() {
37933793
option: ColumnOption::ForeignKey(ForeignKeyConstraint {
37943794
name: None,
37953795
index_name: None,
3796-
columns: vec![],
3796+
columns: vec!["ref".into()],
37973797
foreign_table: ObjectName::from(vec!["othertable".into()]),
37983798
referred_columns: vec!["a".into(), "b".into()],
37993799
on_delete: None,
@@ -3811,7 +3811,7 @@ fn parse_create_table() {
38113811
option: ColumnOption::ForeignKey(ForeignKeyConstraint {
38123812
name: None,
38133813
index_name: None,
3814-
columns: vec![],
3814+
columns: vec!["ref2".into()],
38153815
foreign_table: ObjectName::from(vec!["othertable2".into()]),
38163816
referred_columns: vec![],
38173817
on_delete: Some(ReferentialAction::Cascade),

0 commit comments

Comments
 (0)