Skip to content

Commit 63c2f9c

Browse files
committed
GH-477: Fix Flight JDBC DATE(MILLISECOND) parameter binding
1 parent a9f0086 commit 63c2f9c

2 files changed

Lines changed: 48 additions & 1 deletion

File tree

flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/converter/impl/DateAvaticaParameterConverter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package org.apache.arrow.driver.jdbc.converter.impl;
1818

19+
import java.util.concurrent.TimeUnit;
1920
import org.apache.arrow.vector.DateDayVector;
2021
import org.apache.arrow.vector.DateMilliVector;
2122
import org.apache.arrow.vector.FieldVector;
@@ -33,7 +34,7 @@ public DateAvaticaParameterConverter(ArrowType.Date type) {}
3334
public boolean bindParameter(FieldVector vector, TypedValue typedValue, int index) {
3435
int value = (int) typedValue.toLocal();
3536
if (vector instanceof DateMilliVector) {
36-
((DateMilliVector) vector).setSafe(index, value);
37+
((DateMilliVector) vector).setSafe(index, TimeUnit.DAYS.toMillis(value));
3738
return true;
3839
} else if (vector instanceof DateDayVector) {
3940
((DateDayVector) vector).setSafe(index, value);

flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightPreparedStatementTest.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@
2525

2626
import java.nio.charset.StandardCharsets;
2727
import java.sql.Connection;
28+
import java.sql.Date;
2829
import java.sql.PreparedStatement;
2930
import java.sql.ResultSet;
3031
import java.sql.SQLException;
32+
import java.time.LocalDate;
3133
import java.util.Arrays;
3234
import java.util.Collections;
3335
import java.util.List;
@@ -38,6 +40,7 @@
3840
import org.apache.arrow.memory.RootAllocator;
3941
import org.apache.arrow.vector.IntVector;
4042
import org.apache.arrow.vector.VectorSchemaRoot;
43+
import org.apache.arrow.vector.types.DateUnit;
4144
import org.apache.arrow.vector.types.Types;
4245
import org.apache.arrow.vector.types.pojo.ArrowType;
4346
import org.apache.arrow.vector.types.pojo.Field;
@@ -180,6 +183,49 @@ public void testQueryWithParameterBinding() throws SQLException {
180183
}
181184
}
182185

186+
@Test
187+
public void testQueryWithDateMillisecondParameterBinding() throws SQLException {
188+
final String query = "Fake query with date millisecond parameter";
189+
final Schema schema =
190+
new Schema(Collections.singletonList(Field.nullable("", Types.MinorType.INT.getType())));
191+
final Schema parameterSchema =
192+
new Schema(
193+
Collections.singletonList(
194+
Field.nullable("", new ArrowType.Date(DateUnit.MILLISECOND))));
195+
final LocalDate date = LocalDate.of(2000, 1, 1);
196+
final List<List<Object>> expected =
197+
Collections.singletonList(Collections.singletonList(date.atStartOfDay()));
198+
199+
PRODUCER.addSelectQuery(
200+
query,
201+
schema,
202+
Collections.singletonList(
203+
listener -> {
204+
try (final BufferAllocator allocator = new RootAllocator(Long.MAX_VALUE);
205+
final VectorSchemaRoot root = VectorSchemaRoot.create(schema, allocator)) {
206+
((IntVector) root.getVector(0)).setSafe(0, 10);
207+
root.setRowCount(1);
208+
listener.start(root);
209+
listener.putNext();
210+
} catch (final Throwable throwable) {
211+
listener.error(throwable);
212+
} finally {
213+
listener.completed();
214+
}
215+
}));
216+
217+
PRODUCER.addExpectedParameters(query, parameterSchema, expected);
218+
219+
try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {
220+
preparedStatement.setDate(1, Date.valueOf(date));
221+
222+
try (final ResultSet resultSet = preparedStatement.executeQuery()) {
223+
resultSet.next();
224+
assert true;
225+
}
226+
}
227+
}
228+
183229
@Test
184230
@Disabled("https://github.com/apache/arrow/issues/34741: flaky test")
185231
public void testPreparedStatementExecutionOnce() throws SQLException {

0 commit comments

Comments
 (0)