Skip to content

Commit c1b6e61

Browse files
committed
Fix support for ResultSet.getObject for TIMESTAMP_WITH_TIMEZONE
Turns out AvaticaSite.get does not account for TIMESTAMP_WITH_TIMEZONE types so we add support on an override function.
1 parent d529557 commit c1b6e61

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed

flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcVectorSchemaRootResultSet.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.sql.ResultSet;
2020
import java.sql.ResultSetMetaData;
2121
import java.sql.SQLException;
22+
import java.sql.Types;
2223
import java.util.HashSet;
2324
import java.util.List;
2425
import java.util.Objects;
@@ -28,14 +29,17 @@
2829
import org.apache.arrow.util.AutoCloseables;
2930
import org.apache.arrow.vector.VectorSchemaRoot;
3031
import org.apache.arrow.vector.types.pojo.Schema;
32+
import org.apache.calcite.avatica.AvaticaConnection;
3133
import org.apache.calcite.avatica.AvaticaResultSet;
3234
import org.apache.calcite.avatica.AvaticaResultSetMetaData;
35+
import org.apache.calcite.avatica.AvaticaSite;
3336
import org.apache.calcite.avatica.AvaticaStatement;
3437
import org.apache.calcite.avatica.ColumnMetaData;
3538
import org.apache.calcite.avatica.Meta;
3639
import org.apache.calcite.avatica.Meta.Frame;
3740
import org.apache.calcite.avatica.Meta.Signature;
3841
import org.apache.calcite.avatica.QueryState;
42+
import org.apache.calcite.avatica.util.Cursor;
3943
import org.slf4j.Logger;
4044
import org.slf4j.LoggerFactory;
4145

@@ -102,6 +106,33 @@ void populateData(final VectorSchemaRoot vectorSchemaRoot, final Schema schema)
102106
execute2(new ArrowFlightJdbcCursor(vectorSchemaRoot), this.signature.columns);
103107
}
104108

109+
/**
110+
* The default method in AvaticaResultSet does not properly handle TIMESTASMP_WITH_TIMEZONE, so we
111+
* override here to add support.
112+
*
113+
* @param columnIndex the first column is 1, the second is 2, ...
114+
* @return
115+
* @throws SQLException
116+
*/
117+
@Override
118+
public Object getObject(int columnIndex) throws SQLException {
119+
this.checkOpen();
120+
121+
Cursor.Accessor accessor;
122+
try {
123+
accessor = accessorList.get(columnIndex - 1);
124+
} catch (IndexOutOfBoundsException var3) {
125+
throw AvaticaConnection.HELPER.createException("invalid column ordinal: " + columnIndex);
126+
}
127+
128+
ColumnMetaData metaData = columnMetaDataList.get(columnIndex - 1);
129+
if (metaData.type.id == Types.TIMESTAMP_WITH_TIMEZONE) {
130+
return accessor.getTimestamp(localCalendar);
131+
} else {
132+
return AvaticaSite.get(accessor, metaData.type.id, localCalendar);
133+
}
134+
}
135+
105136
@Override
106137
protected void cancel() {
107138
signature.columns.clear();

0 commit comments

Comments
 (0)