Skip to content

Commit 15bdbfe

Browse files
committed
Support new types introduced in Tarantool 2.2
There are a few new types such as BOOLEAN(BOOL), UNSIGNED, and VARBINARY in Tarantool v2.2. Moreover, Number aliases REAL, FLOAT, DOUBLE were replaced by one NUMBER type since v2.2.1. Support tests for old number types on version before 2.2.
1 parent 45cfe17 commit 15bdbfe

File tree

6 files changed

+264
-81
lines changed

6 files changed

+264
-81
lines changed

src/main/java/org/tarantool/jdbc/type/TarantoolSqlType.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,33 +10,45 @@ public enum TarantoolSqlType {
1010

1111
UNKNOWN(TarantoolType.UNKNOWN, JdbcType.UNKNOWN, "unknown"),
1212

13+
// float, double, real used to be number aliases before 2.2
1314
FLOAT(TarantoolType.NUMBER, JdbcType.FLOAT, "float"),
1415
DOUBLE(TarantoolType.NUMBER, JdbcType.DOUBLE, "double"),
1516
REAL(TarantoolType.NUMBER, JdbcType.REAL, "real"),
17+
// was introduced in Tarantool 2.2.1
18+
NUMBER(TarantoolType.NUMBER, JdbcType.DOUBLE, "number"),
1619

17-
INT(TarantoolType.INTEGER, JdbcType.INTEGER, "int"),
18-
INTEGER(TarantoolType.INTEGER, JdbcType.INTEGER, "integer"),
20+
INT(TarantoolType.INTEGER, JdbcType.BIGINT, "int"),
21+
INTEGER(TarantoolType.INTEGER, JdbcType.BIGINT, "integer"),
22+
// was introduced in 2.2
23+
UNSIGNED(TarantoolType.UNSIGNED, JdbcType.BIGINT, "integer"),
1924

25+
// were introduced in 2.2
2026
BOOL(TarantoolType.BOOLEAN, JdbcType.BOOLEAN, "bool"),
2127
BOOLEAN(TarantoolType.BOOLEAN, JdbcType.BOOLEAN, "boolean"),
2228

29+
STRING(TarantoolType.STRING, JdbcType.VARCHAR, "string"),
30+
TEXT(TarantoolType.STRING, JdbcType.VARCHAR, "text"),
2331
VARCHAR(TarantoolType.STRING, JdbcType.VARCHAR, "varchar") {
2432
@Override
2533
public String getDisplayType() {
2634
return getTypeName() + "(128)";
2735
}
2836
},
29-
TEXT(TarantoolType.STRING, JdbcType.VARCHAR, "text"),
37+
38+
// was introduced in 2.2
39+
VARBINARY(TarantoolType.VARBINARY, JdbcType.VARBINARY, "varbinary"),
3040

3141
SCALAR(TarantoolType.SCALAR, JdbcType.BINARY, "scalar");
3242

3343
private static final Map<TarantoolType, TarantoolSqlType> defaultSqlTypeMapping;
3444
static {
3545
defaultSqlTypeMapping = new HashMap<>();
3646
defaultSqlTypeMapping.put(TarantoolType.BOOLEAN, TarantoolSqlType.BOOLEAN);
37-
defaultSqlTypeMapping.put(TarantoolType.STRING, TarantoolSqlType.VARCHAR);
47+
defaultSqlTypeMapping.put(TarantoolType.STRING, TarantoolSqlType.STRING);
3848
defaultSqlTypeMapping.put(TarantoolType.INTEGER, TarantoolSqlType.INTEGER);
39-
defaultSqlTypeMapping.put(TarantoolType.NUMBER, TarantoolSqlType.DOUBLE);
49+
defaultSqlTypeMapping.put(TarantoolType.UNSIGNED, TarantoolSqlType.UNSIGNED);
50+
defaultSqlTypeMapping.put(TarantoolType.NUMBER, TarantoolSqlType.NUMBER);
51+
defaultSqlTypeMapping.put(TarantoolType.VARBINARY, TarantoolSqlType.VARBINARY);
4052
defaultSqlTypeMapping.put(TarantoolType.SCALAR, TarantoolSqlType.SCALAR);
4153
}
4254

src/main/java/org/tarantool/jdbc/type/TarantoolType.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@ public enum TarantoolType {
1010
STRING("string", false, true, Integer.MAX_VALUE, 0, Integer.MAX_VALUE),
1111
// precision is 20 due to Tarantool integer type has range [-2^63-1..2^64-1]
1212
INTEGER("integer", true, false, 20, 0, 20),
13+
// precision is 20 due to Tarantool unsigned integer type has range [0..2^64-1]
14+
UNSIGNED("unsigned", false, false, 20, 0, 20),
1315
// precision is 20 due to Tarantool allows both integer and floating-point values under number type
1416
NUMBER("number", true, false, 20, 16, 24),
15-
SCALAR("scalar", false, true, Integer.MAX_VALUE, 0, Integer.MAX_VALUE);
17+
SCALAR("scalar", false, true, Integer.MAX_VALUE, 0, Integer.MAX_VALUE),
18+
VARBINARY("varbinary", false, true, Integer.MAX_VALUE, 0, Integer.MAX_VALUE);
1619

1720
private final String typeName;
1821
private final boolean signed;

src/test/java/org/tarantool/ServerVersion.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ public enum ServerVersion {
77
V_1_9("1", "9", "0"),
88
V_1_10("1", "10", "0"),
99
V_2_1("2", "1", "0"),
10-
V_2_2("2", "2", "0");
10+
V_2_2("2", "2", "0"),
11+
V_2_2_1("2", "2", "1");
1112

1213
private final String majorVersion;
1314
private final String minorVersion;
@@ -32,14 +33,18 @@ public String getPatchVersion() {
3233
return patchVersion;
3334
}
3435

35-
public boolean haveMinimalVersion(String versionString) {
36+
public boolean isLessOrEqualThan(String versionString) {
3637
return compareVersions(versionString, (server, minimal) -> server >= minimal);
3738
}
3839

39-
public boolean haveMaximalVersion(String versionString) {
40+
public boolean isGreaterOrEqualThan(String versionString) {
4041
return compareVersions(versionString, (server, maximal) -> server <= maximal);
4142
}
4243

44+
public boolean isGreaterThan(String versionString) {
45+
return compareVersions(versionString, (server, maximal) -> server < maximal);
46+
}
47+
4348
private boolean compareVersions(String versionString, BiFunction<Integer, Integer, Boolean> comparator) {
4449
int parsedVersion = toNumber(splitVersionParts(versionString));
4550
int thisVersion = toNumber(new String[] { majorVersion, minorVersion, patchVersion });

src/test/java/org/tarantool/TestAssumptions.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@
55
public class TestAssumptions {
66

77
public static void assumeMinimalServerVersion(String rawVersion, ServerVersion version) {
8-
Assumptions.assumeTrue(version.haveMinimalVersion(rawVersion));
8+
Assumptions.assumeTrue(version.isLessOrEqualThan(rawVersion));
99
}
1010

1111
public static void assumeMaximalServerVersion(String rawVersion, ServerVersion version) {
12-
Assumptions.assumeTrue(version.haveMaximalVersion(rawVersion));
12+
Assumptions.assumeTrue(version.isGreaterOrEqualThan(rawVersion));
13+
}
14+
15+
public static void assumeServerVersionLessThan(String rawVersion, ServerVersion version) {
16+
Assumptions.assumeTrue(version.isGreaterThan(rawVersion));
1317
}
1418

1519
}

src/test/java/org/tarantool/jdbc/JdbcResultSetMetaDataIT.java

Lines changed: 64 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@
66
import static org.junit.jupiter.api.Assertions.assertThrows;
77
import static org.junit.jupiter.api.Assertions.assertTrue;
88
import static org.tarantool.TestAssumptions.assumeMinimalServerVersion;
9+
import static org.tarantool.TestAssumptions.assumeServerVersionLessThan;
910

1011
import org.tarantool.ServerVersion;
1112
import org.tarantool.TarantoolTestHelper;
12-
import org.tarantool.jdbc.type.JdbcType;
13-
import org.tarantool.jdbc.type.TarantoolSqlType;
1413

1514
import org.junit.jupiter.api.AfterAll;
1615
import org.junit.jupiter.api.AfterEach;
@@ -201,9 +200,11 @@ public void testCaseSensitiveColumns() throws SQLException {
201200
@Test
202201
@DisplayName("returned case insensitive columns")
203202
public void testCaseInsensitiveColumns() throws SQLException {
204-
testHelper.executeSql(
205-
"CREATE TABLE test(id INT PRIMARY KEY, num_val DOUBLE)"
206-
);
203+
if (ServerVersion.V_2_2.isGreaterThan(testHelper.getInstanceVersion())) {
204+
testHelper.executeSql("CREATE TABLE test(id INT PRIMARY KEY, num_val DOUBLE)");
205+
} else {
206+
testHelper.executeSql("CREATE TABLE test(id INT PRIMARY KEY, num_val NUMBER)");
207+
}
207208
try (
208209
Statement statement = connection.createStatement();
209210
ResultSet resultSet = statement.executeQuery("SELECT * FROM test")
@@ -218,9 +219,15 @@ public void testCaseInsensitiveColumns() throws SQLException {
218219
@Test
219220
@DisplayName("returned searchable columns")
220221
public void testSearchableColumns() throws SQLException {
221-
testHelper.executeSql(
222-
"CREATE TABLE test(id INT PRIMARY KEY, num_val DOUBLE, text_val TEXT, bin_val SCALAR)"
223-
);
222+
if (ServerVersion.V_2_2.isGreaterThan(testHelper.getInstanceVersion())) {
223+
testHelper.executeSql(
224+
"CREATE TABLE test(id INT PRIMARY KEY, num_val DOUBLE, text_val TEXT, bin_val SCALAR)"
225+
);
226+
} else {
227+
testHelper.executeSql(
228+
"CREATE TABLE test(id INT PRIMARY KEY, num_val NUMBER, text_val TEXT, bin_val SCALAR)"
229+
);
230+
}
224231
try (
225232
Statement statement = connection.createStatement();
226233
ResultSet resultSet = statement.executeQuery("SELECT * FROM test")
@@ -237,9 +244,15 @@ public void testSearchableColumns() throws SQLException {
237244
@Test
238245
@DisplayName("returned no monetary columns")
239246
public void testCurrencyColumns() throws SQLException {
240-
testHelper.executeSql(
241-
"CREATE TABLE test(id INT PRIMARY KEY, num_val DOUBLE, text_val TEXT, bin_val SCALAR)"
242-
);
247+
if (ServerVersion.V_2_2.isGreaterThan(testHelper.getInstanceVersion())) {
248+
testHelper.executeSql(
249+
"CREATE TABLE test(id INT PRIMARY KEY, num_val DOUBLE, text_val TEXT, bin_val SCALAR)"
250+
);
251+
} else {
252+
testHelper.executeSql(
253+
"CREATE TABLE test(id INT PRIMARY KEY, num_val NUMBER, text_val TEXT, bin_val SCALAR)"
254+
);
255+
}
243256
try (
244257
Statement statement = connection.createStatement();
245258
ResultSet resultSet = statement.executeQuery("SELECT * FROM test")
@@ -256,9 +269,15 @@ public void testCurrencyColumns() throws SQLException {
256269
@Test
257270
@DisplayName("returned signed columns")
258271
public void testSignedColumns() throws SQLException {
259-
testHelper.executeSql(
260-
"CREATE TABLE test(id INT PRIMARY KEY, double_val DOUBLE, real_val REAL, float_val FLOAT)"
261-
);
272+
if (ServerVersion.V_2_2.isGreaterThan(testHelper.getInstanceVersion())) {
273+
testHelper.executeSql(
274+
"CREATE TABLE test(id INT PRIMARY KEY, double_val DOUBLE, real_val REAL, float_val FLOAT)"
275+
);
276+
} else {
277+
testHelper.executeSql(
278+
"CREATE TABLE test(id INT PRIMARY KEY, double_val NUMBER, real_val REAL, float_val FLOAT)"
279+
);
280+
}
262281
try (
263282
Statement statement = connection.createStatement();
264283
ResultSet resultSet = statement.executeQuery("SELECT * FROM test")
@@ -292,8 +311,9 @@ public void testNotSignedColumns() throws SQLException {
292311
}
293312

294313
@Test
295-
@DisplayName("returned numeric column types")
296-
public void testColumnsNumericTypes() throws SQLException {
314+
@DisplayName("returned number type aliases")
315+
public void testColumnsNumberTypeAliases() throws SQLException {
316+
assumeServerVersionLessThan(testHelper.getInstanceVersion(), ServerVersion.V_2_2);
297317
testHelper.executeSql(
298318
"CREATE TABLE test(id INT PRIMARY KEY, f_val FLOAT, d_val DOUBLE, r_val REAL)"
299319
);
@@ -303,26 +323,45 @@ public void testColumnsNumericTypes() throws SQLException {
303323
) {
304324
ResultSetMetaData rsMeta = resultSet.getMetaData();
305325

306-
assertEquals(Types.INTEGER, rsMeta.getColumnType(1));
326+
assertEquals(Types.BIGINT, rsMeta.getColumnType(1));
307327
assertEquals("integer", rsMeta.getColumnTypeName(1));
308-
assertEquals("java.lang.Integer", rsMeta.getColumnClassName(1));
328+
assertEquals("java.lang.Long", rsMeta.getColumnClassName(1));
309329

310330
// we cannot distinguish numeric types because Tarantool
311331
// receives double noSQL type for all the numeric SQL types
312332
assertEquals(Types.DOUBLE, rsMeta.getColumnType(2));
313-
assertEquals("double", rsMeta.getColumnTypeName(2));
333+
assertEquals("number", rsMeta.getColumnTypeName(2));
314334
assertEquals("java.lang.Double", rsMeta.getColumnClassName(2));
315335

316336
assertEquals(Types.DOUBLE, rsMeta.getColumnType(3));
317-
assertEquals("double", rsMeta.getColumnTypeName(3));
337+
assertEquals("number", rsMeta.getColumnTypeName(3));
318338
assertEquals("java.lang.Double", rsMeta.getColumnClassName(3));
319339

320340
assertEquals(Types.DOUBLE, rsMeta.getColumnType(4));
321-
assertEquals("double", rsMeta.getColumnTypeName(4));
341+
assertEquals("number", rsMeta.getColumnTypeName(4));
322342
assertEquals("java.lang.Double", rsMeta.getColumnClassName(4));
323343
}
324344
}
325345

346+
@Test
347+
@DisplayName("returned number column type")
348+
public void testColumnsNumericTypes() throws SQLException {
349+
assumeMinimalServerVersion(testHelper.getInstanceVersion(), ServerVersion.V_2_2);
350+
testHelper.executeSql(
351+
"CREATE TABLE test(id INT PRIMARY KEY, num_val NUMBER)"
352+
);
353+
try (
354+
Statement statement = connection.createStatement();
355+
ResultSet resultSet = statement.executeQuery("SELECT * FROM test")
356+
) {
357+
ResultSetMetaData rsMeta = resultSet.getMetaData();
358+
359+
assertEquals(Types.DOUBLE, rsMeta.getColumnType(2));
360+
assertEquals("number", rsMeta.getColumnTypeName(2));
361+
assertEquals("java.lang.Double", rsMeta.getColumnClassName(2));
362+
}
363+
}
364+
326365
@Test
327366
@DisplayName("returned textual column types")
328367
public void testColumnsTextualTypes() throws SQLException {
@@ -335,17 +374,17 @@ public void testColumnsTextualTypes() throws SQLException {
335374
) {
336375
ResultSetMetaData rsMeta = resultSet.getMetaData();
337376

338-
assertEquals(Types.INTEGER, rsMeta.getColumnType(1));
377+
assertEquals(Types.BIGINT, rsMeta.getColumnType(1));
339378
assertEquals("integer", rsMeta.getColumnTypeName(1));
340-
assertEquals("java.lang.Integer", rsMeta.getColumnClassName(1));
379+
assertEquals("java.lang.Long", rsMeta.getColumnClassName(1));
341380

342381
assertEquals(Types.VARCHAR, rsMeta.getColumnType(2));
343-
assertEquals("varchar", rsMeta.getColumnTypeName(2));
382+
assertEquals("string", rsMeta.getColumnTypeName(2));
344383
assertEquals("java.lang.String", rsMeta.getColumnClassName(2));
345384

346385
// TEXT and VARCHAR are not distinguishable
347386
assertEquals(Types.VARCHAR, rsMeta.getColumnType(3));
348-
assertEquals("varchar", rsMeta.getColumnTypeName(3));
387+
assertEquals("string", rsMeta.getColumnTypeName(3));
349388
assertEquals("java.lang.String", rsMeta.getColumnClassName(3));
350389

351390
assertEquals(Types.BINARY, rsMeta.getColumnType(4));

0 commit comments

Comments
 (0)