Skip to content

Commit 5781856

Browse files
Reused CheckConstraint in ColumnOption
1 parent 0fb3b6b commit 5781856

File tree

4 files changed

+20
-6
lines changed

4 files changed

+20
-6
lines changed

src/ast/ddl.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use sqlparser_derive::{Visit, VisitMut};
3030

3131
use crate::ast::value::escape_single_quote_string;
3232
use crate::ast::{
33-
display_comma_separated, display_separated, table_constraints::TableConstraint, ArgMode,
33+
display_comma_separated, display_separated, table_constraints::{CheckConstraint, TableConstraint}, ArgMode,
3434
CommentDef, ConditionalStatements, CreateFunctionBody, CreateFunctionUsing,
3535
CreateTableLikeKind, CreateTableOptions, DataType, Expr, FileFormat, FunctionBehavior,
3636
FunctionCalledOnNull, FunctionDeterminismSpecifier, FunctionParallel, HiveDistributionStyle,
@@ -1573,7 +1573,7 @@ pub enum ColumnOption {
15731573
characteristics: Option<ConstraintCharacteristics>,
15741574
},
15751575
/// `CHECK (<expr>)`
1576-
Check(Expr),
1576+
Check(CheckConstraint),
15771577
/// Dialect-specific options, such as:
15781578
/// - MySQL's `AUTO_INCREMENT` or SQLite's `AUTOINCREMENT`
15791579
/// - ...
@@ -1642,6 +1642,12 @@ pub enum ColumnOption {
16421642
Invisible,
16431643
}
16441644

1645+
impl From<CheckConstraint> for ColumnOption {
1646+
fn from(c: CheckConstraint) -> Self {
1647+
ColumnOption::Check(c)
1648+
}
1649+
}
1650+
16451651
impl fmt::Display for ColumnOption {
16461652
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
16471653
use ColumnOption::*;
@@ -1690,7 +1696,7 @@ impl fmt::Display for ColumnOption {
16901696
}
16911697
Ok(())
16921698
}
1693-
Check(expr) => write!(f, "CHECK ({expr})"),
1699+
Check(constraint) => write!(f, "{constraint}"),
16941700
DialectSpecific(val) => write!(f, "{}", display_separated(val, " ")),
16951701
CharacterSet(n) => write!(f, "CHARACTER SET {n}"),
16961702
Collation(n) => write!(f, "COLLATE {n}"),

src/ast/spans.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -835,7 +835,7 @@ impl Spanned for ColumnOption {
835835
.chain(on_update.iter().map(|i| i.span()))
836836
.chain(characteristics.iter().map(|i| i.span())),
837837
),
838-
ColumnOption::Check(expr) => expr.span(),
838+
ColumnOption::Check(constraint) => constraint.span(),
839839
ColumnOption::DialectSpecific(_) => Span::empty(),
840840
ColumnOption::CharacterSet(object_name) => object_name.span(),
841841
ColumnOption::Collation(object_name) => object_name.span(),

src/parser/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8071,7 +8071,11 @@ impl<'a> Parser<'a> {
80718071
// since `CHECK` requires parentheses, we can parse the inner expression in ParserState::Normal
80728072
let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
80738073
self.expect_token(&Token::RParen)?;
8074-
Ok(Some(ColumnOption::Check(expr)))
8074+
Ok(Some(CheckConstraint {
8075+
name: None, // Column-level check constraints don't have names
8076+
expr: Box::new(expr),
8077+
enforced: None, // Could be extended later to support MySQL ENFORCED/NOT ENFORCED
8078+
}.into()))
80758079
} else if self.parse_keyword(Keyword::AUTO_INCREMENT)
80768080
&& dialect_of!(self is MySqlDialect | GenericDialect)
80778081
{

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)