From 6df0226cad2b240cba7d428901a97d329c8b9d73 Mon Sep 17 00:00:00 2001 From: Richie Black Date: Wed, 6 May 2026 12:21:19 -0700 Subject: [PATCH] GH-1134: add COLUMN_DEF support to JDBC getColumnns() --- arrow-format/FlightSql.proto | 1 + .../driver/jdbc/ArrowDatabaseMetadata.java | 6 ++++++ .../jdbc/ArrowDatabaseMetadataTest.java | 5 ++++- .../flight/sql/FlightSqlColumnMetadata.java | 21 +++++++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/arrow-format/FlightSql.proto b/arrow-format/FlightSql.proto index 566230c2a6..fcc5567592 100644 --- a/arrow-format/FlightSql.proto +++ b/arrow-format/FlightSql.proto @@ -1213,6 +1213,7 @@ message CommandGetDbSchemas { * - ARROW:FLIGHT:SQL:IS_READ_ONLY - "1" indicates if the column is read only, "0" otherwise. * - ARROW:FLIGHT:SQL:IS_SEARCHABLE - "1" indicates if the column is searchable via WHERE clause, "0" otherwise. * - ARROW:FLIGHT:SQL:REMARKS - A comment describing the column. + * - ARROW:FLIGHT:SQL:COLUMN_DEF - The default value for the column. * The returned data should be ordered by catalog_name, db_schema_name, table_name, then table_type, followed by table_schema if requested. */ message CommandGetTables { diff --git a/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadata.java b/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadata.java index 0110525fea..1d643fdf25 100644 --- a/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadata.java +++ b/flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadata.java @@ -1090,6 +1090,7 @@ private int setGetColumnsVectorSchemaRootFromFields( final VarCharVector tableSchemVector = (VarCharVector) currentRoot.getVector("TABLE_SCHEM"); final VarCharVector tableNameVector = (VarCharVector) currentRoot.getVector("TABLE_NAME"); final VarCharVector columnNameVector = (VarCharVector) currentRoot.getVector("COLUMN_NAME"); + final VarCharVector columnDefVector = (VarCharVector) currentRoot.getVector("COLUMN_DEF"); final IntVector dataTypeVector = (IntVector) currentRoot.getVector("DATA_TYPE"); final VarCharVector typeNameVector = (VarCharVector) currentRoot.getVector("TYPE_NAME"); final IntVector columnSizeVector = (IntVector) currentRoot.getVector("COLUMN_SIZE"); @@ -1131,6 +1132,11 @@ private int setGetColumnsVectorSchemaRootFromFields( columnNameVector.setSafe(insertIndex, columnName.getBytes(CHARSET)); } + final String columnDef = columnMetadata.getDefaultValue(); + if (columnDef != null) { + columnDefVector.setSafe(insertIndex, columnDef.getBytes(CHARSET)); + } + dataTypeVector.setSafe(insertIndex, SqlTypes.getSqlTypeIdFromArrowType(fieldType)); byte[] typeName = columnMetadata.getTypeName() != null diff --git a/flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadataTest.java b/flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadataTest.java index 3ab1460b27..23bbe3e7b2 100644 --- a/flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadataTest.java +++ b/flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadataTest.java @@ -308,6 +308,7 @@ public class ArrowDatabaseMetadataTest { List expectedGetColumnsColumnSize = Arrays.asList(5, 29, 10); List expectedGetColumnsDecimalDigits = Arrays.asList(2, 9, 0); List expectedGetColumnsIsNullable = Arrays.asList("YES", "YES", "NO"); + List expectedGetColumnsDefaultValue = Arrays.asList("123.45", null, "1"); EXPECTED_GET_COLUMNS_RESULTS = range(0, ROW_COUNT * 3) .mapToObj( @@ -325,7 +326,7 @@ public class ArrowDatabaseMetadataTest { expectedGetColumnsRadix.get(i % 3), !Objects.equals(expectedGetColumnsIsNullable.get(i % 3), "NO") ? 1 : 0, format("column description #%d", (i % 3) + 1), - null, + expectedGetColumnsDefaultValue.get(i % 3), null, null, null, @@ -430,6 +431,7 @@ public static void setUpBeforeClass() throws SQLException { null, new FlightSqlColumnMetadata.Builder() .remarks("column description #1") + .defaultValue("123.45") .build() .getMetadataMap()), null); @@ -454,6 +456,7 @@ public static void setUpBeforeClass() throws SQLException { null, new FlightSqlColumnMetadata.Builder() .remarks("column description #3") + .defaultValue("1") .build() .getMetadataMap()), null); diff --git a/flight/flight-sql/src/main/java/org/apache/arrow/flight/sql/FlightSqlColumnMetadata.java b/flight/flight-sql/src/main/java/org/apache/arrow/flight/sql/FlightSqlColumnMetadata.java index 3a969e10cf..c438b58be4 100644 --- a/flight/flight-sql/src/main/java/org/apache/arrow/flight/sql/FlightSqlColumnMetadata.java +++ b/flight/flight-sql/src/main/java/org/apache/arrow/flight/sql/FlightSqlColumnMetadata.java @@ -49,6 +49,7 @@ public class FlightSqlColumnMetadata { private static final String TYPE_NAME = "ARROW:FLIGHT:SQL:TYPE_NAME"; private static final String PRECISION = "ARROW:FLIGHT:SQL:PRECISION"; private static final String SCALE = "ARROW:FLIGHT:SQL:SCALE"; + private static final String DEFAULT_VALUE = "ARROW:FLIGHT:SQL:COLUMN_DEF"; private static final String IS_AUTO_INCREMENT = "ARROW:FLIGHT:SQL:IS_AUTO_INCREMENT"; private static final String IS_CASE_SENSITIVE = "ARROW:FLIGHT:SQL:IS_CASE_SENSITIVE"; private static final String IS_READ_ONLY = "ARROW:FLIGHT:SQL:IS_READ_ONLY"; @@ -138,6 +139,15 @@ public Integer getScale() { return Integer.valueOf(value); } + /** + * Returns the default value of the column. + * + * @return The default value of the column. + */ + public String getDefaultValue() { + return metadataMap.get(DEFAULT_VALUE); + } + /** * Returns if the column is auto incremented. * @@ -278,6 +288,17 @@ public Builder scale(int scale) { return this; } + /** + * Sets the column's default value. + * + * @param defaultValue The column's default value. + * @return This builder. + */ + public Builder defaultValue(String defaultValue) { + metadataMap.put(DEFAULT_VALUE, defaultValue); + return this; + } + /** * Sets if the column is auto incremented. *