Skip to content

Commit 483ddeb

Browse files
committed
Split ConstraintUsingIndex into PrimaryKeyUsingIndex and UniqueUsingIndex variants
1 parent 91a677f commit 483ddeb

4 files changed

Lines changed: 41 additions & 44 deletions

File tree

src/ast/spans.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,8 @@ impl Spanned for TableConstraint {
625625
TableConstraint::Check(constraint) => constraint.span(),
626626
TableConstraint::Index(constraint) => constraint.span(),
627627
TableConstraint::FulltextOrSpatial(constraint) => constraint.span(),
628-
TableConstraint::ConstraintUsingIndex(constraint) => constraint.span(),
628+
TableConstraint::PrimaryKeyUsingIndex(constraint)
629+
| TableConstraint::UniqueUsingIndex(constraint) => constraint.span(),
629630
}
630631
}
631632
}

src/ast/table_constraints.rs

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,21 @@ pub enum TableConstraint {
102102
/// [2]: https://dev.mysql.com/doc/refman/8.0/en/spatial-types.html
103103
FulltextOrSpatial(FullTextOrSpatialConstraint),
104104
/// PostgreSQL [definition][1] for promoting an existing unique index to a
105-
/// `PRIMARY KEY` or `UNIQUE` constraint:
105+
/// `PRIMARY KEY` constraint:
106106
///
107-
/// `[ CONSTRAINT constraint_name ] { UNIQUE | PRIMARY KEY } USING INDEX index_name
107+
/// `[ CONSTRAINT constraint_name ] PRIMARY KEY USING INDEX index_name
108108
/// [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]`
109109
///
110110
/// [1]: https://www.postgresql.org/docs/current/sql-altertable.html
111-
ConstraintUsingIndex(ConstraintUsingIndex),
111+
PrimaryKeyUsingIndex(ConstraintUsingIndex),
112+
/// PostgreSQL [definition][1] for promoting an existing unique index to a
113+
/// `UNIQUE` constraint:
114+
///
115+
/// `[ CONSTRAINT constraint_name ] UNIQUE USING INDEX index_name
116+
/// [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]`
117+
///
118+
/// [1]: https://www.postgresql.org/docs/current/sql-altertable.html
119+
UniqueUsingIndex(ConstraintUsingIndex),
112120
}
113121

114122
impl From<UniqueConstraint> for TableConstraint {
@@ -147,12 +155,6 @@ impl From<FullTextOrSpatialConstraint> for TableConstraint {
147155
}
148156
}
149157

150-
impl From<ConstraintUsingIndex> for TableConstraint {
151-
fn from(constraint: ConstraintUsingIndex) -> Self {
152-
TableConstraint::ConstraintUsingIndex(constraint)
153-
}
154-
}
155-
156158
impl fmt::Display for TableConstraint {
157159
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
158160
match self {
@@ -162,7 +164,8 @@ impl fmt::Display for TableConstraint {
162164
TableConstraint::Check(constraint) => constraint.fmt(f),
163165
TableConstraint::Index(constraint) => constraint.fmt(f),
164166
TableConstraint::FulltextOrSpatial(constraint) => constraint.fmt(f),
165-
TableConstraint::ConstraintUsingIndex(constraint) => constraint.fmt(f),
167+
TableConstraint::PrimaryKeyUsingIndex(c) => c.fmt_with_keyword(f, "PRIMARY KEY"),
168+
TableConstraint::UniqueUsingIndex(c) => c.fmt_with_keyword(f, "UNIQUE"),
166169
}
167170
}
168171
}
@@ -563,26 +566,21 @@ impl crate::ast::Spanned for UniqueConstraint {
563566
pub struct ConstraintUsingIndex {
564567
/// Optional constraint name.
565568
pub name: Option<Ident>,
566-
/// Whether this is a `PRIMARY KEY` (true) or `UNIQUE` (false) constraint.
567-
pub is_primary_key: bool,
568569
/// The name of the existing unique index to promote.
569570
pub index_name: Ident,
570571
/// Optional characteristics like `DEFERRABLE`.
571572
pub characteristics: Option<ConstraintCharacteristics>,
572573
}
573574

574-
impl fmt::Display for ConstraintUsingIndex {
575-
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
575+
impl ConstraintUsingIndex {
576+
/// Format as `[CONSTRAINT name] <keyword> USING INDEX index_name [characteristics]`.
577+
pub fn fmt_with_keyword(&self, f: &mut fmt::Formatter, keyword: &str) -> fmt::Result {
576578
use crate::ast::ddl::{display_constraint_name, display_option_spaced};
577579
write!(
578580
f,
579581
"{}{} USING INDEX {}",
580582
display_constraint_name(&self.name),
581-
if self.is_primary_key {
582-
"PRIMARY KEY"
583-
} else {
584-
"UNIQUE"
585-
},
583+
keyword,
586584
self.index_name,
587585
)?;
588586
write!(f, "{}", display_option_spaced(&self.characteristics))?;

src/parser/mod.rs

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9276,6 +9276,21 @@ impl<'a> Parser<'a> {
92769276
}
92779277
}
92789278

9279+
/// Parse `index_name [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]`
9280+
/// after `{ PRIMARY KEY | UNIQUE } USING INDEX`.
9281+
fn parse_constraint_using_index(
9282+
&mut self,
9283+
name: Option<Ident>,
9284+
) -> Result<ConstraintUsingIndex, ParserError> {
9285+
let index_name = self.parse_identifier()?;
9286+
let characteristics = self.parse_constraint_characteristics()?;
9287+
Ok(ConstraintUsingIndex {
9288+
name,
9289+
index_name,
9290+
characteristics,
9291+
})
9292+
}
9293+
92799294
/// Parse optional constraint characteristics such as `DEFERRABLE`, `INITIALLY` and `ENFORCED`.
92809295
pub fn parse_constraint_characteristics(
92819296
&mut self,
@@ -9343,17 +9358,9 @@ impl<'a> Parser<'a> {
93439358
// PostgreSQL: UNIQUE USING INDEX index_name
93449359
// https://www.postgresql.org/docs/current/sql-altertable.html
93459360
if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
9346-
let index_name = self.parse_identifier()?;
9347-
let characteristics = self.parse_constraint_characteristics()?;
9348-
return Ok(Some(
9349-
ConstraintUsingIndex {
9350-
name,
9351-
is_primary_key: false,
9352-
index_name,
9353-
characteristics,
9354-
}
9355-
.into(),
9356-
));
9361+
return Ok(Some(TableConstraint::UniqueUsingIndex(
9362+
self.parse_constraint_using_index(name)?,
9363+
)));
93579364
}
93589365

93599366
let index_type_display = self.parse_index_type_display();
@@ -9394,17 +9401,9 @@ impl<'a> Parser<'a> {
93949401
// PostgreSQL: PRIMARY KEY USING INDEX index_name
93959402
// https://www.postgresql.org/docs/current/sql-altertable.html
93969403
if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
9397-
let index_name = self.parse_identifier()?;
9398-
let characteristics = self.parse_constraint_characteristics()?;
9399-
return Ok(Some(
9400-
ConstraintUsingIndex {
9401-
name,
9402-
is_primary_key: true,
9403-
index_name,
9404-
characteristics,
9405-
}
9406-
.into(),
9407-
));
9404+
return Ok(Some(TableConstraint::PrimaryKeyUsingIndex(
9405+
self.parse_constraint_using_index(name)?,
9406+
)));
94089407
}
94099408

94109409
// optional index name

tests/sqlparser_postgres.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -635,11 +635,10 @@ fn parse_alter_table_constraint_using_index() {
635635
match pg_and_generic().verified_stmt(sql) {
636636
Statement::AlterTable(alter_table) => match &alter_table.operations[0] {
637637
AlterTableOperation::AddConstraint {
638-
constraint: TableConstraint::ConstraintUsingIndex(c),
638+
constraint: TableConstraint::PrimaryKeyUsingIndex(c),
639639
..
640640
} => {
641641
assert_eq!(c.name.as_ref().unwrap().to_string(), "c");
642-
assert!(c.is_primary_key);
643642
assert_eq!(c.index_name.to_string(), "my_index");
644643
assert!(c.characteristics.is_none());
645644
}

0 commit comments

Comments
 (0)