@@ -1689,6 +1689,7 @@ mod tests {
1689
1689
use std:: ops:: { Add , Sub } ;
1690
1690
use std:: { any:: Any , sync:: Arc , vec} ;
1691
1691
1692
+ use crate :: unparser:: dialect:: SqliteDialect ;
1692
1693
use arrow:: array:: { LargeListArray , ListArray } ;
1693
1694
use arrow:: datatypes:: { DataType :: Int8 , Field , Int32Type , Schema , TimeUnit } ;
1694
1695
use ast:: ObjectName ;
@@ -1701,6 +1702,7 @@ mod tests {
1701
1702
ScalarUDFImpl , Signature , Volatility , WindowFrame , WindowFunctionDefinition ,
1702
1703
} ;
1703
1704
use datafusion_expr:: { interval_month_day_nano_lit, ExprFunctionExt } ;
1705
+ use datafusion_functions:: datetime:: from_unixtime:: FromUnixtimeFunc ;
1704
1706
use datafusion_functions:: expr_fn:: { get_field, named_struct} ;
1705
1707
use datafusion_functions_aggregate:: count:: count_udaf;
1706
1708
use datafusion_functions_aggregate:: expr_fn:: sum;
@@ -1712,7 +1714,7 @@ mod tests {
1712
1714
1713
1715
use crate :: unparser:: dialect:: {
1714
1716
CharacterLengthStyle , CustomDialect , CustomDialectBuilder , DateFieldExtractStyle ,
1715
- Dialect , DuckDBDialect , PostgreSqlDialect , ScalarFnToSqlHandler ,
1717
+ DefaultDialect , Dialect , DuckDBDialect , PostgreSqlDialect , ScalarFnToSqlHandler ,
1716
1718
} ;
1717
1719
1718
1720
use super :: * ;
@@ -2871,6 +2873,115 @@ mod tests {
2871
2873
Ok ( ( ) )
2872
2874
}
2873
2875
2876
+ #[ test]
2877
+ fn test_from_unixtime ( ) -> Result < ( ) > {
2878
+ let default_dialect: Arc < dyn Dialect > = Arc :: new ( DefaultDialect { } ) ;
2879
+ let sqlite_dialect: Arc < dyn Dialect > = Arc :: new ( SqliteDialect { } ) ;
2880
+
2881
+ for ( dialect, expected) in [
2882
+ ( default_dialect, "from_unixtime(date_col)" ) ,
2883
+ ( sqlite_dialect, "datetime(`date_col`, 'unixepoch')" ) ,
2884
+ ] {
2885
+ let unparser = Unparser :: new ( dialect. as_ref ( ) ) ;
2886
+ let expr = Expr :: ScalarFunction ( ScalarFunction {
2887
+ func : Arc :: new ( ScalarUDF :: from ( FromUnixtimeFunc :: new ( ) ) ) ,
2888
+ args : vec ! [ col( "date_col" ) ] ,
2889
+ } ) ;
2890
+
2891
+ let ast = unparser. expr_to_sql ( & expr) ?;
2892
+
2893
+ let actual = ast. to_string ( ) ;
2894
+ let expected = expected. to_string ( ) ;
2895
+
2896
+ assert_eq ! ( actual, expected) ;
2897
+ }
2898
+ Ok ( ( ) )
2899
+ }
2900
+
2901
+ #[ test]
2902
+ fn test_date_trunc ( ) -> Result < ( ) > {
2903
+ let default_dialect: Arc < dyn Dialect > = Arc :: new ( DefaultDialect { } ) ;
2904
+ let sqlite_dialect: Arc < dyn Dialect > = Arc :: new ( SqliteDialect { } ) ;
2905
+
2906
+ for ( dialect, precision, expected) in [
2907
+ (
2908
+ Arc :: clone ( & default_dialect) ,
2909
+ "YEAR" ,
2910
+ "date_trunc('YEAR', date_col)" ,
2911
+ ) ,
2912
+ (
2913
+ Arc :: clone ( & sqlite_dialect) ,
2914
+ "YEAR" ,
2915
+ "strftime('%Y', `date_col`)" ,
2916
+ ) ,
2917
+ (
2918
+ Arc :: clone ( & default_dialect) ,
2919
+ "MONTH" ,
2920
+ "date_trunc('MONTH', date_col)" ,
2921
+ ) ,
2922
+ (
2923
+ Arc :: clone ( & sqlite_dialect) ,
2924
+ "MONTH" ,
2925
+ "strftime('%Y-%m', `date_col`)" ,
2926
+ ) ,
2927
+ (
2928
+ Arc :: clone ( & default_dialect) ,
2929
+ "DAY" ,
2930
+ "date_trunc('DAY', date_col)" ,
2931
+ ) ,
2932
+ (
2933
+ Arc :: clone ( & sqlite_dialect) ,
2934
+ "DAY" ,
2935
+ "strftime('%Y-%m-%d', `date_col`)" ,
2936
+ ) ,
2937
+ (
2938
+ Arc :: clone ( & default_dialect) ,
2939
+ "HOUR" ,
2940
+ "date_trunc('HOUR', date_col)" ,
2941
+ ) ,
2942
+ (
2943
+ Arc :: clone ( & sqlite_dialect) ,
2944
+ "HOUR" ,
2945
+ "strftime('%Y-%m-%d %H', `date_col`)" ,
2946
+ ) ,
2947
+ (
2948
+ Arc :: clone ( & default_dialect) ,
2949
+ "MINUTE" ,
2950
+ "date_trunc('MINUTE', date_col)" ,
2951
+ ) ,
2952
+ (
2953
+ Arc :: clone ( & sqlite_dialect) ,
2954
+ "MINUTE" ,
2955
+ "strftime('%Y-%m-%d %H:%M', `date_col`)" ,
2956
+ ) ,
2957
+ ( default_dialect, "SECOND" , "date_trunc('SECOND', date_col)" ) ,
2958
+ (
2959
+ sqlite_dialect,
2960
+ "SECOND" ,
2961
+ "strftime('%Y-%m-%d %H:%M:%S', `date_col`)" ,
2962
+ ) ,
2963
+ ] {
2964
+ let unparser = Unparser :: new ( dialect. as_ref ( ) ) ;
2965
+ let expr = Expr :: ScalarFunction ( ScalarFunction {
2966
+ func : Arc :: new ( ScalarUDF :: from (
2967
+ datafusion_functions:: datetime:: date_trunc:: DateTruncFunc :: new ( ) ,
2968
+ ) ) ,
2969
+ args : vec ! [
2970
+ Expr :: Literal ( ScalarValue :: Utf8 ( Some ( precision. to_string( ) ) ) ) ,
2971
+ col( "date_col" ) ,
2972
+ ] ,
2973
+ } ) ;
2974
+
2975
+ let ast = unparser. expr_to_sql ( & expr) ?;
2976
+
2977
+ let actual = ast. to_string ( ) ;
2978
+ let expected = expected. to_string ( ) ;
2979
+
2980
+ assert_eq ! ( actual, expected) ;
2981
+ }
2982
+ Ok ( ( ) )
2983
+ }
2984
+
2874
2985
#[ test]
2875
2986
fn test_dictionary_to_sql ( ) -> Result < ( ) > {
2876
2987
let dialect = CustomDialectBuilder :: new ( ) . build ( ) ;
0 commit comments