apache / apache/arrow-java

Expose Arrow `Struct` columns as JDBC `STRUCT` metadata in the Flight SQL JDBC driver.

Open Beginner friendly
#1,100 0 comments 0 reactions 0 assignees View on GitHub
Type: enhancement
Dominant language
Java
Stars
94
Forks
152
Avg merge
3d 16h
Merged PRs (30d)
11

Description

### Describe the enhancement requested

Please expose Arrow `Struct` columns as JDBC `STRUCT` metadata in the Flight SQL JDBC driver.

Today, Arrow `Struct` is mapped to `java.sql.Types.JAVA_OBJECT`, which makes
`ResultSetMetaData` report:
- `getColumnType(...) == Types.JAVA_OBJECT`
- `getColumnTypeName(...) == "JAVA_OBJECT"`

This hides the fact that the column is structurally a JDBC `STRUCT`, even though the driver
already has struct-specific accessor support.

## Why this matters

JDBC clients often rely on `ResultSetMetaData` to understand result schemas before reading
rows. When `STRUCT` columns are reported as `JAVA_OBJECT`, clients cannot distinguish:
- struct/object-like columns
- generic opaque objects

This makes schema inspection, BI tooling, ORM adapters, and generic JDBC consumers harder.

## Current upstream evidence

In
`flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/utils/SqlTypes.java`:

- `ArrowType.Struct` maps to `Types.JAVA_OBJECT`

In `flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/comple
x/ArrowFlightJdbcStructVectorAccessor.java`:

- `getStruct()` is already implemented
- but `getObjectClass()` returns `Map.class`
- `getObject()` returns a `Map`

So the data path knows about structs, but metadata does not expose them as JDBC `STRUCT`.

## Expected behavior

For Arrow `Struct` columns:
- `ResultSetMetaData.getColumnType(...)` should return `java.sql.Types.STRUCT`
- `ResultSetMetaData.getColumnTypeName(...)` should return `STRUCT`

Optionally, `getObject()` / object-class behavior could also be aligned with JDBC `Struct`, but
the most important gap is metadata.

## Actual behavior

Arrow `Struct` columns are exposed as:
- `Types.JAVA_OBJECT`
- `"JAVA_OBJECT"`

## Version

Observed with:
- Arrow Flight SQL JDBC driver `18.2.0`

Confirmed in current upstream code and latest published artifact line:
- `19.0.0`

Contributor guide

Open the contributing guide

Research direction

Start in flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/utils/SqlTypes.java, where ArrowType.Struct is mapped to Types.JAVA_OBJECT, and review the related ArrowFlightJdbcStructVectorAccessor.java implementation. Update the metadata mapping so Struct columns report JDBC STRUCT and verify ResultSetMetaData returns STRUCT and "STRUCT" for those columns.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
database
Issue type
Feature
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
76/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.