Skip to content

Commit 8be57f3

Browse files
committed
[CONJ-1205] permit setObject with ARRAY dataType
1 parent 3e94848 commit 8be57f3

File tree

3 files changed

+120
-1
lines changed

3 files changed

+120
-1
lines changed

src/main/java/org/mariadb/jdbc/BasePreparedStatement.java

+17
Original file line numberDiff line numberDiff line change
@@ -1131,6 +1131,23 @@ private void setInternalObject(
11311131
// in case of not corresponding data type, converting
11321132
switch (targetSqlType) {
11331133
case Types.ARRAY:
1134+
if (obj instanceof float[]) {
1135+
parameters.set(
1136+
parameterIndex - 1, new Parameter<>(FloatArrayCodec.INSTANCE, (float[]) obj));
1137+
return;
1138+
} else if (obj instanceof Float[]) {
1139+
parameters.set(
1140+
parameterIndex - 1, new Parameter<>(FloatObjectArrayCodec.INSTANCE, (Float[]) obj));
1141+
return;
1142+
} else if (obj instanceof FloatArray) {
1143+
parameters.set(
1144+
parameterIndex - 1,
1145+
new Parameter<>(FloatArrayCodec.INSTANCE, (float[]) ((FloatArray) obj).getArray()));
1146+
return;
1147+
}
1148+
throw exceptionFactory()
1149+
.notSupported(
1150+
String.format("ARRAY Type not supported for %s", obj.getClass().getName()));
11341151
case Types.DATALINK:
11351152
case Types.JAVA_OBJECT:
11361153
case Types.REF:

src/main/java/org/mariadb/jdbc/plugin/array/FloatArray.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,11 @@ public ResultSet getResultSet(Map<String, Class<?>> map) throws SQLException {
8282
public ResultSet getResultSet(long index, int count) throws SQLException {
8383
byte[][] rows = new byte[count][];
8484
for (int i = 0; i < count; i++) {
85-
rows[i] = Float.toString(this.val[(int) index - 1 + i]).getBytes(StandardCharsets.US_ASCII);
85+
byte[] val =
86+
Float.toString(this.val[(int) index - 1 + i]).getBytes(StandardCharsets.US_ASCII);
87+
rows[i] = new byte[val.length + 1];
88+
rows[i][0] = (byte) val.length;
89+
System.arraycopy(val, 0, rows[i], 1, val.length);
8690
}
8791

8892
return new CompleteResult(

src/test/java/org/mariadb/jdbc/integration/codec/FloatArrayCodecTest.java

+98
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import static org.junit.jupiter.api.Assertions.*;
77

88
import java.sql.*;
9+
import java.util.HashMap;
910
import org.junit.jupiter.api.AfterAll;
1011
import org.junit.jupiter.api.BeforeAll;
1112
import org.junit.jupiter.api.Test;
@@ -106,6 +107,103 @@ private void floatArrayArrayObj(org.mariadb.jdbc.Connection con) throws SQLExcep
106107
}
107108
}
108109

110+
@Test
111+
public void floatArrayArrayObjWithType() throws SQLException {
112+
Statement stmt = sharedConn.createStatement();
113+
stmt.execute("TRUNCATE TABLE BinaryCodec");
114+
floatArrayArrayObjWithType(sharedConn);
115+
stmt.execute("TRUNCATE TABLE BinaryCodec");
116+
floatArrayArrayObjWithType(sharedConnBinary);
117+
}
118+
119+
private void floatArrayArrayObjWithType(org.mariadb.jdbc.Connection con) throws SQLException {
120+
float[] val = new float[] {1, 2, 3};
121+
float[] val2 = new float[] {4, 5};
122+
float[] val3 = new float[] {7, 8, 9, 10};
123+
124+
Array valArray = con.createArrayOf("float", val);
125+
126+
try (PreparedStatement prep =
127+
con.prepareStatement("INSERT INTO BinaryCodec(t0, t1) VALUES (?, ?)")) {
128+
prep.setInt(1, 1);
129+
prep.setObject(2, valArray, Types.ARRAY);
130+
prep.execute();
131+
132+
prep.setInt(1, 2);
133+
prep.setObject(2, val2, Types.ARRAY);
134+
prep.execute();
135+
136+
prep.setInt(1, 3);
137+
prep.setObject(2, val3, Types.ARRAY);
138+
prep.execute();
139+
}
140+
141+
try (PreparedStatement prep =
142+
con.prepareStatement(
143+
"SELECT * FROM BinaryCodec",
144+
ResultSet.TYPE_SCROLL_INSENSITIVE,
145+
ResultSet.CONCUR_UPDATABLE)) {
146+
ResultSet rs = prep.executeQuery();
147+
assertTrue(rs.next());
148+
float[] res = (float[]) rs.getArray(2).getArray();
149+
assertArrayEquals(val, res);
150+
Array arr = rs.getArray(2);
151+
assertArrayEquals(val, (float[]) arr.getArray(1, 3));
152+
assertArrayEquals(new float[] {2, 3}, (float[]) arr.getArray(2, 2));
153+
assertArrayEquals(new float[] {1, 2}, (float[]) arr.getArray(1, 2));
154+
assertThrowsContains(
155+
SQLException.class,
156+
() -> arr.getArray(0, 2),
157+
"Wrong index position. Is 0 but must be in 1-3 range");
158+
assertThrowsContains(
159+
SQLException.class,
160+
() -> arr.getArray(2, 20),
161+
"Count value is too big. Count is 20 but cannot be > to 2");
162+
assertEquals("float[]", arr.getBaseTypeName());
163+
assertEquals(Types.FLOAT, arr.getBaseType());
164+
assertThrowsContains(
165+
SQLException.class,
166+
() -> arr.getArray(new HashMap<>()),
167+
"getArray(Map<String, Class<?>> map) is not supported");
168+
assertThrowsContains(
169+
SQLException.class,
170+
() -> arr.getArray(1, 2, new HashMap<>()),
171+
"getArray(long index, int count, Map<String, Class<?>> map) is not supported");
172+
173+
ResultSet rss = arr.getResultSet();
174+
assertTrue(rss.next());
175+
assertEquals(1, rss.getFloat(1));
176+
assertTrue(rss.next());
177+
assertEquals(2, rss.getFloat(1));
178+
assertTrue(rss.next());
179+
assertEquals(3, rss.getFloat(1));
180+
assertFalse(rss.next());
181+
182+
rss = arr.getResultSet(2, 2);
183+
assertTrue(rss.next());
184+
assertEquals(2, rss.getFloat(1));
185+
assertTrue(rss.next());
186+
assertEquals(3, rss.getFloat(1));
187+
assertFalse(rss.next());
188+
assertThrowsContains(
189+
SQLException.class,
190+
() -> arr.getResultSet(new HashMap<>()),
191+
"getResultSet(Map<String, Class<?>> map) is not supported");
192+
assertThrowsContains(
193+
SQLException.class,
194+
() -> arr.getResultSet(1, 2, new HashMap<>()),
195+
"getResultSet(long index, int count, Map<String, Class<?>> map) is not supported");
196+
arr.free();
197+
assertTrue(rs.next());
198+
float[] res2 = rs.getObject(2, float[].class);
199+
assertArrayEquals(val2, res2);
200+
201+
assertTrue(rs.next());
202+
float[] res3 = rs.getObject(2, float[].class);
203+
assertArrayEquals(val3, res3);
204+
}
205+
}
206+
109207
@Test
110208
public void floatArrayObjArray() throws SQLException {
111209
Statement stmt = sharedConn.createStatement();

0 commit comments

Comments
 (0)