Skip to content

Commit 75ec5c2

Browse files
authored
fix: fix getLong on NUMERIC (#2420)
* fix: fix getLong on NUMERIC * address review comments
1 parent b0a017d commit 75ec5c2

File tree

6 files changed

+454
-98
lines changed

6 files changed

+454
-98
lines changed

java-spanner-jdbc/src/main/java/com/google/cloud/spanner/jdbc/JdbcResultSet.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,9 @@ public byte getByte(int columnIndex) throws SQLException {
307307
case ENUM:
308308
return isNull ? (byte) 0 : checkedCastToByte(spanner.getLong(spannerIndex));
309309
case NUMERIC:
310-
return isNull ? (byte) 0 : checkedCastToByte(spanner.getBigDecimal(spannerIndex));
310+
return isNull
311+
? (byte) 0
312+
: checkedCastToByte(spanner.getBigDecimal(spannerIndex).toBigInteger());
311313
case PG_NUMERIC:
312314
return isNull
313315
? (byte) 0
@@ -354,7 +356,9 @@ public short getShort(int columnIndex) throws SQLException {
354356
}
355357
return isNull ? 0 : checkedCastToShort(spanner.getLong(spannerIndex));
356358
case NUMERIC:
357-
return isNull ? 0 : checkedCastToShort(spanner.getBigDecimal(spannerIndex));
359+
return isNull
360+
? (short) 0
361+
: checkedCastToShort(spanner.getBigDecimal(spannerIndex).toBigInteger());
358362
case PG_NUMERIC:
359363
return isNull
360364
? 0
@@ -395,7 +399,7 @@ public int getInt(int columnIndex) throws SQLException {
395399
case ENUM:
396400
return isNull ? 0 : checkedCastToInt(spanner.getLong(spannerIndex));
397401
case NUMERIC:
398-
return isNull ? 0 : checkedCastToInt(spanner.getBigDecimal(spannerIndex));
402+
return isNull ? 0 : checkedCastToInt(spanner.getBigDecimal(spannerIndex).toBigInteger());
399403
case PG_NUMERIC:
400404
return isNull
401405
? 0
@@ -432,7 +436,7 @@ public long getLong(int columnIndex) throws SQLException {
432436
case ENUM:
433437
return isNull ? 0L : spanner.getLong(spannerIndex);
434438
case NUMERIC:
435-
return isNull ? 0 : checkedCastToLong(parseBigDecimal(spanner.getString(spannerIndex)));
439+
return isNull ? 0L : checkedCastToLong(spanner.getBigDecimal(spannerIndex).toBigInteger());
436440
case PG_NUMERIC:
437441
return isNull
438442
? 0L

java-spanner-jdbc/src/main/java/com/google/cloud/spanner/jdbc/JdbcTypeConverter.java

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,46 +116,65 @@ static Object convert(Object value, Type type, Class<?> targetType) throws SQLEx
116116
}
117117
if (type.getCode() == Code.FLOAT64) return (Double) value != 0d;
118118
if (type.getCode() == Code.NUMERIC) return !value.equals(BigDecimal.ZERO);
119+
if (type.getCode() == Code.PG_NUMERIC)
120+
return !AbstractJdbcWrapper.parseBigDecimal((String) value).equals(BigDecimal.ZERO);
119121
}
120122
if (targetType.equals(BigDecimal.class)) {
121123
if (type.getCode() == Code.BOOL) return (Boolean) value ? BigDecimal.ONE : BigDecimal.ZERO;
122124
if (type.getCode() == Code.INT64 || type.getCode() == Code.ENUM)
123125
return BigDecimal.valueOf((Long) value);
124126
if (type.getCode() == Code.NUMERIC) return value;
127+
if (type.getCode() == Code.PG_NUMERIC)
128+
return AbstractJdbcWrapper.parseBigDecimal((String) value);
125129
}
126130
if (targetType.equals(Long.class)) {
127131
if (type.getCode() == Code.BOOL) return (Boolean) value ? 1L : 0L;
128132
if (type.getCode() == Code.INT64 || type.getCode() == Code.ENUM) return value;
129133
if (type.getCode() == Code.NUMERIC)
130-
return AbstractJdbcWrapper.checkedCastToLong((BigDecimal) value);
134+
return AbstractJdbcWrapper.checkedCastToLong(((BigDecimal) value).toBigInteger());
135+
if (type.getCode() == Code.PG_NUMERIC)
136+
return AbstractJdbcWrapper.checkedCastToLong(
137+
AbstractJdbcWrapper.parseBigDecimal((String) value).toBigInteger());
131138
}
132139
if (targetType.equals(Integer.class)) {
133140
if (type.getCode() == Code.BOOL) return (Boolean) value ? 1 : 0;
134141
if (type.getCode() == Code.INT64 || type.getCode() == Code.ENUM)
135142
return AbstractJdbcWrapper.checkedCastToInt((Long) value);
136143
if (type.getCode() == Code.NUMERIC)
137-
return AbstractJdbcWrapper.checkedCastToInt((BigDecimal) value);
144+
return AbstractJdbcWrapper.checkedCastToInt(((BigDecimal) value).toBigInteger());
145+
if (type.getCode() == Code.PG_NUMERIC)
146+
return AbstractJdbcWrapper.checkedCastToInt(
147+
AbstractJdbcWrapper.parseBigDecimal((String) value).toBigInteger());
138148
}
139149
if (targetType.equals(Short.class)) {
140150
if (type.getCode() == Code.BOOL) return (Boolean) value ? 1 : 0;
141151
if (type.getCode() == Code.INT64 || type.getCode() == Code.ENUM)
142152
return AbstractJdbcWrapper.checkedCastToShort((Long) value);
143153
if (type.getCode() == Code.NUMERIC)
144-
return AbstractJdbcWrapper.checkedCastToShort((BigDecimal) value);
154+
return AbstractJdbcWrapper.checkedCastToShort(((BigDecimal) value).toBigInteger());
155+
if (type.getCode() == Code.PG_NUMERIC)
156+
return AbstractJdbcWrapper.checkedCastToShort(
157+
AbstractJdbcWrapper.parseBigDecimal((String) value).toBigInteger());
145158
}
146159
if (targetType.equals(Byte.class)) {
147160
if (type.getCode() == Code.BOOL) return (Boolean) value ? 1 : 0;
148161
if (type.getCode() == Code.INT64 || type.getCode() == Code.ENUM)
149162
return AbstractJdbcWrapper.checkedCastToByte((Long) value);
150163
if (type.getCode() == Code.NUMERIC)
151-
return AbstractJdbcWrapper.checkedCastToByte((BigDecimal) value);
164+
return AbstractJdbcWrapper.checkedCastToByte(((BigDecimal) value).toBigInteger());
165+
if (type.getCode() == Code.PG_NUMERIC)
166+
return AbstractJdbcWrapper.checkedCastToByte(
167+
AbstractJdbcWrapper.parseBigDecimal((String) value).toBigInteger());
152168
}
153169
if (targetType.equals(BigInteger.class)) {
154170
if (type.getCode() == Code.BOOL) return (Boolean) value ? BigInteger.ONE : BigInteger.ZERO;
155171
if (type.getCode() == Code.INT64 || type.getCode() == Code.ENUM)
156172
return BigInteger.valueOf((Long) value);
157173
if (type.getCode() == Code.NUMERIC)
158174
return AbstractJdbcWrapper.checkedCastToBigInteger((BigDecimal) value);
175+
if (type.getCode() == Code.PG_NUMERIC)
176+
return AbstractJdbcWrapper.checkedCastToBigInteger(
177+
AbstractJdbcWrapper.parseBigDecimal((String) value));
159178
}
160179
if (targetType.equals(Float.class)) {
161180
if (type.getCode() == Code.BOOL)
@@ -166,6 +185,8 @@ static Object convert(Object value, Type type, Class<?> targetType) throws SQLEx
166185
if (type.getCode() == Code.FLOAT64)
167186
return AbstractJdbcWrapper.checkedCastToFloat((Double) value);
168187
if (type.getCode() == Code.NUMERIC) return ((BigDecimal) value).floatValue();
188+
if (type.getCode() == Code.PG_NUMERIC)
189+
return AbstractJdbcWrapper.parseFloat((String) value);
169190
}
170191
if (targetType.equals(Double.class)) {
171192
if (type.getCode() == Code.BOOL)
@@ -174,6 +195,8 @@ static Object convert(Object value, Type type, Class<?> targetType) throws SQLEx
174195
return value;
175196
}
176197
if (type.getCode() == Code.NUMERIC) return ((BigDecimal) value).doubleValue();
198+
if (type.getCode() == Code.PG_NUMERIC)
199+
return AbstractJdbcWrapper.parseDouble((String) value);
177200
}
178201
if (targetType.equals(java.sql.Date.class)) {
179202
if (type.getCode() == Code.DATE) return value;

java-spanner-jdbc/src/test/java/com/google/cloud/spanner/jdbc/ConcurrentTransactionOnEmulatorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public static void startEmulator() {
5757
new GenericContainer<>(
5858
DockerImageName.parse("gcr.io/cloud-spanner-emulator/emulator:latest"))
5959
.withExposedPorts(9010)
60-
.waitingFor(Wait.forListeningPorts(9010));
60+
.waitingFor(Wait.forLogMessage(".*gRPC server listening at.*\\n", 1));
6161
emulator.start();
6262
properties = new Properties();
6363
properties.setProperty("autoConfigEmulator", "true");

0 commit comments

Comments
 (0)