This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch 
gh-readonly-queue/main/pr-2063-218f43cf2de1b436637430bbd936613b30e277a9
in repository https://gitbox.apache.org/repos/asf/datafusion-sqlparser-rs.git

commit f861566c8dca813d504df74cc99383680c9dac51
Author: Luca Cappelletti <[email protected]>
AuthorDate: Thu Oct 16 10:38:50 2025 +0200

    Reused `CheckConstraint` in `ColumnOption` (#2063)
---
 src/ast/ddl.rs            | 11 ++++++++---
 src/ast/spans.rs          |  2 +-
 src/parser/mod.rs         |  9 ++++++++-
 tests/sqlparser_common.rs |  6 +++++-
 4 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs
index 4a8678e4..84dc74d9 100644
--- a/src/ast/ddl.rs
+++ b/src/ast/ddl.rs
@@ -31,7 +31,7 @@ use sqlparser_derive::{Visit, VisitMut};
 use crate::ast::value::escape_single_quote_string;
 use crate::ast::{
     display_comma_separated, display_separated,
-    table_constraints::{ForeignKeyConstraint, TableConstraint},
+    table_constraints::{CheckConstraint, ForeignKeyConstraint, 
TableConstraint},
     ArgMode, AttachedToken, CommentDef, ConditionalStatements, 
CreateFunctionBody,
     CreateFunctionUsing, CreateTableLikeKind, CreateTableOptions, 
CreateViewParams, DataType, Expr,
     FileFormat, FunctionBehavior, FunctionCalledOnNull, FunctionDesc, 
FunctionDeterminismSpecifier,
@@ -1569,7 +1569,7 @@ pub enum ColumnOption {
     /// `).
     ForeignKey(ForeignKeyConstraint),
     /// `CHECK (<expr>)`
-    Check(Expr),
+    Check(CheckConstraint),
     /// Dialect-specific options, such as:
     /// - MySQL's `AUTO_INCREMENT` or SQLite's `AUTOINCREMENT`
     /// - ...
@@ -1638,6 +1638,11 @@ pub enum ColumnOption {
     Invisible,
 }
 
+impl From<CheckConstraint> for ColumnOption {
+    fn from(c: CheckConstraint) -> Self {
+        ColumnOption::Check(c)
+    }
+}
 impl From<ForeignKeyConstraint> for ColumnOption {
     fn from(fk: ForeignKeyConstraint) -> Self {
         ColumnOption::ForeignKey(fk)
@@ -1693,7 +1698,7 @@ impl fmt::Display for ColumnOption {
                 }
                 Ok(())
             }
-            Check(expr) => write!(f, "CHECK ({expr})"),
+            Check(constraint) => write!(f, "{constraint}"),
             DialectSpecific(val) => write!(f, "{}", display_separated(val, " 
")),
             CharacterSet(n) => write!(f, "CHARACTER SET {n}"),
             Collation(n) => write!(f, "COLLATE {n}"),
diff --git a/src/ast/spans.rs b/src/ast/spans.rs
index 1e5a96bc..5d82c733 100644
--- a/src/ast/spans.rs
+++ b/src/ast/spans.rs
@@ -741,8 +741,8 @@ impl Spanned for ColumnOption {
             ColumnOption::Ephemeral(expr) => 
expr.as_ref().map_or(Span::empty(), |e| e.span()),
             ColumnOption::Alias(expr) => expr.span(),
             ColumnOption::Unique { .. } => Span::empty(),
+            ColumnOption::Check(constraint) => constraint.span(),
             ColumnOption::ForeignKey(constraint) => constraint.span(),
-            ColumnOption::Check(expr) => expr.span(),
             ColumnOption::DialectSpecific(_) => Span::empty(),
             ColumnOption::CharacterSet(object_name) => object_name.span(),
             ColumnOption::Collation(object_name) => object_name.span(),
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index ef583dd3..ef31c41f 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -8104,7 +8104,14 @@ impl<'a> Parser<'a> {
             // since `CHECK` requires parentheses, we can parse the inner 
expression in ParserState::Normal
             let expr: Expr = self.with_state(ParserState::Normal, |p| 
p.parse_expr())?;
             self.expect_token(&Token::RParen)?;
-            Ok(Some(ColumnOption::Check(expr)))
+            Ok(Some(
+                CheckConstraint {
+                    name: None, // Column-level check constraints don't have 
names
+                    expr: Box::new(expr),
+                    enforced: None, // Could be extended later to support 
MySQL ENFORCED/NOT ENFORCED
+                }
+                .into(),
+            ))
         } else if self.parse_keyword(Keyword::AUTO_INCREMENT)
             && dialect_of!(self is MySqlDialect | GenericDialect)
         {
diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs
index 52f38b10..9f807ecf 100644
--- a/tests/sqlparser_common.rs
+++ b/tests/sqlparser_common.rs
@@ -3781,7 +3781,11 @@ fn parse_create_table() {
                             },
                             ColumnOptionDef {
                                 name: None,
-                                option: 
ColumnOption::Check(verified_expr("constrained > 0")),
+                                option: ColumnOption::Check(CheckConstraint {
+                                    name: None,
+                                    expr: Box::new(verified_expr("constrained 
> 0")),
+                                    enforced: None,
+                                }),
                             },
                         ],
                     },


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to