@@ -19,7 +19,9 @@ use arrow::datatypes::DataType::Timestamp;
1919use arrow:: datatypes:: TimeUnit :: Nanosecond ;
2020use arrow:: datatypes:: { DataType , Field , FieldRef } ;
2121use std:: any:: Any ;
22+ use std:: sync:: Arc ;
2223
24+ use datafusion_common:: config:: ConfigOptions ;
2325use datafusion_common:: { internal_err, Result , ScalarValue } ;
2426use datafusion_expr:: simplify:: { ExprSimplifyResult , SimplifyInfo } ;
2527use datafusion_expr:: {
@@ -41,6 +43,7 @@ The `now()` return value is determined at query time and will return the same ti
4143pub struct NowFunc {
4244 signature : Signature ,
4345 aliases : Vec < String > ,
46+ timezone : Option < Arc < str > > ,
4447}
4548
4649impl Default for NowFunc {
@@ -54,6 +57,15 @@ impl NowFunc {
5457 Self {
5558 signature : Signature :: nullary ( Volatility :: Stable ) ,
5659 aliases : vec ! [ "current_timestamp" . to_string( ) ] ,
60+ timezone : Some ( Arc :: from ( "+00" ) ) ,
61+ }
62+ }
63+
64+ pub fn new_with_config ( config : & ConfigOptions ) -> Self {
65+ Self {
66+ signature : Signature :: nullary ( Volatility :: Stable ) ,
67+ aliases : vec ! [ "current_timestamp" . to_string( ) ] ,
68+ timezone : Some ( Arc :: from ( config. execution . time_zone . as_str ( ) ) ) ,
5769 }
5870 }
5971}
@@ -80,7 +92,7 @@ impl ScalarUDFImpl for NowFunc {
8092 fn return_field_from_args ( & self , _args : ReturnFieldArgs ) -> Result < FieldRef > {
8193 Ok ( Field :: new (
8294 self . name ( ) ,
83- Timestamp ( Nanosecond , Some ( "+00" . into ( ) ) ) ,
95+ Timestamp ( Nanosecond , self . timezone . clone ( ) ) ,
8496 false ,
8597 )
8698 . into ( ) )
0 commit comments