diff --git a/be/src/exprs/timestamp_functions.cpp b/be/src/exprs/timestamp_functions.cpp index 9b90979dab7ed2..2b62c3258a8d67 100644 --- a/be/src/exprs/timestamp_functions.cpp +++ b/be/src/exprs/timestamp_functions.cpp @@ -423,7 +423,7 @@ StringVal TimestampFunctions::from_unix( } IntVal TimestampFunctions::to_unix(FunctionContext* context) { - return IntVal(context->impl()->state()->timestamp() / 1000); + return IntVal(context->impl()->state()->timestamp_ms() / 1000); } IntVal TimestampFunctions::to_unix( @@ -462,7 +462,7 @@ IntVal TimestampFunctions::to_unix( DateTimeVal TimestampFunctions::utc_timestamp(FunctionContext* context) { DateTimeValue dtv; - if (!dtv.from_unixtime(context->impl()->state()->timestamp() / 1000, "+00:00")) { + if (!dtv.from_unixtime(context->impl()->state()->timestamp_ms() / 1000, "+00:00")) { return DateTimeVal::null(); } @@ -473,7 +473,7 @@ DateTimeVal TimestampFunctions::utc_timestamp(FunctionContext* context) { DateTimeVal TimestampFunctions::now(FunctionContext* context) { DateTimeValue dtv; - if (!dtv.from_unixtime(context->impl()->state()->timestamp() / 1000, + if (!dtv.from_unixtime(context->impl()->state()->timestamp_ms() / 1000, context->impl()->state()->timezone())) { return DateTimeVal::null(); } @@ -485,7 +485,7 @@ DateTimeVal TimestampFunctions::now(FunctionContext* context) { DoubleVal TimestampFunctions::curtime(FunctionContext* context) { DateTimeValue dtv; - if (!dtv.from_unixtime(context->impl()->state()->timestamp() / 1000, + if (!dtv.from_unixtime(context->impl()->state()->timestamp_ms() / 1000, context->impl()->state()->timezone())) { return DoubleVal::null(); } diff --git a/be/src/runtime/runtime_state.cpp b/be/src/runtime/runtime_state.cpp index 172d80193a6857..35b96dd5f40540 100644 --- a/be/src/runtime/runtime_state.cpp +++ b/be/src/runtime/runtime_state.cpp @@ -107,11 +107,20 @@ RuntimeState::RuntimeState(const TQueryGlobals& query_globals) _profile(_obj_pool.get(), ""), _per_fragment_instance_idx(0) { _query_options.batch_size = DEFAULT_BATCH_SIZE; - _timestamp = atol(query_globals.now_string.c_str()); if (query_globals.__isset.time_zone) { _timezone = query_globals.time_zone; + _timestamp_ms = query_globals.timestamp_ms; + } else if (!query_globals.now_string.empty()) { + _timezone = TimezoneDatabase::default_time_zone; + DateTimeValue dt; + dt.from_date_str(query_globals.now_string.c_str(), query_globals.now_string.size()); + int64_t timestamp; + dt.unix_timestamp(×tamp, _timezone); + _timestamp_ms = timestamp * 1000; } else { + //Unit test may set into here _timezone = TimezoneDatabase::default_time_zone; + _timestamp_ms = 0; } } @@ -169,11 +178,20 @@ Status RuntimeState::init( const TQueryGlobals& query_globals, ExecEnv* exec_env) { _fragment_instance_id = fragment_instance_id; _query_options = query_options; - _timestamp = atol(query_globals.now_string.c_str()); if (query_globals.__isset.time_zone) { _timezone = query_globals.time_zone; + _timestamp_ms = query_globals.timestamp_ms; + } else if (!query_globals.now_string.empty()) { + _timezone = TimezoneDatabase::default_time_zone; + DateTimeValue dt; + dt.from_date_str(query_globals.now_string.c_str(), query_globals.now_string.size()); + int64_t timestamp; + dt.unix_timestamp(×tamp, _timezone); + _timestamp_ms = timestamp * 1000; } else { + //Unit test may set into here _timezone = TimezoneDatabase::default_time_zone; + _timestamp_ms = 0; } _exec_env = exec_env; diff --git a/be/src/runtime/runtime_state.h b/be/src/runtime/runtime_state.h index 64216e355602ee..ac5e2650d18136 100644 --- a/be/src/runtime/runtime_state.h +++ b/be/src/runtime/runtime_state.h @@ -136,8 +136,8 @@ class RuntimeState { int num_scanner_threads() const { return _query_options.num_scanner_threads; } - int64_t timestamp() const { - return _timestamp; + int64_t timestamp_ms() const { + return _timestamp_ms; } const std::string& timezone() const { return _timezone; @@ -536,8 +536,8 @@ class RuntimeState { // Username of user that is executing the query to which this RuntimeState belongs. std::string _user; - //Query-global timestamp - int64_t _timestamp; + //Query-global timestamp_ms + int64_t _timestamp_ms; std::string _timezone; TUniqueId _query_id; diff --git a/be/test/exprs/timestamp_functions_test.cpp b/be/test/exprs/timestamp_functions_test.cpp index 4fc33ccbe9e0f6..f1ae1ce2924e76 100644 --- a/be/test/exprs/timestamp_functions_test.cpp +++ b/be/test/exprs/timestamp_functions_test.cpp @@ -40,7 +40,8 @@ class TimestampFunctionsTest : public testing::Test { TimezoneDatabase::init(); TQueryGlobals globals; - globals.__set_now_string("1565080737805"); + globals.__set_now_string("2019-08-06 01:38:57"); + globals.__set_timestamp_ms(1565080737805); globals.__set_time_zone("America/Los_Angeles"); state = new RuntimeState(globals); utils = new FunctionUtils(state); diff --git a/docs/documentation/cn/administrator-guide/load-data/broker-load-manual.md b/docs/documentation/cn/administrator-guide/load-data/broker-load-manual.md index bdcb4026f947f1..1a28ed0efb10cc 100644 --- a/docs/documentation/cn/administrator-guide/load-data/broker-load-manual.md +++ b/docs/documentation/cn/administrator-guide/load-data/broker-load-manual.md @@ -95,7 +95,7 @@ LOAD LABEL db1.label1 SET ( id=tmp_c2, - name=tmp_c1) + name=tmp_c1 ), DATA INFILE("hdfs://abc.com:8888/user/palo/test/ml/file2") INTO TABLE tbl2 diff --git a/docs/documentation/cn/sql-reference/sql-functions/date-time-functions/curtime.md b/docs/documentation/cn/sql-reference/sql-functions/date-time-functions/curtime.md index 83b9b05f3a6fc8..e3b8157617e884 100644 --- a/docs/documentation/cn/sql-reference/sql-functions/date-time-functions/curtime.md +++ b/docs/documentation/cn/sql-reference/sql-functions/date-time-functions/curtime.md @@ -6,7 +6,7 @@ ## Description -获得当前的时间,以TIME类型返回 +鑾峰緱褰撳墠鐨勬椂闂达紝浠IME绫诲瀷杩斿洖 ## Examples diff --git a/fe/src/main/java/org/apache/doris/qe/Coordinator.java b/fe/src/main/java/org/apache/doris/qe/Coordinator.java index 8cded734b13dd8..9d072e1180ee18 100644 --- a/fe/src/main/java/org/apache/doris/qe/Coordinator.java +++ b/fe/src/main/java/org/apache/doris/qe/Coordinator.java @@ -85,6 +85,8 @@ import org.apache.logging.log4j.Logger; import org.apache.thrift.TException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -105,6 +107,8 @@ public class Coordinator { private static final Logger LOG = LogManager.getLogger(Coordinator.class); + private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private static String localIP = FrontendOptions.getLocalHostAddress(); // Overall status of the entire query; set to the first reported fragment error @@ -190,7 +194,8 @@ public Coordinator(ConnectContext context, Analyzer analyzer, Planner planner) { this.descTable = analyzer.getDescTbl().toThrift(); this.returnedAllResults = false; this.queryOptions = context.getSessionVariable().toThrift(); - this.queryGlobals.setNow_string(String.valueOf(new Date().getTime())); + this.queryGlobals.setNow_string(DATE_FORMAT.format(new Date())); + this.queryGlobals.setTimestamp_ms(new Date().getTime()); if (context.getSessionVariable().getTimeZone().equals("CST")) { this.queryGlobals.setTime_zone(TimeUtils.DEFAULT_TIME_ZONE); } else { @@ -215,7 +220,8 @@ public Coordinator(Long jobId, TUniqueId queryId, DescriptorTable descTable, this.fragments = fragments; this.scanNodes = scanNodes; this.queryOptions = new TQueryOptions(); - this.queryGlobals.setNow_string(String.valueOf(new Date().getTime())); + this.queryGlobals.setNow_string(DATE_FORMAT.format(new Date())); + this.queryGlobals.setTimestamp_ms(new Date().getTime()); this.queryGlobals.setTime_zone(TimeUtils.DEFAULT_TIME_ZONE); this.tResourceInfo = new TResourceInfo("", ""); this.needReport = true; diff --git a/gensrc/thrift/PaloInternalService.thrift b/gensrc/thrift/PaloInternalService.thrift index f8d373e5a3085d..4aa70aae063401 100644 --- a/gensrc/thrift/PaloInternalService.thrift +++ b/gensrc/thrift/PaloInternalService.thrift @@ -181,8 +181,16 @@ struct TPlanFragmentExecParams { // Global query parameters assigned by the coordinator. struct TQueryGlobals { // String containing a timestamp set as the current time. + // Format is yyyy-MM-dd HH:mm:ss 1: required string now_string - 2: optional string time_zone + + // To support timezone in Doris. timestamp_ms is the millisecond uinix timestamp for + // this query to calculate time zone relative function + 2: optional i64 timestamp_ms + + // time_zone is the timezone this query used. + // If this value is set, BE will ignore now_string + 3: optional string time_zone }