Skip to content

Commit d25f387

Browse files
authored
GH-47720: [C++][FlightRPC] ODBC Columns Metadata (#48049)
### Rationale for this change Add support for returning columns metadata from the connected data source. ### What changes are included in this PR? - SQLColumns & Test ### Are these changes tested? Tested in local MSVC ### Are there any user-facing changes? N/A * GitHub Issue: #47720 Authored-by: Alina (Xi) Li <[email protected]> Signed-off-by: James Duong <[email protected]>
1 parent 7b812b4 commit d25f387

File tree

4 files changed

+994
-13
lines changed

4 files changed

+994
-13
lines changed

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

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,7 @@ SQLRETURN SQLAllocHandle(SQLSMALLINT type, SQLHANDLE parent, SQLHANDLE* result)
4141
ARROW_LOG(DEBUG) << "SQLAllocHandle called with type: " << type
4242
<< ", parent: " << parent
4343
<< ", result: " << static_cast<const void*>(result);
44-
// GH-47706 TODO: Add tests for SQLAllocStmt, pre-requisite requires
45-
// SQLDriverConnect implementation
46-
4744
*result = nullptr;
48-
4945
switch (type) {
5046
case SQL_HANDLE_ENV: {
5147
using ODBC::ODBCEnvironment;
@@ -141,9 +137,6 @@ SQLRETURN SQLAllocHandle(SQLSMALLINT type, SQLHANDLE parent, SQLHANDLE* result)
141137
SQLRETURN SQLFreeHandle(SQLSMALLINT type, SQLHANDLE handle) {
142138
ARROW_LOG(DEBUG) << "SQLFreeHandle called with type: " << type
143139
<< ", handle: " << handle;
144-
// GH-47706 TODO: Add tests for SQLFreeStmt, pre-requisite requires
145-
// SQLAllocStmt tests
146-
147140
switch (type) {
148141
case SQL_HANDLE_ENV: {
149142
using ODBC::ODBCEnvironment;
@@ -234,7 +227,6 @@ SQLRETURN SQLFreeStmt(SQLHSTMT handle, SQLUSMALLINT option) {
234227
}
235228

236229
case SQL_UNBIND: {
237-
// GH-47716 TODO: Add tests for SQLBindCol unbinding
238230
using ODBC::ODBCDescriptor;
239231
using ODBC::ODBCStatement;
240232
return ODBCStatement::ExecuteWithDiagnostics(handle, SQL_ERROR, [=]() {
@@ -280,7 +272,6 @@ SQLRETURN SQLGetDiagField(SQLSMALLINT handle_type, SQLHANDLE handle,
280272
<< ", diag_info_ptr: " << diag_info_ptr
281273
<< ", buffer_length: " << buffer_length << ", string_length_ptr: "
282274
<< static_cast<const void*>(string_length_ptr);
283-
// GH-46575 TODO: Add tests for SQLGetDiagField
284275
using ODBC::GetStringAttribute;
285276
using ODBC::ODBCConnection;
286277
using ODBC::ODBCDescriptor;
@@ -545,7 +536,6 @@ SQLRETURN SQLGetDiagRec(SQLSMALLINT handle_type, SQLHANDLE handle, SQLSMALLINT r
545536
<< ", message_text: " << static_cast<const void*>(message_text)
546537
<< ", buffer_length: " << buffer_length
547538
<< ", text_length_ptr: " << static_cast<const void*>(text_length_ptr);
548-
// GH-46575 TODO: Add tests for SQLGetDiagRec
549539
using arrow::flight::sql::odbc::Diagnostics;
550540
using ODBC::GetStringAttribute;
551541
using ODBC::ODBCConnection;
@@ -1227,8 +1217,24 @@ SQLRETURN SQLColumns(SQLHSTMT stmt, SQLWCHAR* catalog_name,
12271217
<< ", table_name_length: " << table_name_length
12281218
<< ", column_name: " << static_cast<const void*>(column_name)
12291219
<< ", column_name_length: " << column_name_length;
1230-
// GH-47720 TODO: Implement SQLColumns
1231-
return SQL_INVALID_HANDLE;
1220+
1221+
using ODBC::ODBCStatement;
1222+
using ODBC::SqlWcharToString;
1223+
1224+
return ODBCStatement::ExecuteWithDiagnostics(stmt, SQL_ERROR, [=]() {
1225+
ODBCStatement* statement = reinterpret_cast<ODBCStatement*>(stmt);
1226+
1227+
std::string catalog = SqlWcharToString(catalog_name, catalog_name_length);
1228+
std::string schema = SqlWcharToString(schema_name, schema_name_length);
1229+
std::string table = SqlWcharToString(table_name, table_name_length);
1230+
std::string column = SqlWcharToString(column_name, column_name_length);
1231+
1232+
statement->GetColumns(catalog_name ? &catalog : nullptr,
1233+
schema_name ? &schema : nullptr, table_name ? &table : nullptr,
1234+
column_name ? &column : nullptr);
1235+
1236+
return SQL_SUCCESS;
1237+
});
12321238
}
12331239

12341240
SQLRETURN SQLColAttribute(SQLHSTMT stmt, SQLUSMALLINT record_number,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ add_arrow_test(flight_sql_odbc_test
3434
SOURCES
3535
odbc_test_suite.cc
3636
odbc_test_suite.h
37+
columns_test.cc
3738
connection_attr_test.cc
3839
connection_info_test.cc
3940
connection_test.cc

0 commit comments

Comments
 (0)