@@ -477,6 +477,17 @@ pub enum CastKind {
477477 DoubleColon ,
478478}
479479
480+ /// The syntax used in a CEIL or FLOOR expression.
481+ #[ derive( Debug , Clone , PartialEq , PartialOrd , Eq , Ord , Hash ) ]
482+ #[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
483+ #[ cfg_attr( feature = "visitor" , derive( Visit , VisitMut ) ) ]
484+ pub enum CeilFloorKind {
485+ /// `CEIL( <expr> TO <DateTimeField>)`
486+ DateTimeField ( DateTimeField ) ,
487+ /// `CEIL( <expr> [, <scale>])`
488+ Scale ( Value ) ,
489+ }
490+
480491/// An SQL expression of any type.
481492///
482493/// The parser does not distinguish between expressions of different types
@@ -649,16 +660,22 @@ pub enum Expr {
649660 /// ```sql
650661 /// CEIL(<expr> [TO DateTimeField])
651662 /// ```
663+ /// ```sql
664+ /// CEIL( <input_expr> [, <scale_expr> ] )
665+ /// ```
652666 Ceil {
653667 expr : Box < Expr > ,
654- field : DateTimeField ,
668+ field : CeilFloorKind ,
655669 } ,
656670 /// ```sql
657671 /// FLOOR(<expr> [TO DateTimeField])
658672 /// ```
673+ /// ```sql
674+ /// FLOOR( <input_expr> [, <scale_expr> ] )
675+ ///
659676 Floor {
660677 expr : Box < Expr > ,
661- field : DateTimeField ,
678+ field : CeilFloorKind ,
662679 } ,
663680 /// ```sql
664681 /// POSITION(<expr> in <expr>)
@@ -1199,17 +1216,17 @@ impl fmt::Display for Expr {
11991216 } ,
12001217 Expr :: Extract { field, expr } => write ! ( f, "EXTRACT({field} FROM {expr})" ) ,
12011218 Expr :: Ceil { expr, field } => {
1202- if field == & DateTimeField :: NoDateTime {
1203- write ! ( f, "CEIL({expr})" )
1204- } else {
1205- write ! ( f, "CEIL({expr} TO {field })" )
1219+ match field {
1220+ CeilFloorKind :: DateTimeField ( DateTimeField :: NoDateTime ) => write ! ( f, "CEIL({expr})" ) ,
1221+ CeilFloorKind :: DateTimeField ( dt_field ) => write ! ( f , "CEIL({expr} TO {dt_field})" ) ,
1222+ CeilFloorKind :: Scale ( s ) => write ! ( f, "CEIL({expr}, {s })" ) ,
12061223 }
12071224 }
12081225 Expr :: Floor { expr, field } => {
1209- if field == & DateTimeField :: NoDateTime {
1210- write ! ( f, "FLOOR({expr})" )
1211- } else {
1212- write ! ( f, "FLOOR({expr} TO {field })" )
1226+ match field {
1227+ CeilFloorKind :: DateTimeField ( DateTimeField :: NoDateTime ) => write ! ( f, "FLOOR({expr})" ) ,
1228+ CeilFloorKind :: DateTimeField ( dt_field ) => write ! ( f , "FLOOR({expr} TO {dt_field})" ) ,
1229+ CeilFloorKind :: Scale ( s ) => write ! ( f, "FLOOR({expr}, {s })" ) ,
12131230 }
12141231 }
12151232 Expr :: Position { expr, r#in } => write ! ( f, "POSITION({expr} IN {in})" ) ,
0 commit comments