Skip to content

Commit a865c7b

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. Closes: #209, #210, #214 Affects: #92
1 parent 45cfe17 commit a865c7b

File tree

6 files changed

+277
-80
lines changed

6 files changed

+277
-80
lines changed

Diff for: src/main/java/org/tarantool/jdbc/type/TarantoolSqlType.java

+17-5
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

Diff for: src/main/java/org/tarantool/jdbc/type/TarantoolType.java

+4-1
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;

Diff for: src/test/java/org/tarantool/ServerVersion.java

+8-3
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 });

Diff for: src/test/java/org/tarantool/TestAssumptions.java

+6-2
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
}

Diff for: src/test/java/org/tarantool/jdbc/JdbcResultSetMetaDataIT.java

+75-24
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")
@@ -254,8 +267,9 @@ public void testCurrencyColumns() throws SQLException {
254267
}
255268

256269
@Test
257-
@DisplayName("returned signed columns")
258-
public void testSignedColumns() throws SQLException {
270+
@DisplayName("returned signed decimal columns")
271+
public void testSignedDecimalColumns() throws SQLException {
272+
assumeServerVersionLessThan(testHelper.getInstanceVersion(), ServerVersion.V_2_2);
259273
testHelper.executeSql(
260274
"CREATE TABLE test(id INT PRIMARY KEY, double_val DOUBLE, real_val REAL, float_val FLOAT)"
261275
);
@@ -272,6 +286,23 @@ public void testSignedColumns() throws SQLException {
272286
}
273287
}
274288

289+
@Test
290+
@DisplayName("returned signed number column")
291+
public void testSignedNumberColumn() throws SQLException {
292+
assumeMinimalServerVersion(testHelper.getInstanceVersion(), ServerVersion.V_2_2_1);
293+
testHelper.executeSql(
294+
"CREATE TABLE test(id INT PRIMARY KEY, num_val NUMBER)"
295+
);
296+
try (
297+
Statement statement = connection.createStatement();
298+
ResultSet resultSet = statement.executeQuery("SELECT * FROM test")
299+
) {
300+
ResultSetMetaData rsMeta = resultSet.getMetaData();
301+
assertTrue(rsMeta.isSigned(1));
302+
assertTrue(rsMeta.isSigned(2));
303+
}
304+
}
305+
275306
@Test
276307
@DisplayName("returned not signed columns")
277308
public void testNotSignedColumns() throws SQLException {
@@ -292,8 +323,9 @@ public void testNotSignedColumns() throws SQLException {
292323
}
293324

294325
@Test
295-
@DisplayName("returned numeric column types")
296-
public void testColumnsNumericTypes() throws SQLException {
326+
@DisplayName("returned number type aliases")
327+
public void testColumnsNumberTypeAliases() throws SQLException {
328+
assumeServerVersionLessThan(testHelper.getInstanceVersion(), ServerVersion.V_2_2);
297329
testHelper.executeSql(
298330
"CREATE TABLE test(id INT PRIMARY KEY, f_val FLOAT, d_val DOUBLE, r_val REAL)"
299331
);
@@ -303,26 +335,45 @@ public void testColumnsNumericTypes() throws SQLException {
303335
) {
304336
ResultSetMetaData rsMeta = resultSet.getMetaData();
305337

306-
assertEquals(Types.INTEGER, rsMeta.getColumnType(1));
338+
assertEquals(Types.BIGINT, rsMeta.getColumnType(1));
307339
assertEquals("integer", rsMeta.getColumnTypeName(1));
308-
assertEquals("java.lang.Integer", rsMeta.getColumnClassName(1));
340+
assertEquals("java.lang.Long", rsMeta.getColumnClassName(1));
309341

310342
// we cannot distinguish numeric types because Tarantool
311343
// receives double noSQL type for all the numeric SQL types
312344
assertEquals(Types.DOUBLE, rsMeta.getColumnType(2));
313-
assertEquals("double", rsMeta.getColumnTypeName(2));
345+
assertEquals("number", rsMeta.getColumnTypeName(2));
314346
assertEquals("java.lang.Double", rsMeta.getColumnClassName(2));
315347

316348
assertEquals(Types.DOUBLE, rsMeta.getColumnType(3));
317-
assertEquals("double", rsMeta.getColumnTypeName(3));
349+
assertEquals("number", rsMeta.getColumnTypeName(3));
318350
assertEquals("java.lang.Double", rsMeta.getColumnClassName(3));
319351

320352
assertEquals(Types.DOUBLE, rsMeta.getColumnType(4));
321-
assertEquals("double", rsMeta.getColumnTypeName(4));
353+
assertEquals("number", rsMeta.getColumnTypeName(4));
322354
assertEquals("java.lang.Double", rsMeta.getColumnClassName(4));
323355
}
324356
}
325357

358+
@Test
359+
@DisplayName("returned number column type")
360+
public void testColumnsNumericTypes() throws SQLException {
361+
assumeMinimalServerVersion(testHelper.getInstanceVersion(), ServerVersion.V_2_2_1);
362+
testHelper.executeSql(
363+
"CREATE TABLE test(id INT PRIMARY KEY, num_val NUMBER)"
364+
);
365+
try (
366+
Statement statement = connection.createStatement();
367+
ResultSet resultSet = statement.executeQuery("SELECT * FROM test")
368+
) {
369+
ResultSetMetaData rsMeta = resultSet.getMetaData();
370+
371+
assertEquals(Types.DOUBLE, rsMeta.getColumnType(2));
372+
assertEquals("number", rsMeta.getColumnTypeName(2));
373+
assertEquals("java.lang.Double", rsMeta.getColumnClassName(2));
374+
}
375+
}
376+
326377
@Test
327378
@DisplayName("returned textual column types")
328379
public void testColumnsTextualTypes() throws SQLException {
@@ -335,17 +386,17 @@ public void testColumnsTextualTypes() throws SQLException {
335386
) {
336387
ResultSetMetaData rsMeta = resultSet.getMetaData();
337388

338-
assertEquals(Types.INTEGER, rsMeta.getColumnType(1));
389+
assertEquals(Types.BIGINT, rsMeta.getColumnType(1));
339390
assertEquals("integer", rsMeta.getColumnTypeName(1));
340-
assertEquals("java.lang.Integer", rsMeta.getColumnClassName(1));
391+
assertEquals("java.lang.Long", rsMeta.getColumnClassName(1));
341392

342393
assertEquals(Types.VARCHAR, rsMeta.getColumnType(2));
343-
assertEquals("varchar", rsMeta.getColumnTypeName(2));
394+
assertEquals("string", rsMeta.getColumnTypeName(2));
344395
assertEquals("java.lang.String", rsMeta.getColumnClassName(2));
345396

346397
// TEXT and VARCHAR are not distinguishable
347398
assertEquals(Types.VARCHAR, rsMeta.getColumnType(3));
348-
assertEquals("varchar", rsMeta.getColumnTypeName(3));
399+
assertEquals("string", rsMeta.getColumnTypeName(3));
349400
assertEquals("java.lang.String", rsMeta.getColumnClassName(3));
350401

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

0 commit comments

Comments
 (0)