Skip to content

Commit 914ae47

Browse files
nokiaMSgithubgxll
authored andcommitted
[fix][runtime] Support union all between time and timestamp.
1 parent 6763705 commit 914ae47

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed

runtime/src/main/java/io/dingodb/expr/runtime/op/cast/TimeCastOpFactory.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@
2424

2525
import java.io.Serial;
2626
import java.sql.Time;
27+
import java.sql.Timestamp;
28+
import java.time.Instant;
29+
import java.time.ZoneId;
30+
import java.time.ZonedDateTime;
31+
import java.util.Calendar;
2732
import java.util.HashMap;
2833
import java.util.Map;
2934

@@ -137,6 +142,15 @@ protected Time evalNonNullValue(@NonNull Object value, ExprConfig config) {
137142
return timeCast((Time) value);
138143
} else if (value instanceof Long) {
139144
return timeCast((Long) value);
145+
} else if (value instanceof Timestamp) {
146+
Calendar calendar = Calendar.getInstance();
147+
calendar.setTimeInMillis(((Timestamp) value).getTime());
148+
149+
int hour = calendar.get(Calendar.HOUR_OF_DAY);
150+
int minute = calendar.get(Calendar.MINUTE);
151+
int second = calendar.get(Calendar.SECOND);
152+
153+
return new Time(hour, minute, second);
140154
} else {
141155
return null;
142156
}

runtime/src/main/java/io/dingodb/expr/runtime/op/cast/TimestampCastOp.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@
2626

2727
import java.math.BigDecimal;
2828
import java.sql.Date;
29+
import java.sql.Time;
2930
import java.sql.Timestamp;
31+
import java.time.LocalDate;
32+
import java.time.LocalDateTime;
3033

3134
//@Operators
3235
abstract class TimestampCastOp extends CastOp {
@@ -48,6 +51,14 @@ abstract class TimestampCastOp extends CastOp {
4851
return new Timestamp(DateTimeUtils.fromSecond(value));
4952
}
5053

54+
static @NonNull Timestamp timestampCast(@NonNull Time value) {
55+
int hours = value.toLocalTime().getHour();
56+
int minutes = value.toLocalTime().getMinute();
57+
int seconds = value.toLocalTime().getSecond();
58+
LocalDateTime localDatetime = LocalDate.now().atTime(hours,minutes,seconds);
59+
return Timestamp.valueOf(localDatetime);
60+
}
61+
5162
static @Nullable Timestamp timestampCast(String value, @NonNull ExprConfig config) {
5263
return DateTimeUtils.parseTimestamp(value, config.getParseDateAndTimestampFormatters());
5364
}

runtime/src/main/java/io/dingodb/expr/runtime/op/cast/TimestampCastOpFactory.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.io.Serial;
2626
import java.math.BigDecimal;
2727
import java.sql.Date;
28+
import java.sql.Time;
2829
import java.sql.Timestamp;
2930
import java.util.HashMap;
3031
import java.util.Map;
@@ -47,6 +48,7 @@ private TimestampCastOpFactory() {
4748
opMap.put(keyOf(Types.TIMESTAMP), new TimestampCastTimestamp());
4849
opMap.put(keyOf(Types.INT), new TimestampCastInt());
4950
opMap.put(keyOf(Types.DATE), new TimestampCastDate());
51+
opMap.put(keyOf(Types.TIME), new TimestampCastTime());
5052
}
5153

5254
@Override
@@ -152,6 +154,20 @@ public OpKey getKey() {
152154
}
153155
}
154156

157+
public static final class TimestampCastTime extends TimestampCastOp {
158+
private static final long serialVersionUID = 6942116289893890527L;
159+
160+
@Override
161+
protected Timestamp evalNonNullValue(@NonNull Object value, ExprConfig config) {
162+
return timestampCastAny.evalNonNullValue(value, config);
163+
}
164+
165+
@Override
166+
public OpKey getKey() {
167+
return keyOf(Types.TIME);
168+
}
169+
}
170+
155171
public static final class TimestampCastAny extends TimestampCastOp {
156172

157173
@Serial
@@ -171,6 +187,8 @@ protected Timestamp evalNonNullValue(@NonNull Object value, ExprConfig config) {
171187
return timestampCast((Long) value);
172188
} else if (value instanceof BigDecimal) {
173189
return timestampCast((BigDecimal) value);
190+
} else if (value instanceof Time) {
191+
return timestampCast((Time) value);
174192
} else {
175193
return null;
176194
}

0 commit comments

Comments
 (0)