This is an automated email from the ASF dual-hosted git repository.

kou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new 353a0a228b GH-47697: [C++][FlightRPC] Add ODBC API placeholders 
(#47725)
353a0a228b is described below

commit 353a0a228b94d634c309ebfd9581d08e8a5f08e4
Author: Alina (Xi) Li <[email protected]>
AuthorDate: Tue Oct 7 18:47:25 2025 -0700

    GH-47697: [C++][FlightRPC] Add ODBC API placeholders (#47725)
    
    ### Rationale for this change
    
    Add placeholders for ODBC APIs to make it easier to create draft PRs for 
ODBC APIs
    
    ### What changes are included in this PR?
    
    Add placeholders for ODBC APIs and link the corresponding GitHub issues.
    Minor build fixes
    ### Are these changes tested?
    
    Tested on local machine
    
    ### Are there any user-facing changes?
    No
    * GitHub Issue: #47697
    
    Authored-by: Alina (Xi) Li <[email protected]>
    Signed-off-by: Sutou Kouhei <[email protected]>
---
 cpp/src/arrow/flight/sql/odbc/entry_points.cc      | 283 +++++++++++++++-
 .../odbc/flight_sql/ui/dsn_configuration_window.cc |   2 +-
 cpp/src/arrow/flight/sql/odbc/odbc_api.cc          | 367 +++++++++++++++++++++
 cpp/src/arrow/flight/sql/odbc/odbc_api_internal.h  |  74 +++++
 .../odbcabstraction/odbc_impl/odbc_handle.h        |   2 +-
 5 files changed, 725 insertions(+), 3 deletions(-)

diff --git a/cpp/src/arrow/flight/sql/odbc/entry_points.cc 
b/cpp/src/arrow/flight/sql/odbc/entry_points.cc
index 6801868a3c..c8f6645012 100644
--- a/cpp/src/arrow/flight/sql/odbc/entry_points.cc
+++ b/cpp/src/arrow/flight/sql/odbc/entry_points.cc
@@ -34,5 +34,286 @@
 #include "arrow/util/logging.h"
 
 SQLRETURN SQL_API SQLAllocHandle(SQLSMALLINT type, SQLHANDLE parent, 
SQLHANDLE* result) {
-  return SQL_INVALID_HANDLE;
+  return arrow::flight::sql::odbc::SQLAllocHandle(type, parent, result);
+}
+
+SQLRETURN SQL_API SQLAllocEnv(SQLHENV* env) {
+  return arrow::flight::sql::odbc::SQLAllocHandle(SQL_HANDLE_ENV, 
SQL_NULL_HANDLE, env);
+}
+
+SQLRETURN SQL_API SQLAllocConnect(SQLHENV env, SQLHDBC* conn) {
+  return arrow::flight::sql::odbc::SQLAllocHandle(SQL_HANDLE_DBC, env, conn);
+}
+
+SQLRETURN SQL_API SQLAllocStmt(SQLHDBC conn, SQLHSTMT* stmt) {
+  return arrow::flight::sql::odbc::SQLAllocHandle(SQL_HANDLE_STMT, conn, stmt);
+}
+
+SQLRETURN SQL_API SQLFreeHandle(SQLSMALLINT type, SQLHANDLE handle) {
+  return arrow::flight::sql::odbc::SQLFreeHandle(type, handle);
+}
+
+SQLRETURN SQL_API SQLFreeEnv(SQLHENV env) {
+  return arrow::flight::sql::odbc::SQLFreeHandle(SQL_HANDLE_ENV, env);
+}
+
+SQLRETURN SQL_API SQLFreeConnect(SQLHDBC conn) {
+  return arrow::flight::sql::odbc::SQLFreeHandle(SQL_HANDLE_DBC, conn);
+}
+
+SQLRETURN SQL_API SQLFreeStmt(SQLHSTMT stmt, SQLUSMALLINT option) {
+  return arrow::flight::sql::odbc::SQLFreeStmt(stmt, option);
+}
+
+SQLRETURN SQL_API SQLGetDiagField(SQLSMALLINT handle_type, SQLHANDLE handle,
+                                  SQLSMALLINT rec_number, SQLSMALLINT 
diag_identifier,
+                                  SQLPOINTER diag_info_ptr, SQLSMALLINT 
buffer_length,
+                                  SQLSMALLINT* string_length_ptr) {
+  return arrow::flight::sql::odbc::SQLGetDiagField(handle_type, handle, 
rec_number,
+                                                   diag_identifier, 
diag_info_ptr,
+                                                   buffer_length, 
string_length_ptr);
+}
+
+SQLRETURN SQL_API SQLGetDiagRec(SQLSMALLINT handle_type, SQLHANDLE handle,
+                                SQLSMALLINT rec_number, SQLWCHAR* sql_state,
+                                SQLINTEGER* native_error_ptr, SQLWCHAR* 
message_text,
+                                SQLSMALLINT buffer_length, SQLSMALLINT* 
text_length_ptr) {
+  return arrow::flight::sql::odbc::SQLGetDiagRec(
+      handle_type, handle, rec_number, sql_state, native_error_ptr, 
message_text,
+      buffer_length, text_length_ptr);
+}
+
+SQLRETURN SQL_API SQLGetEnvAttr(SQLHENV env, SQLINTEGER attr, SQLPOINTER 
value_ptr,
+                                SQLINTEGER buffer_len, SQLINTEGER* 
str_len_ptr) {
+  return arrow::flight::sql::odbc::SQLGetEnvAttr(env, attr, value_ptr, 
buffer_len,
+                                                 str_len_ptr);
+}
+
+SQLRETURN SQL_API SQLSetEnvAttr(SQLHENV env, SQLINTEGER attr, SQLPOINTER 
value_ptr,
+                                SQLINTEGER str_len) {
+  return arrow::flight::sql::odbc::SQLSetEnvAttr(env, attr, value_ptr, 
str_len);
+}
+
+SQLRETURN SQL_API SQLGetConnectAttr(SQLHDBC conn, SQLINTEGER attribute,
+                                    SQLPOINTER value_ptr, SQLINTEGER 
buffer_length,
+                                    SQLINTEGER* string_length_ptr) {
+  return arrow::flight::sql::odbc::SQLGetConnectAttr(conn, attribute, 
value_ptr,
+                                                     buffer_length, 
string_length_ptr);
+}
+
+SQLRETURN SQL_API SQLSetConnectAttr(SQLHDBC conn, SQLINTEGER attr, SQLPOINTER 
value,
+                                    SQLINTEGER value_len) {
+  return arrow::flight::sql::odbc::SQLSetConnectAttr(conn, attr, value, 
value_len);
+}
+
+SQLRETURN SQL_API SQLGetInfo(SQLHDBC conn, SQLUSMALLINT info_type,
+                             SQLPOINTER info_value_ptr, SQLSMALLINT buf_len,
+                             SQLSMALLINT* length) {
+  return arrow::flight::sql::odbc::SQLGetInfo(conn, info_type, info_value_ptr, 
buf_len,
+                                              length);
+}
+
+SQLRETURN SQL_API SQLDriverConnect(SQLHDBC conn, SQLHWND window_handle,
+                                   SQLWCHAR* in_connection_string,
+                                   SQLSMALLINT in_connection_stringLen,
+                                   SQLWCHAR* out_connection_string,
+                                   SQLSMALLINT 
out_connection_string_buffer_len,
+                                   SQLSMALLINT* out_connection_string_len,
+                                   SQLUSMALLINT driver_completion) {
+  return arrow::flight::sql::odbc::SQLDriverConnect(
+      conn, window_handle, in_connection_string, in_connection_stringLen,
+      out_connection_string, out_connection_string_buffer_len, 
out_connection_string_len,
+      driver_completion);
+}
+
+SQLRETURN SQL_API SQLConnect(SQLHDBC conn, SQLWCHAR* dsn_name, SQLSMALLINT 
dsn_name_len,
+                             SQLWCHAR* user_name, SQLSMALLINT user_name_len,
+                             SQLWCHAR* password, SQLSMALLINT password_len) {
+  return arrow::flight::sql::odbc::SQLConnect(conn, dsn_name, dsn_name_len, 
user_name,
+                                              user_name_len, password, 
password_len);
+}
+
+SQLRETURN SQL_API SQLDisconnect(SQLHDBC conn) {
+  return arrow::flight::sql::odbc::SQLDisconnect(conn);
+}
+
+SQLRETURN SQL_API SQLGetStmtAttr(SQLHSTMT stmt, SQLINTEGER attribute,
+                                 SQLPOINTER value_ptr, SQLINTEGER 
buffer_length,
+                                 SQLINTEGER* string_length_ptr) {
+  return arrow::flight::sql::odbc::SQLGetStmtAttr(stmt, attribute, value_ptr,
+                                                  buffer_length, 
string_length_ptr);
+}
+
+SQLRETURN SQL_API SQLExecDirect(SQLHSTMT stmt, SQLWCHAR* query_text,
+                                SQLINTEGER text_length) {
+  return arrow::flight::sql::odbc::SQLExecDirect(stmt, query_text, 
text_length);
+}
+
+SQLRETURN SQL_API SQLFetch(SQLHSTMT stmt) {
+  return arrow::flight::sql::odbc::SQLFetch(stmt);
+}
+
+SQLRETURN SQL_API SQLExtendedFetch(SQLHSTMT stmt, SQLUSMALLINT 
fetch_orientation,
+                                   SQLLEN fetch_offset, SQLULEN* row_count_ptr,
+                                   SQLUSMALLINT* row_status_array) {
+  return arrow::flight::sql::odbc::SQLExtendedFetch(stmt, fetch_orientation, 
fetch_offset,
+                                                    row_count_ptr, 
row_status_array);
+}
+
+SQLRETURN SQL_API SQLFetchScroll(SQLHSTMT stmt, SQLSMALLINT fetch_orientation,
+                                 SQLLEN fetch_offset) {
+  return arrow::flight::sql::odbc::SQLFetchScroll(stmt, fetch_orientation, 
fetch_offset);
+}
+
+SQLRETURN SQL_API SQLGetData(SQLHSTMT stmt, SQLUSMALLINT record_number,
+                             SQLSMALLINT c_type, SQLPOINTER data_ptr,
+                             SQLLEN buffer_length, SQLLEN* indicator_ptr) {
+  return arrow::flight::sql::odbc::SQLGetData(stmt, record_number, c_type, 
data_ptr,
+                                              buffer_length, indicator_ptr);
+}
+
+SQLRETURN SQL_API SQLPrepare(SQLHSTMT stmt, SQLWCHAR* query_text,
+                             SQLINTEGER text_length) {
+  return arrow::flight::sql::odbc::SQLPrepare(stmt, query_text, text_length);
+}
+
+SQLRETURN SQL_API SQLExecute(SQLHSTMT stmt) {
+  return arrow::flight::sql::odbc::SQLExecute(stmt);
+}
+
+SQLRETURN SQL_API SQLBindCol(SQLHSTMT stmt, SQLUSMALLINT record_number,
+                             SQLSMALLINT c_type, SQLPOINTER data_ptr,
+                             SQLLEN buffer_length, SQLLEN* indicator_ptr) {
+  return arrow::flight::sql::odbc::SQLBindCol(stmt, record_number, c_type, 
data_ptr,
+                                              buffer_length, indicator_ptr);
+}
+
+SQLRETURN SQL_API SQLCancel(SQLHSTMT stmt) {
+  ARROW_LOG(DEBUG) << "SQLCancel called with stmt: " << stmt;
+  return ODBC::ODBCStatement::ExecuteWithDiagnostics(stmt, SQL_ERROR, [=]() {
+    throw driver::odbcabstraction::DriverException("SQLCancel is not 
implemented",
+                                                   "IM001");
+    return SQL_ERROR;
+  });
+}
+
+SQLRETURN SQL_API SQLCloseCursor(SQLHSTMT stmt) {
+  return arrow::flight::sql::odbc::SQLCloseCursor(stmt);
+}
+
+SQLRETURN SQL_API SQLColAttribute(SQLHSTMT stmt, SQLUSMALLINT record_number,
+                                  SQLUSMALLINT field_identifier,
+                                  SQLPOINTER character_attribute_ptr,
+                                  SQLSMALLINT buffer_length, SQLSMALLINT* 
output_length,
+                                  SQLLEN* numeric_attribute_ptr) {
+  return arrow::flight::sql::odbc::SQLColAttribute(stmt, record_number, 
field_identifier,
+                                                   character_attribute_ptr, 
buffer_length,
+                                                   output_length, 
numeric_attribute_ptr);
+}
+
+SQLRETURN SQL_API SQLTables(SQLHSTMT stmt, SQLWCHAR* catalog_name,
+                            SQLSMALLINT catalog_name_length, SQLWCHAR* 
schema_name,
+                            SQLSMALLINT schema_name_length, SQLWCHAR* 
table_name,
+                            SQLSMALLINT table_name_length, SQLWCHAR* 
table_type,
+                            SQLSMALLINT table_type_length) {
+  return arrow::flight::sql::odbc::SQLTables(
+      stmt, catalog_name, catalog_name_length, schema_name, schema_name_length,
+      table_name, table_name_length, table_type, table_type_length);
+}
+
+SQLRETURN SQL_API SQLColumns(SQLHSTMT stmt, SQLWCHAR* catalog_name,
+                             SQLSMALLINT catalog_name_length, SQLWCHAR* 
schema_name,
+                             SQLSMALLINT schema_name_length, SQLWCHAR* 
table_name,
+                             SQLSMALLINT table_name_length, SQLWCHAR* 
columnName,
+                             SQLSMALLINT column_name_length) {
+  return arrow::flight::sql::odbc::SQLColumns(
+      stmt, catalog_name, catalog_name_length, schema_name, schema_name_length,
+      table_name, table_name_length, columnName, column_name_length);
+}
+
+SQLRETURN SQL_API SQLForeignKeys(
+    SQLHSTMT stmt, SQLWCHAR* pk_catalog_name, SQLSMALLINT 
pk_catalog_name_length,
+    SQLWCHAR* pk_schema_name, SQLSMALLINT pk_schema_name_length, SQLWCHAR* 
pk_table_name,
+    SQLSMALLINT pk_table_name_length, SQLWCHAR* fk_catalog_name,
+    SQLSMALLINT fk_catalog_name_length, SQLWCHAR* fk_schema_name,
+    SQLSMALLINT fk_schema_name_length, SQLWCHAR* fk_table_name,
+    SQLSMALLINT fk_table_name_length) {
+  ARROW_LOG(DEBUG) << "SQLForeignKeysW called with stmt: " << stmt
+                   << ", pk_catalog_name: " << static_cast<const 
void*>(pk_catalog_name)
+                   << ", pk_catalog_name_length: " << pk_catalog_name_length
+                   << ", pk_schema_name: " << static_cast<const 
void*>(pk_schema_name)
+                   << ", pk_schema_name_length: " << pk_schema_name_length
+                   << ", pk_table_name: " << static_cast<const 
void*>(pk_table_name)
+                   << ", pk_table_name_length: " << pk_table_name_length
+                   << ", fk_catalog_name: " << static_cast<const 
void*>(fk_catalog_name)
+                   << ", fk_catalog_name_length: " << fk_catalog_name_length
+                   << ", fk_schema_name: " << static_cast<const 
void*>(fk_schema_name)
+                   << ", fk_schema_name_length: " << fk_schema_name_length
+                   << ", fk_table_name: " << static_cast<const 
void*>(fk_table_name)
+                   << ", fk_table_name_length: " << fk_table_name_length;
+  return ODBC::ODBCStatement::ExecuteWithDiagnostics(stmt, SQL_ERROR, [=]() {
+    throw driver::odbcabstraction::DriverException("SQLForeignKeysW is not 
implemented",
+                                                   "IM001");
+    return SQL_ERROR;
+  });
+}
+
+SQLRETURN SQL_API SQLGetTypeInfo(SQLHSTMT stmt, SQLSMALLINT data_type) {
+  return arrow::flight::sql::odbc::SQLGetTypeInfo(stmt, data_type);
+}
+
+SQLRETURN SQL_API SQLMoreResults(SQLHSTMT stmt) {
+  return arrow::flight::sql::odbc::SQLMoreResults(stmt);
+}
+
+SQLRETURN SQL_API SQLNativeSql(SQLHDBC conn, SQLWCHAR* in_statement_text,
+                               SQLINTEGER in_statement_text_length,
+                               SQLWCHAR* out_statement_text, SQLINTEGER 
buffer_length,
+                               SQLINTEGER* out_statement_text_length) {
+  return arrow::flight::sql::odbc::SQLNativeSql(
+      conn, in_statement_text, in_statement_text_length, out_statement_text,
+      buffer_length, out_statement_text_length);
+}
+
+SQLRETURN SQL_API SQLNumResultCols(SQLHSTMT stmt, SQLSMALLINT* 
column_count_ptr) {
+  return arrow::flight::sql::odbc::SQLNumResultCols(stmt, column_count_ptr);
+}
+
+SQLRETURN SQL_API SQLRowCount(SQLHSTMT stmt, SQLLEN* row_count_ptr) {
+  return arrow::flight::sql::odbc::SQLRowCount(stmt, row_count_ptr);
+}
+
+SQLRETURN SQL_API SQLPrimaryKeys(SQLHSTMT stmt, SQLWCHAR* catalog_name,
+                                 SQLSMALLINT catalog_name_length, SQLWCHAR* 
schema_name,
+                                 SQLSMALLINT schema_name_length, SQLWCHAR* 
table_name,
+                                 SQLSMALLINT table_name_length) {
+  ARROW_LOG(DEBUG) << "SQLPrimaryKeysW called with stmt: " << stmt
+                   << ", catalog_name: " << static_cast<const 
void*>(catalog_name)
+                   << ", catalog_name_length: " << catalog_name_length
+                   << ", schema_name: " << static_cast<const 
void*>(schema_name)
+                   << ", schema_name_length: " << schema_name_length
+                   << ", table_name: " << static_cast<const void*>(table_name)
+                   << ", table_name_length: " << table_name_length;
+  return ODBC::ODBCStatement::ExecuteWithDiagnostics(stmt, SQL_ERROR, [=]() {
+    throw driver::odbcabstraction::DriverException("SQLPrimaryKeysW is not 
implemented",
+                                                   "IM001");
+    return SQL_ERROR;
+  });
+}
+
+SQLRETURN SQL_API SQLSetStmtAttr(SQLHSTMT stmt, SQLINTEGER attribute,
+                                 SQLPOINTER value_ptr, SQLINTEGER 
stringLength) {
+  return arrow::flight::sql::odbc::SQLSetStmtAttr(stmt, attribute, value_ptr,
+                                                  stringLength);
+}
+
+SQLRETURN SQL_API SQLDescribeCol(SQLHSTMT stmt, SQLUSMALLINT column_number,
+                                 SQLWCHAR* column_name, SQLSMALLINT 
buffer_length,
+                                 SQLSMALLINT* name_length_ptr, SQLSMALLINT* 
data_type_ptr,
+                                 SQLULEN* column_size_ptr,
+                                 SQLSMALLINT* decimal_digits_ptr,
+                                 SQLSMALLINT* nullable_ptr) {
+  return arrow::flight::sql::odbc::SQLDescribeCol(
+      stmt, column_number, column_name, buffer_length, name_length_ptr, 
data_type_ptr,
+      column_size_ptr, decimal_digits_ptr, nullable_ptr);
 }
diff --git 
a/cpp/src/arrow/flight/sql/odbc/flight_sql/ui/dsn_configuration_window.cc 
b/cpp/src/arrow/flight/sql/odbc/flight_sql/ui/dsn_configuration_window.cc
index 718b4a1d52..be432ccd01 100644
--- a/cpp/src/arrow/flight/sql/odbc/flight_sql/ui/dsn_configuration_window.cc
+++ b/cpp/src/arrow/flight/sql/odbc/flight_sql/ui/dsn_configuration_window.cc
@@ -313,7 +313,7 @@ int DsnConfigurationWindow::CreatePropertiesGroup(int 
pos_x, int pos_y, int size
 
   const auto keys = config_.GetCustomKeys();
   for (const auto& key : keys) {
-    property_list_->ListAddItem({std::string(key), config.Get(key)});
+    property_list_->ListAddItem({std::string(key), config_.Get(key)});
   }
 
   SendMessage(property_list_->GetHandle(), LVM_SETEXTENDEDLISTVIEWSTYLE,
diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_api.cc 
b/cpp/src/arrow/flight/sql/odbc/odbc_api.cc
index 865066796c..76ebd990f9 100644
--- a/cpp/src/arrow/flight/sql/odbc/odbc_api.cc
+++ b/cpp/src/arrow/flight/sql/odbc/odbc_api.cc
@@ -36,7 +36,374 @@ SQLRETURN SQLAllocHandle(SQLSMALLINT type, SQLHANDLE 
parent, SQLHANDLE* result)
   ARROW_LOG(DEBUG) << "SQLAllocHandle called with type: " << type
                    << ", parent: " << parent
                    << ", result: " << static_cast<const void*>(result);
+  // GH-46096 TODO: Implement SQLAllocEnv
+  // GH-46097 TODO: Implement SQLAllocConnect, pre-requisite requires 
SQLAllocEnv
+  // implementation
 
+  // GH-47706 TODO: Implement SQLAllocStmt, pre-requisite requires
+  // SQLDriverConnect implementation
+
+  // GH-47707 TODO: Implement SQL_HANDLE_DESC for
+  // descriptor handle, pre-requisite requires SQLAllocStmt
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLFreeHandle(SQLSMALLINT type, SQLHANDLE handle) {
+  ARROW_LOG(DEBUG) << "SQLFreeHandle called with type: " << type
+                   << ", handle: " << handle;
+  // GH-46096 TODO: Implement SQLFreeEnv
+  // GH-46097 TODO: Implement SQLFreeConnect
+  // GH-47706 TODO: Implement SQLFreeStmt
+  // GH-47707 TODO: Implement SQL_HANDLE_DESC for descriptor handle
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLFreeStmt(SQLHSTMT handle, SQLUSMALLINT option) {
+  ARROW_LOG(DEBUG) << "SQLFreeStmt called with handle: " << handle
+                   << ", option: " << option;
+  // GH-47706 TODO: Implement SQLFreeStmt
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLGetDiagField(SQLSMALLINT handle_type, SQLHANDLE handle,
+                          SQLSMALLINT rec_number, SQLSMALLINT diag_identifier,
+                          SQLPOINTER diag_info_ptr, SQLSMALLINT buffer_length,
+                          SQLSMALLINT* string_length_ptr) {
+  // GH-46573 TODO: Implement additional fields types
+  ARROW_LOG(DEBUG) << "SQLGetDiagFieldW called with handle_type: " << 
handle_type
+                   << ", handle: " << handle << ", rec_number: " << rec_number
+                   << ", diag_identifier: " << diag_identifier
+                   << ", diag_info_ptr: " << diag_info_ptr
+                   << ", buffer_length: " << buffer_length << ", 
string_length_ptr: "
+                   << static_cast<const void*>(string_length_ptr);
+  // GH-46575 TODO: Implement SQLGetDiagField
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLGetDiagRec(SQLSMALLINT handle_type, SQLHANDLE handle, SQLSMALLINT 
rec_number,
+                        SQLWCHAR* sql_state, SQLINTEGER* native_error_ptr,
+                        SQLWCHAR* message_text, SQLSMALLINT buffer_length,
+                        SQLSMALLINT* text_length_ptr) {
+  ARROW_LOG(DEBUG) << "SQLGetDiagRecW called with handle_type: " << handle_type
+                   << ", handle: " << handle << ", rec_number: " << rec_number
+                   << ", sql_state: " << static_cast<const void*>(sql_state)
+                   << ", native_error_ptr: " << static_cast<const 
void*>(native_error_ptr)
+                   << ", message_text: " << static_cast<const 
void*>(message_text)
+                   << ", buffer_length: " << buffer_length
+                   << ", text_length_ptr: " << static_cast<const 
void*>(text_length_ptr);
+  // GH-46575 TODO: Implement SQLGetDiagRec
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLGetEnvAttr(SQLHENV env, SQLINTEGER attr, SQLPOINTER value_ptr,
+                        SQLINTEGER buffer_length, SQLINTEGER* str_len_ptr) {
+  ARROW_LOG(DEBUG) << "SQLGetEnvAttr called with env: " << env << ", attr: " 
<< attr
+                   << ", value_ptr: " << value_ptr << ", buffer_length: " << 
buffer_length
+                   << ", str_len_ptr: " << static_cast<const 
void*>(str_len_ptr);
+  // GH-46575 TODO: Implement SQLGetEnvAttr
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLSetEnvAttr(SQLHENV env, SQLINTEGER attr, SQLPOINTER value_ptr,
+                        SQLINTEGER str_len) {
+  ARROW_LOG(DEBUG) << "SQLSetEnvAttr called with env: " << env << ", attr: " 
<< attr
+                   << ", value_ptr: " << value_ptr << ", str_len: " << str_len;
+  // GH-46575 TODO: Implement SQLSetEnvAttr
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLGetConnectAttr(SQLHDBC conn, SQLINTEGER attribute, SQLPOINTER 
value_ptr,
+                            SQLINTEGER buffer_length, SQLINTEGER* 
string_length_ptr) {
+  ARROW_LOG(DEBUG) << "SQLGetConnectAttrW called with conn: " << conn
+                   << ", attribute: " << attribute << ", value_ptr: " << 
value_ptr
+                   << ", buffer_length: " << buffer_length << ", 
string_length_ptr: "
+                   << static_cast<const void*>(string_length_ptr);
+  // GH-47708 TODO: Implement SQLGetConnectAttr
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLSetConnectAttr(SQLHDBC conn, SQLINTEGER attr, SQLPOINTER 
value_ptr,
+                            SQLINTEGER value_len) {
+  ARROW_LOG(DEBUG) << "SQLSetConnectAttrW called with conn: " << conn
+                   << ", attr: " << attr << ", value_ptr: " << value_ptr
+                   << ", value_len: " << value_len;
+  // GH-47708 TODO: Implement SQLSetConnectAttr
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLDriverConnect(SQLHDBC conn, SQLHWND window_handle,
+                           SQLWCHAR* in_connection_string,
+                           SQLSMALLINT in_connection_string_len,
+                           SQLWCHAR* out_connection_string,
+                           SQLSMALLINT out_connection_string_buffer_len,
+                           SQLSMALLINT* out_connection_string_len,
+                           SQLUSMALLINT driver_completion) {
+  ARROW_LOG(DEBUG) << "SQLDriverConnectW called with conn: " << conn
+                   << ", window_handle: " << static_cast<const 
void*>(window_handle)
+                   << ", in_connection_string: "
+                   << static_cast<const void*>(in_connection_string)
+                   << ", in_connection_string_len: " << 
in_connection_string_len
+                   << ", out_connection_string: "
+                   << static_cast<const void*>(out_connection_string)
+                   << ", out_connection_string_buffer_len: "
+                   << out_connection_string_buffer_len << ", 
out_connection_string_len: "
+                   << static_cast<const void*>(out_connection_string_len)
+                   << ", driver_completion: " << driver_completion;
+  // GH-46449 TODO: Implement FILEDSN and SAVEFILE keywords according to the 
spec
+
+  // GH-46560 TODO: Copy connection string properly in SQLDriverConnect 
according to the
+  // spec
+
+  // GH-46574 TODO: Implement SQLDriverConnect
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLConnect(SQLHDBC conn, SQLWCHAR* dsn_name, SQLSMALLINT 
dsn_name_len,
+                     SQLWCHAR* user_name, SQLSMALLINT user_name_len, SQLWCHAR* 
password,
+                     SQLSMALLINT password_len) {
+  ARROW_LOG(DEBUG) << "SQLConnectW called with conn: " << conn
+                   << ", dsn_name: " << static_cast<const void*>(dsn_name)
+                   << ", dsn_name_len: " << dsn_name_len
+                   << ", user_name: " << static_cast<const void*>(user_name)
+                   << ", user_name_len: " << user_name_len
+                   << ", password: " << static_cast<const void*>(password)
+                   << ", password_len: " << password_len;
+  // GH-46574 TODO: Implement SQLConnect
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLDisconnect(SQLHDBC conn) {
+  ARROW_LOG(DEBUG) << "SQLDisconnect called with conn: " << conn;
+  // GH-46574 TODO: Implement SQLDisconnect
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLGetInfo(SQLHDBC conn, SQLUSMALLINT info_type, SQLPOINTER 
info_value_ptr,
+                     SQLSMALLINT buf_len, SQLSMALLINT* string_length_ptr) {
+  ARROW_LOG(DEBUG) << "SQLGetInfoW called with conn: " << conn
+                   << ", info_type: " << info_type
+                   << ", info_value_ptr: " << info_value_ptr << ", buf_len: " 
<< buf_len
+                   << ", string_length_ptr: "
+                   << static_cast<const void*>(string_length_ptr);
+  // GH-47709 TODO: Implement SQLGetInfo
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLGetStmtAttr(SQLHSTMT stmt, SQLINTEGER attribute, SQLPOINTER 
value_ptr,
+                         SQLINTEGER buffer_length, SQLINTEGER* 
string_length_ptr) {
+  ARROW_LOG(DEBUG) << "SQLGetStmtAttrW called with stmt: " << stmt
+                   << ", attribute: " << attribute << ", value_ptr: " << 
value_ptr
+                   << ", buffer_length: " << buffer_length << ", 
string_length_ptr: "
+                   << static_cast<const void*>(string_length_ptr);
+  // GH-47710 TODO: Implement SQLGetStmtAttr
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLSetStmtAttr(SQLHSTMT stmt, SQLINTEGER attribute, SQLPOINTER 
value_ptr,
+                         SQLINTEGER string_length) {
+  ARROW_LOG(DEBUG) << "SQLSetStmtAttrW called with stmt: " << stmt
+                   << ", attribute: " << attribute << ", value_ptr: " << 
value_ptr
+                   << ", string_length: " << string_length;
+  // GH-47710 TODO: Implement SQLSetStmtAttr
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLExecDirect(SQLHSTMT stmt, SQLWCHAR* query_text, SQLINTEGER 
text_length) {
+  ARROW_LOG(DEBUG) << "SQLExecDirectW called with stmt: " << stmt
+                   << ", query_text: " << static_cast<const void*>(query_text)
+                   << ", text_length: " << text_length;
+  // GH-47711 TODO: Implement SQLExecDirect
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLPrepare(SQLHSTMT stmt, SQLWCHAR* query_text, SQLINTEGER 
text_length) {
+  ARROW_LOG(DEBUG) << "SQLPrepareW called with stmt: " << stmt
+                   << ", query_text: " << static_cast<const void*>(query_text)
+                   << ", text_length: " << text_length;
+  // GH-47712 TODO: Implement SQLPrepare
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLExecute(SQLHSTMT stmt) {
+  ARROW_LOG(DEBUG) << "SQLExecute called with stmt: " << stmt;
+  // GH-47712 TODO: Implement SQLExecute
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLFetch(SQLHSTMT stmt) {
+  ARROW_LOG(DEBUG) << "SQLFetch called with stmt: " << stmt;
+  // GH-47713 TODO: Implement SQLFetch
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLExtendedFetch(SQLHSTMT stmt, SQLUSMALLINT fetch_orientation,
+                           SQLLEN fetch_offset, SQLULEN* row_count_ptr,
+                           SQLUSMALLINT* row_status_array) {
+  // GH-47110 TODO: SQLExtendedFetch should return SQL_SUCCESS_WITH_INFO for 
certain diag
+  // states
+  ARROW_LOG(DEBUG) << "SQLExtendedFetch called with stmt: " << stmt
+                   << ", fetch_orientation: " << fetch_orientation
+                   << ", fetch_offset: " << fetch_offset
+                   << ", row_count_ptr: " << static_cast<const 
void*>(row_count_ptr)
+                   << ", row_status_array: "
+                   << static_cast<const void*>(row_status_array);
+  // GH-47714 TODO: Implement SQLExtendedFetch
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLFetchScroll(SQLHSTMT stmt, SQLSMALLINT fetch_orientation,
+                         SQLLEN fetch_offset) {
+  ARROW_LOG(DEBUG) << "SQLFetchScroll called with stmt: " << stmt
+                   << ", fetch_orientation: " << fetch_orientation
+                   << ", fetch_offset: " << fetch_offset;
+  // GH-47715 TODO: Implement SQLFetchScroll
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLBindCol(SQLHSTMT stmt, SQLUSMALLINT record_number, SQLSMALLINT 
c_type,
+                     SQLPOINTER data_ptr, SQLLEN buffer_length, SQLLEN* 
indicator_ptr) {
+  ARROW_LOG(DEBUG) << "SQLBindCol called with stmt: " << stmt
+                   << ", record_number: " << record_number << ", c_type: " << 
c_type
+                   << ", data_ptr: " << data_ptr << ", buffer_length: " << 
buffer_length
+                   << ", indicator_ptr: " << static_cast<const 
void*>(indicator_ptr);
+  // GH-47716 TODO: Implement SQLBindCol
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLCloseCursor(SQLHSTMT stmt) {
+  ARROW_LOG(DEBUG) << "SQLCloseCursor called with stmt: " << stmt;
+  // GH-47717 TODO: Implement SQLCloseCursor
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLGetData(SQLHSTMT stmt, SQLUSMALLINT record_number, SQLSMALLINT 
c_type,
+                     SQLPOINTER data_ptr, SQLLEN buffer_length, SQLLEN* 
indicator_ptr) {
+  // GH-46979 TODO: support SQL_C_GUID data type
+  // GH-46980 TODO: support Interval data types
+  // GH-46985 TODO: return warning message instead of error on float 
truncation case
+  ARROW_LOG(DEBUG) << "SQLGetData called with stmt: " << stmt
+                   << ", record_number: " << record_number << ", c_type: " << 
c_type
+                   << ", data_ptr: " << data_ptr << ", buffer_length: " << 
buffer_length
+                   << ", indicator_ptr: " << static_cast<const 
void*>(indicator_ptr);
+  // GH-47713 TODO: Implement SQLGetData
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLMoreResults(SQLHSTMT stmt) {
+  ARROW_LOG(DEBUG) << "SQLMoreResults called with stmt: " << stmt;
+  // GH-47713 TODO: Implement SQLMoreResults
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLNumResultCols(SQLHSTMT stmt, SQLSMALLINT* column_count_ptr) {
+  ARROW_LOG(DEBUG) << "SQLNumResultCols called with stmt: " << stmt
+                   << ", column_count_ptr: "
+                   << static_cast<const void*>(column_count_ptr);
+  // GH-47713 TODO: Implement SQLNumResultCols
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLRowCount(SQLHSTMT stmt, SQLLEN* row_count_ptr) {
+  ARROW_LOG(DEBUG) << "SQLRowCount called with stmt: " << stmt
+                   << ", column_count_ptr: " << static_cast<const 
void*>(row_count_ptr);
+  // GH-47713 TODO: Implement SQLRowCount
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLTables(SQLHSTMT stmt, SQLWCHAR* catalog_name,
+                    SQLSMALLINT catalog_name_length, SQLWCHAR* schema_name,
+                    SQLSMALLINT schema_name_length, SQLWCHAR* table_name,
+                    SQLSMALLINT table_name_length, SQLWCHAR* table_type,
+                    SQLSMALLINT table_type_length) {
+  ARROW_LOG(DEBUG) << "SQLTablesW called with stmt: " << stmt
+                   << ", catalog_name: " << static_cast<const 
void*>(catalog_name)
+                   << ", catalog_name_length: " << catalog_name_length
+                   << ", schema_name: " << static_cast<const 
void*>(schema_name)
+                   << ", schema_name_length: " << schema_name_length
+                   << ", table_name: " << static_cast<const void*>(table_name)
+                   << ", table_name_length: " << table_name_length
+                   << ", table_type: " << static_cast<const void*>(table_type)
+                   << ", table_type_length: " << table_type_length;
+  // GH-47719 TODO: Implement SQLTables
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLColumns(SQLHSTMT stmt, SQLWCHAR* catalog_name,
+                     SQLSMALLINT catalog_name_length, SQLWCHAR* schema_name,
+                     SQLSMALLINT schema_name_length, SQLWCHAR* table_name,
+                     SQLSMALLINT table_name_length, SQLWCHAR* column_name,
+                     SQLSMALLINT column_name_length) {
+  // GH-47159 TODO: Return NUM_PREC_RADIX based on whether COLUMN_SIZE 
contains number of
+  // digits or bits
+  ARROW_LOG(DEBUG) << "SQLColumnsW called with stmt: " << stmt
+                   << ", catalog_name: " << static_cast<const 
void*>(catalog_name)
+                   << ", catalog_name_length: " << catalog_name_length
+                   << ", schema_name: " << static_cast<const 
void*>(schema_name)
+                   << ", schema_name_length: " << schema_name_length
+                   << ", table_name: " << static_cast<const void*>(table_name)
+                   << ", table_name_length: " << table_name_length
+                   << ", column_name: " << static_cast<const 
void*>(column_name)
+                   << ", column_name_length: " << column_name_length;
+  // GH-47720 TODO: Implement SQLColumns
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLColAttribute(SQLHSTMT stmt, SQLUSMALLINT record_number,
+                          SQLUSMALLINT field_identifier,
+                          SQLPOINTER character_attribute_ptr, SQLSMALLINT 
buffer_length,
+                          SQLSMALLINT* output_length, SQLLEN* 
numeric_attribute_ptr) {
+  ARROW_LOG(DEBUG) << "SQLColAttributeW called with stmt: " << stmt
+                   << ", record_number: " << record_number
+                   << ", field_identifier: " << field_identifier
+                   << ", character_attribute_ptr: " << character_attribute_ptr
+                   << ", buffer_length: " << buffer_length
+                   << ", output_length: " << static_cast<const 
void*>(output_length)
+                   << ", numeric_attribute_ptr: "
+                   << static_cast<const void*>(numeric_attribute_ptr);
+  // GH-47721 TODO: Implement SQLColAttribute, pre-requisite requires 
SQLColumns
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLGetTypeInfo(SQLHSTMT stmt, SQLSMALLINT data_type) {
+  // GH-47237 TODO: return SQL_PRED_CHAR and SQL_PRED_BASIC for
+  // appropriate data types in `SEARCHABLE` field
+  ARROW_LOG(DEBUG) << "SQLGetTypeInfoW called with stmt: " << stmt
+                   << " data_type: " << data_type;
+  // GH-47722 TODO: Implement SQLGetTypeInfo
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLNativeSql(SQLHDBC conn, SQLWCHAR* in_statement_text,
+                       SQLINTEGER in_statement_text_length, SQLWCHAR* 
out_statement_text,
+                       SQLINTEGER buffer_length, SQLINTEGER* 
out_statement_text_length) {
+  ARROW_LOG(DEBUG) << "SQLNativeSqlW called with connection_handle: " << conn
+                   << ", in_statement_text: "
+                   << static_cast<const void*>(in_statement_text)
+                   << ", in_statement_text_length: " << 
in_statement_text_length
+                   << ", out_statement_text: "
+                   << static_cast<const void*>(out_statement_text)
+                   << ", buffer_length: " << buffer_length
+                   << ", out_statement_text_length: "
+                   << static_cast<const void*>(out_statement_text_length);
+  // GH-47723 TODO: Implement SQLNativeSql
+  return SQL_INVALID_HANDLE;
+}
+
+SQLRETURN SQLDescribeCol(SQLHSTMT stmt, SQLUSMALLINT column_number, SQLWCHAR* 
column_name,
+                         SQLSMALLINT buffer_length, SQLSMALLINT* 
name_length_ptr,
+                         SQLSMALLINT* data_type_ptr, SQLULEN* column_size_ptr,
+                         SQLSMALLINT* decimal_digits_ptr, SQLSMALLINT* 
nullable_ptr) {
+  ARROW_LOG(DEBUG) << "SQLDescribeColW called with stmt: " << stmt
+                   << ", column_number: " << column_number
+                   << ", column_name: " << static_cast<const 
void*>(column_name)
+                   << ", buffer_length: " << buffer_length
+                   << ", name_length_ptr: " << static_cast<const 
void*>(name_length_ptr)
+                   << ", data_type_ptr: " << static_cast<const 
void*>(data_type_ptr)
+                   << ", column_size_ptr: " << static_cast<const 
void*>(column_size_ptr)
+                   << ", decimal_digits_ptr: "
+                   << static_cast<const void*>(decimal_digits_ptr)
+                   << ", nullable_ptr: " << static_cast<const 
void*>(nullable_ptr);
+  // GH-47724 TODO: Implement SQLDescribeCol
   return SQL_INVALID_HANDLE;
 }
 
diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_api_internal.h 
b/cpp/src/arrow/flight/sql/odbc/odbc_api_internal.h
index 527d833840..d377ee3120 100644
--- a/cpp/src/arrow/flight/sql/odbc/odbc_api_internal.h
+++ b/cpp/src/arrow/flight/sql/odbc/odbc_api_internal.h
@@ -28,4 +28,78 @@
 //  Define internal ODBC API function headers.
 namespace arrow::flight::sql::odbc {
 SQLRETURN SQLAllocHandle(SQLSMALLINT type, SQLHANDLE parent, SQLHANDLE* 
result);
+SQLRETURN SQLFreeHandle(SQLSMALLINT type, SQLHANDLE handle);
+SQLRETURN SQLFreeStmt(SQLHSTMT stmt, SQLUSMALLINT option);
+SQLRETURN SQLGetDiagField(SQLSMALLINT handle_type, SQLHANDLE handle,
+                          SQLSMALLINT rec_number, SQLSMALLINT diag_identifier,
+                          SQLPOINTER diag_info_ptr, SQLSMALLINT buffer_length,
+                          SQLSMALLINT* string_length_ptr);
+SQLRETURN SQLGetDiagRec(SQLSMALLINT handle_type, SQLHANDLE handle, SQLSMALLINT 
rec_number,
+                        SQLWCHAR* sql_state, SQLINTEGER* native_error_ptr,
+                        SQLWCHAR* message_text, SQLSMALLINT buffer_length,
+                        SQLSMALLINT* text_length_ptr);
+SQLRETURN SQLGetEnvAttr(SQLHENV env, SQLINTEGER attr, SQLPOINTER value_ptr,
+                        SQLINTEGER buffer_len, SQLINTEGER* str_len_ptr);
+SQLRETURN SQLSetEnvAttr(SQLHENV env, SQLINTEGER attr, SQLPOINTER value_ptr,
+                        SQLINTEGER str_len);
+SQLRETURN SQLGetConnectAttr(SQLHDBC conn, SQLINTEGER attribute, SQLPOINTER 
value_ptr,
+                            SQLINTEGER buffer_length, SQLINTEGER* 
string_length_ptr);
+SQLRETURN SQLSetConnectAttr(SQLHDBC conn, SQLINTEGER attr, SQLPOINTER value,
+                            SQLINTEGER value_len);
+SQLRETURN SQLDriverConnect(SQLHDBC conn, SQLHWND window_handle,
+                           SQLWCHAR* in_connection_string,
+                           SQLSMALLINT in_connection_string_len,
+                           SQLWCHAR* out_connection_string,
+                           SQLSMALLINT out_connection_string_buffer_len,
+                           SQLSMALLINT* out_connection_string_len,
+                           SQLUSMALLINT driver_completion);
+SQLRETURN SQLConnect(SQLHDBC conn, SQLWCHAR* dsn_name, SQLSMALLINT 
dsn_name_len,
+                     SQLWCHAR* user_name, SQLSMALLINT user_name_len, SQLWCHAR* 
password,
+                     SQLSMALLINT password_len);
+SQLRETURN SQLDisconnect(SQLHDBC conn);
+SQLRETURN SQLGetInfo(SQLHDBC conn, SQLUSMALLINT info_type, SQLPOINTER 
info_value_ptr,
+                     SQLSMALLINT buf_len, SQLSMALLINT* length);
+SQLRETURN SQLGetStmtAttr(SQLHSTMT stmt, SQLINTEGER attribute, SQLPOINTER 
value_ptr,
+                         SQLINTEGER buffer_length, SQLINTEGER* 
string_length_ptr);
+SQLRETURN SQLSetStmtAttr(SQLHSTMT stmt, SQLINTEGER attribute, SQLPOINTER 
value_ptr,
+                         SQLINTEGER stringLength);
+SQLRETURN SQLExecDirect(SQLHSTMT stmt, SQLWCHAR* queryText, SQLINTEGER 
text_length);
+SQLRETURN SQLPrepare(SQLHSTMT stmt, SQLWCHAR* queryText, SQLINTEGER 
text_length);
+SQLRETURN SQLExecute(SQLHSTMT stmt);
+SQLRETURN SQLFetch(SQLHSTMT stmt);
+SQLRETURN SQLExtendedFetch(SQLHSTMT stmt, SQLUSMALLINT fetch_orientation,
+                           SQLLEN fetch_offset, SQLULEN* row_count_ptr,
+                           SQLUSMALLINT* row_status_array);
+SQLRETURN SQLFetchScroll(SQLHSTMT stmt, SQLSMALLINT fetch_orientation,
+                         SQLLEN fetch_offset);
+SQLRETURN SQLBindCol(SQLHSTMT stmt, SQLUSMALLINT record_number, SQLSMALLINT 
c_type,
+                     SQLPOINTER data_ptr, SQLLEN buffer_length, SQLLEN* 
indicator_ptr);
+SQLRETURN SQLCloseCursor(SQLHSTMT stmt);
+SQLRETURN SQLGetData(SQLHSTMT stmt, SQLUSMALLINT record_number, SQLSMALLINT 
c_type,
+                     SQLPOINTER data_ptr, SQLLEN buffer_length, SQLLEN* 
indicator_ptr);
+SQLRETURN SQLMoreResults(SQLHSTMT stmt);
+SQLRETURN SQLNumResultCols(SQLHSTMT stmt, SQLSMALLINT* column_count_ptr);
+SQLRETURN SQLRowCount(SQLHSTMT stmt, SQLLEN* row_count_ptr);
+SQLRETURN SQLTables(SQLHSTMT stmt, SQLWCHAR* catalog_name,
+                    SQLSMALLINT catalog_name_length, SQLWCHAR* schema_name,
+                    SQLSMALLINT schema_name_length, SQLWCHAR* table_name,
+                    SQLSMALLINT table_name_length, SQLWCHAR* table_type,
+                    SQLSMALLINT table_type_length);
+SQLRETURN SQLColumns(SQLHSTMT stmt, SQLWCHAR* catalog_name,
+                     SQLSMALLINT catalog_name_length, SQLWCHAR* schema_name,
+                     SQLSMALLINT schema_name_length, SQLWCHAR* table_name,
+                     SQLSMALLINT table_name_length, SQLWCHAR* column_name,
+                     SQLSMALLINT column_name_length);
+SQLRETURN SQLColAttribute(SQLHSTMT stmt, SQLUSMALLINT record_number,
+                          SQLUSMALLINT field_identifier,
+                          SQLPOINTER character_attribute_ptr, SQLSMALLINT 
buffer_length,
+                          SQLSMALLINT* output_length, SQLLEN* 
numeric_attribute_ptr);
+SQLRETURN SQLGetTypeInfo(SQLHSTMT stmt, SQLSMALLINT dataType);
+SQLRETURN SQLNativeSql(SQLHDBC conn, SQLWCHAR* in_statement_text,
+                       SQLINTEGER in_statement_text_length, SQLWCHAR* 
out_statement_text,
+                       SQLINTEGER buffer_length, SQLINTEGER* 
out_statement_text_length);
+SQLRETURN SQLDescribeCol(SQLHSTMT stmt, SQLUSMALLINT column_number, SQLWCHAR* 
column_name,
+                         SQLSMALLINT buffer_length, SQLSMALLINT* 
name_length_ptr,
+                         SQLSMALLINT* data_type_ptr, SQLULEN* column_size_ptr,
+                         SQLSMALLINT* decimal_digits_ptr, SQLSMALLINT* 
nullable_ptr);
 }  // namespace arrow::flight::sql::odbc
diff --git 
a/cpp/src/arrow/flight/sql/odbc/odbcabstraction/include/odbcabstraction/odbc_impl/odbc_handle.h
 
b/cpp/src/arrow/flight/sql/odbc/odbcabstraction/include/odbcabstraction/odbc_impl/odbc_handle.h
index 355d950502..b029bac8cc 100644
--- 
a/cpp/src/arrow/flight/sql/odbc/odbcabstraction/include/odbcabstraction/odbc_impl/odbc_handle.h
+++ 
b/cpp/src/arrow/flight/sql/odbc/odbcabstraction/include/odbcabstraction/odbc_impl/odbc_handle.h
@@ -47,7 +47,7 @@ class ODBCHandle {
       rc = function();
     } catch (const driver::odbcabstraction::DriverException& ex) {
       GetDiagnostics().AddError(ex);
-    } catch (const std::bad_alloc& ex) {
+    } catch (const std::bad_alloc&) {
       GetDiagnostics().AddError(driver::odbcabstraction::DriverException(
           "A memory allocation error occurred.", "HY001"));
     } catch (const std::exception& ex) {


Reply via email to