Skip to content

Commit 0c694e7

Browse files
authored
GH-47722: [C++][FlightRPC] ODBC Data Type Information (#48051)
### Rationale for this change Implement ODBC to return information about data types supported by the data source ### What changes are included in this PR? - SQLGetTypeInfo & Tests ### Are these changes tested? Tested locally on MSVC ### Are there any user-facing changes? N/A * GitHub Issue: #47722 Authored-by: Alina (Xi) Li <alina.li@improving.com> Signed-off-by: David Li <li.davidm96@gmail.com>
1 parent df4ff90 commit 0c694e7

File tree

5 files changed

+1741
-5
lines changed

5 files changed

+1741
-5
lines changed

cpp/src/arrow/flight/sql/odbc/odbc_api.cc

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,8 +1388,60 @@ SQLRETURN SQLGetTypeInfo(SQLHSTMT stmt, SQLSMALLINT data_type) {
13881388
// appropriate data types in `SEARCHABLE` field
13891389
ARROW_LOG(DEBUG) << "SQLGetTypeInfoW called with stmt: " << stmt
13901390
<< " data_type: " << data_type;
1391-
// GH-47722 TODO: Implement SQLGetTypeInfo
1392-
return SQL_INVALID_HANDLE;
1391+
1392+
using ODBC::ODBCStatement;
1393+
return ODBC::ODBCStatement::ExecuteWithDiagnostics(stmt, SQL_ERROR, [=]() {
1394+
ODBCStatement* statement = reinterpret_cast<ODBCStatement*>(stmt);
1395+
1396+
switch (data_type) {
1397+
case SQL_ALL_TYPES:
1398+
case SQL_CHAR:
1399+
case SQL_VARCHAR:
1400+
case SQL_LONGVARCHAR:
1401+
case SQL_WCHAR:
1402+
case SQL_WVARCHAR:
1403+
case SQL_WLONGVARCHAR:
1404+
case SQL_BIT:
1405+
case SQL_BINARY:
1406+
case SQL_VARBINARY:
1407+
case SQL_LONGVARBINARY:
1408+
case SQL_TINYINT:
1409+
case SQL_SMALLINT:
1410+
case SQL_INTEGER:
1411+
case SQL_BIGINT:
1412+
case SQL_NUMERIC:
1413+
case SQL_DECIMAL:
1414+
case SQL_FLOAT:
1415+
case SQL_REAL:
1416+
case SQL_DOUBLE:
1417+
case SQL_GUID:
1418+
case SQL_DATE:
1419+
case SQL_TYPE_DATE:
1420+
case SQL_TIME:
1421+
case SQL_TYPE_TIME:
1422+
case SQL_TIMESTAMP:
1423+
case SQL_TYPE_TIMESTAMP:
1424+
case SQL_INTERVAL_DAY:
1425+
case SQL_INTERVAL_DAY_TO_HOUR:
1426+
case SQL_INTERVAL_DAY_TO_MINUTE:
1427+
case SQL_INTERVAL_DAY_TO_SECOND:
1428+
case SQL_INTERVAL_HOUR:
1429+
case SQL_INTERVAL_HOUR_TO_MINUTE:
1430+
case SQL_INTERVAL_HOUR_TO_SECOND:
1431+
case SQL_INTERVAL_MINUTE:
1432+
case SQL_INTERVAL_MINUTE_TO_SECOND:
1433+
case SQL_INTERVAL_SECOND:
1434+
case SQL_INTERVAL_YEAR:
1435+
case SQL_INTERVAL_YEAR_TO_MONTH:
1436+
case SQL_INTERVAL_MONTH:
1437+
statement->GetTypeInfo(data_type);
1438+
break;
1439+
default:
1440+
throw DriverException("Invalid SQL data type", "HY004");
1441+
}
1442+
1443+
return SQL_SUCCESS;
1444+
});
13931445
}
13941446

13951447
SQLRETURN SQLNativeSql(SQLHDBC conn, SQLWCHAR* in_statement_text,

cpp/src/arrow/flight/sql/odbc/odbc_impl/flight_sql_statement_get_type_info.cc

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,24 +108,27 @@ Result<std::shared_ptr<RecordBatch>> TransformInner(
108108
data.literal_suffix = reader.GetLiteralSuffix();
109109

110110
const auto& create_params = reader.GetCreateParams();
111-
if (create_params) {
111+
if (create_params && !create_params->empty()) {
112+
// GH-48093 TODO: replace boost-algorithm with alternatives
112113
data.create_params = boost::algorithm::join(*create_params, ",");
113114
} else {
114115
data.create_params = nullopt;
115116
}
116117

117118
data.nullable = reader.GetNullable() ? NULLABILITY_NULLABLE : NULLABILITY_NO_NULLS;
118119
data.case_sensitive = reader.GetCaseSensitive();
120+
// GH-47237 return SEARCHABILITY_LIKE_ONLY and SEARCHABILITY_ALL_EXPECT_LIKE for
121+
// appropriate data types
119122
data.searchable = reader.GetSearchable() ? SEARCHABILITY_ALL : SEARCHABILITY_NONE;
120123
data.unsigned_attribute = reader.GetUnsignedAttribute();
121124
data.fixed_prec_scale = reader.GetFixedPrecScale();
122125
data.auto_unique_value = reader.GetAutoIncrement();
123126
data.local_type_name = reader.GetLocalTypeName();
124127
data.minimum_scale = reader.GetMinimumScale();
125128
data.maximum_scale = reader.GetMaximumScale();
126-
data.sql_data_type =
129+
data.sql_data_type = util::GetNonConciseDataType(
127130
EnsureRightSqlCharType(static_cast<SqlDataType>(reader.GetSqlDataType()),
128-
metadata_settings_.use_wide_char);
131+
metadata_settings_.use_wide_char));
129132
data.sql_datetime_sub =
130133
util::GetSqlDateTimeSubCode(static_cast<SqlDataType>(data.data_type));
131134
data.num_prec_radix = reader.GetNumPrecRadix();

cpp/src/arrow/flight/sql/odbc/odbc_impl/util.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ SqlDataType GetDefaultSqlCharType(bool use_wide_char) {
5656
SqlDataType GetDefaultSqlVarcharType(bool use_wide_char) {
5757
return use_wide_char ? SqlDataType_WVARCHAR : SqlDataType_VARCHAR;
5858
}
59+
SqlDataType GetDefaultSqlLongVarcharType(bool use_wide_char) {
60+
return use_wide_char ? SqlDataType_WLONGVARCHAR : SqlDataType_LONGVARCHAR;
61+
}
5962
CDataType GetDefaultCCharType(bool use_wide_char) {
6063
return use_wide_char ? CDataType_WCHAR : CDataType_CHAR;
6164
}
@@ -147,6 +150,9 @@ SqlDataType EnsureRightSqlCharType(SqlDataType data_type, bool use_wide_char) {
147150
case SqlDataType_VARCHAR:
148151
case SqlDataType_WVARCHAR:
149152
return GetDefaultSqlVarcharType(use_wide_char);
153+
case SqlDataType_LONGVARCHAR:
154+
case SqlDataType_WLONGVARCHAR:
155+
return GetDefaultSqlLongVarcharType(use_wide_char);
150156
default:
151157
return data_type;
152158
}
@@ -748,10 +754,12 @@ bool NeedArrayConversion(Type::type original_type_id, CDataType data_type) {
748754
return data_type != CDataType_BINARY;
749755
case Type::DECIMAL128:
750756
return data_type != CDataType_NUMERIC;
757+
case Type::DURATION:
751758
case Type::LIST:
752759
case Type::LARGE_LIST:
753760
case Type::FIXED_SIZE_LIST:
754761
case Type::MAP:
762+
case Type::STRING_VIEW:
755763
case Type::STRUCT:
756764
return data_type == CDataType_CHAR || data_type == CDataType_WCHAR;
757765
default:

cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ add_arrow_test(flight_sql_odbc_test
4343
statement_attr_test.cc
4444
statement_test.cc
4545
tables_test.cc
46+
type_info_test.cc
4647
# Enable Protobuf cleanup after test execution
4748
# GH-46889: move protobuf_test_util to a more common location
4849
../../../../engine/substrait/protobuf_test_util.cc

0 commit comments

Comments
 (0)