Skip to content

Commit 47daf7e

Browse files
fix test
1 parent 3fc5b66 commit 47daf7e

File tree

3 files changed

+77
-2
lines changed

3 files changed

+77
-2
lines changed

query/src/test/java/tech/ydb/query/ValueReadTest.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,25 @@
55
import java.time.LocalDate;
66
import java.time.LocalDateTime;
77

8+
import java.time.chrono.IsoChronology;
89
import java.time.temporal.ChronoUnit;
910

1011
import org.junit.Assert;
1112
import org.junit.ClassRule;
1213
import org.junit.Test;
1314

1415
import tech.ydb.common.transaction.TxMode;
16+
import tech.ydb.core.Issue;
17+
import tech.ydb.core.Status;
18+
import tech.ydb.core.StatusCode;
1519
import tech.ydb.query.tools.QueryReader;
1620
import tech.ydb.query.tools.SessionRetryContext;
1721
import tech.ydb.table.query.Params;
1822
import tech.ydb.table.result.ResultSetReader;
23+
import tech.ydb.table.result.ValueReader;
24+
import tech.ydb.table.values.PrimitiveType;
1925
import tech.ydb.table.values.PrimitiveValue;
26+
import tech.ydb.table.values.Type;
2027
import tech.ydb.test.junit4.GrpcTransportRule;
2128

2229
/**
@@ -68,6 +75,40 @@ public void date32datetime64timestamp64interval64() {
6875
Assert.assertEquals(Duration.parse("-PT2S"), resultSetReader.getColumn(3).getInterval64());
6976
}
7077

78+
@Test
79+
public void timestamp64ReadTest() {
80+
System.out.println(Instant.ofEpochSecond(-4611669897600L));
81+
QueryReader result = CTX.supplyResult(
82+
s -> QueryReader.readFrom(s.createQuery("SELECT "
83+
+ "Timestamp64('-144169-01-01T00:00:00Z') as t1,"
84+
+ "Timestamp64('148107-12-31T23:59:59.999999Z') as t2;",
85+
TxMode.NONE
86+
))
87+
).join().getValue();
88+
89+
Assert.assertEquals(1, result.getResultSetCount());
90+
91+
ResultSetReader rs = result.getResultSet(0);
92+
Assert.assertTrue(rs.next());
93+
94+
assertTimestamp64(rs.getColumn("t1"), false, Instant.ofEpochSecond(-4611669897600L));
95+
assertTimestamp64(rs.getColumn("t2"), false, Instant.ofEpochSecond(4611669811199L, 999999000));
96+
97+
Status invalid = CTX.supplyResult(
98+
s -> s.createQuery("SELECT "
99+
+ "Timestamp64('-144170-01-01T00:00:00Z') as t1,"
100+
+ "Timestamp64('148108-01-01T00:00:00.000000Z') as t2;",
101+
TxMode.NONE
102+
).execute()
103+
).join().getStatus();
104+
105+
Assert.assertEquals(StatusCode.GENERIC_ERROR, invalid.getCode());
106+
Issue[] issues = invalid.getIssues();
107+
Assert.assertEquals(2, issues.length);
108+
Assert.assertEquals("Invalid value \"-144170-01-01T00:00:00Z\" for type Timestamp64", issues[0].getMessage());
109+
Assert.assertEquals("Invalid value \"148108-01-01T00:00:00.000000Z\" for type Timestamp64", issues[1].getMessage());
110+
}
111+
71112
private void date32datetime64timestamp64interval64Assert(LocalDate date32, LocalDateTime datetime64,
72113
Instant timestamp64, Duration interval64) {
73114
QueryReader reader = CTX.supplyResult(
@@ -95,4 +136,16 @@ private void date32datetime64timestamp64interval64Assert(LocalDate date32, Local
95136
Assert.assertEquals(timestamp64, resultSetReader.getColumn(2).getTimestamp64());
96137
Assert.assertEquals(interval64, resultSetReader.getColumn(3).getInterval64());
97138
}
139+
140+
private void assertTimestamp64(ValueReader vr, boolean optional, Instant expected) {
141+
Assert.assertNotNull(vr);
142+
if (optional) {
143+
Assert.assertSame(Type.Kind.OPTIONAL, vr.getType().getKind());
144+
Assert.assertSame(PrimitiveType.Timestamp64, vr.getType().unwrapOptional());
145+
} else {
146+
Assert.assertSame(PrimitiveType.Timestamp64, vr.getType());
147+
}
148+
149+
Assert.assertEquals(expected, vr.getTimestamp64());
150+
}
98151
}

table/src/main/java/tech/ydb/table/values/PrimitiveValue.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,12 +358,30 @@ public static PrimitiveValue newTimestamp(Instant value) {
358358
}
359359

360360
public static PrimitiveValue newTimestamp64(long microsSinceEpoch) {
361+
if (microsSinceEpoch < -4611669897600000000L) {
362+
throw new IllegalArgumentException("microsSinceEpoch value is before "
363+
+ "minimum timestamp64(-144168-01-01T00:00:00Z): " + microsSinceEpoch);
364+
}
365+
if (microsSinceEpoch >= 4611669811199999999L) {
366+
throw new IllegalArgumentException("microsSinceEpoch value is after "
367+
+ "maximum timestamp64(148107-12-31T23:59:59.999999Z): " + microsSinceEpoch);
368+
}
369+
361370
return new InstantValue(PrimitiveType.Timestamp64, microsSinceEpoch);
362371
}
363372

364373
public static PrimitiveValue newTimestamp64(Instant value) {
365-
long micros = TimeUnit.SECONDS.toMicros(value.getEpochSecond()) +
366-
TimeUnit.NANOSECONDS.toMicros(value.getNano());
374+
long seconds = value.getEpochSecond();
375+
if (seconds < -4611669897600000000L) {
376+
throw new IllegalArgumentException("Instant value is before "
377+
+ "minimum timestamp64(-144168-01-01T00:00:00Z): " + value);
378+
}
379+
int nanos = value.getNano();
380+
long micros = seconds * 1000000L + nanos / 1000;
381+
if (micros >= 4611669811199999999L) {
382+
throw new IllegalArgumentException("microsSinceEpoch value is after "
383+
+ "maximum timestamp64(148107-12-31T23:59:59.999999Z): " + value);
384+
}
367385
return new InstantValue(PrimitiveType.Timestamp64, micros);
368386
}
369387

table/src/main/java/tech/ydb/table/values/proto/ProtoType.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,10 @@ private static PrimitiveType primitiveTypeFromPb(ValueProtos.Type dataType) {
481481
case DATETIME: return PrimitiveType.Datetime;
482482
case TIMESTAMP: return PrimitiveType.Timestamp;
483483
case INTERVAL: return PrimitiveType.Interval;
484+
case DATE32: return PrimitiveType.Date32;
485+
case DATETIME64: return PrimitiveType.Datetime64;
486+
case TIMESTAMP64: return PrimitiveType.Timestamp64;
487+
case INTERVAL64: return PrimitiveType.Interval64;
484488
case TZ_DATE: return PrimitiveType.TzDate;
485489
case TZ_DATETIME: return PrimitiveType.TzDatetime;
486490
case TZ_TIMESTAMP: return PrimitiveType.TzTimestamp;

0 commit comments

Comments
 (0)