Skip to content

Commit 9939812

Browse files
authored
GDV-90:[C++]Fixed extract second from time. (apache#70)
Fixed the implementation of extract second from time.
1 parent 37ccfe8 commit 9939812

3 files changed

Lines changed: 21 additions & 3 deletions

File tree

cpp/src/gandiva/src/precompiled/time.cc

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ extern "C" {
2323
#define MILLIS_TO_MINS(millis) ((millis) / (60 * 1000))
2424
#define MILLIS_TO_HOUR(millis) ((millis) / (60 * 60 * 1000))
2525
#define MINS_IN_HOUR 60
26+
#define SECONDS_IN_MINUTE 60
2627

2728
// Expand inner macro for all date types.
2829
#define DATE_TYPES(INNER) \
@@ -375,9 +376,13 @@ DATE_TYPES(EXTRACT_SECOND)
375376
DATE_TYPES(EXTRACT_EPOCH)
376377

377378
// Functions that work on millis in a day
378-
#define EXTRACT_SECOND_TIME(TYPE) \
379-
FORCE_INLINE \
380-
int64 extractSecond##_##TYPE(TYPE millis) { return MILLIS_TO_SEC(millis); }
379+
#define EXTRACT_SECOND_TIME(TYPE) \
380+
FORCE_INLINE \
381+
int64 extractSecond##_##TYPE(TYPE millis) { \
382+
int64 seconds_of_day = MILLIS_TO_SEC(millis); \
383+
int64 sec = seconds_of_day % SECONDS_IN_MINUTE; \
384+
return sec; \
385+
}
381386

382387
EXTRACT_SECOND_TIME(time32)
383388

cpp/src/gandiva/src/precompiled/time_test.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ timestamp StringToTimestamp(const char *buf) {
2525
return timegm(&tm) * 1000; // to millis
2626
}
2727

28+
TEST(TestTime, TestExtractTime) {
29+
// 10:20:33
30+
int32 time_as_millis_in_day = 37233000;
31+
32+
EXPECT_EQ(extractHour_time32(time_as_millis_in_day), 10);
33+
EXPECT_EQ(extractMinute_time32(time_as_millis_in_day), 20);
34+
EXPECT_EQ(extractSecond_time32(time_as_millis_in_day), 33);
35+
}
36+
2837
TEST(TestTime, TestExtractTimestamp) {
2938
timestamp ts = StringToTimestamp("1970-05-02 10:20:33");
3039

cpp/src/gandiva/src/precompiled/types.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ int64 extractHour_timestamp(timestamp millis);
6464
int64 extractMinute_timestamp(timestamp millis);
6565
int64 extractSecond_timestamp(timestamp millis);
6666

67+
int64 extractHour_time32(int32 millis_in_day);
68+
int64 extractMinute_time32(int32 millis_in_day);
69+
int64 extractSecond_time32(int32 millis_in_day);
70+
6771
int32 mem_compare(const char *left, int32 left_len, const char *right, int32 right_len);
6872

6973
} // extern "C"

0 commit comments

Comments
 (0)