@@ -47,6 +47,8 @@ using TestTypesHandle = ::testing::Types<FlightSQLOdbcEnvConnHandleMockTestBase,
4747 FlightSQLOdbcEnvConnHandleRemoteTestBase>;
4848TYPED_TEST_SUITE (ErrorsHandleTest, TestTypesHandle);
4949
50+ using ODBC::SqlWcharToString;
51+
5052TYPED_TEST (ErrorsHandleTest, TestSQLGetDiagFieldWForConnectFailure) {
5153 // Invalid connect string
5254 std::string connect_str = this ->GetInvalidConnectionString ();
@@ -90,9 +92,12 @@ TYPED_TEST(ErrorsHandleTest, TestSQLGetDiagFieldWForConnectFailure) {
9092 SQLWCHAR message_text[kOdbcBufferSize ];
9193 SQLSMALLINT message_text_length;
9294
93- EXPECT_EQ (SQL_SUCCESS,
94- SQLGetDiagField (SQL_HANDLE_DBC, this ->conn , RECORD_1, SQL_DIAG_MESSAGE_TEXT,
95- message_text, kOdbcBufferSize , &message_text_length));
95+ SQLRETURN ret =
96+ SQLGetDiagField (SQL_HANDLE_DBC, this ->conn , RECORD_1, SQL_DIAG_MESSAGE_TEXT,
97+ message_text, kOdbcBufferSize , &message_text_length);
98+
99+ // dependent on the size of the message it could output SQL_SUCCESS_WITH_INFO
100+ EXPECT_TRUE (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO);
96101
97102 EXPECT_GT (message_text_length, 100 );
98103
@@ -114,10 +119,9 @@ TYPED_TEST(ErrorsHandleTest, TestSQLGetDiagFieldWForConnectFailure) {
114119 EXPECT_EQ (
115120 SQL_SUCCESS,
116121 SQLGetDiagField (SQL_HANDLE_DBC, this ->conn , RECORD_1, SQL_DIAG_SQLSTATE, sql_state,
117- sql_state_size * arrow::flight::sql::odbc::GetSqlWCharSize (),
118- &sql_state_length));
122+ sql_state_size * GetSqlWCharSize (), &sql_state_length));
119123
120- EXPECT_EQ (std::wstring ( L" 28000 " ), std::wstring (sql_state));
124+ EXPECT_EQ (kErrorState28000 , SqlWcharToString (sql_state));
121125}
122126
123127TYPED_TEST (ErrorsHandleTest, DISABLED_TestSQLGetDiagFieldWForConnectFailureNTS) {
@@ -156,6 +160,8 @@ TYPED_TEST(ErrorsHandleTest, DISABLED_TestSQLGetDiagFieldWForConnectFailureNTS)
156160 EXPECT_GT (message_text_length, 100 );
157161}
158162
163+ // iODBC does not support application allocated descriptors.
164+ #ifndef __APPLE__
159165TYPED_TEST (ErrorsTest, TestSQLGetDiagFieldWForDescriptorFailureFromDriverManager) {
160166 SQLHDESC descriptor;
161167
@@ -216,7 +222,7 @@ TYPED_TEST(ErrorsTest, TestSQLGetDiagFieldWForDescriptorFailureFromDriverManager
216222 SQLGetDiagField (SQL_HANDLE_DESC, descriptor, RECORD_1, SQL_DIAG_SQLSTATE, sql_state,
217223 sql_state_size * GetSqlWCharSize (), &sql_state_length));
218224
219- EXPECT_EQ (std::wstring ( L" IM001 " ), std::wstring (sql_state));
225+ EXPECT_EQ (kErrorStateIM001 , SqlWcharToString (sql_state));
220226
221227 // Free descriptor handle
222228 EXPECT_EQ (SQL_SUCCESS, SQLFreeHandle (SQL_HANDLE_DESC, descriptor));
@@ -245,13 +251,14 @@ TYPED_TEST(ErrorsTest, TestSQLGetDiagRecForDescriptorFailureFromDriverManager) {
245251 EXPECT_EQ (0 , native_error);
246252
247253 // API not implemented error from driver manager
248- EXPECT_EQ (std::wstring ( L" IM001 " ), std::wstring (sql_state));
254+ EXPECT_EQ (kErrorStateIM001 , SqlWcharToString (sql_state));
249255
250256 EXPECT_FALSE (std::wstring (message).empty ());
251257
252258 // Free descriptor handle
253259 EXPECT_EQ (SQL_SUCCESS, SQLFreeHandle (SQL_HANDLE_DESC, descriptor));
254260}
261+ #endif // __APPLE__
255262
256263TYPED_TEST (ErrorsHandleTest, TestSQLGetDiagRecForConnectFailure) {
257264 // Invalid connect string
@@ -282,7 +289,7 @@ TYPED_TEST(ErrorsHandleTest, TestSQLGetDiagRecForConnectFailure) {
282289
283290 EXPECT_EQ (200 , native_error);
284291
285- EXPECT_EQ (std::wstring ( L" 28000 " ), std::wstring (sql_state));
292+ EXPECT_EQ (kErrorState28000 , SqlWcharToString (sql_state));
286293
287294 EXPECT_FALSE (std::wstring (message).empty ());
288295}
@@ -305,11 +312,17 @@ TYPED_TEST(ErrorsTest, TestSQLGetDiagRecInputData) {
305312 nullptr , 0 , nullptr ));
306313
307314 // Invalid handle
315+ #ifdef __APPLE__
316+ // MacOS ODBC driver manager requires connection handle
317+ EXPECT_EQ (SQL_INVALID_HANDLE,
318+ SQLGetDiagRec (0 , this ->conn , 1 , nullptr , nullptr , nullptr , 0 , nullptr ));
319+ #else
308320 EXPECT_EQ (SQL_INVALID_HANDLE,
309321 SQLGetDiagRec (0 , nullptr , 0 , nullptr , nullptr , nullptr , 0 , nullptr ));
322+ #endif // __APPLE__
310323}
311324
312- TYPED_TEST (ErrorsTest , TestSQLErrorInputData) {
325+ TYPED_TEST (ErrorsOdbcV2Test , TestSQLErrorInputData) {
313326 // Test ODBC 2.0 API SQLError. Driver manager maps SQLError to SQLGetDiagRec.
314327 // SQLError does not post diagnostic records for itself.
315328
@@ -320,8 +333,13 @@ TYPED_TEST(ErrorsTest, TestSQLErrorInputData) {
320333 EXPECT_EQ (SQL_NO_DATA, SQLError (nullptr , this ->conn , nullptr , nullptr , nullptr , nullptr ,
321334 0 , nullptr ));
322335
336+ #ifdef __APPLE__
337+ EXPECT_EQ (SQL_NO_DATA, SQLError (SQL_NULL_HENV, this ->conn , this ->stmt , nullptr , nullptr ,
338+ nullptr , 0 , nullptr ));
339+ #else
323340 EXPECT_EQ (SQL_NO_DATA, SQLError (nullptr , nullptr , this ->stmt , nullptr , nullptr , nullptr ,
324341 0 , nullptr ));
342+ #endif // __APPLE__
325343
326344 // Invalid handle
327345 EXPECT_EQ (SQL_INVALID_HANDLE,
@@ -345,12 +363,12 @@ TYPED_TEST(ErrorsTest, TestSQLErrorEnvErrorFromDriverManager) {
345363 ASSERT_EQ (SQL_SUCCESS, SQLError (this ->env , nullptr , nullptr , sql_state, &native_error,
346364 message, SQL_MAX_MESSAGE_LENGTH, &message_length));
347365
348- EXPECT_GT (message_length, 50 );
366+ EXPECT_GT (message_length, 40 );
349367
350368 EXPECT_EQ (0 , native_error);
351369
352370 // Function sequence error state from driver manager
353- EXPECT_EQ (std::wstring ( L" HY010 " ), std::wstring (sql_state));
371+ EXPECT_EQ (kErrorStateHY010 , SqlWcharToString (sql_state));
354372
355373 EXPECT_FALSE (std::wstring (message).empty ());
356374}
@@ -362,9 +380,8 @@ TYPED_TEST(ErrorsTest, TestSQLErrorConnError) {
362380 // DM passes 512 as buffer length to SQLError.
363381
364382 // Attempt to set unsupported attribute
365- SQLRETURN ret = SQLGetConnectAttr (this ->conn , SQL_ATTR_TXN_ISOLATION, 0 , 0 , nullptr );
366-
367- ASSERT_EQ (SQL_ERROR, ret);
383+ ASSERT_EQ (SQL_ERROR,
384+ SQLGetConnectAttr (this ->conn , SQL_ATTR_TXN_ISOLATION, 0 , 0 , nullptr ));
368385
369386 SQLWCHAR sql_state[6 ] = {0 };
370387 SQLINTEGER native_error = 0 ;
@@ -378,7 +395,7 @@ TYPED_TEST(ErrorsTest, TestSQLErrorConnError) {
378395 EXPECT_EQ (100 , native_error);
379396
380397 // optional feature not supported error state
381- EXPECT_EQ (std::wstring ( L" HYC00 " ), std::wstring (sql_state));
398+ EXPECT_EQ (kErrorStateHYC00 , SqlWcharToString (sql_state));
382399
383400 EXPECT_FALSE (std::wstring (message).empty ());
384401}
@@ -399,14 +416,16 @@ TYPED_TEST(ErrorsTest, TestSQLErrorStmtError) {
399416 SQLINTEGER native_error = 0 ;
400417 SQLWCHAR message[SQL_MAX_MESSAGE_LENGTH] = {0 };
401418 SQLSMALLINT message_length = 0 ;
402- ASSERT_EQ (SQL_SUCCESS, SQLError (nullptr , nullptr , this ->stmt , sql_state, &native_error,
403- message, SQL_MAX_MESSAGE_LENGTH, &message_length));
419+ SQLRETURN ret = SQLError (nullptr , this ->conn , this ->stmt , sql_state, &native_error,
420+ message, SQL_MAX_MESSAGE_LENGTH, &message_length);
421+
422+ EXPECT_TRUE (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO);
404423
405424 EXPECT_GT (message_length, 70 );
406425
407426 EXPECT_EQ (100 , native_error);
408427
409- EXPECT_EQ (std::wstring ( L" HY000 " ), std::wstring (sql_state));
428+ EXPECT_EQ (kErrorStateHY000 , SqlWcharToString (sql_state));
410429
411430 EXPECT_FALSE (std::wstring (message).empty ());
412431}
@@ -434,20 +453,21 @@ TYPED_TEST(ErrorsTest, TestSQLErrorStmtWarning) {
434453 SQLINTEGER native_error = 0 ;
435454 SQLWCHAR message[SQL_MAX_MESSAGE_LENGTH] = {0 };
436455 SQLSMALLINT message_length = 0 ;
437- ASSERT_EQ (SQL_SUCCESS, SQLError (nullptr , nullptr , this ->stmt , sql_state, &native_error,
438- message, SQL_MAX_MESSAGE_LENGTH, &message_length));
456+ ASSERT_EQ (SQL_SUCCESS,
457+ SQLError (SQL_NULL_HENV, this ->conn , this ->stmt , sql_state, &native_error,
458+ message, SQL_MAX_MESSAGE_LENGTH, &message_length));
439459
440460 EXPECT_GT (message_length, 50 );
441461
442462 EXPECT_EQ (1000100 , native_error);
443463
444464 // Verify string truncation warning is reported
445- EXPECT_EQ (std::wstring ( L" 01004 " ), std::wstring (sql_state));
465+ EXPECT_EQ (kErrorState01004 , SqlWcharToString (sql_state));
446466
447467 EXPECT_FALSE (std::wstring (message).empty ());
448468}
449469
450- TYPED_TEST (ErrorsOdbcV2Test, TestSQLErrorEnvErrorODBCVer2FromDriverManager ) {
470+ TYPED_TEST (ErrorsOdbcV2Test, TestSQLErrorEnvErrorFromDriverManager ) {
451471 // Test ODBC 2.0 API SQLError with ODBC ver 2.
452472 // Known Windows Driver Manager (DM) behavior:
453473 // When application passes buffer length greater than SQL_MAX_MESSAGE_LENGTH (512),
@@ -464,22 +484,34 @@ TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorEnvErrorODBCVer2FromDriverManager) {
464484 ASSERT_EQ (SQL_SUCCESS, SQLError (this ->env , nullptr , nullptr , sql_state, &native_error,
465485 message, SQL_MAX_MESSAGE_LENGTH, &message_length));
466486
467- EXPECT_GT (message_length, 50 );
487+ EXPECT_GT (message_length, 40 );
468488
469489 EXPECT_EQ (0 , native_error);
470490
471491 // Function sequence error state from driver manager
472- EXPECT_EQ (std::wstring (L" S1010" ), std::wstring (sql_state));
492+ #ifdef _WIN32
493+ // Windows Driver Manager returns S1010
494+ EXPECT_EQ (kErrorStateS1010 , SqlWcharToString (sql_state));
495+ #else
496+ // unix Driver Manager returns HY010
497+ EXPECT_EQ (kErrorStateHY010 , SqlWcharToString (sql_state));
498+ #endif // _WIN32
473499
474500 EXPECT_FALSE (std::wstring (message).empty ());
475501}
476502
477- TYPED_TEST (ErrorsOdbcV2Test, TestSQLErrorConnErrorODBCVer2) {
503+ #ifndef __APPLE__
504+ TYPED_TEST (ErrorsOdbcV2Test, TestSQLErrorConnError) {
478505 // Test ODBC 2.0 API SQLError with ODBC ver 2.
479506 // Known Windows Driver Manager (DM) behavior:
480507 // When application passes buffer length greater than SQL_MAX_MESSAGE_LENGTH (512),
481508 // DM passes 512 as buffer length to SQLError.
482509
510+ // Known macOS Driver Manager (DM) behavior:
511+ // Attempts to call SQLGetConnectOption without redirecting the API call to
512+ // SQLGetConnectAttr. SQLGetConnectOption is not implemented as it is not required by
513+ // macOS Excel.
514+
483515 // Attempt to set unsupported attribute
484516 ASSERT_EQ (SQL_ERROR,
485517 SQLGetConnectAttr (this ->conn , SQL_ATTR_TXN_ISOLATION, 0 , 0 , nullptr ));
@@ -496,12 +528,13 @@ TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorConnErrorODBCVer2) {
496528 EXPECT_EQ (100 , native_error);
497529
498530 // optional feature not supported error state. Driver Manager maps state to S1C00
499- EXPECT_EQ (std::wstring ( L" S1C00 " ), std::wstring (sql_state));
531+ EXPECT_EQ (kErrorStateS1C00 , SqlWcharToString (sql_state));
500532
501533 EXPECT_FALSE (std::wstring (message).empty ());
502534}
535+ #endif // __APPLE__
503536
504- TYPED_TEST (ErrorsOdbcV2Test, TestSQLErrorStmtErrorODBCVer2 ) {
537+ TYPED_TEST (ErrorsOdbcV2Test, TestSQLErrorStmtError ) {
505538 // Test ODBC 2.0 API SQLError with ODBC ver 2.
506539 // Known Windows Driver Manager (DM) behavior:
507540 // When application passes buffer length greater than SQL_MAX_MESSAGE_LENGTH (512),
@@ -525,12 +558,12 @@ TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorStmtErrorODBCVer2) {
525558 EXPECT_EQ (100 , native_error);
526559
527560 // Driver Manager maps error state to S1000
528- EXPECT_EQ (std::wstring ( L" S1000 " ), std::wstring (sql_state));
561+ EXPECT_EQ (kErrorStateS1000 , SqlWcharToString (sql_state));
529562
530563 EXPECT_FALSE (std::wstring (message).empty ());
531564}
532565
533- TYPED_TEST (ErrorsOdbcV2Test, TestSQLErrorStmtWarningODBCVer2 ) {
566+ TYPED_TEST (ErrorsOdbcV2Test, TestSQLErrorStmtWarning ) {
534567 // Test ODBC 2.0 API SQLError.
535568
536569 std::wstring wsql = L" SELECT 'VERY LONG STRING here' AS string_col;" ;
@@ -553,15 +586,16 @@ TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorStmtWarningODBCVer2) {
553586 SQLINTEGER native_error = 0 ;
554587 SQLWCHAR message[SQL_MAX_MESSAGE_LENGTH] = {0 };
555588 SQLSMALLINT message_length = 0 ;
556- ASSERT_EQ (SQL_SUCCESS, SQLError (nullptr , nullptr , this ->stmt , sql_state, &native_error,
557- message, SQL_MAX_MESSAGE_LENGTH, &message_length));
589+ ASSERT_EQ (SQL_SUCCESS,
590+ SQLError (SQL_NULL_HENV, this ->conn , this ->stmt , sql_state, &native_error,
591+ message, SQL_MAX_MESSAGE_LENGTH, &message_length));
558592
559593 EXPECT_GT (message_length, 50 );
560594
561595 EXPECT_EQ (1000100 , native_error);
562596
563597 // Verify string truncation warning is reported
564- EXPECT_EQ (std::wstring ( L" 01004 " ), std::wstring (sql_state));
598+ EXPECT_EQ (kErrorState01004 , SqlWcharToString (sql_state));
565599
566600 EXPECT_FALSE (std::wstring (message).empty ());
567601}
0 commit comments