@@ -500,6 +500,24 @@ pub enum ExtractSyntax {
500500 Comma ,
501501}
502502
503+ /// The syntax used in a CEIL or FLOOR expression.
504+ ///
505+ /// The `CEIL/FLOOR(<datetime value expression> TO <time unit>)` is an Amazon Kinesis Data Analytics extension.
506+ /// See <https://docs.aws.amazon.com/kinesisanalytics/latest/sqlref/sql-reference-ceil.html> for
507+ /// details.
508+ ///
509+ /// Other dialects either support `CEIL/FLOOR( <expr> [, <scale>])` format or just
510+ /// `CEIL/FLOOR(<expr>)`.
511+ #[ derive( Debug , Clone , PartialEq , PartialOrd , Eq , Ord , Hash ) ]
512+ #[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
513+ #[ cfg_attr( feature = "visitor" , derive( Visit , VisitMut ) ) ]
514+ pub enum CeilFloorKind {
515+ /// `CEIL( <expr> TO <DateTimeField>)`
516+ DateTimeField ( DateTimeField ) ,
517+ /// `CEIL( <expr> [, <scale>])`
518+ Scale ( Value ) ,
519+ }
520+
503521/// An SQL expression of any type.
504522///
505523/// The parser does not distinguish between expressions of different types
@@ -674,16 +692,22 @@ pub enum Expr {
674692 /// ```sql
675693 /// CEIL(<expr> [TO DateTimeField])
676694 /// ```
695+ /// ```sql
696+ /// CEIL( <input_expr> [, <scale_expr> ] )
697+ /// ```
677698 Ceil {
678699 expr : Box < Expr > ,
679- field : DateTimeField ,
700+ field : CeilFloorKind ,
680701 } ,
681702 /// ```sql
682703 /// FLOOR(<expr> [TO DateTimeField])
683704 /// ```
705+ /// ```sql
706+ /// FLOOR( <input_expr> [, <scale_expr> ] )
707+ ///
684708 Floor {
685709 expr : Box < Expr > ,
686- field : DateTimeField ,
710+ field : CeilFloorKind ,
687711 } ,
688712 /// ```sql
689713 /// POSITION(<expr> in <expr>)
@@ -1230,20 +1254,20 @@ impl fmt::Display for Expr {
12301254 ExtractSyntax :: From => write ! ( f, "EXTRACT({field} FROM {expr})" ) ,
12311255 ExtractSyntax :: Comma => write ! ( f, "EXTRACT({field}, {expr})" ) ,
12321256 } ,
1233- Expr :: Ceil { expr, field } => {
1234- if field == & DateTimeField :: NoDateTime {
1257+ Expr :: Ceil { expr, field } => match field {
1258+ CeilFloorKind :: DateTimeField ( DateTimeField :: NoDateTime ) => {
12351259 write ! ( f, "CEIL({expr})" )
1236- } else {
1237- write ! ( f, "CEIL({expr} TO {field})" )
12381260 }
1239- }
1240- Expr :: Floor { expr, field } => {
1241- if field == & DateTimeField :: NoDateTime {
1261+ CeilFloorKind :: DateTimeField ( dt_field) => write ! ( f, "CEIL({expr} TO {dt_field})" ) ,
1262+ CeilFloorKind :: Scale ( s) => write ! ( f, "CEIL({expr}, {s})" ) ,
1263+ } ,
1264+ Expr :: Floor { expr, field } => match field {
1265+ CeilFloorKind :: DateTimeField ( DateTimeField :: NoDateTime ) => {
12421266 write ! ( f, "FLOOR({expr})" )
1243- } else {
1244- write ! ( f, "FLOOR({expr} TO {field})" )
12451267 }
1246- }
1268+ CeilFloorKind :: DateTimeField ( dt_field) => write ! ( f, "FLOOR({expr} TO {dt_field})" ) ,
1269+ CeilFloorKind :: Scale ( s) => write ! ( f, "FLOOR({expr}, {s})" ) ,
1270+ } ,
12471271 Expr :: Position { expr, r#in } => write ! ( f, "POSITION({expr} IN {in})" ) ,
12481272 Expr :: Collate { expr, collation } => write ! ( f, "{expr} COLLATE {collation}" ) ,
12491273 Expr :: Nested ( ast) => write ! ( f, "({ast})" ) ,
0 commit comments