fix: accept Arrays of Integer, Short, Byte for Array<Int64> (#2365) · googleapis/java-spanner-jdbc@7429508

@@ -144,6 +144,82 @@ public void testCreateArrayTypeName() throws SQLException {

144144

assertThat(rs.next()).isFalse();

145145

}

146146147+

// Test that Byte[] arrays are automatically widened to Long[] for INT64 type

148+

Long[] data;

149+

array = JdbcArray.createArray("INT64", new Byte[] {1, 2, 3, null, Byte.MAX_VALUE});

150+

assertThat(array.getBaseType()).isEqualTo(Types.BIGINT);

151+

// Data should be stored as Long[]

152+

assertThat(array.getArray()).isInstanceOf(Long[].class);

153+

data = (Long[]) array.getArray();

154+

assertThat(data[0]).isEqualTo(1L);

155+

assertThat(data[1]).isEqualTo(2L);

156+

assertThat(data[2]).isEqualTo(3L);

157+

assertThat(data[3]).isNull();

158+

assertThat(data[4]).isEqualTo((long) Byte.MAX_VALUE);

159+160+

try (ResultSet rs = array.getResultSet()) {

161+

assertThat(rs.next()).isTrue();

162+

assertThat(rs.getByte(2)).isEqualTo((byte) 1);

163+

assertThat(rs.next()).isTrue();

164+

assertThat(rs.getByte(2)).isEqualTo((byte) 2);

165+

assertThat(rs.next()).isTrue();

166+

assertThat(rs.getByte(2)).isEqualTo((byte) 3);

167+

assertThat(rs.next()).isTrue();

168+

assertThat(rs.getByte(2)).isEqualTo((byte) 0);

169+

assertTrue(rs.wasNull());

170+

assertThat(rs.next()).isTrue();

171+

assertThat(rs.getByte(2)).isEqualTo(Byte.MAX_VALUE);

172+

assertThat(rs.next()).isFalse();

173+

}

174+175+

// Test that Short[] arrays are automatically widened to Long[] for INT64 type

176+

array = JdbcArray.createArray("INT64", new Short[] {100, 200, null, Short.MAX_VALUE});

177+

assertThat(array.getBaseType()).isEqualTo(Types.BIGINT);

178+

// Data should be stored as Long[]

179+

assertThat(array.getArray()).isInstanceOf(Long[].class);

180+

data = (Long[]) array.getArray();

181+

assertThat(data[0]).isEqualTo(100L);

182+

assertThat(data[1]).isEqualTo(200L);

183+

assertThat(data[2]).isNull();

184+

assertThat(data[3]).isEqualTo((long) Short.MAX_VALUE);

185+186+

try (ResultSet rs = array.getResultSet()) {

187+

assertThat(rs.next()).isTrue();

188+

assertThat(rs.getShort(2)).isEqualTo((short) 100);

189+

assertThat(rs.next()).isTrue();

190+

assertThat(rs.getShort(2)).isEqualTo((short) 200);

191+

assertThat(rs.next()).isTrue();

192+

assertThat(rs.getShort(2)).isEqualTo((short) 0);

193+

assertTrue(rs.wasNull());

194+

assertThat(rs.next()).isTrue();

195+

assertThat(rs.getShort(2)).isEqualTo(Short.MAX_VALUE);

196+

assertThat(rs.next()).isFalse();

197+

}

198+199+

// Test that Integer[] arrays are automatically widened to Long[] for INT64 type

200+

array = JdbcArray.createArray("INT64", new Integer[] {1000, 2000, null, Integer.MAX_VALUE});

201+

assertThat(array.getBaseType()).isEqualTo(Types.BIGINT);

202+

// Data should be stored as Long[]

203+

assertThat(array.getArray()).isInstanceOf(Long[].class);

204+

data = (Long[]) array.getArray();

205+

assertThat(data[0]).isEqualTo(1000L);

206+

assertThat(data[1]).isEqualTo(2000L);

207+

assertThat(data[2]).isNull();

208+

assertThat(data[3]).isEqualTo((long) Integer.MAX_VALUE);

209+210+

try (ResultSet rs = array.getResultSet()) {

211+

assertThat(rs.next()).isTrue();

212+

assertThat(rs.getInt(2)).isEqualTo(1000);

213+

assertThat(rs.next()).isTrue();

214+

assertThat(rs.getInt(2)).isEqualTo(2000);

215+

assertThat(rs.next()).isTrue();

216+

assertThat(rs.getInt(2)).isEqualTo(0);

217+

assertTrue(rs.wasNull());

218+

assertThat(rs.next()).isTrue();

219+

assertThat(rs.getInt(2)).isEqualTo(Integer.MAX_VALUE);

220+

assertThat(rs.next()).isFalse();

221+

}

222+147223

array =

148224

JdbcArray.createArray("NUMERIC", new BigDecimal[] {BigDecimal.ONE, null, BigDecimal.TEN});

149225

assertThat(array.getBaseType()).isEqualTo(Types.NUMERIC);