GH-49552: [C++][FlightRPC][ODBC] Enable ODBC test build on Linux (#49668)
### Rationale for this change
The test suite needs to be updated so it will build on Linux in addition to Windows & Mac.
Resolves https://github.com/apache/arrow/issues/49552
### What changes are included in this PR?
Miscellaneous changes to get the tests building on Linux.
### Are these changes tested?
Yes.
### Are there any user-facing changes?
No.
* GitHub Issue: #49552
Authored-by: justing-bq <62349012+justing-bq@users.noreply.github.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
diff --git a/ci/scripts/cpp_test.sh b/ci/scripts/cpp_test.sh
index 241addb..2f88cdc 100755
--- a/ci/scripts/cpp_test.sh
+++ b/ci/scripts/cpp_test.sh
@@ -55,6 +55,7 @@
fi
case "$(uname)" in
Linux)
+ exclude_tests+=("arrow-flight-sql-odbc-test")
n_jobs=$(nproc)
;;
Darwin)
diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt
index 446dac9..8783d2b 100644
--- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt
+++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt
@@ -29,10 +29,7 @@
add_subdirectory(odbc_impl)
if(ARROW_BUILD_TESTS)
- if(WIN32 OR APPLE)
- # GH-49552 TODO: Enable Linux test build
- add_subdirectory(tests)
- endif()
+ add_subdirectory(tests)
endif()
arrow_install_all_headers("arrow/flight/sql/odbc")
diff --git a/cpp/src/arrow/flight/sql/odbc/tests/columns_test.cc b/cpp/src/arrow/flight/sql/odbc/tests/columns_test.cc
index 399b0f8..9e36c23 100644
--- a/cpp/src/arrow/flight/sql/odbc/tests/columns_test.cc
+++ b/cpp/src/arrow/flight/sql/odbc/tests/columns_test.cc
@@ -364,7 +364,6 @@
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
- SQLLEN num_val = 0;
ASSERT_EQ(SQL_SUCCESS,
SQLColAttribute(stmt, idx, field_identifier, 0, 0, nullptr, value));
}
@@ -379,7 +378,6 @@
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
- SQLLEN num_val = 0;
ASSERT_EQ(SQL_SUCCESS,
SQLColAttributes(stmt, idx, field_identifier, 0, 0, nullptr, value));
}
@@ -387,10 +385,10 @@
} // namespace
TYPED_TEST(ColumnsTest, SQLColumnsTestInputData) {
- SQLWCHAR catalog_name[] = L"";
- SQLWCHAR schema_name[] = L"";
- SQLWCHAR table_name[] = L"";
- SQLWCHAR column_name[] = L"";
+ SQLWCHAR catalog_name[] = {0};
+ SQLWCHAR schema_name[] = {0};
+ SQLWCHAR table_name[] = {0};
+ SQLWCHAR column_name[] = {0};
// All values populated
EXPECT_EQ(SQL_SUCCESS,
@@ -422,8 +420,8 @@
// Check table pattern and column pattern returns all columns
// Attempt to get all columns
- SQLWCHAR table_pattern[] = L"%";
- SQLWCHAR column_pattern[] = L"%";
+ ASSIGN_SQLWCHAR_ARR(table_pattern, L"%");
+ ASSIGN_SQLWCHAR_ARR(column_pattern, L"%");
ASSERT_EQ(SQL_SUCCESS, SQLColumns(this->stmt, nullptr, SQL_NTS, nullptr, SQL_NTS,
table_pattern, SQL_NTS, column_pattern, SQL_NTS));
@@ -447,7 +445,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_BIGINT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
1, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -468,7 +466,7 @@
0, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_WVARCHAR, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
0, // expected_octet_char_length
2, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -488,7 +486,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_BIGINT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
3, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -508,7 +506,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_BIGINT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
1, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -529,7 +527,7 @@
0, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_WVARCHAR, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
0, // expected_octet_char_length
2, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -549,7 +547,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_BIGINT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
3, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -569,7 +567,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_BIGINT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
4, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -584,8 +582,8 @@
CreateAllDataTypeTable();
// Attempt to get all columns from AllTypesTable
- SQLWCHAR table_pattern[] = L"AllTypesTable";
- SQLWCHAR column_pattern[] = L"%";
+ ASSIGN_SQLWCHAR_ARR(table_pattern, L"AllTypesTable");
+ ASSIGN_SQLWCHAR_ARR(column_pattern, L"%");
ASSERT_EQ(SQL_SUCCESS, SQLColumns(this->stmt, nullptr, SQL_NTS, nullptr, SQL_NTS,
table_pattern, SQL_NTS, column_pattern, SQL_NTS));
@@ -607,7 +605,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_BIGINT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
1, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -628,7 +626,7 @@
0, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_WVARCHAR, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
0, // expected_octet_char_length
2, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -649,7 +647,7 @@
0, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_BINARY, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
0, // expected_octet_char_length
3, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -669,7 +667,7 @@
2, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_DOUBLE, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
4, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -687,8 +685,8 @@
CreateUnicodeTable();
// Attempt to get all columns
- SQLWCHAR table_pattern[] = L"数据";
- SQLWCHAR column_pattern[] = L"%";
+ ASSIGN_SQLWCHAR_ARR(table_pattern, L"数据");
+ ASSIGN_SQLWCHAR_ARR(column_pattern, L"%");
ASSERT_EQ(SQL_SUCCESS, SQLColumns(this->stmt, nullptr, SQL_NTS, nullptr, SQL_NTS,
table_pattern, SQL_NTS, column_pattern, SQL_NTS));
@@ -709,7 +707,7 @@
0, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_WVARCHAR, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
0, // expected_octet_char_length
1, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -724,8 +722,8 @@
// GH-47159 TODO: Return NUM_PREC_RADIX based on whether COLUMN_SIZE contains number of
// digits or bits
- SQLWCHAR table_pattern[] = L"ODBCTest";
- SQLWCHAR column_pattern[] = L"%";
+ ASSIGN_SQLWCHAR_ARR(table_pattern, L"ODBCTest");
+ ASSIGN_SQLWCHAR_ARR(column_pattern, L"%");
ASSERT_EQ(SQL_SUCCESS, SQLColumns(this->stmt, nullptr, SQL_NTS, nullptr, SQL_NTS,
table_pattern, SQL_NTS, column_pattern, SQL_NTS));
@@ -746,7 +744,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_INTEGER, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
4, // expected_octet_char_length
1, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -767,7 +765,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_BIGINT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
2, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -787,7 +785,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_DECIMAL, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
2, // expected_octet_char_length
3, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -807,7 +805,7 @@
2, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_FLOAT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
4, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -827,7 +825,7 @@
2, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_DOUBLE, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
5, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -848,7 +846,7 @@
0, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_BIT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
1, // expected_octet_char_length
6, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -927,8 +925,8 @@
// GH-47159 TODO: Return NUM_PREC_RADIX based on whether COLUMN_SIZE contains number of
// digits or bits
- SQLWCHAR table_pattern[] = L"ODBCTest";
- SQLWCHAR column_pattern[] = L"%";
+ ASSIGN_SQLWCHAR_ARR(table_pattern, L"ODBCTest");
+ ASSIGN_SQLWCHAR_ARR(column_pattern, L"%");
ASSERT_EQ(SQL_SUCCESS, SQLColumns(this->stmt, nullptr, SQL_NTS, nullptr, SQL_NTS,
table_pattern, SQL_NTS, column_pattern, SQL_NTS));
@@ -949,7 +947,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_INTEGER, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
4, // expected_octet_char_length
1, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -970,7 +968,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_BIGINT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
2, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -990,7 +988,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_DECIMAL, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
2, // expected_octet_char_length
3, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -1010,7 +1008,7 @@
2, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_FLOAT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
4, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -1030,7 +1028,7 @@
2, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_DOUBLE, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
5, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -1051,7 +1049,7 @@
0, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_BIT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
1, // expected_octet_char_length
6, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -1129,8 +1127,8 @@
// Checks filtering table with column name pattern.
// Only check table and column name
- SQLWCHAR table_pattern[] = L"%";
- SQLWCHAR column_pattern[] = L"id";
+ ASSIGN_SQLWCHAR_ARR(table_pattern, L"%");
+ ASSIGN_SQLWCHAR_ARR(column_pattern, L"id");
EXPECT_EQ(SQL_SUCCESS, SQLColumns(this->stmt, nullptr, SQL_NTS, nullptr, SQL_NTS,
table_pattern, SQL_NTS, column_pattern, SQL_NTS));
@@ -1150,7 +1148,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_BIGINT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
1, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -1170,7 +1168,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_BIGINT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
1, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -1183,8 +1181,8 @@
// Checks filtering table with table and column name pattern.
// Only check table and column name
- SQLWCHAR table_pattern[] = L"foreignTable";
- SQLWCHAR column_pattern[] = L"id";
+ ASSIGN_SQLWCHAR_ARR(table_pattern, L"foreignTable");
+ ASSIGN_SQLWCHAR_ARR(column_pattern, L"id");
ASSERT_EQ(SQL_SUCCESS, SQLColumns(this->stmt, nullptr, SQL_NTS, nullptr, SQL_NTS,
table_pattern, SQL_NTS, column_pattern, SQL_NTS));
@@ -1204,7 +1202,7 @@
10, // expected_num_prec_radix
SQL_NULLABLE, // expected_nullable
SQL_BIGINT, // expected_sql_data_type
- NULL, // expected_date_time_sub
+ 0, // expected_date_time_sub
8, // expected_octet_char_length
1, // expected_ordinal_position
std::wstring(L"YES")); // expected_is_nullable
@@ -1214,8 +1212,8 @@
}
TEST_F(ColumnsMockTest, TestSQLColumnsInvalidTablePattern) {
- SQLWCHAR table_pattern[] = L"non-existent-table";
- SQLWCHAR column_pattern[] = L"%";
+ ASSIGN_SQLWCHAR_ARR(table_pattern, L"non-existent-table");
+ ASSIGN_SQLWCHAR_ARR(column_pattern, L"%");
ASSERT_EQ(SQL_SUCCESS, SQLColumns(this->stmt, nullptr, SQL_NTS, nullptr, SQL_NTS,
table_pattern, SQL_NTS, column_pattern, SQL_NTS));
@@ -1225,8 +1223,7 @@
}
TYPED_TEST(ColumnsTest, SQLColAttributeTestInputData) {
- SQLWCHAR wsql[] = L"SELECT 1 as col1;";
- SQLSMALLINT wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 1 as col1;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1238,9 +1235,8 @@
SQLLEN numeric_attr = 0;
// All character values populated
- EXPECT_EQ(SQL_SUCCESS,
- SQLColAttribute(this->stmt, idx, SQL_DESC_NAME, character_attr,
- std::wcslen(character_attr), &character_attr_len, nullptr));
+ EXPECT_EQ(SQL_SUCCESS, SQLColAttribute(this->stmt, idx, SQL_DESC_NAME, character_attr,
+ kOdbcBufferSize, &character_attr_len, nullptr));
// All numeric values populated
EXPECT_EQ(SQL_SUCCESS, SQLColAttribute(this->stmt, idx, SQL_DESC_COUNT, 0, 0, nullptr,
@@ -1255,8 +1251,7 @@
}
TYPED_TEST(ColumnsTest, SQLColAttributeGetCharacterLen) {
- SQLWCHAR wsql[] = L"SELECT 1 as col1;";
- SQLSMALLINT wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 1 as col1;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1271,8 +1266,7 @@
}
TYPED_TEST(ColumnsTest, SQLColAttributeInvalidFieldId) {
- SQLWCHAR wsql[] = L"SELECT 1 as col1;";
- SQLSMALLINT wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 1 as col1;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1282,18 +1276,15 @@
SQLUSMALLINT idx = 1;
SQLWCHAR character_attr[kOdbcBufferSize];
SQLSMALLINT character_attr_len = 0;
- SQLLEN numeric_attr = 0;
- ASSERT_EQ(SQL_ERROR,
- SQLColAttribute(this->stmt, idx, invalid_field_id, character_attr,
- std::wcslen(character_attr), &character_attr_len, nullptr));
+ ASSERT_EQ(SQL_ERROR, SQLColAttribute(this->stmt, idx, invalid_field_id, character_attr,
+ kOdbcBufferSize, &character_attr_len, nullptr));
// Verify invalid descriptor field identifier error state is returned
VerifyOdbcErrorState(SQL_HANDLE_STMT, this->stmt, kErrorStateHY091);
}
TYPED_TEST(ColumnsTest, SQLColAttributeInvalidColId) {
- SQLWCHAR wsql[] = L"SELECT 1 as col1;";
- SQLSMALLINT wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 1 as col1;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1303,10 +1294,9 @@
SQLWCHAR character_attr[kOdbcBufferSize];
SQLSMALLINT character_attr_len = 0;
- ASSERT_EQ(SQL_ERROR,
- SQLColAttribute(this->stmt, invalid_col_id, SQL_DESC_BASE_COLUMN_NAME,
- character_attr, std::wcslen(character_attr),
- &character_attr_len, nullptr));
+ ASSERT_EQ(SQL_ERROR, SQLColAttribute(this->stmt, invalid_col_id,
+ SQL_DESC_BASE_COLUMN_NAME, character_attr,
+ kOdbcBufferSize, &character_attr_len, nullptr));
// Verify invalid descriptor index error state is returned
VerifyOdbcErrorState(SQL_HANDLE_STMT, this->stmt, kErrorState07009);
}
@@ -1314,8 +1304,7 @@
TEST_F(ColumnsMockTest, TestSQLColAttributeAllTypes) {
CreateAllDataTypeTable();
- SQLWCHAR wsql[] = L"SELECT * from AllTypesTable;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT * from AllTypesTable;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1398,8 +1387,7 @@
// Tests ODBC 2.0 API SQLColAttributes
CreateAllDataTypeTable();
- SQLWCHAR wsql[] = L"SELECT * from AllTypesTable;";
- SQLSMALLINT wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT * from AllTypesTable;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1459,8 +1447,7 @@
TEST_F(ColumnsRemoteTest, TestSQLColAttributeAllTypes) {
// Test assumes there is a table $scratch.ODBCTest in remote server
- SQLWCHAR wsql[] = L"SELECT * from $scratch.ODBCTest;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT * from $scratch.ODBCTest;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1624,8 +1611,7 @@
#ifndef __APPLE__
TEST_F(ColumnsOdbcV2RemoteTest, TestSQLColAttributeAllTypes) {
// Test assumes there is a table $scratch.ODBCTest in remote server
- SQLWCHAR wsql[] = L"SELECT * from $scratch.ODBCTest;";
- SQLSMALLINT wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT * from $scratch.ODBCTest;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1789,8 +1775,7 @@
TEST_F(ColumnsOdbcV2RemoteTest, TestSQLColAttributesAllTypes) {
// Tests ODBC 2.0 API SQLColAttributes
// Test assumes there is a table $scratch.ODBCTest in remote server
- SQLWCHAR wsql[] = L"SELECT * from $scratch.ODBCTest;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT * from $scratch.ODBCTest;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -2240,22 +2225,20 @@
TEST_F(ColumnsMockTest, SQLDescribeColValidateInput) {
CreateTestTable();
- SQLWCHAR sql_query[] = L"SELECT * FROM TestTable LIMIT 1;";
- SQLINTEGER query_length = static_cast<SQLINTEGER>(wcslen(sql_query));
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(sql_query, L"SELECT * FROM TestTable LIMIT 1;");
SQLUSMALLINT bookmark_column = 0;
SQLUSMALLINT out_of_range_column = 4;
SQLUSMALLINT negative_column = -1;
SQLWCHAR column_name[1024] = {0};
- SQLSMALLINT buf_char_len =
- static_cast<SQLSMALLINT>(sizeof(column_name) / GetSqlWCharSize());
+ SQLSMALLINT buf_char_len = sizeof(column_name) / GetSqlWCharSize();
SQLSMALLINT name_length = 0;
SQLSMALLINT data_type = 0;
SQLULEN column_size = 0;
SQLSMALLINT decimal_digits = 0;
SQLSMALLINT nullable = 0;
- ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, query_length));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, sql_query_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(this->stmt));
@@ -2290,8 +2273,7 @@
// from SELECT AS queries
SQLWCHAR column_name[1024];
- SQLSMALLINT buf_char_len =
- static_cast<SQLSMALLINT>(sizeof(column_name) / GetSqlWCharSize());
+ SQLSMALLINT buf_char_len = sizeof(column_name) / GetSqlWCharSize();
SQLSMALLINT name_length = 0;
SQLSMALLINT column_data_type = 0;
SQLULEN column_size = 0;
@@ -2302,38 +2284,15 @@
std::wstring wsql = this->GetQueryAllDataTypes();
std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
- const SQLWCHAR* column_names[] = {static_cast<const SQLWCHAR*>(L"stiny_int_min"),
- static_cast<const SQLWCHAR*>(L"stiny_int_max"),
- static_cast<const SQLWCHAR*>(L"utiny_int_min"),
- static_cast<const SQLWCHAR*>(L"utiny_int_max"),
- static_cast<const SQLWCHAR*>(L"ssmall_int_min"),
- static_cast<const SQLWCHAR*>(L"ssmall_int_max"),
- static_cast<const SQLWCHAR*>(L"usmall_int_min"),
- static_cast<const SQLWCHAR*>(L"usmall_int_max"),
- static_cast<const SQLWCHAR*>(L"sinteger_min"),
- static_cast<const SQLWCHAR*>(L"sinteger_max"),
- static_cast<const SQLWCHAR*>(L"uinteger_min"),
- static_cast<const SQLWCHAR*>(L"uinteger_max"),
- static_cast<const SQLWCHAR*>(L"sbigint_min"),
- static_cast<const SQLWCHAR*>(L"sbigint_max"),
- static_cast<const SQLWCHAR*>(L"ubigint_min"),
- static_cast<const SQLWCHAR*>(L"ubigint_max"),
- static_cast<const SQLWCHAR*>(L"decimal_negative"),
- static_cast<const SQLWCHAR*>(L"decimal_positive"),
- static_cast<const SQLWCHAR*>(L"float_min"),
- static_cast<const SQLWCHAR*>(L"float_max"),
- static_cast<const SQLWCHAR*>(L"double_min"),
- static_cast<const SQLWCHAR*>(L"double_max"),
- static_cast<const SQLWCHAR*>(L"bit_false"),
- static_cast<const SQLWCHAR*>(L"bit_true"),
- static_cast<const SQLWCHAR*>(L"c_char"),
- static_cast<const SQLWCHAR*>(L"c_wchar"),
- static_cast<const SQLWCHAR*>(L"c_wvarchar"),
- static_cast<const SQLWCHAR*>(L"c_varchar"),
- static_cast<const SQLWCHAR*>(L"date_min"),
- static_cast<const SQLWCHAR*>(L"date_max"),
- static_cast<const SQLWCHAR*>(L"timestamp_min"),
- static_cast<const SQLWCHAR*>(L"timestamp_max")};
+ const std::wstring column_names[] = {
+ L"stiny_int_min", L"stiny_int_max", L"utiny_int_min", L"utiny_int_max",
+ L"ssmall_int_min", L"ssmall_int_max", L"usmall_int_min", L"usmall_int_max",
+ L"sinteger_min", L"sinteger_max", L"uinteger_min", L"uinteger_max",
+ L"sbigint_min", L"sbigint_max", L"ubigint_min", L"ubigint_max",
+ L"decimal_negative", L"decimal_positive", L"float_min", L"float_max",
+ L"double_min", L"double_max", L"bit_false", L"bit_true",
+ L"c_char", L"c_wchar", L"c_wvarchar", L"c_varchar",
+ L"date_min", L"date_max", L"timestamp_min", L"timestamp_max"};
SQLSMALLINT column_data_types[] = {
SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR,
SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR,
@@ -2353,7 +2312,7 @@
buf_char_len, &name_length, &column_data_type,
&column_size, &decimal_digits, &nullable));
- EXPECT_EQ(wcslen(column_names[i]), name_length);
+ EXPECT_EQ(column_names[i].length(), name_length);
std::wstring returned(column_name, column_name + name_length);
EXPECT_EQ(column_names[i], returned);
@@ -2372,8 +2331,7 @@
TEST_F(ColumnsRemoteTest, SQLDescribeColQueryAllDataTypesMetadata) {
SQLWCHAR column_name[1024];
- SQLSMALLINT buf_char_len =
- static_cast<SQLSMALLINT>(sizeof(column_name) / GetSqlWCharSize());
+ SQLSMALLINT buf_char_len = sizeof(column_name) / GetSqlWCharSize();
SQLSMALLINT name_length = 0;
SQLSMALLINT column_data_type = 0;
SQLULEN column_size = 0;
@@ -2384,38 +2342,15 @@
std::wstring wsql = this->GetQueryAllDataTypes();
std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
- const SQLWCHAR* column_names[] = {static_cast<const SQLWCHAR*>(L"stiny_int_min"),
- static_cast<const SQLWCHAR*>(L"stiny_int_max"),
- static_cast<const SQLWCHAR*>(L"utiny_int_min"),
- static_cast<const SQLWCHAR*>(L"utiny_int_max"),
- static_cast<const SQLWCHAR*>(L"ssmall_int_min"),
- static_cast<const SQLWCHAR*>(L"ssmall_int_max"),
- static_cast<const SQLWCHAR*>(L"usmall_int_min"),
- static_cast<const SQLWCHAR*>(L"usmall_int_max"),
- static_cast<const SQLWCHAR*>(L"sinteger_min"),
- static_cast<const SQLWCHAR*>(L"sinteger_max"),
- static_cast<const SQLWCHAR*>(L"uinteger_min"),
- static_cast<const SQLWCHAR*>(L"uinteger_max"),
- static_cast<const SQLWCHAR*>(L"sbigint_min"),
- static_cast<const SQLWCHAR*>(L"sbigint_max"),
- static_cast<const SQLWCHAR*>(L"ubigint_min"),
- static_cast<const SQLWCHAR*>(L"ubigint_max"),
- static_cast<const SQLWCHAR*>(L"decimal_negative"),
- static_cast<const SQLWCHAR*>(L"decimal_positive"),
- static_cast<const SQLWCHAR*>(L"float_min"),
- static_cast<const SQLWCHAR*>(L"float_max"),
- static_cast<const SQLWCHAR*>(L"double_min"),
- static_cast<const SQLWCHAR*>(L"double_max"),
- static_cast<const SQLWCHAR*>(L"bit_false"),
- static_cast<const SQLWCHAR*>(L"bit_true"),
- static_cast<const SQLWCHAR*>(L"c_char"),
- static_cast<const SQLWCHAR*>(L"c_wchar"),
- static_cast<const SQLWCHAR*>(L"c_wvarchar"),
- static_cast<const SQLWCHAR*>(L"c_varchar"),
- static_cast<const SQLWCHAR*>(L"date_min"),
- static_cast<const SQLWCHAR*>(L"date_max"),
- static_cast<const SQLWCHAR*>(L"timestamp_min"),
- static_cast<const SQLWCHAR*>(L"timestamp_max")};
+ const std::wstring column_names[] = {
+ L"stiny_int_min", L"stiny_int_max", L"utiny_int_min", L"utiny_int_max",
+ L"ssmall_int_min", L"ssmall_int_max", L"usmall_int_min", L"usmall_int_max",
+ L"sinteger_min", L"sinteger_max", L"uinteger_min", L"uinteger_max",
+ L"sbigint_min", L"sbigint_max", L"ubigint_min", L"ubigint_max",
+ L"decimal_negative", L"decimal_positive", L"float_min", L"float_max",
+ L"double_min", L"double_max", L"bit_false", L"bit_true",
+ L"c_char", L"c_wchar", L"c_wvarchar", L"c_varchar",
+ L"date_min", L"date_max", L"timestamp_min", L"timestamp_max"};
SQLSMALLINT column_data_types[] = {
SQL_INTEGER, SQL_INTEGER, SQL_INTEGER, SQL_INTEGER, SQL_INTEGER,
SQL_INTEGER, SQL_INTEGER, SQL_INTEGER, SQL_INTEGER, SQL_INTEGER,
@@ -2442,7 +2377,7 @@
buf_char_len, &name_length, &column_data_type,
&column_size, &decimal_digits, &nullable));
- EXPECT_EQ(wcslen(column_names[i]), name_length);
+ EXPECT_EQ(column_names[i].length(), name_length);
std::wstring returned(column_name, column_name + name_length);
EXPECT_EQ(column_names[i], returned);
@@ -2463,8 +2398,7 @@
// Test assumes there is a table $scratch.ODBCTest in remote server
SQLWCHAR column_name[1024];
- SQLSMALLINT buf_char_len =
- static_cast<SQLSMALLINT>(sizeof(column_name) / GetSqlWCharSize());
+ SQLSMALLINT buf_char_len = sizeof(column_name) / GetSqlWCharSize();
SQLSMALLINT name_length = 0;
SQLSMALLINT column_data_type = 0;
SQLULEN column_size = 0;
@@ -2472,25 +2406,19 @@
SQLSMALLINT nullable = 0;
size_t column_index = 0;
- SQLWCHAR sql_query[] = L"SELECT * from $scratch.ODBCTest LIMIT 1;";
- SQLINTEGER query_length = static_cast<SQLINTEGER>(wcslen(sql_query));
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(sql_query, L"SELECT * from $scratch.ODBCTest LIMIT 1;");
- const SQLWCHAR* column_names[] = {static_cast<const SQLWCHAR*>(L"sinteger_max"),
- static_cast<const SQLWCHAR*>(L"sbigint_max"),
- static_cast<const SQLWCHAR*>(L"decimal_positive"),
- static_cast<const SQLWCHAR*>(L"float_max"),
- static_cast<const SQLWCHAR*>(L"double_max"),
- static_cast<const SQLWCHAR*>(L"bit_true"),
- static_cast<const SQLWCHAR*>(L"date_max"),
- static_cast<const SQLWCHAR*>(L"time_max"),
- static_cast<const SQLWCHAR*>(L"timestamp_max")};
+ const std::wstring column_names[] = {
+ L"sinteger_max", L"sbigint_max", L"decimal_positive",
+ L"float_max", L"double_max", L"bit_true",
+ L"date_max", L"time_max", L"timestamp_max"};
SQLSMALLINT column_data_types[] = {SQL_INTEGER, SQL_BIGINT, SQL_DECIMAL,
SQL_FLOAT, SQL_DOUBLE, SQL_BIT,
SQL_TYPE_DATE, SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP};
SQLULEN column_sizes[] = {4, 8, 19, 8, 8, 1, 10, 12, 23};
SQLULEN columndecimal_digits[] = {0, 0, 0, 0, 0, 0, 10, 12, 23};
- ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, query_length));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, sql_query_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(this->stmt));
@@ -2501,7 +2429,7 @@
buf_char_len, &name_length, &column_data_type,
&column_size, &decimal_digits, &nullable));
- EXPECT_EQ(wcslen(column_names[i]), name_length);
+ EXPECT_EQ(column_names[i].length(), name_length);
std::wstring returned(column_name, column_name + name_length);
EXPECT_EQ(column_names[i], returned);
@@ -2521,8 +2449,7 @@
TEST_F(ColumnsOdbcV2RemoteTest, SQLDescribeColODBCTestTableMetadataODBCVer2) {
// Test assumes there is a table $scratch.ODBCTest in remote server
SQLWCHAR column_name[1024];
- SQLSMALLINT buf_char_len =
- static_cast<SQLSMALLINT>(sizeof(column_name) / GetSqlWCharSize());
+ SQLSMALLINT buf_char_len = sizeof(column_name) / GetSqlWCharSize();
SQLSMALLINT name_length = 0;
SQLSMALLINT column_data_type = 0;
SQLULEN column_size = 0;
@@ -2530,25 +2457,19 @@
SQLSMALLINT nullable = 0;
size_t column_index = 0;
- SQLWCHAR sql_query[] = L"SELECT * from $scratch.ODBCTest LIMIT 1;";
- SQLINTEGER query_length = static_cast<SQLINTEGER>(wcslen(sql_query));
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(sql_query, L"SELECT * from $scratch.ODBCTest LIMIT 1;");
- const SQLWCHAR* column_names[] = {static_cast<const SQLWCHAR*>(L"sinteger_max"),
- static_cast<const SQLWCHAR*>(L"sbigint_max"),
- static_cast<const SQLWCHAR*>(L"decimal_positive"),
- static_cast<const SQLWCHAR*>(L"float_max"),
- static_cast<const SQLWCHAR*>(L"double_max"),
- static_cast<const SQLWCHAR*>(L"bit_true"),
- static_cast<const SQLWCHAR*>(L"date_max"),
- static_cast<const SQLWCHAR*>(L"time_max"),
- static_cast<const SQLWCHAR*>(L"timestamp_max")};
+ const std::wstring column_names[] = {
+ L"sinteger_max", L"sbigint_max", L"decimal_positive",
+ L"float_max", L"double_max", L"bit_true",
+ L"date_max", L"time_max", L"timestamp_max"};
SQLSMALLINT column_data_types[] = {SQL_INTEGER, SQL_BIGINT, SQL_DECIMAL,
SQL_FLOAT, SQL_DOUBLE, SQL_BIT,
SQL_DATE, SQL_TIME, SQL_TIMESTAMP};
SQLULEN column_sizes[] = {4, 8, 19, 8, 8, 1, 10, 12, 23};
SQLULEN columndecimal_digits[] = {0, 0, 0, 0, 0, 0, 10, 12, 23};
- ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, query_length));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, sql_query_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(this->stmt));
@@ -2559,7 +2480,7 @@
buf_char_len, &name_length, &column_data_type,
&column_size, &decimal_digits, &nullable));
- EXPECT_EQ(wcslen(column_names[i]), name_length);
+ EXPECT_EQ(column_names[i].length(), name_length);
std::wstring returned(column_name, column_name + name_length);
EXPECT_EQ(column_names[i], returned);
@@ -2580,8 +2501,7 @@
CreateAllDataTypeTable();
SQLWCHAR column_name[1024];
- SQLSMALLINT buf_char_len =
- static_cast<SQLSMALLINT>(sizeof(column_name) / GetSqlWCharSize());
+ SQLSMALLINT buf_char_len = sizeof(column_name) / GetSqlWCharSize();
SQLSMALLINT name_length = 0;
SQLSMALLINT column_data_type = 0;
SQLULEN column_size = 0;
@@ -2589,17 +2509,14 @@
SQLSMALLINT nullable = 0;
size_t column_index = 0;
- SQLWCHAR sql_query[] = L"SELECT * from AllTypesTable LIMIT 1;";
- SQLINTEGER query_length = static_cast<SQLINTEGER>(wcslen(sql_query));
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(sql_query, L"SELECT * from AllTypesTable LIMIT 1;");
- const SQLWCHAR* column_names[] = {static_cast<const SQLWCHAR*>(L"bigint_col"),
- static_cast<const SQLWCHAR*>(L"char_col"),
- static_cast<const SQLWCHAR*>(L"varbinary_col"),
- static_cast<const SQLWCHAR*>(L"double_col")};
+ const std::wstring column_names[] = {L"bigint_col", L"char_col", L"varbinary_col",
+ L"double_col"};
SQLSMALLINT column_data_types[] = {SQL_BIGINT, SQL_WVARCHAR, SQL_BINARY, SQL_DOUBLE};
SQLULEN column_sizes[] = {8, 0, 0, 8};
- ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, query_length));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, sql_query_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(this->stmt));
@@ -2610,7 +2527,7 @@
buf_char_len, &name_length, &column_data_type,
&column_size, &decimal_digits, &nullable));
- EXPECT_EQ(wcslen(column_names[i]), name_length);
+ EXPECT_EQ(column_names[i].length(), name_length);
std::wstring returned(column_name, column_name + name_length);
EXPECT_EQ(column_names[i], returned);
@@ -2633,8 +2550,7 @@
CreateUnicodeTable();
SQLWCHAR column_name[1024];
- SQLSMALLINT buf_char_len =
- static_cast<SQLSMALLINT>(sizeof(column_name) / GetSqlWCharSize());
+ SQLSMALLINT buf_char_len = sizeof(column_name) / GetSqlWCharSize();
SQLSMALLINT name_length = 0;
SQLSMALLINT column_data_type = 0;
SQLULEN column_size = 0;
@@ -2642,14 +2558,13 @@
SQLSMALLINT nullable = 0;
size_t column_index = 1;
- SQLWCHAR sql_query[] = L"SELECT * from 数据 LIMIT 1;";
- SQLINTEGER query_length = static_cast<SQLINTEGER>(wcslen(sql_query));
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(sql_query, L"SELECT * from 数据 LIMIT 1;");
- SQLWCHAR expected_column_name[] = L"资料";
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(expected_column_name, L"资料");
SQLSMALLINT expected_column_data_type = SQL_WVARCHAR;
SQLULEN expected_column_size = 0;
- ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, query_length));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, sql_query_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(this->stmt));
@@ -2657,12 +2572,13 @@
buf_char_len, &name_length, &column_data_type,
&column_size, &decimal_digits, &nullable));
- EXPECT_EQ(name_length, wcslen(expected_column_name));
+ EXPECT_EQ(name_length, expected_column_name_len);
std::wstring returned(column_name, column_name + name_length);
- EXPECT_EQ(returned, expected_column_name);
- EXPECT_EQ(column_data_type, expected_column_data_type);
- EXPECT_EQ(column_size, expected_column_size);
+ std::wstring expected_col_name_str = ConvertToWString(expected_column_name);
+ EXPECT_EQ(expected_col_name_str, returned);
+ EXPECT_EQ(expected_column_data_type, column_data_type);
+ EXPECT_EQ(expected_column_size, column_size);
EXPECT_EQ(0, decimal_digits);
EXPECT_EQ(SQL_NULLABLE, nullable);
@@ -2671,8 +2587,7 @@
TYPED_TEST(ColumnsTest, SQLColumnsGetMetadataBySQLDescribeCol) {
SQLWCHAR column_name[1024];
- SQLSMALLINT buf_char_len =
- static_cast<SQLSMALLINT>(sizeof(column_name) / GetSqlWCharSize());
+ SQLSMALLINT buf_char_len = sizeof(column_name) / GetSqlWCharSize();
SQLSMALLINT name_length = 0;
SQLSMALLINT column_data_type = 0;
SQLULEN column_size = 0;
@@ -2680,24 +2595,12 @@
SQLSMALLINT nullable = 0;
size_t column_index = 0;
- const SQLWCHAR* column_names[] = {static_cast<const SQLWCHAR*>(L"TABLE_CAT"),
- static_cast<const SQLWCHAR*>(L"TABLE_SCHEM"),
- static_cast<const SQLWCHAR*>(L"TABLE_NAME"),
- static_cast<const SQLWCHAR*>(L"COLUMN_NAME"),
- static_cast<const SQLWCHAR*>(L"DATA_TYPE"),
- static_cast<const SQLWCHAR*>(L"TYPE_NAME"),
- static_cast<const SQLWCHAR*>(L"COLUMN_SIZE"),
- static_cast<const SQLWCHAR*>(L"BUFFER_LENGTH"),
- static_cast<const SQLWCHAR*>(L"DECIMAL_DIGITS"),
- static_cast<const SQLWCHAR*>(L"NUM_PREC_RADIX"),
- static_cast<const SQLWCHAR*>(L"NULLABLE"),
- static_cast<const SQLWCHAR*>(L"REMARKS"),
- static_cast<const SQLWCHAR*>(L"COLUMN_DEF"),
- static_cast<const SQLWCHAR*>(L"SQL_DATA_TYPE"),
- static_cast<const SQLWCHAR*>(L"SQL_DATETIME_SUB"),
- static_cast<const SQLWCHAR*>(L"CHAR_OCTET_LENGTH"),
- static_cast<const SQLWCHAR*>(L"ORDINAL_POSITION"),
- static_cast<const SQLWCHAR*>(L"IS_NULLABLE")};
+ const std::wstring column_names[] = {
+ L"TABLE_CAT", L"TABLE_SCHEM", L"TABLE_NAME", L"COLUMN_NAME",
+ L"DATA_TYPE", L"TYPE_NAME", L"COLUMN_SIZE", L"BUFFER_LENGTH",
+ L"DECIMAL_DIGITS", L"NUM_PREC_RADIX", L"NULLABLE", L"REMARKS",
+ L"COLUMN_DEF", L"SQL_DATA_TYPE", L"SQL_DATETIME_SUB", L"CHAR_OCTET_LENGTH",
+ L"ORDINAL_POSITION", L"IS_NULLABLE"};
SQLSMALLINT column_data_types[] = {
SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR, SQL_SMALLINT, SQL_WVARCHAR,
SQL_INTEGER, SQL_INTEGER, SQL_SMALLINT, SQL_SMALLINT, SQL_SMALLINT, SQL_WVARCHAR,
@@ -2715,7 +2618,7 @@
buf_char_len, &name_length, &column_data_type,
&column_size, &decimal_digits, &nullable));
- EXPECT_EQ(wcslen(column_names[i]), name_length);
+ EXPECT_EQ(column_names[i].length(), name_length);
std::wstring returned(column_name, column_name + name_length);
EXPECT_EQ(column_names[i], returned);
@@ -2734,8 +2637,7 @@
TYPED_TEST(ColumnsOdbcV2Test, SQLColumnsGetMetadataBySQLDescribeColODBCVer2) {
SQLWCHAR column_name[1024];
- SQLSMALLINT buf_char_len =
- static_cast<SQLSMALLINT>(sizeof(column_name) / GetSqlWCharSize());
+ SQLSMALLINT buf_char_len = sizeof(column_name) / GetSqlWCharSize();
SQLSMALLINT name_length = 0;
SQLSMALLINT column_data_type = 0;
SQLULEN column_size = 0;
@@ -2743,24 +2645,24 @@
SQLSMALLINT nullable = 0;
size_t column_index = 0;
- const SQLWCHAR* column_names[] = {static_cast<const SQLWCHAR*>(L"TABLE_QUALIFIER"),
- static_cast<const SQLWCHAR*>(L"TABLE_OWNER"),
- static_cast<const SQLWCHAR*>(L"TABLE_NAME"),
- static_cast<const SQLWCHAR*>(L"COLUMN_NAME"),
- static_cast<const SQLWCHAR*>(L"DATA_TYPE"),
- static_cast<const SQLWCHAR*>(L"TYPE_NAME"),
- static_cast<const SQLWCHAR*>(L"PRECISION"),
- static_cast<const SQLWCHAR*>(L"LENGTH"),
- static_cast<const SQLWCHAR*>(L"SCALE"),
- static_cast<const SQLWCHAR*>(L"RADIX"),
- static_cast<const SQLWCHAR*>(L"NULLABLE"),
- static_cast<const SQLWCHAR*>(L"REMARKS"),
- static_cast<const SQLWCHAR*>(L"COLUMN_DEF"),
- static_cast<const SQLWCHAR*>(L"SQL_DATA_TYPE"),
- static_cast<const SQLWCHAR*>(L"SQL_DATETIME_SUB"),
- static_cast<const SQLWCHAR*>(L"CHAR_OCTET_LENGTH"),
- static_cast<const SQLWCHAR*>(L"ORDINAL_POSITION"),
- static_cast<const SQLWCHAR*>(L"IS_NULLABLE")};
+ const std::wstring column_names[] = {L"TABLE_QUALIFIER",
+ L"TABLE_OWNER",
+ L"TABLE_NAME",
+ L"COLUMN_NAME",
+ L"DATA_TYPE",
+ L"TYPE_NAME",
+ L"PRECISION",
+ L"LENGTH",
+ L"SCALE",
+ L"RADIX",
+ L"NULLABLE",
+ L"REMARKS",
+ L"COLUMN_DEF",
+ L"SQL_DATA_TYPE",
+ L"SQL_DATETIME_SUB",
+ L"CHAR_OCTET_LENGTH",
+ L"ORDINAL_POSITION",
+ L"IS_NULLABLE"};
SQLSMALLINT column_data_types[] = {
SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR, SQL_SMALLINT, SQL_WVARCHAR,
SQL_INTEGER, SQL_INTEGER, SQL_SMALLINT, SQL_SMALLINT, SQL_SMALLINT, SQL_WVARCHAR,
@@ -2778,7 +2680,7 @@
buf_char_len, &name_length, &column_data_type,
&column_size, &decimal_digits, &nullable));
- EXPECT_EQ(wcslen(column_names[i]), name_length);
+ EXPECT_EQ(column_names[i].length(), name_length);
std::wstring returned(column_name, column_name + name_length);
EXPECT_EQ(column_names[i], returned);
diff --git a/cpp/src/arrow/flight/sql/odbc/tests/connection_info_test.cc b/cpp/src/arrow/flight/sql/odbc/tests/connection_info_test.cc
index 2f566bf..257e8af 100644
--- a/cpp/src/arrow/flight/sql/odbc/tests/connection_info_test.cc
+++ b/cpp/src/arrow/flight/sql/odbc/tests/connection_info_test.cc
@@ -64,8 +64,8 @@
}
// Get SQLWCHAR return value
-void GetInfo(SQLHDBC connection, SQLUSMALLINT info_type, SQLWCHAR* value,
- SQLSMALLINT buf_len = kOdbcBufferSize) {
+void GetInfoSQLWCHAR(SQLHDBC connection, SQLUSMALLINT info_type, SQLWCHAR* value,
+ SQLSMALLINT buf_len = kOdbcBufferSize) {
SQLSMALLINT message_length;
ASSERT_EQ(SQL_SUCCESS,
@@ -75,7 +75,7 @@
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoTruncation) {
static constexpr int info_len = 1;
- SQLWCHAR value[info_len] = L"";
+ SQLWCHAR value[info_len] = {};
SQLSMALLINT message_length;
ASSERT_EQ(SQL_SUCCESS_WITH_INFO,
@@ -135,10 +135,11 @@
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDataSourceName) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_DATA_SOURCE_NAME, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_DATA_SOURCE_NAME, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L""), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L""), result);
}
#ifdef SQL_DRIVER_AWARE_POOLING_SUPPORTED
@@ -207,24 +208,27 @@
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDriverName) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_DRIVER_NAME, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_DRIVER_NAME, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"Arrow Flight ODBC Driver"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"Arrow Flight ODBC Driver"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDriverOdbcVer) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_DRIVER_ODBC_VER, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_DRIVER_ODBC_VER, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"03.80"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"03.80"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDriverVer) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_DRIVER_VER, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_DRIVER_VER, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"00.09.0000.0"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"00.09.0000.0"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDynamicCursorAttributes1) {
@@ -322,13 +326,15 @@
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoOdbcVer) {
// This is implemented only in the Driver Manager.
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_ODBC_VER, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_ODBC_VER, value);
+
+ std::wstring result = ConvertToWString(value);
#ifdef __APPLE__
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"03.52.0000"), value);
+ EXPECT_EQ(std::wstring(L"03.52.0000"), result);
#else
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"03.80.0000"), value);
+ EXPECT_EQ(std::wstring(L"03.80.0000"), result);
#endif // __APPLE__
}
@@ -347,24 +353,27 @@
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoRowUpdates) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_ROW_UPDATES, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_ROW_UPDATES, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"N"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"N"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoSearchPatternEscape) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_SEARCH_PATTERN_ESCAPE, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_SEARCH_PATTERN_ESCAPE, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"\\"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"\\"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoServerName) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_SERVER_NAME, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_SERVER_NAME, value);
- EXPECT_GT(wcslen(value), 0);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_GT(result.length(), 0);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoStaticCursorAttributes1) {
@@ -384,40 +393,45 @@
// DBMS Product Information
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDatabaseName) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_DATABASE_NAME, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_DATABASE_NAME, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L""), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L""), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDbmsName) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_DBMS_NAME, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_DBMS_NAME, value);
- EXPECT_GT(wcslen(value), 0);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_GT(result.length(), 0);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDbmsVer) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_DBMS_VER, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_DBMS_VER, value);
- EXPECT_GT(wcslen(value), 0);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_GT(result.length(), 0);
}
// Data Source Information
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoAccessibleProcedures) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_ACCESSIBLE_PROCEDURES, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_ACCESSIBLE_PROCEDURES, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"N"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"N"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoAccessibleTables) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_ACCESSIBLE_TABLES, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_ACCESSIBLE_TABLES, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"Y"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"Y"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoBookmarkPersistence) {
@@ -428,17 +442,19 @@
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoCatalogTerm) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_CATALOG_TERM, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_CATALOG_TERM, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L""), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L""), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoCollationSeq) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_COLLATION_SEQ, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_COLLATION_SEQ, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L""), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L""), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoConcatNullBehavior) {
@@ -470,10 +486,11 @@
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDataSourceReadOnly) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_DATA_SOURCE_READ_ONLY, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_DATA_SOURCE_READ_ONLY, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"N"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"N"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDefaultTxnIsolation) {
@@ -484,31 +501,35 @@
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDescribeParameter) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_DESCRIBE_PARAMETER, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_DESCRIBE_PARAMETER, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"N"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"N"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoMultResultSets) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_MULT_RESULT_SETS, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_MULT_RESULT_SETS, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"N"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"N"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoMultipleActiveTxn) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_MULTIPLE_ACTIVE_TXN, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_MULTIPLE_ACTIVE_TXN, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"N"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"N"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoNeedLongDataLen) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_NEED_LONG_DATA_LEN, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_NEED_LONG_DATA_LEN, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"N"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"N"), result);
}
TEST_F(ConnectionInfoMockTest, TestSQLGetInfoNullCollation) {
@@ -518,17 +539,19 @@
}
TEST_F(ConnectionInfoMockTest, TestSQLGetInfoProcedureTerm) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_PROCEDURE_TERM, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_PROCEDURE_TERM, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L""), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L""), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoSchemaTerm) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_SCHEMA_TERM, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_SCHEMA_TERM, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"schema"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"schema"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoScrollOptions) {
@@ -539,10 +562,11 @@
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoTableTerm) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_TABLE_TERM, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_TABLE_TERM, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"table"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"table"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoTxnCapable) {
@@ -560,10 +584,11 @@
}
TEST_F(ConnectionInfoMockTest, TestSQLGetInfoUserName) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_USER_NAME, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_USER_NAME, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L""), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L""), result);
}
// Supported SQL
@@ -606,17 +631,19 @@
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoCatalogName) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_CATALOG_NAME, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_CATALOG_NAME, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"N"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"N"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoCatalogNameSeparator) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_CATALOG_NAME_SEPARATOR, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_CATALOG_NAME_SEPARATOR, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L""), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L""), result);
}
TEST_F(ConnectionInfoMockTest, TestSQLGetInfoCatalogUsage) {
@@ -627,10 +654,11 @@
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoColumnAlias) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_COLUMN_ALIAS, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_COLUMN_ALIAS, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"Y"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"Y"), result);
}
TEST_F(ConnectionInfoMockTest, TestSQLGetInfoCorrelationName) {
@@ -767,10 +795,11 @@
}
TEST_F(ConnectionInfoMockTest, TestSQLGetInfoExpressionsInOrderby) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_EXPRESSIONS_IN_ORDERBY, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_EXPRESSIONS_IN_ORDERBY, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"N"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"N"), result);
}
TEST_F(ConnectionInfoMockTest, TestSQLGetInfoGroupBy) {
@@ -788,10 +817,11 @@
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoIdentifierQuoteChar) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_IDENTIFIER_QUOTE_CHAR, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_IDENTIFIER_QUOTE_CHAR, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"\""), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"\""), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoIndexKeywords) {
@@ -810,26 +840,29 @@
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoIntegrity) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_INTEGRITY, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_INTEGRITY, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"N"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"N"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoKeywords) {
// Keyword strings can require 10000 buffer length
static constexpr int info_len = kOdbcBufferSize * 10;
- SQLWCHAR value[info_len] = L"";
- GetInfo(this->conn, SQL_KEYWORDS, value, info_len);
+ SQLWCHAR value[info_len] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_KEYWORDS, value, info_len);
- EXPECT_GT(wcslen(value), 0);
+ std::wstring result = ConvertToWString(value, -1, info_len);
+ EXPECT_GT(result.length(), 0);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoLikeEscapeClause) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_LIKE_ESCAPE_CLAUSE, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_LIKE_ESCAPE_CLAUSE, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"Y"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"Y"), result);
}
TEST_F(ConnectionInfoMockTest, TestSQLGetInfoNonNullableColumns) {
@@ -847,24 +880,27 @@
}
TEST_F(ConnectionInfoMockTest, TestSQLGetInfoOrderByColumnsInSelect) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_ORDER_BY_COLUMNS_IN_SELECT, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_ORDER_BY_COLUMNS_IN_SELECT, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"Y"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"Y"), result);
}
TEST_F(ConnectionInfoMockTest, TestSQLGetInfoOuterJoins) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_OUTER_JOINS, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_OUTER_JOINS, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"N"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"N"), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoProcedures) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_PROCEDURES, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_PROCEDURES, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"N"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"N"), result);
}
TEST_F(ConnectionInfoMockTest, TestSQLGetInfoQuotedIdentifierCase) {
@@ -882,10 +918,11 @@
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoSpecialCharacters) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_SPECIAL_CHARACTERS, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_SPECIAL_CHARACTERS, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L""), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L""), result);
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoSqlConformance) {
@@ -1005,17 +1042,19 @@
}
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoMaxRowSize) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_MAX_ROW_SIZE, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_MAX_ROW_SIZE, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L""), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L""), result);
}
TEST_F(ConnectionInfoMockTest, TestSQLGetInfoMaxRowSizeIncludesLong) {
- SQLWCHAR value[kOdbcBufferSize] = L"";
- GetInfo(this->conn, SQL_MAX_ROW_SIZE_INCLUDES_LONG, value);
+ SQLWCHAR value[kOdbcBufferSize] = {};
+ GetInfoSQLWCHAR(this->conn, SQL_MAX_ROW_SIZE_INCLUDES_LONG, value);
- EXPECT_STREQ(static_cast<const SQLWCHAR*>(L"N"), value);
+ std::wstring result = ConvertToWString(value);
+ EXPECT_EQ(std::wstring(L"N"), result);
}
TEST_F(ConnectionInfoMockTest, TestSQLGetInfoMaxSchemaNameLen) {
diff --git a/cpp/src/arrow/flight/sql/odbc/tests/connection_test.cc b/cpp/src/arrow/flight/sql/odbc/tests/connection_test.cc
index 0b9b553..837c18c 100644
--- a/cpp/src/arrow/flight/sql/odbc/tests/connection_test.cc
+++ b/cpp/src/arrow/flight/sql/odbc/tests/connection_test.cc
@@ -224,7 +224,7 @@
arrow::util::UTF8ToWideString(connect_str));
std::vector<SQLWCHAR> connect_str0(wconnect_str.begin(), wconnect_str.end());
- SQLWCHAR out_str[kOdbcBufferSize] = L"";
+ SQLWCHAR out_str[kOdbcBufferSize] = {};
SQLSMALLINT out_str_len;
// Connecting to ODBC server.
@@ -266,7 +266,7 @@
arrow::util::UTF8ToWideString(connect_str));
std::vector<SQLWCHAR> connect_str0(wconnect_str.begin(), wconnect_str.end());
- SQLWCHAR out_str[kOdbcBufferSize] = L"";
+ SQLWCHAR out_str[kOdbcBufferSize] = {};
SQLSMALLINT out_str_len;
// Connecting to ODBC server.
@@ -484,7 +484,7 @@
arrow::util::UTF8ToWideString(connect_str));
std::vector<SQLWCHAR> connect_str0(wconnect_str.begin(), wconnect_str.end());
- SQLWCHAR out_str[kOdbcBufferSize] = L"";
+ SQLWCHAR out_str[kOdbcBufferSize] = {};
SQLSMALLINT out_str_len;
// Connecting to ODBC server.
diff --git a/cpp/src/arrow/flight/sql/odbc/tests/errors_test.cc b/cpp/src/arrow/flight/sql/odbc/tests/errors_test.cc
index 8cb826d..0a01035 100644
--- a/cpp/src/arrow/flight/sql/odbc/tests/errors_test.cc
+++ b/cpp/src/arrow/flight/sql/odbc/tests/errors_test.cc
@@ -253,7 +253,8 @@
// API not implemented error from driver manager
EXPECT_EQ(kErrorStateIM001, SqlWcharToString(sql_state));
- EXPECT_FALSE(std::wstring(message).empty());
+ std::string msg = SqlWcharToString(message);
+ EXPECT_FALSE(msg.empty());
// Free descriptor handle
EXPECT_EQ(SQL_SUCCESS, SQLFreeHandle(SQL_HANDLE_DESC, descriptor));
@@ -291,7 +292,8 @@
EXPECT_EQ(kErrorState28000, SqlWcharToString(sql_state));
- EXPECT_FALSE(std::wstring(message).empty());
+ std::string msg = SqlWcharToString(message);
+ EXPECT_FALSE(msg.empty());
}
TYPED_TEST(ErrorsTest, TestSQLGetDiagRecInputData) {
@@ -370,7 +372,8 @@
// Function sequence error state from driver manager
EXPECT_EQ(kErrorStateHY010, SqlWcharToString(sql_state));
- EXPECT_FALSE(std::wstring(message).empty());
+ std::string msg = SqlWcharToString(message);
+ EXPECT_FALSE(msg.empty());
}
TYPED_TEST(ErrorsTest, TestSQLErrorConnError) {
@@ -397,7 +400,8 @@
// optional feature not supported error state
EXPECT_EQ(kErrorStateHYC00, SqlWcharToString(sql_state));
- EXPECT_FALSE(std::wstring(message).empty());
+ std::string msg = SqlWcharToString(message);
+ EXPECT_FALSE(msg.empty());
}
TYPED_TEST(ErrorsTest, TestSQLErrorStmtError) {
@@ -406,8 +410,7 @@
// When application passes buffer length greater than SQL_MAX_MESSAGE_LENGTH (512),
// DM passes 512 as buffer length to SQLError.
- SQLWCHAR wsql[] = L"1";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"1");
ASSERT_EQ(SQL_ERROR, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -426,14 +429,14 @@
EXPECT_EQ(kErrorStateHY000, SqlWcharToString(sql_state));
- EXPECT_FALSE(std::wstring(message).empty());
+ std::string msg = SqlWcharToString(message);
+ EXPECT_FALSE(msg.empty());
}
TYPED_TEST(ErrorsTest, TestSQLErrorStmtWarning) {
// Test ODBC 2.0 API SQLError.
- SQLWCHAR wsql[] = L"SELECT 'VERY LONG STRING here' AS string_col;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 'VERY LONG STRING here' AS string_col;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -462,7 +465,8 @@
// Verify string truncation warning is reported
EXPECT_EQ(kErrorState01004, SqlWcharToString(sql_state));
- EXPECT_FALSE(std::wstring(message).empty());
+ std::string msg = SqlWcharToString(message);
+ EXPECT_FALSE(msg.empty());
}
TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorEnvErrorFromDriverManager) {
@@ -495,7 +499,8 @@
EXPECT_EQ(kErrorStateHY010, SqlWcharToString(sql_state));
#endif // _WIN32
- EXPECT_FALSE(std::wstring(message).empty());
+ std::string msg = SqlWcharToString(message);
+ EXPECT_FALSE(msg.empty());
}
#ifndef __APPLE__
@@ -528,7 +533,8 @@
// optional feature not supported error state. Driver Manager maps state to S1C00
EXPECT_EQ(kErrorStateS1C00, SqlWcharToString(sql_state));
- EXPECT_FALSE(std::wstring(message).empty());
+ std::string msg = SqlWcharToString(message);
+ EXPECT_FALSE(msg.empty());
}
#endif // __APPLE__
@@ -538,8 +544,7 @@
// When application passes buffer length greater than SQL_MAX_MESSAGE_LENGTH (512),
// DM passes 512 as buffer length to SQLError.
- SQLWCHAR wsql[] = L"SELECT * from non_existent_table;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT * from non_existent_table;");
ASSERT_EQ(SQL_ERROR, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -557,14 +562,14 @@
// Driver Manager maps error state to S1000
EXPECT_EQ(kErrorStateS1000, SqlWcharToString(sql_state));
- EXPECT_FALSE(std::wstring(message).empty());
+ std::string msg = SqlWcharToString(message);
+ EXPECT_FALSE(msg.empty());
}
TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorStmtWarning) {
// Test ODBC 2.0 API SQLError.
- SQLWCHAR wsql[] = L"SELECT 'VERY LONG STRING here' AS string_col;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 'VERY LONG STRING here' AS string_col;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -593,7 +598,8 @@
// Verify string truncation warning is reported
EXPECT_EQ(kErrorState01004, SqlWcharToString(sql_state));
- EXPECT_FALSE(std::wstring(message).empty());
+ std::string msg = SqlWcharToString(message);
+ EXPECT_FALSE(msg.empty());
}
} // namespace arrow::flight::sql::odbc
diff --git a/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc b/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc
index 8fa41de..3125c18 100644
--- a/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc
+++ b/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc
@@ -539,8 +539,8 @@
}
std::string driver = config.Get(FlightSqlConnection::DRIVER);
- std::wstring w_driver = arrow::util::UTF8ToWideString(driver).ValueOr(L"");
- return RegisterDsn(config, w_driver.c_str());
+ CONVERT_SQLWCHAR_STR(w_driver, driver);
+ return RegisterDsn(config, reinterpret_cast<LPCWSTR>(w_driver.c_str()));
}
std::wstring GetStringColumnW(SQLHSTMT stmt, int col_id) {
@@ -559,13 +559,45 @@
return std::wstring(buf, buf + char_count);
}
-std::wstring ConvertToWString(const std::vector<SQLWCHAR>& str_val, SQLSMALLINT str_len) {
+size_t SqlWCharArrLen(const SQLWCHAR* str_val) {
+ if (!str_val) {
+ return 0;
+ }
+ const SQLWCHAR* p = str_val;
+ while (*p != 0) {
+ ++p;
+ }
+ return static_cast<size_t>(p - str_val);
+}
+
+std::wstring ConvertToWString(const SQLWCHAR* str_val, SQLSMALLINT str_len,
+ SQLSMALLINT buffer_size) {
+ if (str_len == -1) {
+#ifdef __linux__
+ str_len = SqlWCharArrLen(str_val);
+#else // Windows & Mac
+ str_len = std::wcslen(str_val);
+#endif
+ }
std::wstring attr_str;
if (str_len == 0) {
- attr_str = std::wstring(&str_val[0]);
+ attr_str = L"";
+ } else {
+ assert(str_val != nullptr);
+ assert(str_len > 0 && str_len <= buffer_size);
+ attr_str.assign(str_val, str_val + str_len);
+ }
+ return attr_str;
+}
+
+std::wstring ConvertToWString(const std::vector<SQLWCHAR>& str_val, SQLSMALLINT str_len,
+ SQLSMALLINT buffer_size) {
+ std::wstring attr_str;
+ if (str_len == 0) {
+ attr_str = L"";
} else {
EXPECT_GT(str_len, 0);
- EXPECT_LE(str_len, static_cast<SQLSMALLINT>(kOdbcBufferSize));
+ EXPECT_LE(str_len, buffer_size);
attr_str =
std::wstring(str_val.begin(), str_val.begin() + str_len / GetSqlWCharSize());
}
diff --git a/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.h b/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.h
index 3f361b5..f4de85f 100644
--- a/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.h
+++ b/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.h
@@ -38,6 +38,23 @@
// For DSN registration
#include "arrow/flight/sql/odbc/odbc_impl/system_dsn.h"
+#ifdef __linux__
+# define ASSIGN_SQLWCHAR_ARR(name, wstring_literal) \
+ auto name##_vec = ODBC::ToSqlWCharVector(std::wstring(wstring_literal)); \
+ if (name##_vec.empty() || name##_vec.back() != static_cast<SQLWCHAR>(0)) { \
+ name##_vec.push_back(static_cast<SQLWCHAR>(0)); \
+ } \
+ SQLWCHAR* name = name##_vec.data();
+# define ASSIGN_SQLWCHAR_ARR_AND_LEN(name, wstring_literal) \
+ ASSIGN_SQLWCHAR_ARR(name, wstring_literal) \
+ SQLSMALLINT name##_len = static_cast<SQLSMALLINT>(name##_vec.size() - 1);
+#else // Windows & Mac
+# define ASSIGN_SQLWCHAR_ARR(name, wstring_literal) SQLWCHAR name[] = wstring_literal;
+# define ASSIGN_SQLWCHAR_ARR_AND_LEN(name, wstring_literal) \
+ ASSIGN_SQLWCHAR_ARR(name, wstring_literal) \
+ SQLSMALLINT name##_len = static_cast<SQLSMALLINT>(std::wcslen(name));
+#endif
+
static constexpr std::string_view kTestConnectStr = "ARROW_FLIGHT_SQL_ODBC_CONN";
static constexpr std::string_view kTestDsn = "Apache Arrow Flight SQL Test DSN";
@@ -278,11 +295,26 @@
/// \return wstring
std::wstring GetStringColumnW(SQLHSTMT stmt, int col_id);
+/// \brief Get length of wide char array.
+/// \param[in] str_val Array of SQLWCHAR.
+/// \return number of wide characters in array
+size_t SqlWCharArrLen(const SQLWCHAR* str_val);
+
+/// \brief Check wide char array and convert into wstring
+/// \param[in] str_val Array of SQLWCHAR.
+/// \param[in] str_len length of string, in number of characters.
+/// \param[in] buffer_size size of underlying buffer, in number of characters.
+/// \return wstring
+std::wstring ConvertToWString(const SQLWCHAR* str_val, SQLSMALLINT str_len = -1,
+ SQLSMALLINT buffer_size = kOdbcBufferSize);
+
/// \brief Check wide char vector and convert into wstring
/// \param[in] str_val Vector of SQLWCHAR.
/// \param[in] str_len length of string, in bytes.
+/// \param[in] buffer_size size of underlying buffer, in number of characters.
/// \return wstring
-std::wstring ConvertToWString(const std::vector<SQLWCHAR>& str_val, SQLSMALLINT str_len);
+std::wstring ConvertToWString(const std::vector<SQLWCHAR>& str_val, SQLSMALLINT str_len,
+ SQLSMALLINT buffer_size = kOdbcBufferSize);
/// \brief Check wide string column.
/// \param[in] stmt Statement.
diff --git a/cpp/src/arrow/flight/sql/odbc/tests/statement_attr_test.cc b/cpp/src/arrow/flight/sql/odbc/tests/statement_attr_test.cc
index 812755e..6903ce0 100644
--- a/cpp/src/arrow/flight/sql/odbc/tests/statement_attr_test.cc
+++ b/cpp/src/arrow/flight/sql/odbc/tests/statement_attr_test.cc
@@ -334,8 +334,7 @@
}
TYPED_TEST(StatementAttributeTest, TestSQLGetStmtAttrRowNumber) {
- SQLWCHAR wsql[] = L"SELECT 1;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 1;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
diff --git a/cpp/src/arrow/flight/sql/odbc/tests/statement_test.cc b/cpp/src/arrow/flight/sql/odbc/tests/statement_test.cc
index 45a0ef3..5bf9ef1 100644
--- a/cpp/src/arrow/flight/sql/odbc/tests/statement_test.cc
+++ b/cpp/src/arrow/flight/sql/odbc/tests/statement_test.cc
@@ -38,8 +38,7 @@
TYPED_TEST_SUITE(StatementTest, TestTypes);
TYPED_TEST(StatementTest, TestSQLExecDirectSimpleQuery) {
- SQLWCHAR wsql[] = L"SELECT 1;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 1;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -65,8 +64,7 @@
}
TYPED_TEST(StatementTest, TestSQLExecDirectInvalidQuery) {
- SQLWCHAR wsql[] = L"SELECT;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT;");
ASSERT_EQ(SQL_ERROR, SQLExecDirect(this->stmt, wsql, wsql_len));
// ODBC provides generic error code HY000 to all statement errors
@@ -74,8 +72,7 @@
}
TYPED_TEST(StatementTest, TestSQLExecuteSimpleQuery) {
- SQLWCHAR wsql[] = L"SELECT 1;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 1;");
ASSERT_EQ(SQL_SUCCESS, SQLPrepare(this->stmt, wsql, wsql_len));
@@ -104,8 +101,7 @@
}
TYPED_TEST(StatementTest, TestSQLPrepareInvalidQuery) {
- SQLWCHAR wsql[] = L"SELECT;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT;");
ASSERT_EQ(SQL_ERROR, SQLPrepare(this->stmt, wsql, wsql_len));
// ODBC provides generic error code HY000 to all statement errors
@@ -360,12 +356,11 @@
// Mock server test is skipped due to limitation on the mock server.
// Time type from mock server does not include the fraction
- SQLWCHAR wsql[] =
- LR"(
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql,
+ LR"(
SELECT CAST(TIME '00:00:00' AS TIME) AS time_min,
CAST(TIME '23:59:59' AS TIME) AS time_max;
- )";
- SQLSMALLINT wsql_len = std::wcslen(wsql);
+ )");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -394,8 +389,7 @@
// Have binary test on mock test base as remote test servers tend to have different
// formats for binary data
- SQLWCHAR wsql[] = L"SELECT X'ABCDEF' AS c_varbinary;";
- SQLSMALLINT wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT X'ABCDEF' AS c_varbinary;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -601,12 +595,11 @@
// Mock server test is skipped due to limitation on the mock server.
// Time type from mock server does not include the fraction
- SQLWCHAR wsql[] =
- LR"(
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql,
+ LR"(
SELECT CAST(TIME '00:00:00' AS TIME) AS time_min,
CAST(TIME '23:59:59' AS TIME) AS time_max;
- )";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ )");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -636,8 +629,7 @@
// Mock server has type `DENSE_UNION` for varbinary.
// Note that not all remote servers support "from_hex" function
- SQLWCHAR wsql[] = L"SELECT from_hex('ABCDEF') AS c_varbinary;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT from_hex('ABCDEF') AS c_varbinary;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -657,8 +649,7 @@
// TODO(GH-48730): Enable this test when ARD/IRD descriptor support is fully implemented
TYPED_TEST(StatementTest, DISABLED_TestGetDataPrecisionScaleUsesIRDAsDefault) {
// Verify that SQLGetData uses IRD precision/scale as defaults when ARD values are unset
- SQLWCHAR wsql[] = L"SELECT CAST('123.45' AS NUMERIC) as decimal_col;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT CAST('123.45' AS NUMERIC) as decimal_col;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -704,8 +695,7 @@
TYPED_TEST(StatementTest, DISABLED_TestGetDataPrecisionScaleUsesARDWhenSet) {
// Verify that SQLGetData uses ARD precision/scale when set, for both SQL_ARD_TYPE and
// SQL_C_DEFAULT
- SQLWCHAR wsql[] = L"SELECT CAST('123.45' AS NUMERIC) as decimal_col;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT CAST('123.45' AS NUMERIC) as decimal_col;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -750,8 +740,8 @@
TYPED_TEST(StatementTest, TestSQLExecDirectGuidQueryUnsupported) {
// Query GUID as string as SQLite does not support GUID
- SQLWCHAR wsql[] = L"SELECT 'C77313CF-4E08-47CE-B6DF-94DD2FCF3541' AS guid;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql,
+ L"SELECT 'C77313CF-4E08-47CE-B6DF-94DD2FCF3541' AS guid;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -766,15 +756,14 @@
}
TYPED_TEST(StatementTest, TestSQLExecDirectRowFetching) {
- SQLWCHAR wsql[] =
- LR"(
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql,
+ LR"(
SELECT 1 AS small_table
UNION ALL
SELECT 2
UNION ALL
SELECT 3;
- )";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ )");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -824,15 +813,14 @@
SQLLEN rows_fetched;
SQLSetStmtAttr(this->stmt, SQL_ATTR_ROWS_FETCHED_PTR, &rows_fetched, 0);
- SQLWCHAR wsql[] =
- LR"(
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql,
+ LR"(
SELECT 1 AS small_table
UNION ALL
SELECT 2
UNION ALL
SELECT 3;
- )";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ )");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -886,8 +874,7 @@
TYPED_TEST(StatementTest, TestSQLFetchScrollUnsupportedOrientation) {
// SQL_FETCH_NEXT is the only supported fetch orientation.
- SQLWCHAR wsql[] = L"SELECT 1;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 1;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -923,8 +910,7 @@
}
TYPED_TEST(StatementTest, TestSQLExecDirectVarcharTruncation) {
- SQLWCHAR wsql[] = L"SELECT 'VERY LONG STRING here' AS string_col;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 'VERY LONG STRING here' AS string_col;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -973,8 +959,8 @@
}
TYPED_TEST(StatementTest, TestSQLExecDirectWVarcharTruncation) {
- SQLWCHAR wsql[] = L"SELECT 'VERY LONG Unicode STRING 句子 here' AS wstring_col;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(
+ wsql, L"SELECT 'VERY LONG Unicode STRING 句子 here' AS wstring_col;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -990,7 +976,8 @@
// Verify string truncation is reported
VerifyOdbcErrorState(SQL_HANDLE_STMT, this->stmt, kErrorState01004);
- EXPECT_EQ(std::wstring(L"VERY LONG Unicode STRING 句子"), std::wstring(wchar_val));
+ std::wstring wchar_result = ConvertToWString(wchar_val);
+ EXPECT_EQ(std::wstring(L"VERY LONG Unicode STRING 句子"), wchar_result);
EXPECT_EQ(32 * wchar_size, ind);
// Fetch same column 2nd time
@@ -1002,7 +989,8 @@
// Verify string truncation is reported
VerifyOdbcErrorState(SQL_HANDLE_STMT, this->stmt, kErrorState01004);
- EXPECT_EQ(std::wstring(L" "), std::wstring(wchar_val2));
+ wchar_result = ConvertToWString(wchar_val2);
+ EXPECT_EQ(std::wstring(L" "), wchar_result);
EXPECT_EQ(5 * wchar_size, ind);
// Fetch same column 3rd time
@@ -1014,7 +1002,8 @@
ASSERT_EQ(SQL_SUCCESS,
SQLGetData(this->stmt, 1, SQL_C_WCHAR, &wchar_val3, buf_len, &ind));
- EXPECT_EQ(std::wstring(L"here"), std::wstring(wchar_val3));
+ wchar_result = ConvertToWString(wchar_val3);
+ EXPECT_EQ(std::wstring(L"here"), wchar_result);
EXPECT_EQ(4 * wchar_size, ind);
// Attempt to fetch data 4th time
@@ -1027,8 +1016,7 @@
// Have binary test on mock test base as remote test servers tend to have different
// formats for binary data
- SQLWCHAR wsql[] = L"SELECT X'ABCDEFAB' AS c_varbinary;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT X'ABCDEFAB' AS c_varbinary;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1096,8 +1084,7 @@
// Limitation on mock test server prevents null from working properly, so use remote
// server instead. Mock server has type `DENSE_UNION` for null column data.
- SQLWCHAR wsql[] = L"SELECT null as null_col;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT null as null_col;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1117,14 +1104,13 @@
// Have binary test on mock test base as remote test servers tend to have different
// formats for binary data
- SQLWCHAR wsql[] =
- LR"(
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql,
+ LR"(
SELECT 1,
'VERY LONG STRING here' AS string_col,
'VERY LONG Unicode STRING 句子 here' AS wstring_col,
X'ABCDEFAB' AS c_varbinary;
- )";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ )");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1167,8 +1153,7 @@
// Limitation on mock test server prevents null from working properly, so use remote
// server instead. Mock server has type `DENSE_UNION` for null column data.
- SQLWCHAR wsql[] = L"SELECT null as null_col;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT null as null_col;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1674,12 +1659,11 @@
ASSERT_EQ(SQL_SUCCESS,
SQLBindCol(this->stmt, 2, SQL_C_TYPE_TIME, &time_var_max, buf_len, &ind));
- SQLWCHAR wsql[] =
- LR"(
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql,
+ LR"(
SELECT CAST(TIME '00:00:00' AS TIME) AS time_min,
CAST(TIME '23:59:59' AS TIME) AS time_max;
- )";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ )");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1707,8 +1691,7 @@
ASSERT_EQ(SQL_SUCCESS,
SQLBindCol(this->stmt, 1, SQL_C_BINARY, &varbinary_val[0], buf_len, &ind));
- SQLWCHAR wsql[] = L"SELECT X'ABCDEF' AS c_varbinary;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT X'ABCDEF' AS c_varbinary;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1729,8 +1712,7 @@
ASSERT_EQ(SQL_SUCCESS, SQLBindCol(this->stmt, 1, SQL_C_LONG, &val, 0, &ind));
- SQLWCHAR wsql[] = L"SELECT null as null_col;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT null as null_col;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1748,8 +1730,7 @@
ASSERT_EQ(SQL_SUCCESS, SQLBindCol(this->stmt, 1, SQL_C_LONG, &val, 0, 0));
- SQLWCHAR wsql[] = L"SELECT null as null_col;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT null as null_col;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1767,15 +1748,14 @@
// should be updated after every SQLFetch call.
ASSERT_EQ(SQL_SUCCESS, SQLBindCol(this->stmt, 1, SQL_C_LONG, &val, buf_len, &ind));
- SQLWCHAR wsql[] =
- LR"(
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql,
+ LR"(
SELECT 1 AS small_table
UNION ALL
SELECT 2
UNION ALL
SELECT 3;
- )";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ )");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1817,15 +1797,14 @@
ASSERT_EQ(SQL_SUCCESS,
SQLSetStmtAttr(this->stmt, SQL_ATTR_ROWS_FETCHED_PTR, &rows_fetched, 0));
- SQLWCHAR wsql[] =
- LR"(
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql,
+ LR"(
SELECT 1 AS small_table
UNION ALL
SELECT 2
UNION ALL
SELECT 3;
- )";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ )");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1936,15 +1915,14 @@
ASSERT_EQ(SQL_SUCCESS, SQLSetStmtAttr(this->stmt, SQL_ROWSET_SIZE,
reinterpret_cast<SQLPOINTER>(rows), 0));
- SQLWCHAR wsql[] =
- LR"(
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql,
+ LR"(
SELECT 1 AS small_table
UNION ALL
SELECT 2
UNION ALL
SELECT 3;
- )";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ )");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1956,7 +1934,7 @@
SQLExtendedFetch(this->stmt, SQL_FETCH_NEXT, 0, &row_count, row_status));
EXPECT_EQ(3, row_count);
- for (int i = 0; i < rows; i++) {
+ for (SQLULEN i = 0; i < rows; i++) {
EXPECT_EQ(SQL_SUCCESS, row_status[i]);
}
@@ -1982,8 +1960,7 @@
ASSERT_EQ(SQL_SUCCESS, SQLBindCol(this->stmt, 1, SQL_C_LONG, &val, 0, nullptr));
- SQLWCHAR wsql[] = L"SELECT null as null_col;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT null as null_col;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -1999,8 +1976,7 @@
TYPED_TEST(StatementTest, TestSQLMoreResultsNoData) {
// Verify SQLMoreResults returns SQL_NO_DATA by default.
- SQLWCHAR wsql[] = L"SELECT 1;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 1;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -2017,80 +1993,75 @@
TYPED_TEST(StatementTest, TestSQLNativeSqlReturnsInputString) {
SQLWCHAR buf[1024];
SQLINTEGER buf_char_len = sizeof(buf) / GetSqlWCharSize();
- SQLWCHAR input_str[] = L"SELECT * FROM mytable WHERE id == 1";
- SQLINTEGER input_char_len = static_cast<SQLINTEGER>(wcslen(input_str));
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(input_str, L"SELECT * FROM mytable WHERE id == 1");
SQLINTEGER output_char_len = 0;
- std::wstring expected_string = std::wstring(input_str);
- ASSERT_EQ(SQL_SUCCESS, SQLNativeSql(this->conn, input_str, input_char_len, buf,
+ ASSERT_EQ(SQL_SUCCESS, SQLNativeSql(this->conn, input_str, input_str_len, buf,
buf_char_len, &output_char_len));
- EXPECT_EQ(input_char_len, output_char_len);
+ EXPECT_EQ(input_str_len, output_char_len);
// returned length is in characters
std::wstring returned_string(buf, buf + output_char_len);
- EXPECT_EQ(expected_string, returned_string);
+ std::wstring input = ConvertToWString(input_str, input_str_len);
+ EXPECT_EQ(input, returned_string);
}
TYPED_TEST(StatementTest, TestSQLNativeSqlReturnsNTSInputString) {
SQLWCHAR buf[1024];
SQLINTEGER buf_char_len = sizeof(buf) / GetSqlWCharSize();
- SQLWCHAR input_str[] = L"SELECT * FROM mytable WHERE id == 1";
- SQLINTEGER input_char_len = static_cast<SQLINTEGER>(wcslen(input_str));
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(input_str, L"SELECT * FROM mytable WHERE id == 1");
SQLINTEGER output_char_len = 0;
- std::wstring expected_string = std::wstring(input_str);
ASSERT_EQ(SQL_SUCCESS, SQLNativeSql(this->conn, input_str, SQL_NTS, buf, buf_char_len,
&output_char_len));
- EXPECT_EQ(input_char_len, output_char_len);
+ EXPECT_EQ(input_str_len, output_char_len);
// returned length is in characters
std::wstring returned_string(buf, buf + output_char_len);
+ std::wstring expected_string = ConvertToWString(input_str, input_str_len);
EXPECT_EQ(expected_string, returned_string);
}
TYPED_TEST(StatementTest, TestSQLNativeSqlReturnsInputStringLength) {
- SQLWCHAR input_str[] = L"SELECT * FROM mytable WHERE id == 1";
- SQLINTEGER input_char_len = static_cast<SQLINTEGER>(wcslen(input_str));
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(input_str, L"SELECT * FROM mytable WHERE id == 1");
SQLINTEGER output_char_len = 0;
- std::wstring expected_string = std::wstring(input_str);
- ASSERT_EQ(SQL_SUCCESS, SQLNativeSql(this->conn, input_str, input_char_len, nullptr, 0,
+ ASSERT_EQ(SQL_SUCCESS, SQLNativeSql(this->conn, input_str, input_str_len, nullptr, 0,
&output_char_len));
- EXPECT_EQ(input_char_len, output_char_len);
+ EXPECT_EQ(input_str_len, output_char_len);
ASSERT_EQ(SQL_SUCCESS,
SQLNativeSql(this->conn, input_str, SQL_NTS, nullptr, 0, &output_char_len));
- EXPECT_EQ(input_char_len, output_char_len);
+ EXPECT_EQ(input_str_len, output_char_len);
}
TYPED_TEST(StatementTest, TestSQLNativeSqlReturnsTruncatedString) {
const SQLINTEGER small_buf_size_in_char = 11;
SQLWCHAR small_buf[small_buf_size_in_char];
SQLINTEGER small_buf_char_len = sizeof(small_buf) / GetSqlWCharSize();
- SQLWCHAR input_str[] = L"SELECT * FROM mytable WHERE id == 1";
- SQLINTEGER input_char_len = static_cast<SQLINTEGER>(wcslen(input_str));
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(input_str, L"SELECT * FROM mytable WHERE id == 1");
SQLINTEGER output_char_len = 0;
// Create expected return string based on buf size
SQLWCHAR expected_string_buf[small_buf_size_in_char];
- wcsncpy(expected_string_buf, input_str, 10);
+ std::copy(input_str, input_str + 10, expected_string_buf);
expected_string_buf[10] = L'\0';
std::wstring expected_string(expected_string_buf,
expected_string_buf + small_buf_size_in_char);
ASSERT_EQ(SQL_SUCCESS_WITH_INFO,
- SQLNativeSql(this->conn, input_str, input_char_len, small_buf,
+ SQLNativeSql(this->conn, input_str, input_str_len, small_buf,
small_buf_char_len, &output_char_len));
VerifyOdbcErrorState(SQL_HANDLE_DBC, this->conn, kErrorState01004);
// Returned text length represents full string char length regardless of truncation
- EXPECT_EQ(input_char_len, output_char_len);
+ EXPECT_EQ(input_str_len, output_char_len);
std::wstring returned_string(small_buf, small_buf + small_buf_char_len);
@@ -2100,15 +2071,10 @@
TYPED_TEST(StatementTest, TestSQLNativeSqlReturnsErrorOnBadInputs) {
SQLWCHAR buf[1024];
SQLINTEGER buf_char_len = sizeof(buf) / GetSqlWCharSize();
- SQLWCHAR input_str[] = L"SELECT * FROM mytable WHERE id == 1";
- SQLINTEGER input_char_len = static_cast<SQLINTEGER>(wcslen(input_str));
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(input_str, L"SELECT * FROM mytable WHERE id == 1");
SQLINTEGER output_char_len = 0;
- ASSERT_EQ(SQL_ERROR, SQLNativeSql(this->conn, nullptr, input_char_len, buf,
- buf_char_len, &output_char_len));
- VerifyOdbcErrorState(SQL_HANDLE_DBC, this->conn, kErrorStateHY009);
-
- ASSERT_EQ(SQL_ERROR, SQLNativeSql(this->conn, nullptr, SQL_NTS, buf, buf_char_len,
+ ASSERT_EQ(SQL_ERROR, SQLNativeSql(this->conn, nullptr, input_str_len, buf, buf_char_len,
&output_char_len));
VerifyOdbcErrorState(SQL_HANDLE_DBC, this->conn, kErrorStateHY009);
@@ -2124,10 +2090,9 @@
TYPED_TEST(StatementTest, SQLNumResultColsReturnsColumnsOnSelect) {
SQLSMALLINT column_count = 0;
SQLSMALLINT expected_value = 3;
- SQLWCHAR sql_query[] = L"SELECT 1 AS col1, 'One' AS col2, 3 AS col3";
- SQLINTEGER query_length = static_cast<SQLINTEGER>(wcslen(sql_query));
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(sql_query, L"SELECT 1 AS col1, 'One' AS col2, 3 AS col3");
- ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, query_length));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, sql_query_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(this->stmt));
@@ -2141,10 +2106,9 @@
}
TYPED_TEST(StatementTest, SQLNumResultColsReturnsSuccessOnNullptr) {
- SQLWCHAR sql_query[] = L"SELECT 1 AS col1, 'One' AS col2, 3 AS col3";
- SQLINTEGER query_length = static_cast<SQLINTEGER>(wcslen(sql_query));
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(sql_query, L"SELECT 1 AS col1, 'One' AS col2, 3 AS col3");
- ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, query_length));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, sql_query_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(this->stmt));
@@ -2179,10 +2143,9 @@
TYPED_TEST(StatementTest, SQLRowCountReturnsNegativeOneOnSelect) {
SQLLEN row_count = 0;
SQLLEN expected_value = -1;
- SQLWCHAR sql_query[] = L"SELECT 1 AS col1, 'One' AS col2, 3 AS col3";
- SQLINTEGER query_length = static_cast<SQLINTEGER>(wcslen(sql_query));
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(sql_query, L"SELECT 1 AS col1, 'One' AS col2, 3 AS col3");
- ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, query_length));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, sql_query_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(this->stmt));
@@ -2196,10 +2159,9 @@
}
TYPED_TEST(StatementTest, SQLRowCountReturnsSuccessOnNullptr) {
- SQLWCHAR sql_query[] = L"SELECT 1 AS col1, 'One' AS col2, 3 AS col3";
- SQLINTEGER query_length = static_cast<SQLINTEGER>(wcslen(sql_query));
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(sql_query, L"SELECT 1 AS col1, 'One' AS col2, 3 AS col3");
- ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, query_length));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, sql_query, sql_query_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(this->stmt));
@@ -2225,8 +2187,7 @@
}
TYPED_TEST(StatementTest, TestSQLFreeStmtSQLClose) {
- SQLWCHAR wsql[] = L"SELECT 1;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 1;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
@@ -2234,8 +2195,7 @@
}
TYPED_TEST(StatementTest, TestSQLCloseCursor) {
- SQLWCHAR wsql[] = L"SELECT 1;";
- SQLINTEGER wsql_len = std::wcslen(wsql);
+ ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 1;");
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(this->stmt, wsql, wsql_len));
diff --git a/cpp/src/arrow/flight/sql/odbc/tests/tables_test.cc b/cpp/src/arrow/flight/sql/odbc/tests/tables_test.cc
index ede7057..6a5c805 100644
--- a/cpp/src/arrow/flight/sql/odbc/tests/tables_test.cc
+++ b/cpp/src/arrow/flight/sql/odbc/tests/tables_test.cc
@@ -44,10 +44,10 @@
// Test Cases
TYPED_TEST(TablesTest, SQLTablesTestInputData) {
- SQLWCHAR catalog_name[] = L"";
- SQLWCHAR schema_name[] = L"";
- SQLWCHAR table_name[] = L"";
- SQLWCHAR table_type[] = L"";
+ SQLWCHAR catalog_name[] = {0};
+ SQLWCHAR schema_name[] = {0};
+ SQLWCHAR table_name[] = {0};
+ SQLWCHAR table_type[] = {0};
// All values populated
EXPECT_EQ(SQL_SUCCESS, SQLTables(this->stmt, catalog_name, sizeof(catalog_name),
@@ -79,8 +79,8 @@
}
TEST_F(TablesMockTest, SQLTablesTestGetMetadataForAllCatalogs) {
- SQLWCHAR empty[] = L"";
- SQLWCHAR SQL_ALL_CATALOGS_W[] = L"%";
+ SQLWCHAR empty[] = {0};
+ ASSIGN_SQLWCHAR_ARR(SQL_ALL_CATALOGS_W, L"%");
std::wstring expected_catalog_name = std::wstring(L"main");
// Get Catalog metadata
@@ -101,12 +101,10 @@
TEST_F(TablesMockTest, SQLTablesTestGetMetadataForNamedCatalog) {
CreateTestTable();
- SQLWCHAR catalog_name[] = L"main";
- const SQLWCHAR* table_names[] = {static_cast<const SQLWCHAR*>(L"TestTable"),
- static_cast<const SQLWCHAR*>(L"foreignTable"),
- static_cast<const SQLWCHAR*>(L"intTable"),
- static_cast<const SQLWCHAR*>(L"sqlite_sequence")};
- std::wstring expected_catalog_name = std::wstring(catalog_name);
+ ASSIGN_SQLWCHAR_ARR(catalog_name, L"main");
+ const std::wstring table_names[] = {L"TestTable", L"foreignTable", L"intTable",
+ L"sqlite_sequence"};
+ std::wstring expected_catalog_name = std::wstring(L"main");
std::wstring expected_table_type = std::wstring(L"table");
// Get named Catalog metadata - Mock server returns the system table sqlite_sequence as
@@ -131,7 +129,7 @@
}
TEST_F(TablesMockTest, SQLTablesTestGetSchemaHasNoData) {
- SQLWCHAR SQL_ALL_SCHEMAS_W[] = L"%";
+ ASSIGN_SQLWCHAR_ARR(SQL_ALL_SCHEMAS_W, L"%");
// Validate that no schema data is available for Mock server
ASSERT_EQ(SQL_SUCCESS, SQLTables(this->stmt, nullptr, SQL_NTS, SQL_ALL_SCHEMAS_W,
@@ -141,8 +139,8 @@
}
TEST_F(TablesRemoteTest, SQLTablesTestGetMetadataForAllSchemas) {
- SQLWCHAR empty[] = L"";
- SQLWCHAR SQL_ALL_SCHEMAS_W[] = L"%";
+ SQLWCHAR empty[] = {0};
+ ASSIGN_SQLWCHAR_ARR(SQL_ALL_SCHEMAS_W, L"%");
std::set<std::wstring> actual_schemas;
std::set<std::wstring> expected_schemas = {L"$scratch", L"INFORMATION_SCHEMA", L"sys",
L"sys.cache"};
@@ -174,39 +172,39 @@
TEST_F(TablesRemoteTest, SQLTablesTestFilterByAllSchema) {
// Requires creation of user table named ODBCTest using schema $scratch in remote server
- SQLWCHAR SQL_ALL_SCHEMAS_W[] = L"%";
- const SQLWCHAR* schema_names[] = {static_cast<const SQLWCHAR*>(L"INFORMATION_SCHEMA"),
- static_cast<const SQLWCHAR*>(L"INFORMATION_SCHEMA"),
- static_cast<const SQLWCHAR*>(L"INFORMATION_SCHEMA"),
- static_cast<const SQLWCHAR*>(L"INFORMATION_SCHEMA"),
- static_cast<const SQLWCHAR*>(L"INFORMATION_SCHEMA"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys"),
- static_cast<const SQLWCHAR*>(L"sys.cache"),
- static_cast<const SQLWCHAR*>(L"sys.cache"),
- static_cast<const SQLWCHAR*>(L"sys.cache"),
- static_cast<const SQLWCHAR*>(L"sys.cache"),
- static_cast<const SQLWCHAR*>(L"$scratch")};
+ ASSIGN_SQLWCHAR_ARR(SQL_ALL_SCHEMAS_W, L"%");
+ const std::wstring schema_names[] = {L"INFORMATION_SCHEMA",
+ L"INFORMATION_SCHEMA",
+ L"INFORMATION_SCHEMA",
+ L"INFORMATION_SCHEMA",
+ L"INFORMATION_SCHEMA",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys",
+ L"sys.cache",
+ L"sys.cache",
+ L"sys.cache",
+ L"sys.cache",
+ L"$scratch"};
std::wstring expected_system_table_type = std::wstring(L"SYSTEM_TABLE");
std::wstring expected_user_table_type = std::wstring(L"TABLE");
@@ -234,8 +232,8 @@
TEST_F(TablesRemoteTest, SQLTablesGetMetadataForNamedSchema) {
// Requires creation of user table named ODBCTest using schema $scratch in remote server
- SQLWCHAR schema_name[] = L"$scratch";
- std::wstring expected_schema_name = std::wstring(schema_name);
+ ASSIGN_SQLWCHAR_ARR(schema_name, L"$scratch");
+ std::wstring expected_schema_name = std::wstring(L"$scratch");
std::wstring expected_table_name = std::wstring(L"ODBCTest");
std::wstring expected_table_type = std::wstring(L"TABLE");
@@ -256,11 +254,9 @@
TEST_F(TablesMockTest, SQLTablesTestGetMetadataForAllTables) {
CreateTestTable();
- SQLWCHAR SQL_ALL_TABLES_W[] = L"%";
- const SQLWCHAR* table_names[] = {static_cast<const SQLWCHAR*>(L"TestTable"),
- static_cast<const SQLWCHAR*>(L"foreignTable"),
- static_cast<const SQLWCHAR*>(L"intTable"),
- static_cast<const SQLWCHAR*>(L"sqlite_sequence")};
+ ASSIGN_SQLWCHAR_ARR(SQL_ALL_TABLES_W, L"%");
+ const std::wstring table_names[] = {L"TestTable", L"foreignTable", L"intTable",
+ L"sqlite_sequence"};
std::wstring expected_catalog_name = std::wstring(L"main");
std::wstring expected_table_type = std::wstring(L"table");
@@ -288,11 +284,10 @@
TEST_F(TablesMockTest, SQLTablesTestGetMetadataForTableName) {
CreateTestTable();
- // Use mutable arrays to pass SQLWCHAR parameters to SQLTables
- SQLWCHAR test_table[] = L"TestTable";
- SQLWCHAR foreign_table[] = L"foreignTable";
- SQLWCHAR int_table[] = L"intTable";
- SQLWCHAR sqlite_sequence[] = L"sqlite_sequence";
+ ASSIGN_SQLWCHAR_ARR(test_table, L"TestTable");
+ ASSIGN_SQLWCHAR_ARR(foreign_table, L"foreignTable");
+ ASSIGN_SQLWCHAR_ARR(int_table, L"intTable");
+ ASSIGN_SQLWCHAR_ARR(sqlite_sequence, L"sqlite_sequence");
SQLWCHAR* table_names[] = {test_table, foreign_table, int_table, sqlite_sequence};
@@ -309,7 +304,10 @@
CheckStringColumnW(this->stmt, 1, expected_catalog_name);
// Mock server does not support table schema
CheckNullColumnW(this->stmt, 2);
- CheckStringColumnW(this->stmt, 3, table_names[i]);
+
+ std::wstring table_name = ConvertToWString(table_names[i]);
+ CheckStringColumnW(this->stmt, 3, table_name);
+
CheckStringColumnW(this->stmt, 4, expected_table_type);
CheckNullColumnW(this->stmt, 5);
@@ -322,9 +320,9 @@
TEST_F(TablesMockTest, SQLTablesTestGetMetadataForUnicodeTableByTableName) {
CreateUnicodeTable();
- SQLWCHAR unicodetable_name[] = L"数据";
+ ASSIGN_SQLWCHAR_ARR(unicodetable_name, L"数据");
std::wstring expected_catalog_name = std::wstring(L"main");
- std::wstring expected_table_name = std::wstring(unicodetable_name);
+ std::wstring expected_table_name = std::wstring(L"数据");
std::wstring expected_table_type = std::wstring(L"table");
// Get specific Table metadata
@@ -348,7 +346,7 @@
TEST_F(TablesMockTest, SQLTablesTestGetMetadataForInvalidTableNameNoData) {
CreateTestTable();
- SQLWCHAR invalid_table_name[] = L"NonExistenttable_name";
+ ASSIGN_SQLWCHAR_ARR(invalid_table_name, L"NonExistenttable_name");
// Try to get metadata for a non-existent table name
ASSERT_EQ(SQL_SUCCESS, SQLTables(this->stmt, nullptr, SQL_NTS, nullptr, SQL_NTS,
@@ -363,17 +361,15 @@
// Mock server only supports table type "table" in lowercase
CreateTestTable();
- SQLWCHAR table_type_table_lowercase[] = L"table";
- SQLWCHAR table_type_table_uppercase[] = L"TABLE";
- SQLWCHAR table_type_view[] = L"VIEW";
- SQLWCHAR table_type_table_view[] = L"TABLE,VIEW";
- const SQLWCHAR* table_names[] = {static_cast<const SQLWCHAR*>(L"TestTable"),
- static_cast<const SQLWCHAR*>(L"foreignTable"),
- static_cast<const SQLWCHAR*>(L"intTable"),
- static_cast<const SQLWCHAR*>(L"sqlite_sequence")};
+ ASSIGN_SQLWCHAR_ARR(table_type_table_lowercase, L"table");
+ ASSIGN_SQLWCHAR_ARR(table_type_table_uppercase, L"TABLE");
+ ASSIGN_SQLWCHAR_ARR(table_type_view, L"VIEW");
+ ASSIGN_SQLWCHAR_ARR(table_type_table_view, L"TABLE,VIEW");
+ const std::wstring table_names[] = {L"TestTable", L"foreignTable", L"intTable",
+ L"sqlite_sequence"};
std::wstring expected_catalog_name = std::wstring(L"main");
std::wstring expected_table_name = std::wstring(L"TestTable");
- std::wstring expected_table_type = std::wstring(table_type_table_lowercase);
+ std::wstring expected_table_type = std::wstring(L"table");
EXPECT_EQ(SQL_SUCCESS,
SQLTables(this->stmt, nullptr, SQL_NTS, nullptr, SQL_NTS, nullptr, SQL_NTS,
@@ -416,8 +412,8 @@
// Requires creation of user table named ODBCTest using schema $scratch in remote server
// Use mutable arrays to pass SQLWCHAR parameters to SQLTables
- SQLWCHAR table[] = L"TABLE";
- SQLWCHAR table_view[] = L"TABLE,VIEW";
+ ASSIGN_SQLWCHAR_ARR(table, L"TABLE");
+ ASSIGN_SQLWCHAR_ARR(table_view, L"TABLE,VIEW");
SQLWCHAR* type_list[] = {table, table_view};
@@ -442,8 +438,8 @@
}
TEST_F(TablesRemoteTest, SQLTablesGetMetadataForTableTypeViewHasNoData) {
- SQLWCHAR empty[] = L"";
- SQLWCHAR type_view[] = L"VIEW";
+ SQLWCHAR empty[] = {0};
+ ASSIGN_SQLWCHAR_ARR(type_view, L"VIEW");
EXPECT_EQ(SQL_SUCCESS, SQLTables(this->stmt, nullptr, SQL_NTS, nullptr, SQL_NTS, empty,
SQL_NTS, type_view, SQL_NTS));
@@ -457,8 +453,8 @@
}
TEST_F(TablesMockTest, SQLTablesGetSupportedTableTypes) {
- SQLWCHAR empty[] = L"";
- SQLWCHAR SQL_ALL_TABLE_TYPES_W[] = L"%";
+ SQLWCHAR empty[] = {0};
+ ASSIGN_SQLWCHAR_ARR(SQL_ALL_TABLE_TYPES_W, L"%");
std::wstring expected_table_type = std::wstring(L"table");
// Mock server returns lower case for supported type of "table"
@@ -477,11 +473,9 @@
}
TEST_F(TablesRemoteTest, SQLTablesGetSupportedTableTypes) {
- SQLWCHAR empty[] = L"";
- SQLWCHAR SQL_ALL_TABLE_TYPES_W[] = L"%";
- const SQLWCHAR* type_lists[] = {static_cast<const SQLWCHAR*>(L"TABLE"),
- static_cast<const SQLWCHAR*>(L"SYSTEM_TABLE"),
- static_cast<const SQLWCHAR*>(L"VIEW")};
+ SQLWCHAR empty[] = {0};
+ ASSIGN_SQLWCHAR_ARR(SQL_ALL_TABLE_TYPES_W, L"%");
+ const std::wstring type_lists[] = {L"TABLE", L"SYSTEM_TABLE", L"VIEW"};
ASSERT_EQ(SQL_SUCCESS, SQLTables(this->stmt, empty, SQL_NTS, empty, SQL_NTS, empty,
SQL_NTS, SQL_ALL_TABLE_TYPES_W, SQL_NTS));
@@ -510,11 +504,8 @@
SQLSMALLINT nullable = 0;
size_t column_index = 0;
- const SQLWCHAR* column_names[] = {static_cast<const SQLWCHAR*>(L"TABLE_CAT"),
- static_cast<const SQLWCHAR*>(L"TABLE_SCHEM"),
- static_cast<const SQLWCHAR*>(L"TABLE_NAME"),
- static_cast<const SQLWCHAR*>(L"TABLE_TYPE"),
- static_cast<const SQLWCHAR*>(L"REMARKS")};
+ const std::wstring column_names[] = {L"TABLE_CAT", L"TABLE_SCHEM", L"TABLE_NAME",
+ L"TABLE_TYPE", L"REMARKS"};
SQLSMALLINT column_data_types[] = {SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR,
SQL_WVARCHAR, SQL_WVARCHAR};
SQLULEN column_sizes[] = {1024, 1024, 1024, 1024, 1024};
@@ -529,7 +520,7 @@
buf_char_len, &name_length, &column_data_type,
&column_size, &decimal_digits, &nullable));
- EXPECT_EQ(wcslen(column_names[i]), name_length);
+ EXPECT_EQ(column_names[i].length(), name_length);
std::wstring returned(column_name, column_name + name_length);
EXPECT_EQ(column_names[i], returned);
@@ -557,11 +548,8 @@
SQLSMALLINT nullable = 0;
size_t column_index = 0;
- const SQLWCHAR* column_names[] = {static_cast<const SQLWCHAR*>(L"TABLE_QUALIFIER"),
- static_cast<const SQLWCHAR*>(L"TABLE_OWNER"),
- static_cast<const SQLWCHAR*>(L"TABLE_NAME"),
- static_cast<const SQLWCHAR*>(L"TABLE_TYPE"),
- static_cast<const SQLWCHAR*>(L"REMARKS")};
+ const std::wstring column_names[] = {L"TABLE_QUALIFIER", L"TABLE_OWNER", L"TABLE_NAME",
+ L"TABLE_TYPE", L"REMARKS"};
SQLSMALLINT column_data_types[] = {SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR,
SQL_WVARCHAR, SQL_WVARCHAR};
SQLULEN column_sizes[] = {1024, 1024, 1024, 1024, 1024};
@@ -576,7 +564,7 @@
buf_char_len, &name_length, &column_data_type,
&column_size, &decimal_digits, &nullable));
- EXPECT_EQ(wcslen(column_names[i]), name_length);
+ EXPECT_EQ(column_names[i].length(), name_length);
std::wstring returned(column_name, column_name + name_length);
EXPECT_EQ(column_names[i], returned);
diff --git a/cpp/src/arrow/flight/sql/odbc/tests/type_info_test.cc b/cpp/src/arrow/flight/sql/odbc/tests/type_info_test.cc
index 802e3ab..04e178f 100644
--- a/cpp/src/arrow/flight/sql/odbc/tests/type_info_test.cc
+++ b/cpp/src/arrow/flight/sql/odbc/tests/type_info_test.cc
@@ -70,25 +70,25 @@
}
void CheckSQLDescribeColODBCVer2(SQLHSTMT stmt) {
- const SQLWCHAR* column_names[] = {static_cast<const SQLWCHAR*>(L"TYPE_NAME"),
- static_cast<const SQLWCHAR*>(L"DATA_TYPE"),
- static_cast<const SQLWCHAR*>(L"PRECISION"),
- static_cast<const SQLWCHAR*>(L"LITERAL_PREFIX"),
- static_cast<const SQLWCHAR*>(L"LITERAL_SUFFIX"),
- static_cast<const SQLWCHAR*>(L"CREATE_PARAMS"),
- static_cast<const SQLWCHAR*>(L"NULLABLE"),
- static_cast<const SQLWCHAR*>(L"CASE_SENSITIVE"),
- static_cast<const SQLWCHAR*>(L"SEARCHABLE"),
- static_cast<const SQLWCHAR*>(L"UNSIGNED_ATTRIBUTE"),
- static_cast<const SQLWCHAR*>(L"MONEY"),
- static_cast<const SQLWCHAR*>(L"AUTO_INCREMENT"),
- static_cast<const SQLWCHAR*>(L"LOCAL_TYPE_NAME"),
- static_cast<const SQLWCHAR*>(L"MINIMUM_SCALE"),
- static_cast<const SQLWCHAR*>(L"MAXIMUM_SCALE"),
- static_cast<const SQLWCHAR*>(L"SQL_DATA_TYPE"),
- static_cast<const SQLWCHAR*>(L"SQL_DATETIME_SUB"),
- static_cast<const SQLWCHAR*>(L"NUM_PREC_RADIX"),
- static_cast<const SQLWCHAR*>(L"INTERVAL_PRECISION")};
+ const std::wstring column_names[] = {L"TYPE_NAME",
+ L"DATA_TYPE",
+ L"PRECISION",
+ L"LITERAL_PREFIX",
+ L"LITERAL_SUFFIX",
+ L"CREATE_PARAMS",
+ L"NULLABLE",
+ L"CASE_SENSITIVE",
+ L"SEARCHABLE",
+ L"UNSIGNED_ATTRIBUTE",
+ L"MONEY",
+ L"AUTO_INCREMENT",
+ L"LOCAL_TYPE_NAME",
+ L"MINIMUM_SCALE",
+ L"MAXIMUM_SCALE",
+ L"SQL_DATA_TYPE",
+ L"SQL_DATETIME_SUB",
+ L"NUM_PREC_RADIX",
+ L"INTERVAL_PRECISION"};
SQLSMALLINT column_data_types[] = {
SQL_WVARCHAR, SQL_SMALLINT, SQL_INTEGER, SQL_WVARCHAR, SQL_WVARCHAR,
SQL_WVARCHAR, SQL_SMALLINT, SQL_SMALLINT, SQL_SMALLINT, SQL_SMALLINT,
@@ -112,25 +112,14 @@
}
void CheckSQLDescribeColODBCVer3(SQLHSTMT stmt) {
- const SQLWCHAR* column_names[] = {static_cast<const SQLWCHAR*>(L"TYPE_NAME"),
- static_cast<const SQLWCHAR*>(L"DATA_TYPE"),
- static_cast<const SQLWCHAR*>(L"COLUMN_SIZE"),
- static_cast<const SQLWCHAR*>(L"LITERAL_PREFIX"),
- static_cast<const SQLWCHAR*>(L"LITERAL_SUFFIX"),
- static_cast<const SQLWCHAR*>(L"CREATE_PARAMS"),
- static_cast<const SQLWCHAR*>(L"NULLABLE"),
- static_cast<const SQLWCHAR*>(L"CASE_SENSITIVE"),
- static_cast<const SQLWCHAR*>(L"SEARCHABLE"),
- static_cast<const SQLWCHAR*>(L"UNSIGNED_ATTRIBUTE"),
- static_cast<const SQLWCHAR*>(L"FIXED_PREC_SCALE"),
- static_cast<const SQLWCHAR*>(L"AUTO_UNIQUE_VALUE"),
- static_cast<const SQLWCHAR*>(L"LOCAL_TYPE_NAME"),
- static_cast<const SQLWCHAR*>(L"MINIMUM_SCALE"),
- static_cast<const SQLWCHAR*>(L"MAXIMUM_SCALE"),
- static_cast<const SQLWCHAR*>(L"SQL_DATA_TYPE"),
- static_cast<const SQLWCHAR*>(L"SQL_DATETIME_SUB"),
- static_cast<const SQLWCHAR*>(L"NUM_PREC_RADIX"),
- static_cast<const SQLWCHAR*>(L"INTERVAL_PRECISION")};
+ const std::wstring column_names[] = {
+ L"TYPE_NAME", L"DATA_TYPE", L"COLUMN_SIZE",
+ L"LITERAL_PREFIX", L"LITERAL_SUFFIX", L"CREATE_PARAMS",
+ L"NULLABLE", L"CASE_SENSITIVE", L"SEARCHABLE",
+ L"UNSIGNED_ATTRIBUTE", L"FIXED_PREC_SCALE", L"AUTO_UNIQUE_VALUE",
+ L"LOCAL_TYPE_NAME", L"MINIMUM_SCALE", L"MAXIMUM_SCALE",
+ L"SQL_DATA_TYPE", L"SQL_DATETIME_SUB", L"NUM_PREC_RADIX",
+ L"INTERVAL_PRECISION"};
SQLSMALLINT column_data_types[] = {
SQL_WVARCHAR, SQL_SMALLINT, SQL_INTEGER, SQL_WVARCHAR, SQL_WVARCHAR,
SQL_WVARCHAR, SQL_SMALLINT, SQL_SMALLINT, SQL_SMALLINT, SQL_SMALLINT,
@@ -221,16 +210,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"bit"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_BIT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -249,14 +238,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"tinyint"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_TINYINT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -275,14 +264,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"bigint"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_BIGINT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -299,16 +288,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"longvarbinary"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_LONGVARBINARY, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -325,16 +314,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"varbinary"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_VARBINARY, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -352,16 +341,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"text"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_WLONGVARCHAR, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -378,16 +367,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"longvarchar"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_WLONGVARCHAR, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -405,16 +394,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"char"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_WCHAR, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -433,14 +422,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"integer"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_INTEGER, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -459,14 +448,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"smallint"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_SMALLINT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -485,14 +474,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"float"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_FLOAT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -511,14 +500,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"double"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DOUBLE, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -538,14 +527,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"numeric"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DOUBLE, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -565,14 +554,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"varchar"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_WVARCHAR, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -591,14 +580,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"date"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
SQL_CODE_DATE, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -617,14 +606,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"time"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
SQL_CODE_TIME, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -643,14 +632,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"timestamp"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
SQL_CODE_TIMESTAMP, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
}
@@ -671,16 +660,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"bit"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_BIT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -699,14 +688,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"tinyint"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_TINYINT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -725,14 +714,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"bigint"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_BIGINT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -749,16 +738,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"longvarbinary"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_LONGVARBINARY, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -775,16 +764,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"varbinary"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_VARBINARY, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -802,16 +791,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"text"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_WLONGVARCHAR, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -828,16 +817,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"longvarchar"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_WLONGVARCHAR, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -855,16 +844,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"char"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_WCHAR, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -883,14 +872,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"integer"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_INTEGER, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -909,14 +898,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"smallint"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_SMALLINT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -935,14 +924,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"float"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_FLOAT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -961,14 +950,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"double"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DOUBLE, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -988,14 +977,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"numeric"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DOUBLE, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -1015,14 +1004,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"varchar"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_WVARCHAR, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -1041,14 +1030,15 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"date"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub, driver returns NULL for Ver2
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // 0, driver
+ // returns NULL for Ver2
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -1067,14 +1057,15 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"time"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub, driver returns NULL for Ver2
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // 0, driver
+ // returns NULL for Ver2
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -1093,14 +1084,15 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"timestamp"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub, driver returns NULL for Ver2
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // 0, driver
+ // returns NULL for Ver2
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
}
@@ -1121,16 +1113,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"bit"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_BIT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1156,14 +1148,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"tinyint"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_TINYINT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1189,14 +1181,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"bigint"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_BIGINT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1220,16 +1212,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"longvarbinary"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_LONGVARBINARY, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1253,16 +1245,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"varbinary"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_VARBINARY, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
// No more data
ASSERT_EQ(SQL_NO_DATA, SQLFetch(stmt));
@@ -1285,16 +1277,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"text"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_WLONGVARCHAR, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1311,16 +1303,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"longvarchar"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_WLONGVARCHAR, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1345,16 +1337,16 @@
SQL_NULLABLE, // expected_nullable
SQL_FALSE, // expected_case_sensitive
SQL_SEARCHABLE, // expected_searchable
- NULL, // expected_unsigned_attr
+ 0, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"char"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_WCHAR, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1380,14 +1372,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"integer"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_INTEGER, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1413,14 +1405,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"smallint"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_SMALLINT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1446,14 +1438,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"float"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_FLOAT, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1479,14 +1471,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"double"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DOUBLE, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1506,14 +1498,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"numeric"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DOUBLE, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1540,14 +1532,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"varchar"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_WVARCHAR, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1573,14 +1565,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"date"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
SQL_CODE_DATE, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1607,14 +1599,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"date"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
SQL_CODE_DATE, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1640,14 +1632,15 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"date"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub, driver returns NULL for Ver2
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // 0, driver
+ // returns NULL for Ver2
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -1685,14 +1678,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"time"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
SQL_CODE_TIME, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1719,14 +1712,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"time"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
SQL_CODE_TIME, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1752,14 +1745,15 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"time"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub, driver returns NULL for Ver2
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // 0, driver
+ // returns NULL for Ver2
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);
@@ -1797,14 +1791,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"timestamp"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
SQL_CODE_TIMESTAMP, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1831,14 +1825,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"timestamp"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
SQL_CODE_TIMESTAMP, // expected_sql_datetime_sub
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer3(stmt);
@@ -1864,14 +1858,14 @@
SQL_SEARCHABLE, // expected_searchable
SQL_FALSE, // expected_unsigned_attr
SQL_FALSE, // expected_fixed_prec_scale
- NULL, // expected_auto_unique_value
+ 0, // expected_auto_unique_value
std::wstring(L"timestamp"), // expected_local_type_name
- NULL, // expected_min_scale
- NULL, // expected_max_scale
+ 0, // expected_min_scale
+ 0, // expected_max_scale
SQL_DATETIME, // expected_sql_data_type
- NULL, // expected_sql_datetime_sub, driver returns NULL for Ver2
- NULL, // expected_num_prec_radix
- NULL); // expected_interval_prec
+ 0, // expected_sql_datetime_sub, driver returns NULL for Ver2
+ 0, // expected_num_prec_radix
+ 0); // expected_interval_prec
CheckSQLDescribeColODBCVer2(stmt);