Skip to content

Commit 362234e

Browse files
Merge foreign-key-match into future-main
2 parents 678234e + ebe6a9e commit 362234e

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
@@ -7942,7 +7942,7 @@ impl<'a> Parser<'a> {
79427942
}
79437943

79447944
pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
7945-
let name = self.parse_identifier()?;
7945+
let col_name = self.parse_identifier()?;
79467946
let data_type = if self.is_column_type_sqlite_unspecified() {
79477947
DataType::Unspecified
79487948
} else {
@@ -7952,22 +7952,22 @@ impl<'a> Parser<'a> {
79527952
loop {
79537953
if self.parse_keyword(Keyword::CONSTRAINT) {
79547954
let name = Some(self.parse_identifier()?);
7955-
if let Some(option) = self.parse_optional_column_option()? {
7955+
if let Some(option) = self.parse_optional_column_option(&col_name)? {
79567956
options.push(ColumnOptionDef { name, option });
79577957
} else {
79587958
return self.expected(
79597959
"constraint details after CONSTRAINT <name>",
79607960
self.peek_token(),
79617961
);
79627962
}
7963-
} else if let Some(option) = self.parse_optional_column_option()? {
7963+
} else if let Some(option) = self.parse_optional_column_option(&col_name)? {
79647964
options.push(ColumnOptionDef { name: None, option });
79657965
} else {
79667966
break;
79677967
};
79687968
}
79697969
Ok(ColumnDef {
7970-
name,
7970+
name: col_name,
79717971
data_type,
79727972
options,
79737973
})
@@ -7996,20 +7996,26 @@ impl<'a> Parser<'a> {
79967996
}
79977997
}
79987998

7999-
pub fn parse_optional_column_option(&mut self) -> Result<Option<ColumnOption>, ParserError> {
7999+
pub fn parse_optional_column_option(
8000+
&mut self,
8001+
column_ident: &Ident,
8002+
) -> Result<Option<ColumnOption>, ParserError> {
80008003
if let Some(option) = self.dialect.parse_column_option(self)? {
80018004
return option;
80028005
}
80038006

80048007
self.with_state(
80058008
ColumnDefinition,
80068009
|parser| -> Result<Option<ColumnOption>, ParserError> {
8007-
parser.parse_optional_column_option_inner()
8010+
parser.parse_optional_column_option_inner(column_ident)
80088011
},
80098012
)
80108013
}
80118014

8012-
fn parse_optional_column_option_inner(&mut self) -> Result<Option<ColumnOption>, ParserError> {
8015+
fn parse_optional_column_option_inner(
8016+
&mut self,
8017+
column_ident: &Ident,
8018+
) -> Result<Option<ColumnOption>, ParserError> {
80138019
if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
80148020
Ok(Some(ColumnOption::CharacterSet(
80158021
self.parse_object_name(false)?,
@@ -8091,7 +8097,7 @@ impl<'a> Parser<'a> {
80918097
ForeignKeyConstraint {
80928098
name: None, // Column-level constraints don't have names
80938099
index_name: None, // Not applicable for column-level constraints
8094-
columns: vec![], // Column is implicit for column-level constraints
8100+
columns: vec![column_ident.clone()],
80958101
foreign_table,
80968102
referred_columns,
80978103
on_delete,
@@ -9099,7 +9105,7 @@ impl<'a> Parser<'a> {
90999105
let new_name = self.parse_identifier()?;
91009106
let data_type = self.parse_data_type()?;
91019107
let mut options = vec![];
9102-
while let Some(option) = self.parse_optional_column_option()? {
9108+
while let Some(option) = self.parse_optional_column_option(&new_name)? {
91039109
options.push(option);
91049110
}
91059111

@@ -9117,7 +9123,7 @@ impl<'a> Parser<'a> {
91179123
let col_name = self.parse_identifier()?;
91189124
let data_type = self.parse_data_type()?;
91199125
let mut options = vec![];
9120-
while let Some(option) = self.parse_optional_column_option()? {
9126+
while let Some(option) = self.parse_optional_column_option(&col_name)? {
91219127
options.push(option);
91229128
}
91239129

@@ -11379,7 +11385,7 @@ impl<'a> Parser<'a> {
1137911385
/// Parses a column definition within a view.
1138011386
fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
1138111387
let name = self.parse_identifier()?;
11382-
let options = self.parse_view_column_options()?;
11388+
let options = self.parse_view_column_options(&name)?;
1138311389
let data_type = if dialect_of!(self is ClickHouseDialect) {
1138411390
Some(self.parse_data_type()?)
1138511391
} else {
@@ -11392,10 +11398,13 @@ impl<'a> Parser<'a> {
1139211398
})
1139311399
}
1139411400

11395-
fn parse_view_column_options(&mut self) -> Result<Option<ColumnOptions>, ParserError> {
11401+
fn parse_view_column_options(
11402+
&mut self,
11403+
column_ident: &Ident,
11404+
) -> Result<Option<ColumnOptions>, ParserError> {
1139611405
let mut options = Vec::new();
1139711406
loop {
11398-
let option = self.parse_optional_column_option()?;
11407+
let option = self.parse_optional_column_option(column_ident)?;
1139911408
if let Some(option) = option {
1140011409
options.push(option);
1140111410
} 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)