@@ -965,10 +965,16 @@ impl Unparser<'_> {
965
965
) ) ?
966
966
. to_string ( )
967
967
} ;
968
+
969
+ let time_unit = match T :: DATA_TYPE {
970
+ DataType :: Timestamp ( unit, _) => unit,
971
+ _ => return Err ( internal_datafusion_err ! ( "Expected Timestamp, got {:?}" , T :: DATA_TYPE ) ) ,
972
+ } ;
973
+
968
974
Ok ( ast:: Expr :: Cast {
969
975
kind : ast:: CastKind :: Cast ,
970
976
expr : Box :: new ( ast:: Expr :: Value ( SingleQuotedString ( ts) ) ) ,
971
- data_type : ast :: DataType :: Timestamp ( None , TimezoneInfo :: None ) ,
977
+ data_type : self . dialect . timestamp_cast_dtype ( & time_unit , & None ) ,
972
978
format : None ,
973
979
} )
974
980
}
@@ -2579,6 +2585,32 @@ mod tests {
2579
2585
Ok ( ( ) )
2580
2586
}
2581
2587
2588
+ #[ test]
2589
+ fn custom_dialect_with_timestamp_cast_dtype_scalar_expr ( ) -> Result < ( ) > {
2590
+ let default_dialect = CustomDialectBuilder :: new ( ) . build ( ) ;
2591
+ let mysql_dialect = CustomDialectBuilder :: new ( )
2592
+ . with_timestamp_cast_dtype (
2593
+ ast:: DataType :: Datetime ( None ) ,
2594
+ ast:: DataType :: Datetime ( None ) ,
2595
+ )
2596
+ . build ( ) ;
2597
+
2598
+ for ( dialect, identifier) in [
2599
+ ( & default_dialect, "TIMESTAMP" ) ,
2600
+ ( & mysql_dialect, "DATETIME" ) ,
2601
+ ] {
2602
+ let unparser = Unparser :: new ( dialect) ;
2603
+ let expr = Expr :: Literal ( ScalarValue :: TimestampMillisecond ( Some ( 1738285549123 ) , None ) ) ;
2604
+ let ast = unparser. expr_to_sql ( & expr) ?;
2605
+
2606
+ let actual = format ! ( "{}" , ast) ;
2607
+ let expected = format ! ( r#"CAST('2025-01-31 01:05:49.123' AS {identifier})"# ) ;
2608
+
2609
+ assert_eq ! ( actual, expected) ;
2610
+ }
2611
+ Ok ( ( ) )
2612
+ }
2613
+
2582
2614
#[ test]
2583
2615
fn custom_dialect_date32_ast_dtype ( ) -> Result < ( ) > {
2584
2616
let default_dialect = CustomDialectBuilder :: default ( ) . build ( ) ;
0 commit comments