diff --git a/java/jdbc/src/main/java/io/vitess/jdbc/VitessPreparedStatement.java b/java/jdbc/src/main/java/io/vitess/jdbc/VitessPreparedStatement.java index 9b0a347cbb6..2c69fa0ef32 100644 --- a/java/jdbc/src/main/java/io/vitess/jdbc/VitessPreparedStatement.java +++ b/java/jdbc/src/main/java/io/vitess/jdbc/VitessPreparedStatement.java @@ -19,6 +19,7 @@ import java.io.InputStream; import java.io.Reader; import java.math.BigDecimal; +import java.math.BigInteger; import java.net.URL; import java.sql.Array; import java.sql.Blob; @@ -247,6 +248,11 @@ public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException this.bindVariables.put(Constants.LITERAL_V + parameterIndex, x); } + public void setBigInteger(int parameterIndex, BigInteger x) throws SQLException { + checkOpen(); + this.bindVariables.put(Constants.LITERAL_V + parameterIndex, x); + } + public void setString(int parameterIndex, String x) throws SQLException { checkOpen(); this.bindVariables.put(Constants.LITERAL_V + parameterIndex, x); @@ -322,6 +328,8 @@ public void setObject(int parameterIndex, Object x) throws SQLException { setTimestamp(parameterIndex, (Timestamp) x); } else if (x instanceof BigDecimal) { setBigDecimal(parameterIndex, (BigDecimal) x); + } else if (x instanceof BigInteger) { + setBigInteger(parameterIndex, (BigInteger) x); } else if (x instanceof byte[]) { setBytes(parameterIndex, (byte[]) x); } else if (getConnection().getTreatUtilDateAsTimestamp() && x instanceof java.util.Date) { @@ -890,8 +898,7 @@ private void setNumericObject(int parameterIndex, Object parameterObj, int targe } setBigDecimal(parameterIndex, scaledBigDecimal); } else if (numberParam instanceof java.math.BigInteger) { - setBigDecimal(parameterIndex, - new java.math.BigDecimal((java.math.BigInteger) numberParam, scale)); + setBigInteger(parameterIndex, (BigInteger) numberParam); } else { setBigDecimal(parameterIndex, new java.math.BigDecimal(numberParam.doubleValue())); diff --git a/java/jdbc/src/main/java/io/vitess/jdbc/VitessResultSet.java b/java/jdbc/src/main/java/io/vitess/jdbc/VitessResultSet.java index 6825265d0a2..c2c28e19484 100644 --- a/java/jdbc/src/main/java/io/vitess/jdbc/VitessResultSet.java +++ b/java/jdbc/src/main/java/io/vitess/jdbc/VitessResultSet.java @@ -16,13 +16,12 @@ package io.vitess.jdbc; -import com.google.common.annotations.VisibleForTesting; -import com.google.protobuf.ByteString; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.Reader; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; +import java.math.BigInteger; import java.net.URL; import java.sql.Array; import java.sql.Blob; @@ -46,8 +45,12 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; + import javax.sql.rowset.serial.SerialClob; +import com.google.common.annotations.VisibleForTesting; +import com.google.protobuf.ByteString; + import io.vitess.client.cursor.Cursor; import io.vitess.client.cursor.Row; import io.vitess.client.cursor.SimpleCursor; @@ -428,6 +431,27 @@ public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException return value; } + public BigInteger getBigInteger(int columnIndex) throws SQLException { + String bigIntegerString; + BigInteger value; + + preAccessor(columnIndex); + + if (isNull(columnIndex)) { + return null; + } + + bigIntegerString = this.getString(columnIndex); + + try { + value = new BigInteger(bigIntegerString); + } catch (Exception ex) { + throw new SQLException(ex); + } + + return value; + } + public byte[] getBytes(int columnIndex) throws SQLException { String bytesString; byte[] value; @@ -528,6 +552,11 @@ public BigDecimal getBigDecimal(String columnLabel, int scale) throws SQLExcepti return getBigDecimal(columnIndex, scale); } + public BigInteger getBigInteger(String columnLabel) throws SQLException { + int columnIndex = this.findColumn(columnLabel); + return getBigInteger(columnIndex); + } + public byte[] getBytes(String columnLabel) throws SQLException { int columnIndex = this.findColumn(columnLabel); return getBytes(columnIndex); diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java index 6005dc4e665..31b7356f1f0 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java @@ -16,9 +16,9 @@ package io.vitess.jdbc; -import com.google.common.collect.ImmutableMap; import java.lang.reflect.Field; import java.math.BigDecimal; +import java.math.BigInteger; import java.sql.BatchUpdateException; import java.sql.Date; import java.sql.ResultSet; @@ -32,7 +32,9 @@ import java.util.List; import java.util.Map; import java.util.TimeZone; + import javax.sql.rowset.serial.SerialClob; + import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -42,6 +44,8 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import com.google.common.collect.ImmutableMap; + import io.vitess.client.Context; import io.vitess.client.SQLFuture; import io.vitess.client.VTGateConnection; @@ -456,6 +460,7 @@ private void testExecute(int fetchSize, boolean simpleExecute, boolean shouldRun Double doubleValue = Double.MAX_VALUE; BigDecimal bigDecimalValue = new BigDecimal(3.14159265358979323846); BigDecimal expectedDecimalValue = new BigDecimal("3.14159"); + BigInteger bigIntegerValue = new BigInteger("18446744073709551615"); String stringValue = "vitess"; byte[] bytesValue = stringValue.getBytes(); Date dateValue = new Date(0); @@ -473,41 +478,43 @@ private void testExecute(int fetchSize, boolean simpleExecute, boolean shouldRun preparedStatement.setFloat(7, floatValue); preparedStatement.setDouble(8, doubleValue); preparedStatement.setBigDecimal(9, bigDecimalValue); - preparedStatement.setString(10, stringValue); - preparedStatement.setBytes(11, bytesValue); - preparedStatement.setDate(12, dateValue); - preparedStatement.setTime(13, timeValue); - preparedStatement.setTimestamp(14, timestampValue); - preparedStatement.setDate(15, dateValue, Calendar.getInstance(TimeZone.getDefault())); - preparedStatement.setTime(16, timeValue, Calendar.getInstance(TimeZone.getDefault())); + preparedStatement.setBigInteger(10, bigIntegerValue); + preparedStatement.setString(11, stringValue); + preparedStatement.setBytes(12, bytesValue); + preparedStatement.setDate(13, dateValue); + preparedStatement.setTime(14, timeValue); + preparedStatement.setTimestamp(15, timestampValue); + preparedStatement.setDate(16, dateValue, Calendar.getInstance(TimeZone.getDefault())); + preparedStatement.setTime(17, timeValue, Calendar.getInstance(TimeZone.getDefault())); preparedStatement - .setTimestamp(17, timestampValue, Calendar.getInstance(TimeZone.getDefault())); - preparedStatement.setObject(18, boolValue); - preparedStatement.setObject(19, byteValue); - preparedStatement.setObject(20, shortValue); - preparedStatement.setObject(21, intValue); - preparedStatement.setObject(22, longValue); - preparedStatement.setObject(23, floatValue); - preparedStatement.setObject(24, doubleValue); - preparedStatement.setObject(25, bigDecimalValue); - preparedStatement.setObject(26, stringValue); - preparedStatement.setObject(27, dateValue); - preparedStatement.setObject(28, timeValue); - preparedStatement.setObject(29, timestampValue); - preparedStatement.setObject(30, 'a'); - preparedStatement.setObject(31, null); - preparedStatement.setObject(32, boolValue, Types.BOOLEAN, 0); - preparedStatement.setObject(33, shortValue, Types.SMALLINT, 0); - preparedStatement.setObject(34, longValue, Types.BIGINT, 0); - preparedStatement.setObject(35, floatValue, Types.DOUBLE, 2); - preparedStatement.setObject(36, doubleValue, Types.DOUBLE, 3); - preparedStatement.setObject(37, bigDecimalValue, Types.DECIMAL, 5); - preparedStatement.setObject(38, stringValue, Types.VARCHAR, 0); - preparedStatement.setObject(39, dateValue, Types.DATE, 0); - preparedStatement.setObject(40, timeValue, Types.TIME, 0); - preparedStatement.setObject(41, timestampValue, Types.TIMESTAMP, 0); - preparedStatement.setClob(42, new SerialClob("clob".toCharArray())); - preparedStatement.setObject(43, bytesValue); + .setTimestamp(18, timestampValue, Calendar.getInstance(TimeZone.getDefault())); + preparedStatement.setObject(19, boolValue); + preparedStatement.setObject(20, byteValue); + preparedStatement.setObject(21, shortValue); + preparedStatement.setObject(22, intValue); + preparedStatement.setObject(23, longValue); + preparedStatement.setObject(24, floatValue); + preparedStatement.setObject(25, doubleValue); + preparedStatement.setObject(26, bigDecimalValue); + preparedStatement.setObject(27, bigIntegerValue); + preparedStatement.setObject(28, stringValue); + preparedStatement.setObject(29, dateValue); + preparedStatement.setObject(30, timeValue); + preparedStatement.setObject(31, timestampValue); + preparedStatement.setObject(32, 'a'); + preparedStatement.setObject(33, null); + preparedStatement.setObject(34, boolValue, Types.BOOLEAN, 0); + preparedStatement.setObject(35, shortValue, Types.SMALLINT, 0); + preparedStatement.setObject(36, longValue, Types.BIGINT, 0); + preparedStatement.setObject(37, floatValue, Types.DOUBLE, 2); + preparedStatement.setObject(38, doubleValue, Types.DOUBLE, 3); + preparedStatement.setObject(39, bigDecimalValue, Types.DECIMAL, 5); + preparedStatement.setObject(40, stringValue, Types.VARCHAR, 0); + preparedStatement.setObject(41, dateValue, Types.DATE, 0); + preparedStatement.setObject(42, timeValue, Types.TIME, 0); + preparedStatement.setObject(43, timestampValue, Types.TIMESTAMP, 0); + preparedStatement.setClob(44, new SerialClob("clob".toCharArray())); + preparedStatement.setObject(45, bytesValue); Field bindVariablesMap = preparedStatement.getClass().getDeclaredField("bindVariables"); bindVariablesMap.setAccessible(true); Map bindVariables = @@ -521,40 +528,42 @@ private void testExecute(int fetchSize, boolean simpleExecute, boolean shouldRun Assert.assertEquals(floatValue, bindVariables.get("v7")); Assert.assertEquals(doubleValue, bindVariables.get("v8")); Assert.assertEquals(bigDecimalValue, bindVariables.get("v9")); - Assert.assertEquals(stringValue, bindVariables.get("v10")); - Assert.assertEquals(bytesValue, bindVariables.get("v11")); - Assert.assertEquals(dateValue.toString(), bindVariables.get("v12")); - Assert.assertEquals(timeValue.toString(), bindVariables.get("v13")); - Assert.assertEquals(timestampValue.toString(), bindVariables.get("v14")); - Assert.assertEquals(dateValue.toString(), bindVariables.get("v15")); - Assert.assertEquals(timeValue.toString(), bindVariables.get("v16")); - Assert.assertEquals(timestampValue.toString(), bindVariables.get("v17")); - Assert.assertEquals(boolValue, bindVariables.get("v18")); - Assert.assertEquals(byteValue, bindVariables.get("v19")); - Assert.assertEquals(shortValue, bindVariables.get("v20")); - Assert.assertEquals(intValue, bindVariables.get("v21")); - Assert.assertEquals(longValue, bindVariables.get("v22")); - Assert.assertEquals(floatValue, bindVariables.get("v23")); - Assert.assertEquals(doubleValue, bindVariables.get("v24")); - Assert.assertEquals(bigDecimalValue, bindVariables.get("v25")); - Assert.assertEquals(stringValue, bindVariables.get("v26")); - Assert.assertEquals(dateValue.toString(), bindVariables.get("v27")); - Assert.assertEquals(timeValue.toString(), bindVariables.get("v28")); - Assert.assertEquals(timestampValue.toString(), bindVariables.get("v29")); - Assert.assertEquals("a", bindVariables.get("v30")); - Assert.assertEquals(null, bindVariables.get("v31")); - Assert.assertEquals(boolValue, bindVariables.get("v32")); - Assert.assertEquals(shortValue.intValue(), bindVariables.get("v33")); - Assert.assertEquals(longValue, bindVariables.get("v34")); - Assert.assertEquals((double) floatValue, (double) bindVariables.get("v35"), 0.1); - Assert.assertEquals(doubleValue, (double) bindVariables.get("v36"), 0.1); - Assert.assertEquals(expectedDecimalValue, bindVariables.get("v37")); - Assert.assertEquals(stringValue, bindVariables.get("v38")); - Assert.assertEquals(dateValue.toString(), bindVariables.get("v39")); - Assert.assertEquals(timeValue.toString(), bindVariables.get("v40")); - Assert.assertEquals(timestampValue.toString(), bindVariables.get("v41")); - Assert.assertEquals("clob", bindVariables.get("v42")); - Assert.assertArrayEquals(bytesValue, (byte[])bindVariables.get("v43")); + Assert.assertEquals(bigIntegerValue, bindVariables.get("v10")); + Assert.assertEquals(stringValue, bindVariables.get("v11")); + Assert.assertEquals(bytesValue, bindVariables.get("v12")); + Assert.assertEquals(dateValue.toString(), bindVariables.get("v13")); + Assert.assertEquals(timeValue.toString(), bindVariables.get("v14")); + Assert.assertEquals(timestampValue.toString(), bindVariables.get("v15")); + Assert.assertEquals(dateValue.toString(), bindVariables.get("v16")); + Assert.assertEquals(timeValue.toString(), bindVariables.get("v17")); + Assert.assertEquals(timestampValue.toString(), bindVariables.get("v18")); + Assert.assertEquals(boolValue, bindVariables.get("v19")); + Assert.assertEquals(byteValue, bindVariables.get("v20")); + Assert.assertEquals(shortValue, bindVariables.get("v21")); + Assert.assertEquals(intValue, bindVariables.get("v22")); + Assert.assertEquals(longValue, bindVariables.get("v23")); + Assert.assertEquals(floatValue, bindVariables.get("v24")); + Assert.assertEquals(doubleValue, bindVariables.get("v25")); + Assert.assertEquals(bigDecimalValue, bindVariables.get("v26")); + Assert.assertEquals(bigIntegerValue, bindVariables.get("v27")); + Assert.assertEquals(stringValue, bindVariables.get("v28")); + Assert.assertEquals(dateValue.toString(), bindVariables.get("v29")); + Assert.assertEquals(timeValue.toString(), bindVariables.get("v30")); + Assert.assertEquals(timestampValue.toString(), bindVariables.get("v31")); + Assert.assertEquals("a", bindVariables.get("v32")); + Assert.assertEquals(null, bindVariables.get("v33")); + Assert.assertEquals(boolValue, bindVariables.get("v34")); + Assert.assertEquals(shortValue.intValue(), bindVariables.get("v35")); + Assert.assertEquals(longValue, bindVariables.get("v36")); + Assert.assertEquals((double) floatValue, (double) bindVariables.get("v37"), 0.1); + Assert.assertEquals(doubleValue, (double) bindVariables.get("v38"), 0.1); + Assert.assertEquals(expectedDecimalValue, bindVariables.get("v39")); + Assert.assertEquals(stringValue, bindVariables.get("v40")); + Assert.assertEquals(dateValue.toString(), bindVariables.get("v41")); + Assert.assertEquals(timeValue.toString(), bindVariables.get("v42")); + Assert.assertEquals(timestampValue.toString(), bindVariables.get("v43")); + Assert.assertEquals("clob", bindVariables.get("v44")); + Assert.assertArrayEquals(bytesValue, (byte[])bindVariables.get("v45")); preparedStatement.clearParameters(); } diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java index f31de052f5a..726398de68a 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java @@ -16,7 +16,6 @@ package io.vitess.jdbc; -import com.google.protobuf.ByteString; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -27,6 +26,7 @@ import java.sql.Time; import java.sql.Timestamp; import java.util.Properties; + import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -36,6 +36,8 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import com.google.protobuf.ByteString; + import io.vitess.client.cursor.Cursor; import io.vitess.client.cursor.SimpleCursor; import io.vitess.proto.Query; @@ -266,6 +268,14 @@ public Cursor getCursorWithRowsAsNull() { Assert.assertEquals(new BigInteger("1000"), vitessResultSet.getObject(10)); } + @Test public void getBigInteger() throws SQLException { + Cursor cursor = getCursorWithRowsAsNull(); + VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); + vitessResultSet.next(); + + Assert.assertEquals(new BigInteger("1000"), vitessResultSet.getBigInteger(10)); + } + @Test public void testgetBoolean() throws SQLException { Cursor cursor = getCursorWithRows(); Cursor cursorWithRowsAsNull = getCursorWithRowsAsNull(); @@ -448,6 +458,14 @@ public Cursor getCursorWithRowsAsNull() { Assert.assertEquals(-1000, vitessResultSet.getInt("col9")); } + @Test public void testBigIntegerbyColumnLabel() throws SQLException { + Cursor cursor = getCursorWithRows(); + VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); + vitessResultSet.next(); + Assert.assertEquals(new BigInteger("1000"), + vitessResultSet.getBigInteger("col10")); + } + @Test public void testgetFloatbyColumnLabel() throws SQLException { Cursor cursor = getCursorWithRows(); VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement());