Skip to content

Commit d4f109c

Browse files
feat: supported Date32, Datetime64, Timestamp64, Interval64
1 parent be40178 commit d4f109c

File tree

12 files changed

+435
-256
lines changed

12 files changed

+435
-256
lines changed

jdbc/src/main/java/tech/ydb/jdbc/YdbJdbcCode.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

jdbc/src/main/java/tech/ydb/jdbc/common/MappingGetters.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,14 @@ private static ValueToString valueToString(PrimitiveType id) {
169169
return value -> String.valueOf(value.getTimestamp());
170170
case Interval:
171171
return value -> String.valueOf(value.getInterval());
172+
case Date32:
173+
return value -> String.valueOf(value.getDate32());
174+
case Datetime64:
175+
return value -> String.valueOf(value.getDatetime64());
176+
case Timestamp64:
177+
return value -> String.valueOf(value.getTimestamp64());
178+
case Interval64:
179+
return value -> String.valueOf(value.getInterval64());
172180
case TzDate:
173181
return value -> String.valueOf(value.getTzDate());
174182
case TzDatetime:
@@ -377,6 +385,8 @@ private static ValueToInt valueToInt(PrimitiveType id) {
377385
return value -> checkIntValue(id, value.getUint64());
378386
case Date:
379387
return value -> checkIntValue(id, value.getDate().toEpochDay());
388+
case Date32:
389+
return value -> checkIntValue(id, value.getDate32().toEpochDay());
380390
default:
381391
return castToIntNotSupported(id.name());
382392
}
@@ -404,17 +414,25 @@ private static ValueToLong valueToLong(PrimitiveType id) {
404414
return PrimitiveReader::getUint64;
405415
case Date:
406416
return value -> value.getDate().toEpochDay();
417+
case Date32:
418+
return value -> value.getDate32().toEpochDay();
407419
case Datetime:
408420
return value -> value.getDatetime().toEpochSecond(ZoneOffset.UTC);
421+
case Datetime64:
422+
return value -> value.getDatetime64().toEpochSecond(ZoneOffset.UTC);
409423
case Timestamp:
410424
return value -> value.getTimestamp().toEpochMilli();
425+
case Timestamp64:
426+
return value -> value.getTimestamp64().toEpochMilli();
411427
case TzDate:
412428
case TzDatetime:
413429
case TzTimestamp:
414430
ValueToInstant delegate = valueToInstant(id);
415431
return value -> delegate.fromValue(value).toEpochMilli();
416432
case Interval:
417433
return value -> TimeUnit.NANOSECONDS.toMicros(value.getInterval().toNanos());
434+
case Interval64:
435+
return value -> TimeUnit.NANOSECONDS.toMicros(value.getInterval64().toNanos());
418436
default:
419437
return castToLongNotSupported(id.name());
420438
}
@@ -635,12 +653,16 @@ private static SqlType buildPrimitiveType(int sqlType, PrimitiveType id) {
635653
case Double:
636654
return new SqlType(sqlType, Double.class);
637655
case Date:
656+
case Date32:
638657
return new SqlType(sqlType, LocalDate.class);
639658
case Datetime:
659+
case Datetime64:
640660
return new SqlType(sqlType, LocalDateTime.class);
641661
case Timestamp:
662+
case Timestamp64:
642663
return new SqlType(sqlType, Instant.class);
643664
case Interval:
665+
case Interval64:
644666
return new SqlType(sqlType, Duration.class);
645667
case TzDate:
646668
case TzDatetime:

jdbc/src/main/java/tech/ydb/jdbc/impl/YdbTypes.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import java.util.UUID;
1818

1919
import tech.ydb.jdbc.YdbConst;
20-
import tech.ydb.jdbc.YdbJdbcCode;
2120
import tech.ydb.table.values.DecimalType;
2221
import tech.ydb.table.values.DecimalValue;
2322
import tech.ydb.table.values.PrimitiveType;
@@ -65,11 +64,12 @@ private YdbTypes() {
6564
typeBySqlType.put(YdbConst.SQL_KIND_PRIMITIVE + 22, PrimitiveType.TzTimestamp);
6665

6766
typeBySqlType.put(YdbConst.SQL_KIND_PRIMITIVE + 23, PrimitiveType.JsonDocument);
67+
typeBySqlType.put(YdbConst.SQL_KIND_PRIMITIVE + 24, PrimitiveType.DyNumber);
6868

69-
typeBySqlType.put(YdbJdbcCode.DATE_32, PrimitiveType.Date32);
70-
typeBySqlType.put(YdbJdbcCode.DATETIME_64, PrimitiveType.Datetime64);
71-
typeBySqlType.put(YdbJdbcCode.TIMESTAMP_64, PrimitiveType.Timestamp64);
72-
typeBySqlType.put(YdbJdbcCode.INTERVAL_64, PrimitiveType.Interval64);
69+
typeBySqlType.put(YdbConst.SQL_KIND_PRIMITIVE + 25, PrimitiveType.Date32);
70+
typeBySqlType.put(YdbConst.SQL_KIND_PRIMITIVE + 26, PrimitiveType.Datetime64);
71+
typeBySqlType.put(YdbConst.SQL_KIND_PRIMITIVE + 27, PrimitiveType.Timestamp64);
72+
typeBySqlType.put(YdbConst.SQL_KIND_PRIMITIVE + 28, PrimitiveType.Interval64);
7373

7474
typeBySqlType.put(Types.VARCHAR, PrimitiveType.Text);
7575
typeBySqlType.put(Types.BIGINT, PrimitiveType.Int64);

jdbc/src/test/java/tech/ydb/jdbc/impl/YdbDatabaseMetaDataImplTest.java

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -587,72 +587,81 @@ public void getColumns() throws SQLException {
587587
TableAssert.ResultSetAssert rs = columns.check(metaData.getColumns(null, null, ALL_TYPES_TABLE, null))
588588
.assertMetaColumns();
589589

590+
rs.nextRow(columnName.eq("c_Interval64"), dataType.eq(Types.BIGINT), typeName.eq("Interval64"),
591+
columnSize.eq(8), ordinal.eq(1)).assertAll();
590592
rs.nextRow(columnName.eq("key"), dataType.eq(Types.INTEGER), typeName.eq("Int32"),
591-
columnSize.eq(4), ordinal.eq(1)).assertAll();
593+
columnSize.eq(4), ordinal.eq(2)).assertAll();
592594

593595
rs.nextRow(columnName.eq("c_Bool"), dataType.eq(Types.BOOLEAN), typeName.eq("Bool"),
594-
columnSize.eq(1), ordinal.eq(2)).assertAll();
596+
columnSize.eq(1), ordinal.eq(3)).assertAll();
595597

596598
rs.nextRow(columnName.eq("c_Int8"), dataType.eq(Types.SMALLINT), typeName.eq("Int8"),
597-
columnSize.eq(1), ordinal.eq(3)).assertAll();
599+
columnSize.eq(1), ordinal.eq(4)).assertAll();
598600
rs.nextRow(columnName.eq("c_Int16"), dataType.eq(Types.SMALLINT), typeName.eq("Int16"),
599-
columnSize.eq(2), ordinal.eq(4)).assertAll();
601+
columnSize.eq(2), ordinal.eq(5)).assertAll();
600602
rs.nextRow(columnName.eq("c_Int32"), dataType.eq(Types.INTEGER), typeName.eq("Int32"),
601-
columnSize.eq(4), ordinal.eq(5)).assertAll();
603+
columnSize.eq(4), ordinal.eq(6)).assertAll();
602604
rs.nextRow(columnName.eq("c_Int64"), dataType.eq(Types.BIGINT), typeName.eq("Int64"),
603-
columnSize.eq(8), ordinal.eq(6)).assertAll();
605+
columnSize.eq(8), ordinal.eq(7)).assertAll();
604606

605607
rs.nextRow(columnName.eq("c_Uint8"), dataType.eq(Types.INTEGER), typeName.eq("Uint8"),
606-
columnSize.eq(1), ordinal.eq(7)).assertAll();
608+
columnSize.eq(1), ordinal.eq(8)).assertAll();
607609
rs.nextRow(columnName.eq("c_Uint16"), dataType.eq(Types.INTEGER), typeName.eq("Uint16"),
608-
columnSize.eq(2), ordinal.eq(8)).assertAll();
610+
columnSize.eq(2), ordinal.eq(9)).assertAll();
609611
rs.nextRow(columnName.eq("c_Uint32"), dataType.eq(Types.BIGINT), typeName.eq("Uint32"),
610-
columnSize.eq(4), ordinal.eq(9)).assertAll();
612+
columnSize.eq(4), ordinal.eq(10)).assertAll();
611613
rs.nextRow(columnName.eq("c_Uint64"), dataType.eq(Types.BIGINT), typeName.eq("Uint64"),
612-
columnSize.eq(8), ordinal.eq(10)).assertAll();
614+
columnSize.eq(8), ordinal.eq(11)).assertAll();
613615

614616
rs.nextRow(columnName.eq("c_Float"), dataType.eq(Types.FLOAT), typeName.eq("Float"),
615-
columnSize.eq(4), ordinal.eq(11)).assertAll();
617+
columnSize.eq(4), ordinal.eq(12)).assertAll();
616618
rs.nextRow(columnName.eq("c_Double"), dataType.eq(Types.DOUBLE), typeName.eq("Double"),
617-
columnSize.eq(8), ordinal.eq(12)).assertAll();
619+
columnSize.eq(8), ordinal.eq(13)).assertAll();
618620

619621
rs.nextRow(columnName.eq("c_Bytes"), dataType.eq(Types.BINARY), typeName.eq("Bytes"),
620-
columnSize.eq(YdbConst.MAX_COLUMN_SIZE), ordinal.eq(13)).assertAll();
621-
rs.nextRow(columnName.eq("c_Text"), dataType.eq(Types.VARCHAR), typeName.eq("Text"),
622622
columnSize.eq(YdbConst.MAX_COLUMN_SIZE), ordinal.eq(14)).assertAll();
623-
rs.nextRow(columnName.eq("c_Json"), dataType.eq(Types.VARCHAR), typeName.eq("Json"),
623+
rs.nextRow(columnName.eq("c_Text"), dataType.eq(Types.VARCHAR), typeName.eq("Text"),
624624
columnSize.eq(YdbConst.MAX_COLUMN_SIZE), ordinal.eq(15)).assertAll();
625-
rs.nextRow(columnName.eq("c_JsonDocument"), dataType.eq(Types.VARCHAR), typeName.eq("JsonDocument"),
625+
rs.nextRow(columnName.eq("c_Json"), dataType.eq(Types.VARCHAR), typeName.eq("Json"),
626626
columnSize.eq(YdbConst.MAX_COLUMN_SIZE), ordinal.eq(16)).assertAll();
627-
rs.nextRow(columnName.eq("c_Yson"), dataType.eq(Types.BINARY), typeName.eq("Yson"),
627+
rs.nextRow(columnName.eq("c_JsonDocument"), dataType.eq(Types.VARCHAR), typeName.eq("JsonDocument"),
628628
columnSize.eq(YdbConst.MAX_COLUMN_SIZE), ordinal.eq(17)).assertAll();
629+
rs.nextRow(columnName.eq("c_Yson"), dataType.eq(Types.BINARY), typeName.eq("Yson"),
630+
columnSize.eq(YdbConst.MAX_COLUMN_SIZE), ordinal.eq(18)).assertAll();
629631

630632
rs.nextRow(columnName.eq("c_Uuid"), dataType.eq(Types.VARCHAR), typeName.eq("Uuid"),
631-
columnSize.eq(16), ordinal.eq(18)).assertAll();
633+
columnSize.eq(16), ordinal.eq(19)).assertAll();
632634

633635
rs.nextRow(columnName.eq("c_Date"), dataType.eq(Types.DATE), typeName.eq("Date"),
634-
columnSize.eq(10), ordinal.eq(19)).assertAll();
636+
columnSize.eq(10), ordinal.eq(20)).assertAll();
635637
rs.nextRow(columnName.eq("c_Datetime"), dataType.eq(Types.TIMESTAMP), typeName.eq("Datetime"),
636-
columnSize.eq(19), ordinal.eq(20)).assertAll();
638+
columnSize.eq(19), ordinal.eq(21)).assertAll();
637639
rs.nextRow(columnName.eq("c_Timestamp"), dataType.eq(Types.TIMESTAMP), typeName.eq("Timestamp"),
638-
columnSize.eq(26), ordinal.eq(21)).assertAll();
640+
columnSize.eq(26), ordinal.eq(22)).assertAll();
639641
rs.nextRow(columnName.eq("c_Interval"), dataType.eq(Types.BIGINT), typeName.eq("Interval"),
640-
columnSize.eq(8), ordinal.eq(22)).assertAll();
642+
columnSize.eq(8), ordinal.eq(23)).assertAll();
641643

642644
rs.nextRow(columnName.eq("c_Decimal"), dataType.eq(Types.DECIMAL), typeName.eq("Decimal(22, 9)"),
643-
columnSize.eq(22), ordinal.eq(23), decimalDigits.eq(22)).assertAll();
645+
columnSize.eq(22), ordinal.eq(24), decimalDigits.eq(22)).assertAll();
644646
rs.nextRow(columnName.eq("c_BigDecimal"), dataType.eq(Types.DECIMAL), typeName.eq("Decimal(35, 0)"),
645-
columnSize.eq(35), ordinal.eq(24), decimalDigits.eq(35)).assertAll();
647+
columnSize.eq(35), ordinal.eq(25), decimalDigits.eq(35)).assertAll();
646648
rs.nextRow(columnName.eq("c_BankDecimal"), dataType.eq(Types.DECIMAL), typeName.eq("Decimal(31, 9)"),
647-
columnSize.eq(31), ordinal.eq(25), decimalDigits.eq(31)).assertAll();
649+
columnSize.eq(31), ordinal.eq(26), decimalDigits.eq(31)).assertAll();
650+
651+
rs.nextRow(columnName.eq("c_Date32"), dataType.eq(Types.DATE), typeName.eq("Date32"),
652+
columnSize.eq(10), ordinal.eq(27)).assertAll();
653+
rs.nextRow(columnName.eq("c_Datetime64"), dataType.eq(Types.TIMESTAMP), typeName.eq("Datetime64"),
654+
columnSize.eq(19), ordinal.eq(28)).assertAll();
655+
rs.nextRow(columnName.eq("c_Timestamp64"), dataType.eq(Types.TIMESTAMP), typeName.eq("Timestamp64"),
656+
columnSize.eq(26), ordinal.eq(29)).assertAll();
648657

649658
rs.assertNoRows();
650659

651660
// find only one column
652661
rs = columns.check(metaData.getColumns(null, null, ALL_TYPES_TABLE, "c_JsonDocument"))
653662
.assertMetaColumns();
654663
rs.nextRow(columnName.eq("c_JsonDocument"), dataType.eq(Types.VARCHAR), typeName.eq("JsonDocument"),
655-
columnSize.eq(YdbConst.MAX_COLUMN_SIZE), ordinal.eq(16)).assertAll();
664+
columnSize.eq(YdbConst.MAX_COLUMN_SIZE), ordinal.eq(17)).assertAll();
656665
rs.assertNoRows();
657666
}
658667

jdbc/src/test/java/tech/ydb/jdbc/impl/YdbLazyResultSetImplTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ public void getMetaData() throws SQLException {
181181

182182
ExceptionAssert.sqlException("Column is out of range: 995", () -> metadata.getColumnName(995));
183183

184-
Assertions.assertEquals(25, metadata.getColumnCount());
184+
Assertions.assertEquals(29, metadata.getColumnCount());
185185

186186
for (int index = 0; index < metadata.getColumnCount(); index++) {
187187
int column = index + 1;

jdbc/src/test/java/tech/ydb/jdbc/impl/YdbPreparedStatementImplTest.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,9 @@ public void executeWithoutBatch(SqlQueries.YqlQuery mode) throws SQLException {
136136
.nextRow(3, "value-3")
137137
.noNextRows();
138138
}
139-
};
139+
}
140+
141+
;
140142

141143
@ParameterizedTest(name = "with {0}")
142144
@EnumSource(SqlQueries.YqlQuery.class)
@@ -183,7 +185,7 @@ public void addBatch(SqlQueries.YqlQuery mode) throws SQLException {
183185
statement.setInt("key", 3);
184186
statement.setString("c_Text", "value-3");
185187

186-
Assertions.assertArrayEquals(new int[]{ Statement.SUCCESS_NO_INFO, Statement.SUCCESS_NO_INFO },
188+
Assertions.assertArrayEquals(new int[]{Statement.SUCCESS_NO_INFO, Statement.SUCCESS_NO_INFO},
187189
statement.executeBatch());
188190

189191
// does nothing
@@ -426,6 +428,10 @@ public void testSetNull(SqlQueries.YqlQuery mode) throws SQLException {
426428
ps.setNull("c_Decimal", Types.DECIMAL);
427429
ps.setNull("c_BigDecimal", Types.DECIMAL);
428430
ps.setNull("c_BankDecimal", Types.DECIMAL);
431+
ps.setNull("c_Date32", Types.DATE);
432+
ps.setNull("c_Datetime64", Types.TIMESTAMP);
433+
ps.setNull("c_Timestamp64", Types.TIMESTAMP);
434+
ps.setNull("c_Interval64", Types.JAVA_OBJECT);
429435

430436
ps.executeUpdate();
431437
}
@@ -456,6 +462,10 @@ public void testSetNull(SqlQueries.YqlQuery mode) throws SQLException {
456462
ps.setNull("c_Decimal", -1, "Decimal(22, 9)");
457463
ps.setNull("c_BigDecimal", -1, "Decimal(35, 0)");
458464
ps.setNull("c_BankDecimal", -1, "Decimal(31, 9)");
465+
ps.setNull("c_Date32", -1, "Date32");
466+
ps.setNull("c_Datetime64", -1, "Datetime64");
467+
ps.setNull("c_Timestamp64", -1, "Timestamp64");
468+
ps.setNull("c_Interval64", -1, "Interval64");
459469

460470
ps.executeUpdate();
461471
}
@@ -486,6 +496,10 @@ public void testSetNull(SqlQueries.YqlQuery mode) throws SQLException {
486496
ps.setNull("c_Decimal", -1);
487497
ps.setNull("c_BigDecimal", -1);
488498
ps.setNull("c_BankDecimal", -1);
499+
ps.setNull("c_Date32", -1);
500+
ps.setNull("c_Datetime64", -1);
501+
ps.setNull("c_Timestamp64", -1);
502+
ps.setNull("c_Interval64", -1);
489503

490504
ps.executeUpdate();
491505
}
@@ -497,7 +511,7 @@ public void testSetNull(SqlQueries.YqlQuery mode) throws SQLException {
497511
Assertions.assertTrue(rs.next());
498512

499513
ResultSetMetaData metaData = rs.getMetaData();
500-
Assertions.assertEquals(25, metaData.getColumnCount());
514+
Assertions.assertEquals(29, metaData.getColumnCount());
501515
Assertions.assertEquals(key, rs.getInt("key")); // key
502516

503517
for (int i = 2; i <= metaData.getColumnCount(); i++) {
@@ -521,7 +535,7 @@ public void testParametersMeta(SqlQueries.YqlQuery mode) throws SQLException {
521535
() -> meta.getParameterType(335)
522536
);
523537

524-
Assertions.assertEquals(25, meta.getParameterCount());
538+
Assertions.assertEquals(29, meta.getParameterCount());
525539
for (int param = 1; param <= meta.getParameterCount(); param++) {
526540
String name = ydbMeta.getParameterName(param);
527541
boolean isKey = "key".equals(name);
@@ -600,15 +614,19 @@ public void testParametersMeta(SqlQueries.YqlQuery mode) throws SQLException {
600614
expectClassName = UUID.class.getName();
601615
break;
602616
case "c_Date":
617+
case "c_Date32":
603618
expectClassName = LocalDate.class.getName();
604619
break;
605620
case "c_Datetime":
621+
case "c_Datetime64":
606622
expectClassName = LocalDateTime.class.getName();
607623
break;
608624
case "c_Timestamp":
625+
case "c_Timestamp64":
609626
expectClassName = Instant.class.getName();
610627
break;
611628
case "c_Interval":
629+
case "c_Interval64":
612630
expectClassName = Duration.class.getName();
613631
break;
614632
case "c_Decimal":

jdbc/src/test/java/tech/ydb/jdbc/impl/YdbPreparedStatementTest.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package tech.ydb.jdbc.impl;
22

33
import java.math.BigDecimal;
4-
import java.sql.Blob;
5-
import java.sql.Clob;
64
import java.sql.Connection;
75
import java.sql.Date;
86
import java.sql.PreparedStatement;
97
import java.sql.ResultSet;
108
import java.sql.SQLException;
11-
import java.sql.SQLType;
129
import java.sql.Statement;
1310
import java.sql.Time;
1411
import java.sql.Timestamp;
@@ -36,7 +33,6 @@
3633
import org.junit.jupiter.params.provider.ValueSource;
3734

3835
import tech.ydb.jdbc.YdbConst;
39-
import tech.ydb.jdbc.YdbJdbcCode;
4036
import tech.ydb.jdbc.impl.helper.ExceptionAssert;
4137
import tech.ydb.jdbc.impl.helper.JdbcConnectionExtention;
4238
import tech.ydb.jdbc.impl.helper.SqlQueries;
@@ -378,10 +374,10 @@ private void fillRowValues(PreparedStatement statement, int id, boolean castingS
378374
statement.setObject(24, BigDecimal.valueOf(20000 + id, 0), ydbType(DecimalType.of(35, 0))); // c_BigDecimal
379375
statement.setObject(25, BigDecimal.valueOf(30000 + id, 6), ydbType(DecimalType.of(31, 9))); // c_BankDecimal
380376

381-
statement.setObject(26, sqlDate, YdbJdbcCode.DATE_32); // c_Date32
382-
statement.setObject(27, dateTime, YdbJdbcCode.DATETIME_64); // c_Datetime64
383-
statement.setObject(28, timestamp, YdbJdbcCode.TIMESTAMP_64); // c_Timestamp64
384-
statement.setObject(29, negativeDuration, YdbJdbcCode.INTERVAL_64); // c_Interval64
377+
statement.setObject(26, sqlDate, ydbType(PrimitiveType.Date32)); // c_Date32
378+
statement.setObject(27, dateTime, ydbType(PrimitiveType.Datetime64)); // c_Datetime64
379+
statement.setObject(28, timestamp, ydbType(PrimitiveType.Timestamp64)); // c_Timestamp64
380+
statement.setObject(29, negativeDuration, ydbType(PrimitiveType.Interval64)); // c_Interval64
385381
}
386382
}
387383

@@ -589,7 +585,7 @@ public void setStringTest() throws SQLException {
589585
statement.setString(26, sqlDate.toString()); // c_Date
590586
statement.setString(27, dateTime.toString()); // c_Datetime
591587
statement.setString(28, TEST_TS.plusSeconds(id).toString()); // c_Timestamp
592-
statement.setString(29, Duration.ofMinutes(id).toString()); // c_Interval
588+
statement.setString(29, Duration.ofMinutes(-id).toString()); // c_Interval
593589

594590
statement.execute();
595591
}

0 commit comments

Comments
 (0)