Skip to content

Commit f861566

Browse files
Reused CheckConstraint in ColumnOption (#2063)
1 parent 218f43c commit f861566

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
@@ -8104,7 +8104,14 @@ impl<'a> Parser<'a> {
81048104
// since `CHECK` requires parentheses, we can parse the inner expression in ParserState::Normal
81058105
let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
81068106
self.expect_token(&Token::RParen)?;
8107-
Ok(Some(ColumnOption::Check(expr)))
8107+
Ok(Some(
8108+
CheckConstraint {
8109+
name: None, // Column-level check constraints don't have names
8110+
expr: Box::new(expr),
8111+
enforced: None, // Could be extended later to support MySQL ENFORCED/NOT ENFORCED
8112+
}
8113+
.into(),
8114+
))
81088115
} else if self.parse_keyword(Keyword::AUTO_INCREMENT)
81098116
&& dialect_of!(self is MySqlDialect | GenericDialect)
81108117
{

tests/sqlparser_common.rs

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

0 commit comments

Comments
 (0)