diff --git a/cpp/src/arrow/flight/sql/column_metadata.cc b/cpp/src/arrow/flight/sql/column_metadata.cc index e98b29c2923c2..30ef240105c87 100644 --- a/cpp/src/arrow/flight/sql/column_metadata.cc +++ b/cpp/src/arrow/flight/sql/column_metadata.cc @@ -42,6 +42,7 @@ bool StringToBoolean(const std::string& string_value) { const char* ColumnMetadata::kCatalogName = "ARROW:FLIGHT:SQL:CATALOG_NAME"; const char* ColumnMetadata::kSchemaName = "ARROW:FLIGHT:SQL:SCHEMA_NAME"; const char* ColumnMetadata::kTableName = "ARROW:FLIGHT:SQL:TABLE_NAME"; +const char* ColumnMetadata::kTypeName = "ARROW:FLIGHT:SQL:TYPE_NAME"; const char* ColumnMetadata::kPrecision = "ARROW:FLIGHT:SQL:PRECISION"; const char* ColumnMetadata::kScale = "ARROW:FLIGHT:SQL:SCALE"; const char* ColumnMetadata::kIsAutoIncrement = "ARROW:FLIGHT:SQL:IS_AUTO_INCREMENT"; @@ -65,6 +66,10 @@ arrow::Result ColumnMetadata::GetTableName() const { return metadata_map_->Get(kTableName); } +arrow::Result ColumnMetadata::GetTypeName() const { + return metadata_map_->Get(kTypeName); +} + arrow::Result ColumnMetadata::GetPrecision() const { std::string precision_string; ARROW_ASSIGN_OR_RAISE(precision_string, metadata_map_->Get(kPrecision)); @@ -130,6 +135,12 @@ ColumnMetadata::ColumnMetadataBuilder& ColumnMetadata::ColumnMetadataBuilder::Ta return *this; } +ColumnMetadata::ColumnMetadataBuilder& ColumnMetadata::ColumnMetadataBuilder::TypeName( + std::string& type_name) { + metadata_map_->Append(ColumnMetadata::kTypeName, type_name); + return *this; +} + ColumnMetadata::ColumnMetadataBuilder& ColumnMetadata::ColumnMetadataBuilder::Precision( int32_t precision) { metadata_map_->Append(ColumnMetadata::kPrecision, std::to_string(precision)); diff --git a/cpp/src/arrow/flight/sql/column_metadata.h b/cpp/src/arrow/flight/sql/column_metadata.h index 7a20e74d67915..d347155fff5fb 100644 --- a/cpp/src/arrow/flight/sql/column_metadata.h +++ b/cpp/src/arrow/flight/sql/column_metadata.h @@ -46,6 +46,9 @@ class ColumnMetadata { static const char* kTableName; /// \brief Constant variable to hold the value of the key that /// will be used in the KeyValueMetadata class. + static const char* kTypeName; + /// \brief Constant variable to hold the value of the key that + /// will be used in the KeyValueMetadata class. static const char* kPrecision; /// \brief Constant variable to hold the value of the key that /// will be used in the KeyValueMetadata class. @@ -78,6 +81,10 @@ class ColumnMetadata { /// \return The table name. arrow::Result GetTableName() const; + /// \brief Return the type name set in the KeyValueMetadata. + /// \return The type name. + arrow::Result GetTypeName() const; + /// \brief Return the precision set in the KeyValueMetadata. /// \return The precision. arrow::Result GetPrecision() const; @@ -117,15 +124,20 @@ class ColumnMetadata { ColumnMetadataBuilder& CatalogName(std::string& catalog_name); /// \brief Set the schema_name in the KeyValueMetadata object. - /// \param[in] schema_name The schema_name. + /// \param[in] schema_name The schema_name. /// \return A ColumnMetadataBuilder. ColumnMetadataBuilder& SchemaName(std::string& schema_name); /// \brief Set the table name in the KeyValueMetadata object. - /// \param[in] table_name The table name. + /// \param[in] table_name The table name. /// \return A ColumnMetadataBuilder. ColumnMetadataBuilder& TableName(std::string& table_name); + /// \brief Set the type name in the KeyValueMetadata object. + /// \param[in] type_name The type name. + /// \return A ColumnMetadataBuilder. + ColumnMetadataBuilder& TypeName(std::string& type_name); + /// \brief Set the precision in the KeyValueMetadata object. /// \param[in] precision The precision. /// \return A ColumnMetadataBuilder. @@ -138,22 +150,22 @@ class ColumnMetadata { /// \brief Set the IsAutoIncrement in the KeyValueMetadata object. /// \param[in] is_auto_increment The IsAutoIncrement. - /// \return A ColumnMetadataBuilder. + /// \return A ColumnMetadataBuilder. ColumnMetadataBuilder& IsAutoIncrement(bool is_auto_increment); /// \brief Set the IsCaseSensitive in the KeyValueMetadata object. /// \param[in] is_case_sensitive The IsCaseSensitive. - /// \return A ColumnMetadataBuilder. + /// \return A ColumnMetadataBuilder. ColumnMetadataBuilder& IsCaseSensitive(bool is_case_sensitive); /// \brief Set the IsReadOnly in the KeyValueMetadata object. /// \param[in] is_read_only The IsReadOnly. - /// \return A ColumnMetadataBuilder. + /// \return A ColumnMetadataBuilder. ColumnMetadataBuilder& IsReadOnly(bool is_read_only); /// \brief Set the IsSearchable in the KeyValueMetadata object. /// \param[in] is_searchable The IsSearchable. - /// \return A ColumnMetadataBuilder. + /// \return A ColumnMetadataBuilder. ColumnMetadataBuilder& IsSearchable(bool is_searchable); ColumnMetadata Build() const; diff --git a/format/FlightSql.proto b/format/FlightSql.proto index d6c58bf04fe5a..a1a153c9673d7 100644 --- a/format/FlightSql.proto +++ b/format/FlightSql.proto @@ -1118,6 +1118,7 @@ message CommandGetDbSchemas { * - ARROW:FLIGHT:SQL:CATALOG_NAME - Table's catalog name * - ARROW:FLIGHT:SQL:DB_SCHEMA_NAME - Database schema name * - ARROW:FLIGHT:SQL:TABLE_NAME - Table name + * - ARROW:FLIGHT:SQL:TYPE_NAME - Type name * - ARROW:FLIGHT:SQL:PRECISION - Column precision/size * - ARROW:FLIGHT:SQL:SCALE - Column scale/decimal digits if applicable * - ARROW:FLIGHT:SQL:IS_AUTO_INCREMENT - "1" indicates if the column is auto incremented, "0" otherwise. @@ -1457,6 +1458,7 @@ message ActionClosePreparedStatementRequest { * - ARROW:FLIGHT:SQL:CATALOG_NAME - Table's catalog name * - ARROW:FLIGHT:SQL:DB_SCHEMA_NAME - Database schema name * - ARROW:FLIGHT:SQL:TABLE_NAME - Table name + * - ARROW:FLIGHT:SQL:TYPE_NAME - Type name * - ARROW:FLIGHT:SQL:PRECISION - Column precision/size * - ARROW:FLIGHT:SQL:SCALE - Column scale/decimal digits if applicable * - ARROW:FLIGHT:SQL:IS_AUTO_INCREMENT - "1" indicates if the column is auto incremented, "0" otherwise. @@ -1491,6 +1493,7 @@ message TicketStatementQuery { * - ARROW:FLIGHT:SQL:CATALOG_NAME - Table's catalog name * - ARROW:FLIGHT:SQL:DB_SCHEMA_NAME - Database schema name * - ARROW:FLIGHT:SQL:TABLE_NAME - Table name + * - ARROW:FLIGHT:SQL:TYPE_NAME - Type name * - ARROW:FLIGHT:SQL:PRECISION - Column precision/size * - ARROW:FLIGHT:SQL:SCALE - Column scale/decimal digits if applicable * - ARROW:FLIGHT:SQL:IS_AUTO_INCREMENT - "1" indicates if the column is auto incremented, "0" otherwise. diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadata.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadata.java index f2579ea03e9f9..da2b0b00edaef 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadata.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadata.java @@ -1037,8 +1037,10 @@ private int setGetColumnsVectorSchemaRootFromFields(final VectorSchemaRoot curre } dataTypeVector.setSafe(insertIndex, SqlTypes.getSqlTypeIdFromArrowType(fieldType)); - typeNameVector.setSafe(insertIndex, - SqlTypes.getSqlTypeNameFromArrowType(fieldType).getBytes(CHARSET)); + byte[] typeName = columnMetadata.getTypeName() != null ? + columnMetadata.getTypeName().getBytes(CHARSET) : + SqlTypes.getSqlTypeNameFromArrowType(fieldType).getBytes(CHARSET); + typeNameVector.setSafe(insertIndex, typeName); // We're not setting COLUMN_SIZE for ROWID SQL Types, as there's no such Arrow type. // We're not setting COLUMN_SIZE nor DECIMAL_DIGITS for Float/Double as their precision and scale are variable. diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/CoreMockedSqlProducers.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/CoreMockedSqlProducers.java index 7637e1dd12732..cf359849a7105 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/CoreMockedSqlProducers.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/CoreMockedSqlProducers.java @@ -172,6 +172,7 @@ private static void addLegacyMetadataSqlCmdSupport(final MockFlightSqlProducer p .catalogName("CATALOG_NAME_1") .schemaName("SCHEMA_NAME_1") .tableName("TABLE_NAME_1") + .typeName("TYPE_NAME_1") .precision(10) .scale(0) .isAutoIncrement(true) @@ -187,6 +188,7 @@ private static void addLegacyMetadataSqlCmdSupport(final MockFlightSqlProducer p .catalogName("CATALOG_NAME_2") .schemaName("SCHEMA_NAME_2") .tableName("TABLE_NAME_2") + .typeName("TYPE_NAME_2") .precision(65535) .scale(0) .isAutoIncrement(false) @@ -202,6 +204,7 @@ private static void addLegacyMetadataSqlCmdSupport(final MockFlightSqlProducer p .catalogName("CATALOG_NAME_3") .schemaName("SCHEMA_NAME_3") .tableName("TABLE_NAME_3") + .typeName("TYPE_NAME_3") .precision(15) .scale(20) .isAutoIncrement(false) diff --git a/java/flight/flight-sql/src/main/java/org/apache/arrow/flight/sql/FlightSqlColumnMetadata.java b/java/flight/flight-sql/src/main/java/org/apache/arrow/flight/sql/FlightSqlColumnMetadata.java index f085e7db4ed8e..bd52e4b495e6e 100644 --- a/java/flight/flight-sql/src/main/java/org/apache/arrow/flight/sql/FlightSqlColumnMetadata.java +++ b/java/flight/flight-sql/src/main/java/org/apache/arrow/flight/sql/FlightSqlColumnMetadata.java @@ -45,6 +45,7 @@ public class FlightSqlColumnMetadata { private static final String CATALOG_NAME = "ARROW:FLIGHT:SQL:CATALOG_NAME"; private static final String SCHEMA_NAME = "ARROW:FLIGHT:SQL:SCHEMA_NAME"; private static final String TABLE_NAME = "ARROW:FLIGHT:SQL:TABLE_NAME"; + 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 IS_AUTO_INCREMENT = "ARROW:FLIGHT:SQL:IS_AUTO_INCREMENT"; @@ -96,6 +97,14 @@ public String getTableName() { return metadataMap.get(TABLE_NAME); } + /** + * Returns the type name. + * @return The type name. + */ + public String getTypeName() { + return metadataMap.get(TYPE_NAME); + } + /** * Returns the precision / column size. * @return The precision / column size. @@ -217,6 +226,16 @@ public Builder tableName(String tableName) { return this; } + /** + * Sets the type name. + * @param typeName The type name. + * @return This builder. + */ + public Builder typeName(String typeName) { + metadataMap.put(TYPE_NAME, typeName); + return this; + } + /** * Sets the precision / column size. * @param precision The precision / column size. diff --git a/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/TestFlightSql.java b/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/TestFlightSql.java index 8001cf2c1e549..2825059abca41 100644 --- a/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/TestFlightSql.java +++ b/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/TestFlightSql.java @@ -254,6 +254,7 @@ public void testGetTablesResultFilteredWithSchema() throws Exception { new Field("ID", new FieldType(false, MinorType.INT.getType(), null, new FlightSqlColumnMetadata.Builder() .catalogName("") + .typeName("INTEGER") .schemaName("APP") .tableName("FOREIGNTABLE") .precision(10) @@ -263,6 +264,7 @@ public void testGetTablesResultFilteredWithSchema() throws Exception { new Field("FOREIGNNAME", new FieldType(true, MinorType.VARCHAR.getType(), null, new FlightSqlColumnMetadata.Builder() .catalogName("") + .typeName("VARCHAR") .schemaName("APP") .tableName("FOREIGNTABLE") .precision(100) @@ -272,6 +274,7 @@ public void testGetTablesResultFilteredWithSchema() throws Exception { new Field("VALUE", new FieldType(true, MinorType.INT.getType(), null, new FlightSqlColumnMetadata.Builder() .catalogName("") + .typeName("INTEGER") .schemaName("APP") .tableName("FOREIGNTABLE") .precision(10) @@ -287,6 +290,7 @@ public void testGetTablesResultFilteredWithSchema() throws Exception { new Field("ID", new FieldType(false, MinorType.INT.getType(), null, new FlightSqlColumnMetadata.Builder() .catalogName("") + .typeName("INTEGER") .schemaName("APP") .tableName("INTTABLE") .precision(10) @@ -296,6 +300,7 @@ public void testGetTablesResultFilteredWithSchema() throws Exception { new Field("KEYNAME", new FieldType(true, MinorType.VARCHAR.getType(), null, new FlightSqlColumnMetadata.Builder() .catalogName("") + .typeName("VARCHAR") .schemaName("APP") .tableName("INTTABLE") .precision(100) @@ -305,6 +310,7 @@ public void testGetTablesResultFilteredWithSchema() throws Exception { new Field("VALUE", new FieldType(true, MinorType.INT.getType(), null, new FlightSqlColumnMetadata.Builder() .catalogName("") + .typeName("INTEGER") .schemaName("APP") .tableName("INTTABLE") .precision(10) @@ -314,6 +320,7 @@ public void testGetTablesResultFilteredWithSchema() throws Exception { new Field("FOREIGNID", new FieldType(true, MinorType.INT.getType(), null, new FlightSqlColumnMetadata.Builder() .catalogName("") + .typeName("INTEGER") .schemaName("APP") .tableName("INTTABLE") .precision(10) diff --git a/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/sql/example/FlightSqlExample.java b/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/sql/example/FlightSqlExample.java index cbc16cb7ee893..320ab4def46f4 100644 --- a/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/sql/example/FlightSqlExample.java +++ b/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/sql/example/FlightSqlExample.java @@ -597,6 +597,7 @@ private static VectorSchemaRoot getTablesRoot(final DatabaseMetaData databaseMet final String catalogName = columnsData.getString("TABLE_CAT"); final String schemaName = columnsData.getString("TABLE_SCHEM"); final String tableName = columnsData.getString("TABLE_NAME"); + final String typeName = columnsData.getString("TYPE_NAME"); final String fieldName = columnsData.getString("COLUMN_NAME"); final int dataType = columnsData.getInt("DATA_TYPE"); final boolean isNullable = columnsData.getInt("NULLABLE") != DatabaseMetaData.columnNoNulls; @@ -611,6 +612,7 @@ private static VectorSchemaRoot getTablesRoot(final DatabaseMetaData databaseMet .catalogName(catalogName) .schemaName(schemaName) .tableName(tableName) + .typeName(typeName) .precision(precision) .scale(scale) .isAutoIncrement(isAutoIncrement)