diff --git a/java/vtgate-client/src/main/java/com/youtube/vitess/vtgate/Field.java b/java/vtgate-client/src/main/java/com/youtube/vitess/vtgate/Field.java index 8e0507f1047..3276fcc6ed9 100644 --- a/java/vtgate-client/src/main/java/com/youtube/vitess/vtgate/Field.java +++ b/java/vtgate-client/src/main/java/com/youtube/vitess/vtgate/Field.java @@ -1,27 +1,212 @@ package com.youtube.vitess.vtgate; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.primitives.UnsignedLong; + +import com.youtube.vitess.vtgate.Field.Flag; +import com.youtube.vitess.vtgate.Row.Cell; + +import org.apache.commons.lang.CharEncoding; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.ISODateTimeFormat; + +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; + public class Field { + /** + * MySQL field flags bitset values e.g. to distinguish between signed and unsigned integer. + * Comments are taken from the original source code. + * These numbers should exactly match values defined in dist/mysql-5.1.52/include/mysql_com.h + */ + public enum Flag { + // VT_ZEROVALUE_FLAG is not part of the MySQL specification and only used in unit tests. + VT_ZEROVALUE_FLAG(0), + VT_NOT_NULL_FLAG (1), /* Field can't be NULL */ + VT_PRI_KEY_FLAG(2), /* Field is part of a primary key */ + VT_UNIQUE_KEY_FLAG(4), /* Field is part of a unique key */ + VT_MULTIPLE_KEY_FLAG(8), /* Field is part of a key */ + VT_BLOB_FLAG(16), /* Field is a blob */ + VT_UNSIGNED_FLAG(32), /* Field is unsigned */ + VT_ZEROFILL_FLAG(64), /* Field is zerofill */ + VT_BINARY_FLAG(128), /* Field is binary */ + /* The following are only sent to new clients */ + VT_ENUM_FLAG(256), /* field is an enum */ + VT_AUTO_INCREMENT_FLAG(512), /* field is a autoincrement field */ + VT_TIMESTAMP_FLAG(1024), /* Field is a timestamp */ + VT_SET_FLAG(2048), /* field is a set */ + VT_NO_DEFAULT_VALUE_FLAG(4096), /* Field doesn't have default value */ + VT_ON_UPDATE_NOW_FLAG(8192), /* Field is set to NOW on UPDATE */ + VT_NUM_FLAG(32768); /* Field is num (for clients) */ + + public int mysqlFlag; + + Flag(int mysqlFlag) { + this.mysqlFlag = mysqlFlag; + } + } + + /** + * Represents all field types supported by Vitess and their corresponding types in Java. mysqlType + * numbers should exactly match values defined in dist/mysql-5.1.52/include/mysql/mysql_com.h + * + */ + enum FieldType { + VT_DECIMAL(0, BigDecimal.class), + VT_TINY(1, Integer.class), + VT_SHORT(2, Integer.class), + VT_LONG(3, Long.class), + VT_FLOAT(4, Float.class), + VT_DOUBLE(5, Double.class), + VT_NULL(6, null), + VT_TIMESTAMP(7, DateTime.class), + VT_LONGLONG(8, Long.class, UnsignedLong.class), + VT_INT24(9, Integer.class), + VT_DATE(10, DateTime.class), + VT_TIME(11, DateTime.class), + VT_DATETIME(12, DateTime.class), + VT_YEAR(13, Short.class), + VT_NEWDATE(14, DateTime.class), + VT_VARCHAR(15, byte[].class), + VT_BIT(16, byte[].class), + VT_NEWDECIMAL(246, BigDecimal.class), + VT_ENUM(247, String.class), + VT_SET(248, String.class), + VT_TINY_BLOB(249, byte[].class), + VT_MEDIUM_BLOB(250, byte[].class), + VT_LONG_BLOB(251, byte[].class), + VT_BLOB(252, byte[].class), + VT_VAR_STRING(253, byte[].class), + VT_STRING(254, byte[].class), + VT_GEOMETRY(255, byte[].class); + + public final int mysqlType; + public final Class javaType; + public final Class unsignedJavaType; + + FieldType(int mysqlType, Class javaType) { + this.mysqlType = mysqlType; + this.javaType = javaType; + this.unsignedJavaType = javaType; + } + + FieldType(int mysqlType, Class javaType, Class unsignedJavaType) { + this.mysqlType = mysqlType; + this.javaType = javaType; + this.unsignedJavaType = unsignedJavaType; + } + } + private String name; private FieldType type; - - public Field(String name, FieldType type) { - this.name = name; - this.type = type; + private int mysqlFlags; + + public static Field newFieldFromMysql(String name, int mysqlTypeId, int mysqlFlags) { + for (FieldType ft : FieldType.values()) { + if (ft.mysqlType == mysqlTypeId) { + return new Field(name, ft, mysqlFlags); + } + } + + throw new RuntimeException("Unknown MySQL type: " + mysqlTypeId); } - public String getName() { - return name; + @VisibleForTesting + static Field newFieldForTest(FieldType fieldType, Flag flag) { + return new Field("dummyField", fieldType, flag.mysqlFlag); } - public void setName(String name) { + private Field(String name, FieldType type, int mysqlFlags) { this.name = name; + this.type = type; + this.mysqlFlags = mysqlFlags; } - public FieldType getType() { - return type; + public Cell convertValueToCell(byte[] bytes) { + if ((mysqlFlags & Flag.VT_UNSIGNED_FLAG.mysqlFlag) != 0) { + return new Cell(name, convert(bytes), type.unsignedJavaType); + } else { + return new Cell(name, convert(bytes), type.javaType); + } } - public void setType(FieldType type) { - this.type = type; + Object convert(byte[] bytes) { + if (bytes == null || bytes.length == 0) { + return null; + } + String s = null; + try { + s = new String(bytes, CharEncoding.ISO_8859_1); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + + switch (type) { + case VT_DECIMAL: + return new BigDecimal(s); + case VT_TINY: + return Integer.valueOf(s); + case VT_SHORT: + return Integer.valueOf(s); + case VT_LONG: + return Long.valueOf(s); + case VT_FLOAT: + return Float.valueOf(s); + case VT_DOUBLE: + return Double.valueOf(s); + case VT_NULL: + return null; + case VT_TIMESTAMP: + s = s.replace(' ', 'T'); + return DateTime.parse(s); + case VT_LONGLONG: + // This can be an unsigned or a signed long + if ((mysqlFlags & Flag.VT_UNSIGNED_FLAG.mysqlFlag) != 0) { + return UnsignedLong.valueOf(s); + } else { + return Long.valueOf(s); + } + case VT_INT24: + return Integer.valueOf(s); + case VT_DATE: + return DateTime.parse(s, ISODateTimeFormat.date()); + case VT_TIME: + DateTime d = DateTime.parse(s, DateTimeFormat.forPattern("HH:mm:ss")); + return d; + case VT_DATETIME: + s = s.replace(' ', 'T'); + return DateTime.parse(s); + case VT_YEAR: + return Short.valueOf(s); + case VT_NEWDATE: + return DateTime.parse(s, ISODateTimeFormat.date()); + case VT_VARCHAR: + return bytes; + case VT_BIT: + return bytes; + case VT_NEWDECIMAL: + return new BigDecimal(s); + case VT_ENUM: + return s; + case VT_SET: + return s; + case VT_TINY_BLOB: + return bytes; + case VT_MEDIUM_BLOB: + return bytes; + case VT_LONG_BLOB: + return bytes; + case VT_BLOB: + return bytes; + case VT_VAR_STRING: + return bytes; + case VT_STRING: + return bytes; + case VT_GEOMETRY: + return bytes; + default: + throw new RuntimeException("invalid field type " + this); + } } } diff --git a/java/vtgate-client/src/main/java/com/youtube/vitess/vtgate/FieldType.java b/java/vtgate-client/src/main/java/com/youtube/vitess/vtgate/FieldType.java deleted file mode 100644 index 4c09d80bac8..00000000000 --- a/java/vtgate-client/src/main/java/com/youtube/vitess/vtgate/FieldType.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.youtube.vitess.vtgate; - -import com.google.common.primitives.UnsignedLong; - -import org.apache.commons.lang.CharEncoding; -import org.joda.time.DateTime; -import org.joda.time.format.DateTimeFormat; -import org.joda.time.format.ISODateTimeFormat; - -import java.io.UnsupportedEncodingException; -import java.math.BigDecimal; - -/** - * Represents all field types supported by Vitess and their corresponding types in Java. mysqlType - * numbers should exactly match values defined in dist/mysql-5.1.52/include/mysql/mysql_com.h - * - */ -public enum FieldType { - VT_DECIMAL(0, BigDecimal.class), - VT_TINY(1, Integer.class), - VT_SHORT(2, Integer.class), - VT_LONG(3, Long.class), - VT_FLOAT(4, Float.class), - VT_DOUBLE(5, Double.class), - VT_NULL(6, null), - VT_TIMESTAMP(7, DateTime.class), - VT_LONGLONG(8, UnsignedLong.class), - VT_INT24(9, Integer.class), - VT_DATE(10, DateTime.class), - VT_TIME(11, DateTime.class), - VT_DATETIME(12, DateTime.class), - VT_YEAR(13, Short.class), - VT_NEWDATE(14, DateTime.class), - VT_VARCHAR(15, byte[].class), - VT_BIT(16, byte[].class), - VT_NEWDECIMAL(246, BigDecimal.class), - VT_ENUM(247, String.class), - VT_SET(248, String.class), - VT_TINY_BLOB(249, byte[].class), - VT_MEDIUM_BLOB(250, byte[].class), - VT_LONG_BLOB(251, byte[].class), - VT_BLOB(252, byte[].class), - VT_VAR_STRING(253, byte[].class), - VT_STRING(254, byte[].class), - VT_GEOMETRY(255, byte[].class); - - public int mysqlType; - public Class javaType; - - FieldType(int mysqlType, Class javaType) { - this.mysqlType = mysqlType; - this.javaType = javaType; - } - - public static FieldType get(int mysqlTypeId) { - for (FieldType ft : FieldType.values()) { - if (ft.mysqlType == mysqlTypeId) { - return ft; - } - } - return null; - } - - public Object convert(byte[] bytes) { - if (bytes == null || bytes.length == 0) { - return null; - } - String s = null; - try { - s = new String(bytes, CharEncoding.ISO_8859_1); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - - switch (this) { - case VT_DECIMAL: - return new BigDecimal(s); - case VT_TINY: - return Integer.valueOf(s); - case VT_SHORT: - return Integer.valueOf(s); - case VT_LONG: - return Long.valueOf(s); - case VT_FLOAT: - return Float.valueOf(s); - case VT_DOUBLE: - return Double.valueOf(s); - case VT_NULL: - return null; - case VT_TIMESTAMP: - s = s.replace(' ', 'T'); - return DateTime.parse(s); - case VT_LONGLONG: - // This can be an unsigned or a signed long - try { - return UnsignedLong.valueOf(s); - } catch (NumberFormatException e) { - return Long.valueOf(s); - } - case VT_INT24: - return Integer.valueOf(s); - case VT_DATE: - return DateTime.parse(s, ISODateTimeFormat.date()); - case VT_TIME: - DateTime d = DateTime.parse(s, DateTimeFormat.forPattern("HH:mm:ss")); - return d; - case VT_DATETIME: - s = s.replace(' ', 'T'); - return DateTime.parse(s); - case VT_YEAR: - return Short.valueOf(s); - case VT_NEWDATE: - return DateTime.parse(s, ISODateTimeFormat.date()); - case VT_VARCHAR: - return bytes; - case VT_BIT: - return bytes; - case VT_NEWDECIMAL: - return new BigDecimal(s); - case VT_ENUM: - return s; - case VT_SET: - return s; - case VT_TINY_BLOB: - return bytes; - case VT_MEDIUM_BLOB: - return bytes; - case VT_LONG_BLOB: - return bytes; - case VT_BLOB: - return bytes; - case VT_VAR_STRING: - return bytes; - case VT_STRING: - return bytes; - case VT_GEOMETRY: - return bytes; - default: - throw new RuntimeException("invalid field type " + this); - } - } -} diff --git a/java/vtgate-client/src/main/java/com/youtube/vitess/vtgate/rpcclient/gorpc/Bsonify.java b/java/vtgate-client/src/main/java/com/youtube/vitess/vtgate/rpcclient/gorpc/Bsonify.java index c4e60dfe9c4..e306778b80a 100644 --- a/java/vtgate-client/src/main/java/com/youtube/vitess/vtgate/rpcclient/gorpc/Bsonify.java +++ b/java/vtgate-client/src/main/java/com/youtube/vitess/vtgate/rpcclient/gorpc/Bsonify.java @@ -7,7 +7,7 @@ import com.youtube.vitess.vtgate.BatchQueryResponse; import com.youtube.vitess.vtgate.BindVariable; import com.youtube.vitess.vtgate.Field; -import com.youtube.vitess.vtgate.FieldType; +import com.youtube.vitess.vtgate.Field.Flag; import com.youtube.vitess.vtgate.KeyRange; import com.youtube.vitess.vtgate.KeyspaceId; import com.youtube.vitess.vtgate.Query; @@ -156,8 +156,12 @@ public static List bsonToFields(BSONObject result) { BSONObject fieldBson = (BSONObject) field; String fieldName = new String((byte[]) fieldBson.get("Name")); int mysqlType = Ints.checkedCast((Long) fieldBson.get("Type")); - FieldType fieldType = FieldType.get(mysqlType); - fieldList.add(new Field(fieldName, fieldType)); + int mysqlFlags = Flag.VT_ZEROVALUE_FLAG.mysqlFlag; + Object flags = fieldBson.get("Flags"); + if (flags != null) { + mysqlFlags = Ints.checkedCast((Long) flags); + } + fieldList.add(Field.newFieldFromMysql(fieldName, mysqlType, mysqlFlags)); } return fieldList; } @@ -172,8 +176,7 @@ public static List bsonToRows(BSONObject result, List fields) { for (Object col : cols) { byte[] val = col != null ? (byte[]) col : null; Field field = fieldsIter.next(); - FieldType ft = field.getType(); - cells.add(new Cell(field.getName(), ft.convert(val), ft.javaType)); + cells.add(field.convertValueToCell(val)); } rowList.add(new Row(cells)); } diff --git a/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/BsonifyTest.java b/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/BsonifyTest.java index 0e83a7d532e..ebb827d49b2 100644 --- a/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/BsonifyTest.java +++ b/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/BsonifyTest.java @@ -3,6 +3,8 @@ import com.google.common.primitives.UnsignedLong; import com.youtube.vitess.vtgate.Exceptions.InvalidFieldException; +import com.youtube.vitess.vtgate.Field.FieldType; +import com.youtube.vitess.vtgate.Field.Flag; import com.youtube.vitess.vtgate.Row.Cell; import com.youtube.vitess.vtgate.cursor.Cursor; import com.youtube.vitess.vtgate.cursor.CursorImpl; @@ -20,27 +22,34 @@ @RunWith(JUnit4.class) public class BsonifyTest { - + @Test public void testResultParse() throws InvalidFieldException { BSONObject result = new BasicBSONObject(); result.put("RowsAffected", UnsignedLong.valueOf("12")); result.put("InsertId", UnsignedLong.valueOf("12345")); + BasicBSONList fields = new BasicBSONList(); - for (long l = 0; l < 4; l++) { - BSONObject field = new BasicBSONObject(); - field.put("Name", ("col_" + l).getBytes()); - field.put("Type", l); - fields.add(field); - } + fields.add(newField("col_0", FieldType.VT_DECIMAL, Flag.VT_ZEROVALUE_FLAG)); + fields.add(newField("col_1", FieldType.VT_TINY, Flag.VT_ZEROVALUE_FLAG)); + fields.add(newField("col_2", FieldType.VT_SHORT, Flag.VT_ZEROVALUE_FLAG)); + fields.add(newField("col_3", FieldType.VT_LONG, Flag.VT_ZEROVALUE_FLAG)); + fields.add(newField("col_4", FieldType.VT_LONGLONG, Flag.VT_ZEROVALUE_FLAG)); + fields.add(newField("col_5", FieldType.VT_LONGLONG, Flag.VT_UNSIGNED_FLAG)); result.put("Fields", fields); + + // Fill each column with the following different values: 0, 1, 2 BasicBSONList rows = new BasicBSONList(); - for (int i = 0; i < 3; i++) { + int rowCount = 2; + for (int i = 0; i <= rowCount; i++) { BasicBSONList row = new BasicBSONList(); row.add(new Double(i).toString().getBytes()); row.add(String.valueOf(i).getBytes()); row.add(String.valueOf(i).getBytes()); row.add(new Long(i).toString().getBytes()); + row.add(new Long(i).toString().getBytes()); + row.add(new Long(i).toString().getBytes()); + Assert.assertEquals(fields.size(), row.size()); rows.add(row); } result.put("Rows", rows); @@ -50,25 +59,48 @@ public void testResultParse() throws InvalidFieldException { Assert.assertEquals(12L, cursor.getRowsAffected()); Assert.assertEquals(12345L, cursor.getLastRowId()); - Row firstRow = cursor.next(); - Cell cell0 = firstRow.next(); - Assert.assertEquals("col_0", cell0.getName()); - Assert.assertEquals(BigDecimal.class, cell0.getType()); - Assert.assertEquals(new BigDecimal("0.0"), firstRow.getBigDecimal(cell0.getName())); - - Cell cell1 = firstRow.next(); - Assert.assertEquals("col_1", cell1.getName()); - Assert.assertEquals(Integer.class, cell1.getType()); - Assert.assertEquals(new Integer(0), firstRow.getInt(cell1.getName())); - - Cell cell2 = firstRow.next(); - Assert.assertEquals("col_2", cell2.getName()); - Assert.assertEquals(Integer.class, cell2.getType()); - Assert.assertEquals(new Integer(0), firstRow.getInt(cell2.getName())); + for (int i = 0; i <= rowCount; i++) { + Row row = cursor.next(); + Cell cell0 = row.next(); + Assert.assertEquals("col_0", cell0.getName()); + Assert.assertEquals(BigDecimal.class, cell0.getType()); + Assert.assertEquals(new BigDecimal(String.format("%d.0", i)), row.getBigDecimal(cell0.getName())); + + Cell cell1 = row.next(); + Assert.assertEquals("col_1", cell1.getName()); + Assert.assertEquals(Integer.class, cell1.getType()); + Assert.assertEquals(new Integer(i), row.getInt(cell1.getName())); + + Cell cell2 = row.next(); + Assert.assertEquals("col_2", cell2.getName()); + Assert.assertEquals(Integer.class, cell2.getType()); + Assert.assertEquals(new Integer(i), row.getInt(cell2.getName())); + + Cell cell3 = row.next(); + Assert.assertEquals("col_3", cell3.getName()); + Assert.assertEquals(Long.class, cell3.getType()); + Assert.assertEquals(new Long(i), row.getLong(cell3.getName())); + + Cell cell4 = row.next(); + Assert.assertEquals("col_4", cell4.getName()); + Assert.assertEquals(Long.class, cell4.getType()); + Assert.assertEquals(new Long(i), row.getLong(cell4.getName())); + + Cell cell5 = row.next(); + Assert.assertEquals("col_5", cell5.getName()); + Assert.assertEquals(UnsignedLong.class, cell5.getType()); + Assert.assertEquals(UnsignedLong.valueOf(String.format("%d", i)), row.getULong(cell5.getName())); + } + // No more rows left. + Assert.assertFalse(cursor.hasNext()); +} - Cell cell3 = firstRow.next(); - Assert.assertEquals("col_3", cell3.getName()); - Assert.assertEquals(Long.class, cell3.getType()); - Assert.assertEquals(new Long(0), firstRow.getLong(cell3.getName())); + private BSONObject newField(String name, FieldType fieldType, Flag flag) { + BSONObject field = new BasicBSONObject(); + field.put("Name", name.getBytes()); + field.put("Type", (long) fieldType.mysqlType); + field.put("Flags", (long) flag.mysqlFlag); + + return field; } } diff --git a/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/DateTypesTest.java b/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/DateTypesTest.java index f2e7efcc3ac..2b640346211 100644 --- a/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/DateTypesTest.java +++ b/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/DateTypesTest.java @@ -1,5 +1,8 @@ package com.youtube.vitess.vtgate; +import com.youtube.vitess.vtgate.Field.FieldType; +import com.youtube.vitess.vtgate.Field.Flag; + import org.joda.time.DateTime; import org.junit.Assert; import org.junit.Test; @@ -37,7 +40,8 @@ public void testTime() throws Exception { } private void check(FieldType typeUnderTest, DateTime dt, byte[] bytes) throws ParseException { - Object o = typeUnderTest.convert(bytes); + Field f = Field.newFieldForTest(typeUnderTest, Flag.VT_ZEROVALUE_FLAG); + Object o = f.convert(bytes); Assert.assertEquals(DateTime.class, o.getClass()); Assert.assertEquals(dt, (DateTime) o); } diff --git a/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/FieldTypeTest.java b/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/FieldTest.java similarity index 58% rename from java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/FieldTypeTest.java rename to java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/FieldTest.java index 683fd163db5..6fc5f26802f 100644 --- a/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/FieldTypeTest.java +++ b/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/FieldTest.java @@ -3,6 +3,9 @@ import com.google.common.collect.Lists; import com.google.common.primitives.UnsignedLong; +import com.youtube.vitess.vtgate.Field.FieldType; +import com.youtube.vitess.vtgate.Field.Flag; + import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -11,14 +14,17 @@ import java.math.BigDecimal; import java.util.List; + + @RunWith(JUnit4.class) -public class FieldTypeTest { +public class FieldTest { @Test public void testDouble() { List typesToTest = Lists.newArrayList(FieldType.VT_DOUBLE); String val = "1000.01"; for (FieldType type : typesToTest) { - Object o = type.convert(val.getBytes()); + Field f = Field.newFieldForTest(type, Flag.VT_ZEROVALUE_FLAG); + Object o = f.convert(val.getBytes()); Assert.assertEquals(Double.class, o.getClass()); Assert.assertEquals(1000.01, ((Double) o).doubleValue(), 0.01); } @@ -29,7 +35,8 @@ public void testBigDecimal() { List typesToTest = Lists.newArrayList(FieldType.VT_DECIMAL, FieldType.VT_NEWDECIMAL); String val = "1000.01"; for (FieldType type : typesToTest) { - Object o = type.convert(val.getBytes()); + Field f = Field.newFieldForTest(type, Flag.VT_ZEROVALUE_FLAG); + Object o = f.convert(val.getBytes()); Assert.assertEquals(BigDecimal.class, o.getClass()); Assert.assertEquals(1000.01, ((BigDecimal) o).doubleValue(), 0.01); } @@ -41,39 +48,53 @@ public void testInteger() { Lists.newArrayList(FieldType.VT_TINY, FieldType.VT_SHORT, FieldType.VT_INT24); String val = "1000"; for (FieldType type : typesToTest) { - Object o = type.convert(val.getBytes()); + Field f = Field.newFieldForTest(type, Flag.VT_ZEROVALUE_FLAG); + Object o = f.convert(val.getBytes()); Assert.assertEquals(Integer.class, o.getClass()); Assert.assertEquals(1000, ((Integer) o).intValue()); } } @Test - public void testLong() { + public void testLong_LONG() { String val = "1000"; - Object o = FieldType.VT_LONG.convert(val.getBytes()); + Field f = Field.newFieldForTest(FieldType.VT_LONG, Flag.VT_ZEROVALUE_FLAG); + Object o = f.convert(val.getBytes()); Assert.assertEquals(Long.class, o.getClass()); Assert.assertEquals(1000L, ((Long) o).longValue()); } + @Test + public void testLong_LONGLONG() { + String val = "10000000000000"; + Field f = Field.newFieldForTest(FieldType.VT_LONGLONG, Flag.VT_ZEROVALUE_FLAG); + Object o = f.convert(val.getBytes()); + Assert.assertEquals(Long.class, o.getClass()); + Assert.assertEquals(10000000000000L, ((Long) o).longValue()); + } + + @Test + public void testLong_LONGLONG_UNSIGNED() { + String val = "10000000000000"; + Field f = Field.newFieldForTest(FieldType.VT_LONGLONG, Flag.VT_UNSIGNED_FLAG); + Object o = f.convert(val.getBytes()); + Assert.assertEquals(UnsignedLong.class, o.getClass()); + Assert.assertEquals(10000000000000L, ((UnsignedLong) o).longValue()); + } + @Test public void testNull() { - Object o = FieldType.VT_NULL.convert(null); + Field f = Field.newFieldForTest(FieldType.VT_NULL, Flag.VT_ZEROVALUE_FLAG); + Object o = f.convert(null); Assert.assertEquals(null, o); } @Test public void testFloat() { String val = "1000.01"; - Object o = FieldType.VT_FLOAT.convert(val.getBytes()); + Field f = Field.newFieldForTest(FieldType.VT_FLOAT, Flag.VT_ZEROVALUE_FLAG); + Object o = f.convert(val.getBytes()); Assert.assertEquals(Float.class, o.getClass()); Assert.assertEquals(1000.01, ((Float) o).floatValue(), 0.1); } - - @Test - public void testULong() { - String val = "10000000000000"; - Object o = FieldType.VT_LONGLONG.convert(val.getBytes()); - Assert.assertEquals(UnsignedLong.class, o.getClass()); - Assert.assertEquals(10000000000000L, ((UnsignedLong) o).longValue()); - } } diff --git a/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/integration/VtGateIT.java b/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/integration/VtGateIT.java index 0562261732b..4908dd8ebb3 100644 --- a/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/integration/VtGateIT.java +++ b/java/vtgate-client/src/test/java/com/youtube/vitess/vtgate/integration/VtGateIT.java @@ -1,4 +1,4 @@ -package com.youtube.vitess.vtgate.integration; + package com.youtube.vitess.vtgate.integration; import com.google.common.collect.Lists; import com.google.common.primitives.UnsignedLong; @@ -116,8 +116,8 @@ public void testExecuteKeyspaceIds() throws Exception { Row row = cursor.next(); Cell idCell = row.next(); Assert.assertEquals("id", idCell.getName()); - Assert.assertEquals(UnsignedLong.class, idCell.getType()); - UnsignedLong id = row.getULong(idCell.getName()); + Assert.assertEquals(Long.class, idCell.getType()); + Long id = row.getLong(idCell.getName()); Cell nameCell = row.next(); Assert.assertEquals("name", nameCell.getName()); @@ -307,7 +307,7 @@ public void testBatchExecuteKeyspaceIds() throws Exception { List actual = new ArrayList<>(); for (Cursor cursor : cursors) { for (Row row : cursor) { - actual.add(row.getULong("id").longValue()); + actual.add(row.getLong("id").longValue()); } } Assert.assertTrue(expected.equals(actual));