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 {
144144assertThat(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+147223array =
148224JdbcArray.createArray("NUMERIC", new BigDecimal[] {BigDecimal.ONE, null, BigDecimal.TEN});
149225assertThat(array.getBaseType()).isEqualTo(Types.NUMERIC);