Skip to content

Commit f8b23be

Browse files
authored
GH-47707: [C++][FlightRPC] Add tests for descriptor handle allocation (#48053)
### Rationale for this change Add tests for `SQL_HANDLE_DESC` descriptor handle allocation, and diagnostics test. Related test updates ### What changes are included in this PR? - tests for `SQL_HANDLE_DESC` - Use `nullptr` explicitly where applicable - We use error associated returned from Driver manager to ensure users can get errors from descriptor handle ### Are these changes tested? Tested on local MSVC Windows ### Are there any user-facing changes? N/A * GitHub Issue: #47707 Authored-by: Alina (Xi) Li <[email protected]> Signed-off-by: David Li <[email protected]>
1 parent e5f05c7 commit f8b23be

File tree

6 files changed

+142
-64
lines changed

6 files changed

+142
-64
lines changed

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,6 @@ SQLRETURN SQLAllocHandle(SQLSMALLINT type, SQLHANDLE parent, SQLHANDLE* result)
4444
// GH-47706 TODO: Add tests for SQLAllocStmt, pre-requisite requires
4545
// SQLDriverConnect implementation
4646

47-
// GH-47707 TODO: Add tests for SQL_HANDLE_DESC implementation for
48-
// descriptor handle, pre-requisite requires SQLAllocStmt
49-
5047
*result = nullptr;
5148

5249
switch (type) {
@@ -147,8 +144,6 @@ SQLRETURN SQLFreeHandle(SQLSMALLINT type, SQLHANDLE handle) {
147144
// GH-47706 TODO: Add tests for SQLFreeStmt, pre-requisite requires
148145
// SQLAllocStmt tests
149146

150-
// GH-47707 TODO: Add tests for SQL_HANDLE_DESC implementation for
151-
// descriptor handle
152147
switch (type) {
153148
case SQL_HANDLE_ENV: {
154149
using ODBC::ODBCEnvironment;

cpp/src/arrow/flight/sql/odbc/odbc_impl/odbc_statement.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ class ODBCStatement : public ODBCHandle<ODBCStatement> {
6767
void SetStmtAttr(SQLINTEGER statement_attribute, SQLPOINTER value,
6868
SQLINTEGER buffer_size, bool is_unicode);
6969

70+
/// \brief Revert back to implicitly allocated internal descriptors.
71+
/// isApd as True indicates APD descritor is to be reverted.
72+
/// isApd as False indicates ARD descritor is to be reverted.
7073
void RevertAppDescriptor(bool is_apd);
7174

7275
inline ODBCDescriptor* GetIRD() { return ird_.get(); }

cpp/src/arrow/flight/sql/odbc/tests/connection_attr_test.cc

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -146,23 +146,25 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrTxnIsolationUnsupported
146146
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrDbcInfoTokenSetOnly) {
147147
// Verify that set-only attribute cannot be read
148148
SQLPOINTER ptr = NULL;
149-
ASSERT_EQ(SQL_ERROR, SQLGetConnectAttr(this->conn, SQL_ATTR_DBC_INFO_TOKEN, ptr, 0, 0));
149+
ASSERT_EQ(SQL_ERROR,
150+
SQLGetConnectAttr(this->conn, SQL_ATTR_DBC_INFO_TOKEN, ptr, 0, nullptr));
150151
VerifyOdbcErrorState(SQL_HANDLE_DBC, this->conn, kErrorStateHY092);
151152
}
152153
#endif
153154

154155
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrOdbcCursorsDMOnly) {
155156
// Verify that DM-only attribute is handled by driver manager
156157
SQLULEN cursor_attr;
157-
ASSERT_EQ(SQL_SUCCESS,
158-
SQLGetConnectAttr(this->conn, SQL_ATTR_ODBC_CURSORS, &cursor_attr, 0, 0));
158+
ASSERT_EQ(SQL_SUCCESS, SQLGetConnectAttr(this->conn, SQL_ATTR_ODBC_CURSORS,
159+
&cursor_attr, 0, nullptr));
159160
EXPECT_EQ(SQL_CUR_USE_DRIVER, cursor_attr);
160161
}
161162

162163
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTraceDMOnly) {
163164
// Verify that DM-only attribute is handled by driver manager
164165
SQLUINTEGER trace;
165-
ASSERT_EQ(SQL_SUCCESS, SQLGetConnectAttr(this->conn, SQL_ATTR_TRACE, &trace, 0, 0));
166+
ASSERT_EQ(SQL_SUCCESS,
167+
SQLGetConnectAttr(this->conn, SQL_ATTR_TRACE, &trace, 0, nullptr));
166168
EXPECT_EQ(SQL_OPT_TRACE_OFF, trace);
167169
}
168170

@@ -190,15 +192,15 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTranslateLibUnsupported
190192

191193
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTranslateOptionUnsupported) {
192194
SQLINTEGER option;
193-
ASSERT_EQ(SQL_ERROR,
194-
SQLGetConnectAttr(this->conn, SQL_ATTR_TRANSLATE_OPTION, &option, 0, 0));
195+
ASSERT_EQ(SQL_ERROR, SQLGetConnectAttr(this->conn, SQL_ATTR_TRANSLATE_OPTION, &option,
196+
0, nullptr));
195197
VerifyOdbcErrorState(SQL_HANDLE_DBC, this->conn, kErrorStateHYC00);
196198
}
197199

198200
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTxnIsolationUnsupported) {
199201
SQLINTEGER isolation;
200-
ASSERT_EQ(SQL_ERROR,
201-
SQLGetConnectAttr(this->conn, SQL_ATTR_TXN_ISOLATION, &isolation, 0, 0));
202+
ASSERT_EQ(SQL_ERROR, SQLGetConnectAttr(this->conn, SQL_ATTR_TXN_ISOLATION, &isolation,
203+
0, nullptr));
202204
VerifyOdbcErrorState(SQL_HANDLE_DBC, this->conn, kErrorStateHYC00);
203205
}
204206

@@ -219,7 +221,7 @@ TYPED_TEST(ConnectionAttributeTest,
219221
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrAsyncDbcEventDefault) {
220222
SQLPOINTER ptr = NULL;
221223
ASSERT_EQ(SQL_SUCCESS,
222-
SQLGetConnectAttr(this->conn, SQL_ATTR_ASYNC_DBC_EVENT, ptr, 0, 0));
224+
SQLGetConnectAttr(this->conn, SQL_ATTR_ASYNC_DBC_EVENT, ptr, 0, nullptr));
223225
EXPECT_EQ(reinterpret_cast<SQLPOINTER>(NULL), ptr);
224226
}
225227
#endif
@@ -228,7 +230,7 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrAsyncDbcEventDefault) {
228230
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrAsyncDbcPcallbackDefault) {
229231
SQLPOINTER ptr = NULL;
230232
ASSERT_EQ(SQL_SUCCESS,
231-
SQLGetConnectAttr(this->conn, SQL_ATTR_ASYNC_DBC_PCALLBACK, ptr, 0, 0));
233+
SQLGetConnectAttr(this->conn, SQL_ATTR_ASYNC_DBC_PCALLBACK, ptr, 0, nullptr));
232234
EXPECT_EQ(reinterpret_cast<SQLPOINTER>(NULL), ptr);
233235
}
234236
#endif
@@ -237,41 +239,43 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrAsyncDbcPcallbackDefaul
237239
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrAsyncDbcPcontextDefault) {
238240
SQLPOINTER ptr = NULL;
239241
ASSERT_EQ(SQL_SUCCESS,
240-
SQLGetConnectAttr(this->conn, SQL_ATTR_ASYNC_DBC_PCONTEXT, ptr, 0, 0));
242+
SQLGetConnectAttr(this->conn, SQL_ATTR_ASYNC_DBC_PCONTEXT, ptr, 0, nullptr));
241243
EXPECT_EQ(reinterpret_cast<SQLPOINTER>(NULL), ptr);
242244
}
243245
#endif
244246

245247
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrAsyncEnableDefault) {
246248
SQLULEN enable;
247249
ASSERT_EQ(SQL_SUCCESS,
248-
SQLGetConnectAttr(this->conn, SQL_ATTR_ASYNC_ENABLE, &enable, 0, 0));
250+
SQLGetConnectAttr(this->conn, SQL_ATTR_ASYNC_ENABLE, &enable, 0, nullptr));
249251
EXPECT_EQ(SQL_ASYNC_ENABLE_OFF, enable);
250252
}
251253

252254
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrAutoIpdDefault) {
253255
SQLUINTEGER ipd;
254-
ASSERT_EQ(SQL_SUCCESS, SQLGetConnectAttr(this->conn, SQL_ATTR_AUTO_IPD, &ipd, 0, 0));
256+
ASSERT_EQ(SQL_SUCCESS,
257+
SQLGetConnectAttr(this->conn, SQL_ATTR_AUTO_IPD, &ipd, 0, nullptr));
255258
EXPECT_EQ(static_cast<SQLUINTEGER>(SQL_FALSE), ipd);
256259
}
257260

258261
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrAutocommitDefault) {
259262
SQLUINTEGER auto_commit;
260263
ASSERT_EQ(SQL_SUCCESS,
261-
SQLGetConnectAttr(this->conn, SQL_ATTR_AUTOCOMMIT, &auto_commit, 0, 0));
264+
SQLGetConnectAttr(this->conn, SQL_ATTR_AUTOCOMMIT, &auto_commit, 0, nullptr));
262265
EXPECT_EQ(SQL_AUTOCOMMIT_ON, auto_commit);
263266
}
264267

265268
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrEnlistInDtcDefault) {
266269
SQLPOINTER ptr = NULL;
267270
ASSERT_EQ(SQL_SUCCESS,
268-
SQLGetConnectAttr(this->conn, SQL_ATTR_ENLIST_IN_DTC, ptr, 0, 0));
271+
SQLGetConnectAttr(this->conn, SQL_ATTR_ENLIST_IN_DTC, ptr, 0, nullptr));
269272
EXPECT_EQ(reinterpret_cast<SQLPOINTER>(NULL), ptr);
270273
}
271274

272275
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrQuietModeDefault) {
273276
HWND ptr = NULL;
274-
ASSERT_EQ(SQL_SUCCESS, SQLGetConnectAttr(this->conn, SQL_ATTR_QUIET_MODE, ptr, 0, 0));
277+
ASSERT_EQ(SQL_SUCCESS,
278+
SQLGetConnectAttr(this->conn, SQL_ATTR_QUIET_MODE, ptr, 0, nullptr));
275279
EXPECT_EQ(reinterpret_cast<SQLPOINTER>(NULL), ptr);
276280
}
277281

@@ -281,7 +285,7 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrAccessModeValid) {
281285
// Check default value first
282286
SQLUINTEGER mode = -1;
283287
ASSERT_EQ(SQL_SUCCESS,
284-
SQLGetConnectAttr(this->conn, SQL_ATTR_ACCESS_MODE, &mode, 0, 0));
288+
SQLGetConnectAttr(this->conn, SQL_ATTR_ACCESS_MODE, &mode, 0, nullptr));
285289
EXPECT_EQ(SQL_MODE_READ_WRITE, mode);
286290

287291
ASSERT_EQ(SQL_SUCCESS,
@@ -290,7 +294,7 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrAccessModeValid) {
290294

291295
mode = -1;
292296
ASSERT_EQ(SQL_SUCCESS,
293-
SQLGetConnectAttr(this->conn, SQL_ATTR_ACCESS_MODE, &mode, 0, 0));
297+
SQLGetConnectAttr(this->conn, SQL_ATTR_ACCESS_MODE, &mode, 0, nullptr));
294298
EXPECT_EQ(SQL_MODE_READ_WRITE, mode);
295299

296300
// Attempt to set to SQL_MODE_READ_ONLY, driver should return warning and not error
@@ -305,32 +309,32 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrAccessModeValid) {
305309
TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrConnectionTimeoutValid) {
306310
// Check default value first
307311
SQLUINTEGER timeout = -1;
308-
ASSERT_EQ(SQL_SUCCESS,
309-
SQLGetConnectAttr(this->conn, SQL_ATTR_CONNECTION_TIMEOUT, &timeout, 0, 0));
312+
ASSERT_EQ(SQL_SUCCESS, SQLGetConnectAttr(this->conn, SQL_ATTR_CONNECTION_TIMEOUT,
313+
&timeout, 0, nullptr));
310314
EXPECT_EQ(0, timeout);
311315

312316
ASSERT_EQ(SQL_SUCCESS, SQLSetConnectAttr(this->conn, SQL_ATTR_CONNECTION_TIMEOUT,
313317
reinterpret_cast<SQLPOINTER>(42), 0));
314318

315319
timeout = -1;
316-
ASSERT_EQ(SQL_SUCCESS,
317-
SQLGetConnectAttr(this->conn, SQL_ATTR_CONNECTION_TIMEOUT, &timeout, 0, 0));
320+
ASSERT_EQ(SQL_SUCCESS, SQLGetConnectAttr(this->conn, SQL_ATTR_CONNECTION_TIMEOUT,
321+
&timeout, 0, nullptr));
318322
EXPECT_EQ(42, timeout);
319323
}
320324

321325
TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrLoginTimeoutValid) {
322326
// Check default value first
323327
SQLUINTEGER timeout = -1;
324328
ASSERT_EQ(SQL_SUCCESS,
325-
SQLGetConnectAttr(this->conn, SQL_ATTR_LOGIN_TIMEOUT, &timeout, 0, 0));
329+
SQLGetConnectAttr(this->conn, SQL_ATTR_LOGIN_TIMEOUT, &timeout, 0, nullptr));
326330
EXPECT_EQ(0, timeout);
327331

328332
ASSERT_EQ(SQL_SUCCESS, SQLSetConnectAttr(this->conn, SQL_ATTR_LOGIN_TIMEOUT,
329333
reinterpret_cast<SQLPOINTER>(42), 0));
330334

331335
timeout = -1;
332336
ASSERT_EQ(SQL_SUCCESS,
333-
SQLGetConnectAttr(this->conn, SQL_ATTR_LOGIN_TIMEOUT, &timeout, 0, 0));
337+
SQLGetConnectAttr(this->conn, SQL_ATTR_LOGIN_TIMEOUT, &timeout, 0, nullptr));
334338
EXPECT_EQ(42, timeout);
335339
}
336340

@@ -340,15 +344,15 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrPacketSizeValid) {
340344
// Check default value first
341345
SQLUINTEGER size = -1;
342346
ASSERT_EQ(SQL_SUCCESS,
343-
SQLGetConnectAttr(this->conn, SQL_ATTR_PACKET_SIZE, &size, 0, 0));
347+
SQLGetConnectAttr(this->conn, SQL_ATTR_PACKET_SIZE, &size, 0, nullptr));
344348
EXPECT_EQ(0, size);
345349

346350
ASSERT_EQ(SQL_SUCCESS, SQLSetConnectAttr(this->conn, SQL_ATTR_PACKET_SIZE,
347351
reinterpret_cast<SQLPOINTER>(0), 0));
348352

349353
size = -1;
350354
ASSERT_EQ(SQL_SUCCESS,
351-
SQLGetConnectAttr(this->conn, SQL_ATTR_PACKET_SIZE, &size, 0, 0));
355+
SQLGetConnectAttr(this->conn, SQL_ATTR_PACKET_SIZE, &size, 0, nullptr));
352356
EXPECT_EQ(0, size);
353357

354358
// Attempt to set to non-zero value, driver should return warning and not error

cpp/src/arrow/flight/sql/odbc/tests/connection_info_test.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,8 @@ TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDriverHdesc) {
166166

167167
// Value returned from driver manager is the desc address
168168
SQLHDESC local_desc = descriptor;
169-
ASSERT_EQ(SQL_SUCCESS, SQLGetInfo(this->conn, SQL_HANDLE_DESC, &local_desc, 0, 0));
169+
ASSERT_EQ(SQL_SUCCESS,
170+
SQLGetInfo(this->conn, SQL_HANDLE_DESC, &local_desc, 0, nullptr));
170171
EXPECT_GT(local_desc, static_cast<SQLHSTMT>(0));
171172

172173
// Free descriptor handle
@@ -194,7 +195,8 @@ TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDriverHlib) {
194195
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDriverHstmt) {
195196
// Value returned from driver manager is the stmt address
196197
SQLHSTMT local_stmt = this->stmt;
197-
ASSERT_EQ(SQL_SUCCESS, SQLGetInfo(this->conn, SQL_DRIVER_HSTMT, &local_stmt, 0, 0));
198+
ASSERT_EQ(SQL_SUCCESS,
199+
SQLGetInfo(this->conn, SQL_DRIVER_HSTMT, &local_stmt, 0, nullptr));
198200
EXPECT_GT(local_stmt, static_cast<SQLHSTMT>(0));
199201
}
200202

cpp/src/arrow/flight/sql/odbc/tests/connection_test.cc

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ TEST(SQLGetEnvAttr, TestSQLGetEnvAttrODBCVersion) {
117117
// Allocate an environment handle
118118
ASSERT_EQ(SQL_SUCCESS, SQLAllocEnv(&env));
119119

120-
ASSERT_EQ(SQL_SUCCESS, SQLGetEnvAttr(env, SQL_ATTR_ODBC_VERSION, &version, 0, 0));
120+
ASSERT_EQ(SQL_SUCCESS, SQLGetEnvAttr(env, SQL_ATTR_ODBC_VERSION, &version, 0, nullptr));
121121

122122
ASSERT_EQ(SQL_OV_ODBC2, version);
123123

@@ -155,7 +155,7 @@ TYPED_TEST(ConnectionTest, TestSQLGetEnvAttrOutputNTS) {
155155
SQLINTEGER output_nts;
156156

157157
ASSERT_EQ(SQL_SUCCESS,
158-
SQLGetEnvAttr(this->env, SQL_ATTR_OUTPUT_NTS, &output_nts, 0, 0));
158+
SQLGetEnvAttr(this->env, SQL_ATTR_OUTPUT_NTS, &output_nts, 0, nullptr));
159159

160160
ASSERT_EQ(SQL_TRUE, output_nts);
161161
}
@@ -432,7 +432,7 @@ TEST_F(ConnectionRemoteTest, TestSQLConnectDSNPrecedence) {
432432
<< GetOdbcErrorMessage(SQL_HANDLE_DBC, conn);
433433
}
434434

435-
#endif
435+
#endif // _WIN32
436436

437437
TEST_F(ConnectionRemoteTest, TestSQLDriverConnectInvalidUid) {
438438
// Invalid connect string
@@ -508,4 +508,71 @@ TYPED_TEST(ConnectionHandleTest, TestCloseConnectionWithOpenStatement) {
508508
ASSERT_EQ(SQL_SUCCESS, SQLDisconnect(this->conn));
509509
}
510510

511+
TYPED_TEST(ConnectionTest, TestSQLAllocFreeDesc) {
512+
SQLHDESC descriptor;
513+
514+
// Allocate a descriptor using alloc handle
515+
ASSERT_EQ(SQL_SUCCESS, SQLAllocHandle(SQL_HANDLE_DESC, this->conn, &descriptor));
516+
517+
// Free descriptor handle
518+
ASSERT_EQ(SQL_SUCCESS, SQLFreeHandle(SQL_HANDLE_DESC, descriptor));
519+
}
520+
521+
TYPED_TEST(ConnectionTest, TestSQLSetStmtAttrDescriptor) {
522+
SQLHDESC apd_descriptor, ard_descriptor;
523+
524+
// Allocate an APD descriptor using alloc handle
525+
ASSERT_EQ(SQL_SUCCESS, SQLAllocHandle(SQL_HANDLE_DESC, this->conn, &apd_descriptor));
526+
527+
// Allocate an ARD descriptor using alloc handle
528+
ASSERT_EQ(SQL_SUCCESS, SQLAllocHandle(SQL_HANDLE_DESC, this->conn, &ard_descriptor));
529+
530+
// Save implicitly allocated internal APD and ARD descriptor pointers
531+
SQLPOINTER internal_apd, internal_ard = nullptr;
532+
533+
EXPECT_EQ(SQL_SUCCESS, SQLGetStmtAttr(this->stmt, SQL_ATTR_APP_PARAM_DESC,
534+
&internal_apd, sizeof(internal_apd), 0));
535+
536+
EXPECT_EQ(SQL_SUCCESS, SQLGetStmtAttr(this->stmt, SQL_ATTR_APP_ROW_DESC, &internal_ard,
537+
sizeof(internal_ard), 0));
538+
539+
// Set APD descriptor to explicitly allocated handle
540+
EXPECT_EQ(SQL_SUCCESS, SQLSetStmtAttr(this->stmt, SQL_ATTR_APP_PARAM_DESC,
541+
reinterpret_cast<SQLPOINTER>(apd_descriptor), 0));
542+
543+
// Set ARD descriptor to explicitly allocated handle
544+
EXPECT_EQ(SQL_SUCCESS, SQLSetStmtAttr(this->stmt, SQL_ATTR_APP_ROW_DESC,
545+
reinterpret_cast<SQLPOINTER>(ard_descriptor), 0));
546+
547+
// Verify APD and ARD descriptors are set to explicitly allocated pointers
548+
SQLPOINTER value = nullptr;
549+
EXPECT_EQ(SQL_SUCCESS, SQLGetStmtAttr(this->stmt, SQL_ATTR_APP_PARAM_DESC, &value,
550+
sizeof(value), 0));
551+
552+
EXPECT_EQ(apd_descriptor, value);
553+
554+
EXPECT_EQ(SQL_SUCCESS,
555+
SQLGetStmtAttr(this->stmt, SQL_ATTR_APP_ROW_DESC, &value, sizeof(value), 0));
556+
557+
EXPECT_EQ(ard_descriptor, value);
558+
559+
// Free explicitly allocated APD and ARD descriptor handles
560+
ASSERT_EQ(SQL_SUCCESS, SQLFreeHandle(SQL_HANDLE_DESC, apd_descriptor));
561+
562+
ASSERT_EQ(SQL_SUCCESS, SQLFreeHandle(SQL_HANDLE_DESC, ard_descriptor));
563+
564+
// Verify APD and ARD descriptors has been reverted to implicit descriptors
565+
value = nullptr;
566+
567+
EXPECT_EQ(SQL_SUCCESS, SQLGetStmtAttr(this->stmt, SQL_ATTR_APP_PARAM_DESC, &value,
568+
sizeof(value), 0));
569+
570+
EXPECT_EQ(internal_apd, value);
571+
572+
EXPECT_EQ(SQL_SUCCESS,
573+
SQLGetStmtAttr(this->stmt, SQL_ATTR_APP_ROW_DESC, &value, sizeof(value), 0));
574+
575+
EXPECT_EQ(internal_ard, value);
576+
}
577+
511578
} // namespace arrow::flight::sql::odbc

0 commit comments

Comments
 (0)