Skip to content

Commit 60c3889

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: #67, #92, #209, #210
1 parent 45cfe17 commit 60c3889

File tree

6 files changed

+287
-80
lines changed

6 files changed

+287
-80
lines changed

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

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;

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 });

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

+12-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,21 @@
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));
17+
}
18+
19+
public static void assumeServerVersionOutOfRange(String rawVersion,
20+
ServerVersion left,
21+
ServerVersion right) {
22+
Assumptions.assumeFalse(left.isLessOrEqualThan(rawVersion) && right.isGreaterThan(rawVersion));
1323
}
1424

1525
}

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

+79-24
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
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;
10+
import static org.tarantool.TestAssumptions.assumeServerVersionOutOfRange;
911

1012
import org.tarantool.ServerVersion;
1113
import org.tarantool.TarantoolTestHelper;
12-
import org.tarantool.jdbc.type.JdbcType;
13-
import org.tarantool.jdbc.type.TarantoolSqlType;
1414

1515
import org.junit.jupiter.api.AfterAll;
1616
import org.junit.jupiter.api.AfterEach;
@@ -201,9 +201,12 @@ public void testCaseSensitiveColumns() throws SQLException {
201201
@Test
202202
@DisplayName("returned case insensitive columns")
203203
public void testCaseInsensitiveColumns() throws SQLException {
204-
testHelper.executeSql(
205-
"CREATE TABLE test(id INT PRIMARY KEY, num_val DOUBLE)"
206-
);
204+
assumeServerVersionOutOfRange(testHelper.getInstanceVersion(), ServerVersion.V_2_2, ServerVersion.V_2_2_1);
205+
if (ServerVersion.V_2_2.isGreaterThan(testHelper.getInstanceVersion())) {
206+
testHelper.executeSql("CREATE TABLE test(id INT PRIMARY KEY, num_val DOUBLE)");
207+
} else {
208+
testHelper.executeSql("CREATE TABLE test(id INT PRIMARY KEY, num_val NUMBER)");
209+
}
207210
try (
208211
Statement statement = connection.createStatement();
209212
ResultSet resultSet = statement.executeQuery("SELECT * FROM test")
@@ -218,9 +221,16 @@ public void testCaseInsensitiveColumns() throws SQLException {
218221
@Test
219222
@DisplayName("returned searchable columns")
220223
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-
);
224+
assumeServerVersionOutOfRange(testHelper.getInstanceVersion(), ServerVersion.V_2_2, ServerVersion.V_2_2_1);
225+
if (ServerVersion.V_2_2.isGreaterThan(testHelper.getInstanceVersion())) {
226+
testHelper.executeSql(
227+
"CREATE TABLE test(id INT PRIMARY KEY, num_val DOUBLE, text_val TEXT, bin_val SCALAR)"
228+
);
229+
} else {
230+
testHelper.executeSql(
231+
"CREATE TABLE test(id INT PRIMARY KEY, num_val NUMBER, text_val TEXT, bin_val SCALAR)"
232+
);
233+
}
224234
try (
225235
Statement statement = connection.createStatement();
226236
ResultSet resultSet = statement.executeQuery("SELECT * FROM test")
@@ -237,9 +247,16 @@ public void testSearchableColumns() throws SQLException {
237247
@Test
238248
@DisplayName("returned no monetary columns")
239249
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-
);
250+
assumeServerVersionOutOfRange(testHelper.getInstanceVersion(), ServerVersion.V_2_2, ServerVersion.V_2_2_1);
251+
if (ServerVersion.V_2_2.isGreaterThan(testHelper.getInstanceVersion())) {
252+
testHelper.executeSql(
253+
"CREATE TABLE test(id INT PRIMARY KEY, num_val DOUBLE, text_val TEXT, bin_val SCALAR)"
254+
);
255+
} else {
256+
testHelper.executeSql(
257+
"CREATE TABLE test(id INT PRIMARY KEY, num_val NUMBER, text_val TEXT, bin_val SCALAR)"
258+
);
259+
}
243260
try (
244261
Statement statement = connection.createStatement();
245262
ResultSet resultSet = statement.executeQuery("SELECT * FROM test")
@@ -254,8 +271,9 @@ public void testCurrencyColumns() throws SQLException {
254271
}
255272

256273
@Test
257-
@DisplayName("returned signed columns")
258-
public void testSignedColumns() throws SQLException {
274+
@DisplayName("returned signed decimal columns")
275+
public void testSignedDecimalColumns() throws SQLException {
276+
assumeServerVersionLessThan(testHelper.getInstanceVersion(), ServerVersion.V_2_2);
259277
testHelper.executeSql(
260278
"CREATE TABLE test(id INT PRIMARY KEY, double_val DOUBLE, real_val REAL, float_val FLOAT)"
261279
);
@@ -272,6 +290,23 @@ public void testSignedColumns() throws SQLException {
272290
}
273291
}
274292

293+
@Test
294+
@DisplayName("returned signed number column")
295+
public void testSignedNumberColumn() throws SQLException {
296+
assumeMinimalServerVersion(testHelper.getInstanceVersion(), ServerVersion.V_2_2_1);
297+
testHelper.executeSql(
298+
"CREATE TABLE test(id INT PRIMARY KEY, num_val NUMBER)"
299+
);
300+
try (
301+
Statement statement = connection.createStatement();
302+
ResultSet resultSet = statement.executeQuery("SELECT * FROM test")
303+
) {
304+
ResultSetMetaData rsMeta = resultSet.getMetaData();
305+
assertTrue(rsMeta.isSigned(1));
306+
assertTrue(rsMeta.isSigned(2));
307+
}
308+
}
309+
275310
@Test
276311
@DisplayName("returned not signed columns")
277312
public void testNotSignedColumns() throws SQLException {
@@ -292,8 +327,9 @@ public void testNotSignedColumns() throws SQLException {
292327
}
293328

294329
@Test
295-
@DisplayName("returned numeric column types")
296-
public void testColumnsNumericTypes() throws SQLException {
330+
@DisplayName("returned number type aliases")
331+
public void testColumnsNumberTypeAliases() throws SQLException {
332+
assumeServerVersionLessThan(testHelper.getInstanceVersion(), ServerVersion.V_2_2);
297333
testHelper.executeSql(
298334
"CREATE TABLE test(id INT PRIMARY KEY, f_val FLOAT, d_val DOUBLE, r_val REAL)"
299335
);
@@ -303,26 +339,45 @@ public void testColumnsNumericTypes() throws SQLException {
303339
) {
304340
ResultSetMetaData rsMeta = resultSet.getMetaData();
305341

306-
assertEquals(Types.INTEGER, rsMeta.getColumnType(1));
342+
assertEquals(Types.BIGINT, rsMeta.getColumnType(1));
307343
assertEquals("integer", rsMeta.getColumnTypeName(1));
308-
assertEquals("java.lang.Integer", rsMeta.getColumnClassName(1));
344+
assertEquals("java.lang.Long", rsMeta.getColumnClassName(1));
309345

310346
// we cannot distinguish numeric types because Tarantool
311347
// receives double noSQL type for all the numeric SQL types
312348
assertEquals(Types.DOUBLE, rsMeta.getColumnType(2));
313-
assertEquals("double", rsMeta.getColumnTypeName(2));
349+
assertEquals("number", rsMeta.getColumnTypeName(2));
314350
assertEquals("java.lang.Double", rsMeta.getColumnClassName(2));
315351

316352
assertEquals(Types.DOUBLE, rsMeta.getColumnType(3));
317-
assertEquals("double", rsMeta.getColumnTypeName(3));
353+
assertEquals("number", rsMeta.getColumnTypeName(3));
318354
assertEquals("java.lang.Double", rsMeta.getColumnClassName(3));
319355

320356
assertEquals(Types.DOUBLE, rsMeta.getColumnType(4));
321-
assertEquals("double", rsMeta.getColumnTypeName(4));
357+
assertEquals("number", rsMeta.getColumnTypeName(4));
322358
assertEquals("java.lang.Double", rsMeta.getColumnClassName(4));
323359
}
324360
}
325361

362+
@Test
363+
@DisplayName("returned number column type")
364+
public void testColumnsNumericTypes() throws SQLException {
365+
assumeMinimalServerVersion(testHelper.getInstanceVersion(), ServerVersion.V_2_2_1);
366+
testHelper.executeSql(
367+
"CREATE TABLE test(id INT PRIMARY KEY, num_val NUMBER)"
368+
);
369+
try (
370+
Statement statement = connection.createStatement();
371+
ResultSet resultSet = statement.executeQuery("SELECT * FROM test")
372+
) {
373+
ResultSetMetaData rsMeta = resultSet.getMetaData();
374+
375+
assertEquals(Types.DOUBLE, rsMeta.getColumnType(2));
376+
assertEquals("number", rsMeta.getColumnTypeName(2));
377+
assertEquals("java.lang.Double", rsMeta.getColumnClassName(2));
378+
}
379+
}
380+
326381
@Test
327382
@DisplayName("returned textual column types")
328383
public void testColumnsTextualTypes() throws SQLException {
@@ -335,17 +390,17 @@ public void testColumnsTextualTypes() throws SQLException {
335390
) {
336391
ResultSetMetaData rsMeta = resultSet.getMetaData();
337392

338-
assertEquals(Types.INTEGER, rsMeta.getColumnType(1));
393+
assertEquals(Types.BIGINT, rsMeta.getColumnType(1));
339394
assertEquals("integer", rsMeta.getColumnTypeName(1));
340-
assertEquals("java.lang.Integer", rsMeta.getColumnClassName(1));
395+
assertEquals("java.lang.Long", rsMeta.getColumnClassName(1));
341396

342397
assertEquals(Types.VARCHAR, rsMeta.getColumnType(2));
343-
assertEquals("varchar", rsMeta.getColumnTypeName(2));
398+
assertEquals("string", rsMeta.getColumnTypeName(2));
344399
assertEquals("java.lang.String", rsMeta.getColumnClassName(2));
345400

346401
// TEXT and VARCHAR are not distinguishable
347402
assertEquals(Types.VARCHAR, rsMeta.getColumnType(3));
348-
assertEquals("varchar", rsMeta.getColumnTypeName(3));
403+
assertEquals("string", rsMeta.getColumnTypeName(3));
349404
assertEquals("java.lang.String", rsMeta.getColumnClassName(3));
350405

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

0 commit comments

Comments
 (0)