Skip to content

Commit ef28b7e

Browse files
LucaCappelletti94ayman-sigma
authored andcommitted
Reused CheckConstraint in ColumnOption (apache#2063)
1 parent 0d75d2a commit ef28b7e

File tree

4 files changed

+22
-6
lines changed

4 files changed

+22
-6
lines changed

src/ast/ddl.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use sqlparser_derive::{Visit, VisitMut};
3131
use crate::ast::value::escape_single_quote_string;
3232
use crate::ast::{
3333
display_comma_separated, display_separated,
34-
table_constraints::{ForeignKeyConstraint, TableConstraint},
34+
table_constraints::{CheckConstraint, ForeignKeyConstraint, TableConstraint},
3535
ArgMode, AttachedToken, CommentDef, ConditionalStatements, CreateFunctionBody,
3636
CreateFunctionUsing, CreateTableLikeKind, CreateTableOptions, CreateViewParams, DataType, Expr,
3737
FileFormat, FunctionBehavior, FunctionCalledOnNull, FunctionDesc, FunctionDeterminismSpecifier,
@@ -1569,7 +1569,7 @@ pub enum ColumnOption {
15691569
/// `).
15701570
ForeignKey(ForeignKeyConstraint),
15711571
/// `CHECK (<expr>)`
1572-
Check(Expr),
1572+
Check(CheckConstraint),
15731573
/// Dialect-specific options, such as:
15741574
/// - MySQL's `AUTO_INCREMENT` or SQLite's `AUTOINCREMENT`
15751575
/// - ...
@@ -1638,6 +1638,11 @@ pub enum ColumnOption {
16381638
Invisible,
16391639
}
16401640

1641+
impl From<CheckConstraint> for ColumnOption {
1642+
fn from(c: CheckConstraint) -> Self {
1643+
ColumnOption::Check(c)
1644+
}
1645+
}
16411646
impl From<ForeignKeyConstraint> for ColumnOption {
16421647
fn from(fk: ForeignKeyConstraint) -> Self {
16431648
ColumnOption::ForeignKey(fk)
@@ -1693,7 +1698,7 @@ impl fmt::Display for ColumnOption {
16931698
}
16941699
Ok(())
16951700
}
1696-
Check(expr) => write!(f, "CHECK ({expr})"),
1701+
Check(constraint) => write!(f, "{constraint}"),
16971702
DialectSpecific(val) => write!(f, "{}", display_separated(val, " ")),
16981703
CharacterSet(n) => write!(f, "CHARACTER SET {n}"),
16991704
Collation(n) => write!(f, "COLLATE {n}"),

src/ast/spans.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -741,8 +741,8 @@ impl Spanned for ColumnOption {
741741
ColumnOption::Ephemeral(expr) => expr.as_ref().map_or(Span::empty(), |e| e.span()),
742742
ColumnOption::Alias(expr) => expr.span(),
743743
ColumnOption::Unique { .. } => Span::empty(),
744+
ColumnOption::Check(constraint) => constraint.span(),
744745
ColumnOption::ForeignKey(constraint) => constraint.span(),
745-
ColumnOption::Check(expr) => expr.span(),
746746
ColumnOption::DialectSpecific(_) => Span::empty(),
747747
ColumnOption::CharacterSet(object_name) => object_name.span(),
748748
ColumnOption::Collation(object_name) => object_name.span(),

src/parser/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8135,7 +8135,14 @@ impl<'a> Parser<'a> {
81358135
// since `CHECK` requires parentheses, we can parse the inner expression in ParserState::Normal
81368136
let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
81378137
self.expect_token(&Token::RParen)?;
8138-
Ok(Some(ColumnOption::Check(expr)))
8138+
Ok(Some(
8139+
CheckConstraint {
8140+
name: None, // Column-level check constraints don't have names
8141+
expr: Box::new(expr),
8142+
enforced: None, // Could be extended later to support MySQL ENFORCED/NOT ENFORCED
8143+
}
8144+
.into(),
8145+
))
81398146
} else if self.parse_keyword(Keyword::AUTO_INCREMENT)
81408147
&& dialect_of!(self is MySqlDialect | GenericDialect)
81418148
{

tests/sqlparser_common.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3782,7 +3782,11 @@ fn parse_create_table() {
37823782
},
37833783
ColumnOptionDef {
37843784
name: None,
3785-
option: ColumnOption::Check(verified_expr("constrained > 0")),
3785+
option: ColumnOption::Check(CheckConstraint {
3786+
name: None,
3787+
expr: Box::new(verified_expr("constrained > 0")),
3788+
enforced: None,
3789+
}),
37863790
},
37873791
],
37883792
},

0 commit comments

Comments
 (0)