11package tech .ydb .table .integration ;
22
3+ import java .time .Duration ;
34import java .time .Instant ;
5+ import java .time .LocalDate ;
6+ import java .time .LocalDateTime ;
7+ import java .time .temporal .ChronoUnit ;
48import java .util .UUID ;
59
610import org .junit .Assert ;
1317import tech .ydb .table .SessionRetryContext ;
1418import tech .ydb .table .impl .SimpleTableClient ;
1519import tech .ydb .table .query .DataQueryResult ;
20+ import tech .ydb .table .query .Params ;
1621import tech .ydb .table .result .ResultSetReader ;
1722import tech .ydb .table .result .ValueReader ;
1823import tech .ydb .table .rpc .grpc .GrpcTableRpc ;
@@ -124,11 +129,11 @@ private void assertTimestamp(ValueReader vr, boolean optional, Instant expected)
124129 public void timestampReadTest () {
125130 DataQueryResult result = CTX .supplyResult (
126131 s -> s .executeDataQuery ("SELECT "
127- + "DateTime::MakeTimestamp(DateTime::FromMilliseconds(0ul)) as t1,"
128- + "DateTime::MakeTimestamp(DateTime::FromMicroseconds(1000ul)) as t2,"
129- + "DateTime::MakeTimestamp(DateTime::FromMicroseconds(4291747199999999ul)) as t3,"
130- + "Timestamp('1970-01-01T00:00:00.000000Z') as t4,"
131- + "Timestamp('2105-12-31T23:59:59.999999Z') as t5;" ,
132+ + "DateTime::MakeTimestamp(DateTime::FromMilliseconds(0ul)) as t1,"
133+ + "DateTime::MakeTimestamp(DateTime::FromMicroseconds(1000ul)) as t2,"
134+ + "DateTime::MakeTimestamp(DateTime::FromMicroseconds(4291747199999999ul)) as t3,"
135+ + "Timestamp('1970-01-01T00:00:00.000000Z') as t4,"
136+ + "Timestamp('2105-12-31T23:59:59.999999Z') as t5;" ,
132137 TxControl .serializableRw ()
133138 )
134139 ).join ().getValue ();
@@ -146,8 +151,8 @@ public void timestampReadTest() {
146151
147152 Status invalid = CTX .supplyResult (
148153 s -> s .executeDataQuery ("SELECT "
149- + "Timestamp('1969-12-31T23:59:59.999999Z') as t6,"
150- + "Timestamp('2106-01-01T00:00:00.000000Z') as t7;" ,
154+ + "Timestamp('1969-12-31T23:59:59.999999Z') as t6,"
155+ + "Timestamp('2106-01-01T00:00:00.000000Z') as t7;" ,
151156 TxControl .serializableRw ()
152157 )
153158 ).join ().getStatus ();
@@ -164,18 +169,18 @@ public void timestampReadTest() {
164169 public void decimalReadTest () {
165170 DataQueryResult result = CTX .supplyResult (
166171 s -> s .executeDataQuery ("SELECT "
167- + "Decimal('9', 1, 0) AS d1, "
168- + "Decimal('-9', 1, 0) AS d2, "
169- + "Decimal('99999999999999999999999999999999999', 35, 0) AS d3, "
170- + "Decimal('-99999999999999999999999999999999999', 35, 0) AS d4, "
171- + "Decimal('9999999999999999999999999.9999999999', 35, 10) AS d5, "
172- + "Decimal('-9999999999999999999999999.9999999999', 35, 10) AS d6, "
173- + "Decimal('9.6', 1, 0) AS d7, "
174- + "Decimal('-9.6', 1, 0) AS d8, "
175- + "Decimal('99999999999999999999999999999999999.6', 35, 0) AS d9, "
176- + "Decimal('-99999999999999999999999999999999999.6', 35, 0) AS d10, "
177- + "Decimal('9999999999999999999999999.99999999996', 35, 10) AS d11, "
178- + "Decimal('-9999999999999999999999999.99999999996', 35, 10) AS d12;" ,
172+ + "Decimal('9', 1, 0) AS d1, "
173+ + "Decimal('-9', 1, 0) AS d2, "
174+ + "Decimal('99999999999999999999999999999999999', 35, 0) AS d3, "
175+ + "Decimal('-99999999999999999999999999999999999', 35, 0) AS d4, "
176+ + "Decimal('9999999999999999999999999.9999999999', 35, 10) AS d5, "
177+ + "Decimal('-9999999999999999999999999.9999999999', 35, 10) AS d6, "
178+ + "Decimal('9.6', 1, 0) AS d7, "
179+ + "Decimal('-9.6', 1, 0) AS d8, "
180+ + "Decimal('99999999999999999999999999999999999.6', 35, 0) AS d9, "
181+ + "Decimal('-99999999999999999999999999999999999.6', 35, 0) AS d10, "
182+ + "Decimal('9999999999999999999999999.99999999996', 35, 10) AS d11, "
183+ + "Decimal('-9999999999999999999999999.99999999996', 35, 10) AS d12;" ,
179184 TxControl .serializableRw ()
180185 )
181186 ).join ().getValue ();
@@ -223,4 +228,109 @@ public void decimalReadTest() {
223228 Assert .assertEquals (d8 .getLow (), d10 .getLow ());
224229 Assert .assertEquals (d8 .getLow (), d12 .getLow ());
225230 }
231+
232+ @ Test
233+ public void date32datetime64timestamp64interval64 () {
234+ date32datetime64timestamp64interval64Assert (
235+ LocalDate .of (988 , 2 , 6 ),
236+ LocalDateTime .of (988 , 2 , 7 , 12 , 30 , 0 ),
237+ Instant .parse ("0998-06-02T12:30:00.678901Z" ),
238+ Duration .parse ("-PT2S" )
239+ );
240+
241+ date32datetime64timestamp64interval64Assert (
242+ LocalDate .now (),
243+ LocalDateTime .now ().truncatedTo (ChronoUnit .SECONDS ),
244+ Instant .now ().truncatedTo (ChronoUnit .MICROS ),
245+ Duration .ZERO
246+ );
247+
248+ DataQueryResult reader = CTX .supplyResult (
249+ s -> s .executeDataQuery ("DECLARE $date32 AS Date32;\n " +
250+ "DECLARE $datetime64 AS Datetime64;\n " +
251+ "DECLARE $timestamp64 AS Timestamp64;\n " +
252+ "DECLARE $interval64 AS Interval64;\n " +
253+ "\n " +
254+ "$date32=Date32('998-06-02'); \n " +
255+ "$datetime64=Datetime64('0998-06-02T12:30:00Z');\n " +
256+ "$timestamp64=Timestamp64('0998-06-02T12:30:00.678901Z');\n " +
257+ "$interval64=Interval64('-PT2S');\n " +
258+ "\n " +
259+ "SELECT $date32, $datetime64, $timestamp64, $interval64;" , TxControl .serializableRw ())
260+ ).join ().getValue ();
261+
262+ ResultSetReader resultSetReader = reader .getResultSet (0 );
263+
264+ Assert .assertTrue (resultSetReader .next ());
265+ Assert .assertEquals (LocalDate .parse ("0998-06-02" ), resultSetReader .getColumn (0 ).getDate32 ());
266+ Assert .assertEquals (LocalDateTime .parse ("0998-06-02T12:30:00" ), resultSetReader .getColumn (1 ).getDatetime64 ());
267+ Assert .assertEquals (Instant .parse ("0998-06-02T12:30:00.678901Z" ), resultSetReader .getColumn (2 ).getTimestamp64 ());
268+ Assert .assertEquals (Duration .parse ("-PT2S" ), resultSetReader .getColumn (3 ).getInterval64 ());
269+ }
270+
271+ @ Test
272+ public void timestamp64ReadTest () {
273+ System .out .println (Instant .ofEpochSecond (-4611669897600L ));
274+ DataQueryResult result = CTX .supplyResult (
275+ s -> s .executeDataQuery ("SELECT "
276+ + "Timestamp64('-144169-01-01T00:00:00Z') as t1,"
277+ + "Timestamp64('148107-12-31T23:59:59.999999Z') as t2;" ,
278+ TxControl .serializableRw ()
279+ )).join ().getValue ();
280+
281+ Assert .assertEquals (1 , result .getResultSetCount ());
282+
283+ ResultSetReader rs = result .getResultSet (0 );
284+ Assert .assertTrue (rs .next ());
285+
286+ assertTimestamp64 (rs .getColumn ("t1" ), Instant .ofEpochSecond (-4611669897600L ));
287+ assertTimestamp64 (rs .getColumn ("t2" ), Instant .ofEpochSecond (4611669811199L , 999999000 ));
288+
289+ Status invalid = CTX .supplyResult (
290+ s -> s .executeDataQuery ("SELECT "
291+ + "Timestamp64('-144170-01-01T00:00:00Z') as t1,"
292+ + "Timestamp64('148108-01-01T00:00:00.000000Z') as t2;" ,
293+ TxControl .serializableRw ()
294+ )
295+ ).join ().getStatus ();
296+
297+ Assert .assertEquals (StatusCode .GENERIC_ERROR , invalid .getCode ());
298+ Issue [] issues = invalid .getIssues ();
299+ Assert .assertEquals (2 , issues .length );
300+ Assert .assertEquals ("Invalid value \" -144170-01-01T00:00:00Z\" for type Timestamp64" , issues [0 ].getMessage ());
301+ Assert .assertEquals ("Invalid value \" 148108-01-01T00:00:00.000000Z\" for type Timestamp64" , issues [1 ].getMessage ());
302+ }
303+
304+ private void date32datetime64timestamp64interval64Assert (LocalDate date32 , LocalDateTime datetime64 ,
305+ Instant timestamp64 , Duration interval64 ) {
306+ DataQueryResult reader = CTX .supplyResult (
307+ s -> s .executeDataQuery ("" +
308+ "DECLARE $date32 AS date32;\n " +
309+ "DECLARE $datetime64 AS Datetime64;\n " +
310+ "DECLARE $timestamp64 AS Timestamp64;\n " +
311+ "DECLARE $interval64 AS Interval64;" +
312+ "SELECT $date32, $datetime64, $timestamp64, $interval64;" ,
313+ TxControl .serializableRw (),
314+ Params .of (
315+ "$date32" , PrimitiveValue .newDate32 (date32 ),
316+ "$datetime64" , PrimitiveValue .newDatetime64 (datetime64 ),
317+ "$timestamp64" , PrimitiveValue .newTimestamp64 (timestamp64 ),
318+ "$interval64" , PrimitiveValue .newInterval64 (interval64 )
319+ )
320+ )).join ().getValue ();
321+
322+ ResultSetReader resultSetReader = reader .getResultSet (0 );
323+
324+ Assert .assertTrue (resultSetReader .next ());
325+ Assert .assertEquals (date32 , resultSetReader .getColumn (0 ).getDate32 ());
326+ Assert .assertEquals (datetime64 , resultSetReader .getColumn (1 ).getDatetime64 ());
327+ Assert .assertEquals (timestamp64 , resultSetReader .getColumn (2 ).getTimestamp64 ());
328+ Assert .assertEquals (interval64 , resultSetReader .getColumn (3 ).getInterval64 ());
329+ }
330+
331+ private void assertTimestamp64 (ValueReader vr , Instant expected ) {
332+ Assert .assertNotNull (vr );
333+ Assert .assertSame (PrimitiveType .Timestamp64 , vr .getType ());
334+ Assert .assertEquals (expected , vr .getTimestamp64 ());
335+ }
226336}
0 commit comments