This is an automated email from the ASF dual-hosted git repository.
lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push:
new af184f5ec9 GH-49561: [C++][FlightRPC][ODBC] Use SQLWCHAR array for
wide string literals in test suite (#49562)
af184f5ec9 is described below
commit af184f5ec9b11528afade4625511bc4210e388be
Author: justing-bq <[email protected]>
AuthorDate: Mon Mar 23 17:53:58 2026 -0700
GH-49561: [C++][FlightRPC][ODBC] Use SQLWCHAR array for wide string
literals in test suite (#49562)
### Rationale for this change
We want to use a SQLWCHAR array for wide string literal inside our test
suite instead of a SQLWCHAR vector.
### What changes are included in this PR?
SQLWCHAR vector used for wide string literals are replaced with a SQLWCHAR
array instead.
Columns tests were refactored to perform assertions over std::string
equality rather than wide string equality.
### Are these changes tested?
Yes
### Are there any user-facing changes?
No
* GitHub Issue: #49561
Authored-by: justing-bq <[email protected]>
Signed-off-by: David Li <[email protected]>
---
.../flight/sql/odbc/odbc_impl/encoding_utils.h | 19 +
.../arrow/flight/sql/odbc/tests/columns_test.cc | 1043 ++++++++++----------
cpp/src/arrow/flight/sql/odbc/tests/errors_test.cc | 28 +-
.../flight/sql/odbc/tests/statement_attr_test.cc | 7 +-
.../arrow/flight/sql/odbc/tests/statement_test.cc | 221 ++---
5 files changed, 647 insertions(+), 671 deletions(-)
diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/encoding_utils.h
b/cpp/src/arrow/flight/sql/odbc/odbc_impl/encoding_utils.h
index 7f8a4a7ef8..f6178c7f58 100644
--- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/encoding_utils.h
+++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/encoding_utils.h
@@ -31,6 +31,7 @@
#define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING
namespace ODBC {
+using arrow::flight::sql::odbc::WcsToUtf8;
// Return the number of bytes required for the conversion.
template <typename CHAR_TYPE>
@@ -99,6 +100,24 @@ inline std::string SqlWcharToString(SQLWCHAR* wchar_msg,
SQLINTEGER msg_len = SQ
return std::string(utf8_str.begin(), utf8_str.end());
}
+/// \brief Convert vector of SqlWchar to standard string
+/// \param[in] wchar_vec SqlWchar vector to convert
+/// \return wchar_vec in std::string format
+inline std::string SqlWcharToString(const std::vector<SQLWCHAR>& wchar_vec) {
+ if (wchar_vec.empty() || wchar_vec[0] == 0) {
+ return {};
+ }
+
+ auto end = std::find(wchar_vec.begin(), wchar_vec.end(), 0);
+ size_t actual_len = std::distance(wchar_vec.begin(), end);
+
+ thread_local std::vector<uint8_t> utf8_str;
+
+ WcsToUtf8((void*)wchar_vec.data(), static_cast<SQLINTEGER>(actual_len),
&utf8_str);
+
+ return std::string(utf8_str.begin(), utf8_str.end());
+}
+
inline std::string SqlStringToString(const unsigned char* sql_str,
int32_t sql_str_len = SQL_NTS) {
std::string res;
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 6ac3cde874..d88a569c8f 100644
--- a/cpp/src/arrow/flight/sql/odbc/tests/columns_test.cc
+++ b/cpp/src/arrow/flight/sql/odbc/tests/columns_test.cc
@@ -127,12 +127,12 @@ void CheckRemoteSQLColumns(
}
void CheckSQLColAttribute(SQLHSTMT stmt, SQLUSMALLINT idx,
- const std::wstring& expected_column_name,
+ const std::string& expected_column_name,
SQLLEN expected_data_type, SQLLEN
expected_concise_type,
SQLLEN expected_display_size, SQLLEN
expected_prec_scale,
SQLLEN expected_length,
- const std::wstring& expected_literal_prefix,
- const std::wstring& expected_literal_suffix,
+ const std::string& expected_literal_prefix,
+ const std::string& expected_literal_suffix,
SQLLEN expected_column_size, SQLLEN
expected_column_scale,
SQLLEN expected_column_nullability,
SQLLEN expected_num_prec_radix, SQLLEN
expected_octet_length,
@@ -215,10 +215,10 @@ void CheckSQLColAttribute(SQLHSTMT stmt, SQLUSMALLINT idx,
EXPECT_EQ(SQL_SUCCESS,
SQLColAttribute(stmt, idx, SQL_DESC_UNSIGNED, 0, 0, nullptr,
&unsigned_col));
- std::wstring name_str = ConvertToWString(name, name_len);
- std::wstring base_column_name_str = ConvertToWString(base_column_name,
column_name_len);
- std::wstring label_str = ConvertToWString(label, label_len);
- std::wstring prefixStr = ConvertToWString(prefix, prefix_len);
+ std::string name_str = ODBC::SqlWcharToString(name);
+ std::string base_column_name_str = ODBC::SqlWcharToString(base_column_name);
+ std::string label_str = ODBC::SqlWcharToString(label);
+ std::string prefix_str = ODBC::SqlWcharToString(prefix);
// Assume column name, base column name, and label are equivalent in the
result set
EXPECT_EQ(expected_column_name, name_str);
@@ -229,7 +229,7 @@ void CheckSQLColAttribute(SQLHSTMT stmt, SQLUSMALLINT idx,
EXPECT_EQ(expected_display_size, display_size);
EXPECT_EQ(expected_prec_scale, prec_scale);
EXPECT_EQ(expected_length, length);
- EXPECT_EQ(expected_literal_prefix, prefixStr);
+ EXPECT_EQ(expected_literal_prefix, prefix_str);
EXPECT_EQ(expected_column_size, size);
EXPECT_EQ(expected_column_scale, scale);
EXPECT_EQ(expected_column_nullability, nullability);
@@ -241,7 +241,7 @@ void CheckSQLColAttribute(SQLHSTMT stmt, SQLUSMALLINT idx,
#ifndef __APPLE__
void CheckSQLColAttributes(SQLHSTMT stmt, SQLUSMALLINT idx,
- const std::wstring& expected_column_name,
+ const std::string& expected_column_name,
SQLLEN expected_data_type, SQLLEN
expected_display_size,
SQLLEN expected_prec_scale, SQLLEN expected_length,
SQLLEN expected_column_size, SQLLEN
expected_column_scale,
@@ -295,8 +295,8 @@ void CheckSQLColAttributes(SQLHSTMT stmt, SQLUSMALLINT idx,
EXPECT_EQ(SQL_SUCCESS, SQLColAttributes(stmt, idx, SQL_COLUMN_UNSIGNED, 0,
0, nullptr,
&unsigned_col));
- std::wstring name_str = ConvertToWString(name, name_len);
- std::wstring label_str = ConvertToWString(label, label_len);
+ std::string name_str = ODBC::SqlWcharToString(name);
+ std::string label_str = ODBC::SqlWcharToString(label);
EXPECT_EQ(expected_column_name, name_str);
EXPECT_EQ(expected_column_name, label_str);
@@ -326,8 +326,9 @@ void GetSQLColAttributeString(SQLHSTMT stmt, const
std::wstring& wsql, SQLUSMALL
std::vector<SQLWCHAR> str_val(kOdbcBufferSize);
SQLSMALLINT str_len = 0;
- ASSERT_EQ(SQL_SUCCESS, SQLColAttribute(stmt, idx, field_identifier,
&str_val[0],
- (SQLSMALLINT)str_val.size(),
&str_len, nullptr));
+ ASSERT_EQ(SQL_SUCCESS,
+ SQLColAttribute(stmt, idx, field_identifier, &str_val[0],
+ static_cast<SQLSMALLINT>(str_val.size()),
&str_len, nullptr));
value = ConvertToWString(str_val, str_len);
}
@@ -347,9 +348,9 @@ void GetSQLColAttributesString(SQLHSTMT stmt, const
std::wstring& wsql, SQLUSMAL
std::vector<SQLWCHAR> str_val(kOdbcBufferSize);
SQLSMALLINT str_len = 0;
- ASSERT_EQ(SQL_SUCCESS,
- SQLColAttributes(stmt, idx, field_identifier, &str_val[0],
- (SQLSMALLINT)str_val.size(), &str_len, nullptr));
+ ASSERT_EQ(SQL_SUCCESS, SQLColAttributes(stmt, idx, field_identifier,
&str_val[0],
+
static_cast<SQLSMALLINT>(str_val.size()),
+ &str_len, nullptr));
value = ConvertToWString(str_val, str_len);
}
@@ -1223,24 +1224,23 @@ TEST_F(ColumnsMockTest,
TestSQLColumnsInvalidTablePattern) {
}
TYPED_TEST(ColumnsTest, SQLColAttributeTestInputData) {
- std::wstring wsql = L"SELECT 1 as col1;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 1 as col1;";
+ SQLSMALLINT wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())))
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len))
<< GetOdbcErrorMessage(SQL_HANDLE_DBC, conn);
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
SQLUSMALLINT idx = 1;
- std::vector<SQLWCHAR> character_attr(kOdbcBufferSize);
+ SQLWCHAR character_attr[kOdbcBufferSize];
SQLSMALLINT character_attr_len = 0;
SQLLEN numeric_attr = 0;
// All character values populated
- EXPECT_EQ(SQL_SUCCESS, SQLColAttribute(stmt, idx, SQL_DESC_NAME,
&character_attr[0],
- (SQLSMALLINT)character_attr.size(),
- &character_attr_len, nullptr));
+ EXPECT_EQ(SQL_SUCCESS,
+ SQLColAttribute(stmt, idx, SQL_DESC_NAME, character_attr,
+ std::wcslen(character_attr), &character_attr_len,
nullptr));
// All numeric values populated
EXPECT_EQ(SQL_SUCCESS,
@@ -1255,11 +1255,10 @@ TYPED_TEST(ColumnsTest, SQLColAttributeTestInputData) {
}
TYPED_TEST(ColumnsTest, SQLColAttributeGetCharacterLen) {
- std::wstring wsql = L"SELECT 1 as col1;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 1 as col1;";
+ SQLSMALLINT wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -1272,44 +1271,41 @@ TYPED_TEST(ColumnsTest, SQLColAttributeGetCharacterLen)
{
}
TYPED_TEST(ColumnsTest, SQLColAttributeInvalidFieldId) {
- std::wstring wsql = L"SELECT 1 as col1;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 1 as col1;";
+ SQLSMALLINT wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
SQLUSMALLINT invalid_field_id = -100;
SQLUSMALLINT idx = 1;
- std::vector<SQLWCHAR> character_attr(kOdbcBufferSize);
+ SQLWCHAR character_attr[kOdbcBufferSize];
SQLSMALLINT character_attr_len = 0;
SQLLEN numeric_attr = 0;
- ASSERT_EQ(SQL_ERROR, SQLColAttribute(stmt, idx, invalid_field_id,
&character_attr[0],
- (SQLSMALLINT)character_attr.size(),
- &character_attr_len, nullptr));
+ ASSERT_EQ(SQL_ERROR,
+ SQLColAttribute(stmt, idx, invalid_field_id, character_attr,
+ std::wcslen(character_attr), &character_attr_len,
nullptr));
// Verify invalid descriptor field identifier error state is returned
VerifyOdbcErrorState(SQL_HANDLE_STMT, stmt, kErrorStateHY091);
}
TYPED_TEST(ColumnsTest, SQLColAttributeInvalidColId) {
- std::wstring wsql = L"SELECT 1 as col1;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 1 as col1;";
+ SQLSMALLINT wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
SQLUSMALLINT invalid_col_id = 2;
- std::vector<SQLWCHAR> character_attr(kOdbcBufferSize);
+ SQLWCHAR character_attr[kOdbcBufferSize];
SQLSMALLINT character_attr_len = 0;
- ASSERT_EQ(
- SQL_ERROR,
- SQLColAttribute(stmt, invalid_col_id, SQL_DESC_BASE_COLUMN_NAME,
&character_attr[0],
- (SQLSMALLINT)character_attr.size(), &character_attr_len,
nullptr));
+ ASSERT_EQ(SQL_ERROR, SQLColAttribute(stmt, invalid_col_id,
SQL_DESC_BASE_COLUMN_NAME,
+ character_attr,
std::wcslen(character_attr),
+ &character_attr_len, nullptr));
// Verify invalid descriptor index error state is returned
VerifyOdbcErrorState(SQL_HANDLE_STMT, stmt, kErrorState07009);
}
@@ -1317,81 +1313,80 @@ TYPED_TEST(ColumnsTest, SQLColAttributeInvalidColId) {
TEST_F(ColumnsMockTest, TestSQLColAttributeAllTypes) {
CreateAllDataTypeTable();
- std::wstring wsql = L"SELECT * from AllTypesTable;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT * from AllTypesTable;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
CheckSQLColAttribute(stmt, 1,
- std::wstring(L"bigint_col"), // expected_column_name
- SQL_BIGINT, // expected_data_type
- SQL_BIGINT, // expected_concise_type
- 20, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 8, // expected_length
- std::wstring(L""), // expected_literal_prefix
- std::wstring(L""), // expected_literal_suffix
- 8, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 10, // expected_num_prec_radix
- 8, // expected_octet_length
- SQL_PRED_NONE, // expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "bigint_col", // expected_column_name
+ SQL_BIGINT, // expected_data_type
+ SQL_BIGINT, // expected_concise_type
+ 20, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 8, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 8, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 10, // expected_num_prec_radix
+ 8, // expected_octet_length
+ SQL_PRED_NONE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 2,
- std::wstring(L"char_col"), // expected_column_name
- SQL_WVARCHAR, // expected_data_type
- SQL_WVARCHAR, // expected_concise_type
- 0, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 0, // expected_length
- std::wstring(L""), // expected_literal_prefix
- std::wstring(L""), // expected_literal_suffix
- 0, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 0, // expected_num_prec_radix
- 0, // expected_octet_length
- SQL_PRED_NONE, // expected_searchable
- SQL_TRUE); // expected_unsigned_column
+ "char_col", // expected_column_name
+ SQL_WVARCHAR, // expected_data_type
+ SQL_WVARCHAR, // expected_concise_type
+ 0, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 0, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 0, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 0, // expected_num_prec_radix
+ 0, // expected_octet_length
+ SQL_PRED_NONE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 3,
- std::wstring(L"varbinary_col"), // expected_column_name
- SQL_BINARY, // expected_data_type
- SQL_BINARY, //
expected_concise_type
- 0, //
expected_display_size
- SQL_FALSE, // expected_prec_scale
- 0, // expected_length
- std::wstring(L""), //
expected_literal_prefix
- std::wstring(L""), //
expected_literal_suffix
- 0, // expected_column_size
- 0, //
expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 0, //
expected_num_prec_radix
- 0, //
expected_octet_length
- SQL_PRED_NONE, // expected_searchable
- SQL_TRUE); //
expected_unsigned_column
+ "varbinary_col", // expected_column_name
+ SQL_BINARY, // expected_data_type
+ SQL_BINARY, // expected_concise_type
+ 0, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 0, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 0, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 0, // expected_num_prec_radix
+ 0, // expected_octet_length
+ SQL_PRED_NONE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 4,
- std::wstring(L"double_col"), // expected_column_name
- SQL_DOUBLE, // expected_data_type
- SQL_DOUBLE, // expected_concise_type
- 24, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 8, // expected_length
- std::wstring(L""), // expected_literal_prefix
- std::wstring(L""), // expected_literal_suffix
- 8, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 2, // expected_num_prec_radix
- 8, // expected_octet_length
- SQL_PRED_NONE, // expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "double_col", // expected_column_name
+ SQL_DOUBLE, // expected_data_type
+ SQL_DOUBLE, // expected_concise_type
+ 24, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 8, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 8, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 2, // expected_num_prec_radix
+ 8, // expected_octet_length
+ SQL_PRED_NONE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
DropAllDataTypeTable();
}
@@ -1402,60 +1397,59 @@ TEST_F(ColumnsOdbcV2MockTest,
TestSQLColAttributesAllTypes) {
// Tests ODBC 2.0 API SQLColAttributes
CreateAllDataTypeTable();
- std::wstring wsql = L"SELECT * from AllTypesTable;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT * from AllTypesTable;";
+ SQLSMALLINT wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
CheckSQLColAttributes(stmt, 1,
- std::wstring(L"bigint_col"), // expected_column_name
- SQL_BIGINT, // expected_data_type
- 20, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 8, // expected_length
- 8, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- SQL_PRED_NONE, // expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "bigint_col", // expected_column_name
+ SQL_BIGINT, // expected_data_type
+ 20, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 8, // expected_length
+ 8, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ SQL_PRED_NONE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttributes(stmt, 2,
- std::wstring(L"char_col"), // expected_column_name
- SQL_WVARCHAR, // expected_data_type
- 0, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 0, // expected_length
- 0, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- SQL_PRED_NONE, // expected_searchable
- SQL_TRUE); // expected_unsigned_column
+ "char_col", // expected_column_name
+ SQL_WVARCHAR, // expected_data_type
+ 0, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 0, // expected_length
+ 0, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ SQL_PRED_NONE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
CheckSQLColAttributes(stmt, 3,
- std::wstring(L"varbinary_col"), //
expected_column_name
- SQL_BINARY, // expected_data_type
- 0, //
expected_display_size
- SQL_FALSE, // expected_prec_scale
- 0, // expected_length
- 0, //
expected_column_size
- 0, //
expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- SQL_PRED_NONE, // expected_searchable
- SQL_TRUE); //
expected_unsigned_column
+ "varbinary_col", // expected_column_name
+ SQL_BINARY, // expected_data_type
+ 0, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 0, // expected_length
+ 0, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ SQL_PRED_NONE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
CheckSQLColAttributes(stmt, 4,
- std::wstring(L"double_col"), // expected_column_name
- SQL_DOUBLE, // expected_data_type
- 24, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 8, // expected_length
- 8, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- SQL_PRED_NONE, // expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "double_col", // expected_column_name
+ SQL_DOUBLE, // expected_data_type
+ 24, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 8, // expected_length
+ 8, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ SQL_PRED_NONE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
DropAllDataTypeTable();
}
@@ -1464,453 +1458,450 @@ TEST_F(ColumnsOdbcV2MockTest,
TestSQLColAttributesAllTypes) {
TEST_F(ColumnsRemoteTest, TestSQLColAttributeAllTypes) {
// Test assumes there is a table $scratch.ODBCTest in remote server
- std::wstring wsql = L"SELECT * from $scratch.ODBCTest;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT * from $scratch.ODBCTest;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
CheckSQLColAttribute(stmt, 1,
- std::wstring(L"sinteger_max"), // expected_column_name
- SQL_INTEGER, // expected_data_type
- SQL_INTEGER, // expected_concise_type
- 11, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 4, // expected_length
- std::wstring(L""), //
expected_literal_prefix
- std::wstring(L""), //
expected_literal_suffix
- 4, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 10, //
expected_num_prec_radix
- 4, // expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "sinteger_max", // expected_column_name
+ SQL_INTEGER, // expected_data_type
+ SQL_INTEGER, // expected_concise_type
+ 11, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 4, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 4, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 10, // expected_num_prec_radix
+ 4, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 2,
- std::wstring(L"sbigint_max"), // expected_column_name
- SQL_BIGINT, // expected_data_type
- SQL_BIGINT, // expected_concise_type
- 20, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 8, // expected_length
- std::wstring(L""), //
expected_literal_prefix
- std::wstring(L""), //
expected_literal_suffix
- 8, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 10, //
expected_num_prec_radix
- 8, // expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "sbigint_max", // expected_column_name
+ SQL_BIGINT, // expected_data_type
+ SQL_BIGINT, // expected_concise_type
+ 20, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 8, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 8, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 10, // expected_num_prec_radix
+ 8, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 3,
- std::wstring(L"decimal_positive"), //
expected_column_name
- SQL_DECIMAL, //
expected_data_type
- SQL_DECIMAL, //
expected_concise_type
- 40, //
expected_display_size
- SQL_FALSE, //
expected_prec_scale
- 19, // expected_length
- std::wstring(L""), //
expected_literal_prefix
- std::wstring(L""), //
expected_literal_suffix
- 19, //
expected_column_size
- 0, //
expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 10, //
expected_num_prec_radix
- 40, //
expected_octet_length
- SQL_SEARCHABLE, //
expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "decimal_positive", // expected_column_name
+ SQL_DECIMAL, // expected_data_type
+ SQL_DECIMAL, // expected_concise_type
+ 40, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 19, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 19, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 10, // expected_num_prec_radix
+ 40, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 4,
- std::wstring(L"float_max"), // expected_column_name
- SQL_FLOAT, // expected_data_type
- SQL_FLOAT, // expected_concise_type
- 24, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 8, // expected_length
- std::wstring(L""), // expected_literal_prefix
- std::wstring(L""), // expected_literal_suffix
- 8, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 2, // expected_num_prec_radix
- 8, // expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_FALSE); // expected_unsigned_column
+ "float_max", // expected_column_name
+ SQL_FLOAT, // expected_data_type
+ SQL_FLOAT, // expected_concise_type
+ 24, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 8, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 8, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 2, // expected_num_prec_radix
+ 8, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 5,
- std::wstring(L"double_max"), // expected_column_name
- SQL_DOUBLE, // expected_data_type
- SQL_DOUBLE, // expected_concise_type
- 24, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 8, // expected_length
- std::wstring(L""), // expected_literal_prefix
- std::wstring(L""), // expected_literal_suffix
- 8, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 2, // expected_num_prec_radix
- 8, // expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "double_max", // expected_column_name
+ SQL_DOUBLE, // expected_data_type
+ SQL_DOUBLE, // expected_concise_type
+ 24, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 8, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 8, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 2, // expected_num_prec_radix
+ 8, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 6,
- std::wstring(L"bit_true"), // expected_column_name
- SQL_BIT, // expected_data_type
- SQL_BIT, // expected_concise_type
- 1, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 1, // expected_length
- std::wstring(L""), // expected_literal_prefix
- std::wstring(L""), // expected_literal_suffix
- 1, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 0, // expected_num_prec_radix
- 1, // expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_TRUE); // expected_unsigned_column
+ "bit_true", // expected_column_name
+ SQL_BIT, // expected_data_type
+ SQL_BIT, // expected_concise_type
+ 1, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 1, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 1, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 0, // expected_num_prec_radix
+ 1, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 7,
- std::wstring(L"date_max"), // expected_column_name
- SQL_DATETIME, // expected_data_type
- SQL_TYPE_DATE, // expected_concise_type
- 10, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 10, // expected_length
- std::wstring(L""), // expected_literal_prefix
- std::wstring(L""), // expected_literal_suffix
- 10, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 0, // expected_num_prec_radix
- 6, // expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_TRUE); // expected_unsigned_column
+ "date_max", // expected_column_name
+ SQL_DATETIME, // expected_data_type
+ SQL_TYPE_DATE, // expected_concise_type
+ 10, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 10, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 10, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 0, // expected_num_prec_radix
+ 6, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 8,
- std::wstring(L"time_max"), // expected_column_name
- SQL_DATETIME, // expected_data_type
- SQL_TYPE_TIME, // expected_concise_type
- 12, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 12, // expected_length
- std::wstring(L""), // expected_literal_prefix
- std::wstring(L""), // expected_literal_suffix
- 12, // expected_column_size
- 3, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 0, // expected_num_prec_radix
- 6, // expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_TRUE); // expected_unsigned_column
+ "time_max", // expected_column_name
+ SQL_DATETIME, // expected_data_type
+ SQL_TYPE_TIME, // expected_concise_type
+ 12, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 12, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 12, // expected_column_size
+ 3, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 0, // expected_num_prec_radix
+ 6, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 9,
- std::wstring(L"timestamp_max"), // expected_column_name
- SQL_DATETIME, // expected_data_type
- SQL_TYPE_TIMESTAMP, //
expected_concise_type
- 23, //
expected_display_size
- SQL_FALSE, // expected_prec_scale
- 23, // expected_length
- std::wstring(L""), //
expected_literal_prefix
- std::wstring(L""), //
expected_literal_suffix
- 23, // expected_column_size
- 3, //
expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 0, //
expected_num_prec_radix
- 16, //
expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_TRUE); //
expected_unsigned_column
+ "timestamp_max", // expected_column_name
+ SQL_DATETIME, // expected_data_type
+ SQL_TYPE_TIMESTAMP, // expected_concise_type
+ 23, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 23, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 23, // expected_column_size
+ 3, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 0, // expected_num_prec_radix
+ 16, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
}
// iODBC does not support SQLColAttribute in ODBC 2.0 mode.
#ifndef __APPLE__
TEST_F(ColumnsOdbcV2RemoteTest, TestSQLColAttributeAllTypes) {
// Test assumes there is a table $scratch.ODBCTest in remote server
- std::wstring wsql = L"SELECT * from $scratch.ODBCTest;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT * from $scratch.ODBCTest;";
+ SQLSMALLINT wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
CheckSQLColAttribute(stmt, 1,
- std::wstring(L"sinteger_max"), // expected_column_name
- SQL_INTEGER, // expected_data_type
- SQL_INTEGER, // expected_concise_type
- 11, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 4, // expected_length
- std::wstring(L""), //
expected_literal_prefix
- std::wstring(L""), //
expected_literal_suffix
- 4, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 10, //
expected_num_prec_radix
- 4, // expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "sinteger_max", // expected_column_name
+ SQL_INTEGER, // expected_data_type
+ SQL_INTEGER, // expected_concise_type
+ 11, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 4, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 4, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 10, // expected_num_prec_radix
+ 4, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 2,
- std::wstring(L"sbigint_max"), // expected_column_name
- SQL_BIGINT, // expected_data_type
- SQL_BIGINT, // expected_concise_type
- 20, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 8, // expected_length
- std::wstring(L""), //
expected_literal_prefix
- std::wstring(L""), //
expected_literal_suffix
- 8, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 10, //
expected_num_prec_radix
- 8, // expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "sbigint_max", // expected_column_name
+ SQL_BIGINT, // expected_data_type
+ SQL_BIGINT, // expected_concise_type
+ 20, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 8, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 8, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 10, // expected_num_prec_radix
+ 8, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 3,
- std::wstring(L"decimal_positive"), //
expected_column_name
- SQL_DECIMAL, //
expected_data_type
- SQL_DECIMAL, //
expected_concise_type
- 40, //
expected_display_size
- SQL_FALSE, //
expected_prec_scale
- 19, // expected_length
- std::wstring(L""), //
expected_literal_prefix
- std::wstring(L""), //
expected_literal_suffix
- 19, //
expected_column_size
- 0, //
expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 10, //
expected_num_prec_radix
- 40, //
expected_octet_length
- SQL_SEARCHABLE, //
expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "decimal_positive", // expected_column_name
+ SQL_DECIMAL, // expected_data_type
+ SQL_DECIMAL, // expected_concise_type
+ 40, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 19, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 19, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 10, // expected_num_prec_radix
+ 40, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 4,
- std::wstring(L"float_max"), // expected_column_name
- SQL_FLOAT, // expected_data_type
- SQL_FLOAT, // expected_concise_type
- 24, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 8, // expected_length
- std::wstring(L""), // expected_literal_prefix
- std::wstring(L""), // expected_literal_suffix
- 8, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 2, // expected_num_prec_radix
- 8, // expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_FALSE); // expected_unsigned_column
+ "float_max", // expected_column_name
+ SQL_FLOAT, // expected_data_type
+ SQL_FLOAT, // expected_concise_type
+ 24, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 8, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 8, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 2, // expected_num_prec_radix
+ 8, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 5,
- std::wstring(L"double_max"), // expected_column_name
- SQL_DOUBLE, // expected_data_type
- SQL_DOUBLE, // expected_concise_type
- 24, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 8, // expected_length
- std::wstring(L""), // expected_literal_prefix
- std::wstring(L""), // expected_literal_suffix
- 8, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 2, // expected_num_prec_radix
- 8, // expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "double_max", // expected_column_name
+ SQL_DOUBLE, // expected_data_type
+ SQL_DOUBLE, // expected_concise_type
+ 24, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 8, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 8, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 2, // expected_num_prec_radix
+ 8, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 6,
- std::wstring(L"bit_true"), // expected_column_name
- SQL_BIT, // expected_data_type
- SQL_BIT, // expected_concise_type
- 1, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 1, // expected_length
- std::wstring(L""), // expected_literal_prefix
- std::wstring(L""), // expected_literal_suffix
- 1, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 0, // expected_num_prec_radix
- 1, // expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_TRUE); // expected_unsigned_column
+ "bit_true", // expected_column_name
+ SQL_BIT, // expected_data_type
+ SQL_BIT, // expected_concise_type
+ 1, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 1, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 1, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 0, // expected_num_prec_radix
+ 1, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 7,
- std::wstring(L"date_max"), // expected_column_name
- SQL_DATETIME, // expected_data_type
- SQL_DATE, // expected_concise_type
- 10, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 10, // expected_length
- std::wstring(L""), // expected_literal_prefix
- std::wstring(L""), // expected_literal_suffix
- 10, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 0, // expected_num_prec_radix
- 6, // expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_TRUE); // expected_unsigned_column
+ "date_max", // expected_column_name
+ SQL_DATETIME, // expected_data_type
+ SQL_DATE, // expected_concise_type
+ 10, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 10, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 10, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 0, // expected_num_prec_radix
+ 6, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 8,
- std::wstring(L"time_max"), // expected_column_name
- SQL_DATETIME, // expected_data_type
- SQL_TIME, // expected_concise_type
- 12, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 12, // expected_length
- std::wstring(L""), // expected_literal_prefix
- std::wstring(L""), // expected_literal_suffix
- 12, // expected_column_size
- 3, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 0, // expected_num_prec_radix
- 6, // expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_TRUE); // expected_unsigned_column
+ "time_max", // expected_column_name
+ SQL_DATETIME, // expected_data_type
+ SQL_TIME, // expected_concise_type
+ 12, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 12, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 12, // expected_column_size
+ 3, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 0, // expected_num_prec_radix
+ 6, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
CheckSQLColAttribute(stmt, 9,
- std::wstring(L"timestamp_max"), // expected_column_name
- SQL_DATETIME, // expected_data_type
- SQL_TIMESTAMP, //
expected_concise_type
- 23, //
expected_display_size
- SQL_FALSE, // expected_prec_scale
- 23, // expected_length
- std::wstring(L""), //
expected_literal_prefix
- std::wstring(L""), //
expected_literal_suffix
- 23, // expected_column_size
- 3, //
expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- 0, //
expected_num_prec_radix
- 16, //
expected_octet_length
- SQL_SEARCHABLE, // expected_searchable
- SQL_TRUE); //
expected_unsigned_column
+ "timestamp_max", // expected_column_name
+ SQL_DATETIME, // expected_data_type
+ SQL_TIMESTAMP, // expected_concise_type
+ 23, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 23, // expected_length
+ "", // expected_literal_prefix
+ "", // expected_literal_suffix
+ 23, // expected_column_size
+ 3, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ 0, // expected_num_prec_radix
+ 16, // expected_octet_length
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
}
// iODBC does not support SQLColAttributes for ODBC 3.0 attributes.
TEST_F(ColumnsOdbcV2RemoteTest, TestSQLColAttributesAllTypes) {
// Tests ODBC 2.0 API SQLColAttributes
// Test assumes there is a table $scratch.ODBCTest in remote server
- std::wstring wsql = L"SELECT * from $scratch.ODBCTest;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT * from $scratch.ODBCTest;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
CheckSQLColAttributes(stmt, 1,
- std::wstring(L"sinteger_max"), // expected_column_name
- SQL_INTEGER, // expected_data_type
- 11, //
expected_display_size
- SQL_FALSE, // expected_prec_scale
- 4, // expected_length
- 4, // expected_column_size
- 0, //
expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- SQL_SEARCHABLE, // expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "sinteger_max", // expected_column_name
+ SQL_INTEGER, // expected_data_type
+ 11, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 4, // expected_length
+ 4, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttributes(stmt, 2,
- std::wstring(L"sbigint_max"), // expected_column_name
- SQL_BIGINT, // expected_data_type
- 20, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 8, // expected_length
- 8, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- SQL_SEARCHABLE, // expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "sbigint_max", // expected_column_name
+ SQL_BIGINT, // expected_data_type
+ 20, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 8, // expected_length
+ 8, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttributes(stmt, 3,
- std::wstring(L"decimal_positive"), //
expected_column_name
- SQL_DECIMAL, //
expected_data_type
- 40, //
expected_display_size
- SQL_FALSE, //
expected_prec_scale
- 19, // expected_length
- 19, //
expected_column_size
- 0, //
expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- SQL_SEARCHABLE, //
expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "decimal_positive", // expected_column_name
+ SQL_DECIMAL, // expected_data_type
+ 40, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 19, // expected_length
+ 19, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttributes(stmt, 4,
- std::wstring(L"float_max"), // expected_column_name
- SQL_FLOAT, // expected_data_type
- 24, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 8, // expected_length
- 8, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- SQL_SEARCHABLE, // expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "float_max", // expected_column_name
+ SQL_FLOAT, // expected_data_type
+ 24, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 8, // expected_length
+ 8, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttributes(stmt, 5,
- std::wstring(L"double_max"), // expected_column_name
- SQL_DOUBLE, // expected_data_type
- 24, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 8, // expected_length
- 8, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- SQL_SEARCHABLE, // expected_searchable
- SQL_FALSE); //
expected_unsigned_column
+ "double_max", // expected_column_name
+ SQL_DOUBLE, // expected_data_type
+ 24, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 8, // expected_length
+ 8, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_FALSE); // expected_unsigned_column
CheckSQLColAttributes(stmt, 6,
- std::wstring(L"bit_true"), // expected_column_name
- SQL_BIT, // expected_data_type
- 1, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 1, // expected_length
- 1, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- SQL_SEARCHABLE, // expected_searchable
- SQL_TRUE); // expected_unsigned_column
+ "bit_true", // expected_column_name
+ SQL_BIT, // expected_data_type
+ 1, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 1, // expected_length
+ 1, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
CheckSQLColAttributes(stmt, 7,
- std::wstring(L"date_max"), // expected_column_name
- SQL_DATE, // expected_data_type
- 10, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 10, // expected_length
- 10, // expected_column_size
- 0, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- SQL_SEARCHABLE, // expected_searchable
- SQL_TRUE); // expected_unsigned_column
+ "date_max", // expected_column_name
+ SQL_DATE, // expected_data_type
+ 10, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 10, // expected_length
+ 10, // expected_column_size
+ 0, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
CheckSQLColAttributes(stmt, 8,
- std::wstring(L"time_max"), // expected_column_name
- SQL_TIME, // expected_data_type
- 12, // expected_display_size
- SQL_FALSE, // expected_prec_scale
- 12, // expected_length
- 12, // expected_column_size
- 3, // expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- SQL_SEARCHABLE, // expected_searchable
- SQL_TRUE); // expected_unsigned_column
+ "time_max", // expected_column_name
+ SQL_TIME, // expected_data_type
+ 12, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 12, // expected_length
+ 12, // expected_column_size
+ 3, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
CheckSQLColAttributes(stmt, 9,
- std::wstring(L"timestamp_max"), //
expected_column_name
- SQL_TIMESTAMP, // expected_data_type
- 23, //
expected_display_size
- SQL_FALSE, // expected_prec_scale
- 23, // expected_length
- 23, //
expected_column_size
- 3, //
expected_column_scale
- SQL_NULLABLE, //
expected_column_nullability
- SQL_SEARCHABLE, // expected_searchable
- SQL_TRUE); //
expected_unsigned_column
+ "timestamp_max", // expected_column_name
+ SQL_TIMESTAMP, // expected_data_type
+ 23, // expected_display_size
+ SQL_FALSE, // expected_prec_scale
+ 23, // expected_length
+ 23, // expected_column_size
+ 3, // expected_column_scale
+ SQL_NULLABLE, // expected_column_nullability
+ SQL_SEARCHABLE, // expected_searchable
+ SQL_TRUE); // expected_unsigned_column
}
#endif // __APPLE__
@@ -2254,7 +2245,7 @@ TEST_F(ColumnsMockTest, SQLDescribeColValidateInput) {
SQLUSMALLINT bookmark_column = 0;
SQLUSMALLINT out_of_range_column = 4;
SQLUSMALLINT negative_column = -1;
- SQLWCHAR column_name[1024];
+ SQLWCHAR column_name[1024] = {0};
SQLSMALLINT buf_char_len =
static_cast<SQLSMALLINT>(sizeof(column_name) / GetSqlWCharSize());
SQLSMALLINT name_length = 0;
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 307b481251..38f8d342a0 100644
--- a/cpp/src/arrow/flight/sql/odbc/tests/errors_test.cc
+++ b/cpp/src/arrow/flight/sql/odbc/tests/errors_test.cc
@@ -401,11 +401,10 @@ TYPED_TEST(ErrorsTest, TestSQLErrorStmtError) {
// When application passes buffer length greater than SQL_MAX_MESSAGE_LENGTH
(512),
// DM passes 512 as buffer length to SQLError.
- std::wstring wsql = L"1";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"1";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_ERROR,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_ERROR, SQLExecDirect(stmt, wsql, wsql_len));
SQLWCHAR sql_state[6] = {0};
SQLINTEGER native_error = 0;
@@ -428,11 +427,10 @@ TYPED_TEST(ErrorsTest, TestSQLErrorStmtError) {
TYPED_TEST(ErrorsTest, TestSQLErrorStmtWarning) {
// Test ODBC 2.0 API SQLError.
- std::wstring wsql = L"SELECT 'VERY LONG STRING here' AS string_col;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 'VERY LONG STRING here' AS string_col;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -534,11 +532,10 @@ TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorStmtError) {
// When application passes buffer length greater than SQL_MAX_MESSAGE_LENGTH
(512),
// DM passes 512 as buffer length to SQLError.
- std::wstring wsql = L"SELECT * from non_existent_table;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT * from non_existent_table;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_ERROR,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_ERROR, SQLExecDirect(stmt, wsql, wsql_len));
SQLWCHAR sql_state[6] = {0};
SQLINTEGER native_error = 0;
@@ -559,11 +556,10 @@ TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorStmtError) {
TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorStmtWarning) {
// Test ODBC 2.0 API SQLError.
- std::wstring wsql = L"SELECT 'VERY LONG STRING here' AS string_col;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 'VERY LONG STRING here' AS string_col;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
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 18dca6e24b..1bbd3c1b74 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
@@ -332,11 +332,10 @@ TYPED_TEST(StatementAttributeTest,
TestSQLGetStmtAttrRowBindType) {
}
TYPED_TEST(StatementAttributeTest, TestSQLGetStmtAttrRowNumber) {
- std::wstring wsql = L"SELECT 1;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 1;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
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 a69ba9dd3c..dd33ce9ae9 100644
--- a/cpp/src/arrow/flight/sql/odbc/tests/statement_test.cc
+++ b/cpp/src/arrow/flight/sql/odbc/tests/statement_test.cc
@@ -38,11 +38,10 @@ using TestTypes = ::testing::Types<StatementMockTest,
StatementRemoteTest>;
TYPED_TEST_SUITE(StatementTest, TestTypes);
TYPED_TEST(StatementTest, TestSQLExecDirectSimpleQuery) {
- std::wstring wsql = L"SELECT 1;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 1;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -66,21 +65,19 @@ TYPED_TEST(StatementTest, TestSQLExecDirectSimpleQuery) {
}
TYPED_TEST(StatementTest, TestSQLExecDirectInvalidQuery) {
- std::wstring wsql = L"SELECT;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_ERROR,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_ERROR, SQLExecDirect(stmt, wsql, wsql_len));
// ODBC provides generic error code HY000 to all statement errors
VerifyOdbcErrorState(SQL_HANDLE_STMT, stmt, kErrorStateHY000);
}
TYPED_TEST(StatementTest, TestSQLExecuteSimpleQuery) {
- std::wstring wsql = L"SELECT 1;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 1;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLPrepare(stmt, &sql0[0], static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLPrepare(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLExecute(stmt));
@@ -107,10 +104,10 @@ TYPED_TEST(StatementTest, TestSQLExecuteSimpleQuery) {
}
TYPED_TEST(StatementTest, TestSQLPrepareInvalidQuery) {
- std::wstring wsql = L"SELECT;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_ERROR, SQLPrepare(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_ERROR, SQLPrepare(stmt, wsql, wsql_len));
// ODBC provides generic error code HY000 to all statement errors
VerifyOdbcErrorState(SQL_HANDLE_STMT, stmt, kErrorStateHY000);
@@ -349,15 +346,14 @@ TEST_F(StatementRemoteTest, TestSQLExecDirectTimeQuery) {
// Mock server test is skipped due to limitation on the mock server.
// Time type from mock server does not include the fraction
- std::wstring wsql =
+ SQLWCHAR wsql[] =
LR"(
SELECT CAST(TIME '00:00:00' AS TIME) AS time_min,
CAST(TIME '23:59:59' AS TIME) AS time_max;
)";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLSMALLINT wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -382,11 +378,10 @@ TEST_F(StatementMockTest,
TestSQLExecDirectVarbinaryQuery) {
// Have binary test on mock test base as remote test servers tend to have
different
// formats for binary data
- std::wstring wsql = L"SELECT X'ABCDEF' AS c_varbinary;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT X'ABCDEF' AS c_varbinary;";
+ SQLSMALLINT wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -578,15 +573,14 @@ TEST_F(StatementRemoteTest,
TestSQLExecDirectTimeQueryDefaultType) {
// Mock server test is skipped due to limitation on the mock server.
// Time type from mock server does not include the fraction
- std::wstring wsql =
+ SQLWCHAR wsql[] =
LR"(
SELECT CAST(TIME '00:00:00' AS TIME) AS time_min,
CAST(TIME '23:59:59' AS TIME) AS time_max;
)";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -612,11 +606,10 @@ TEST_F(StatementRemoteTest,
TestSQLExecDirectVarbinaryQueryDefaultType) {
// Mock server has type `DENSE_UNION` for varbinary.
// Note that not all remote servers support "from_hex" function
- std::wstring wsql = L"SELECT from_hex('ABCDEF') AS c_varbinary;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT from_hex('ABCDEF') AS c_varbinary;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -634,11 +627,10 @@ TEST_F(StatementRemoteTest,
TestSQLExecDirectVarbinaryQueryDefaultType) {
// 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
- std::wstring wsql = L"SELECT CAST('123.45' AS NUMERIC) as decimal_col;";
- std::vector<SQLWCHAR> sql(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT CAST('123.45' AS NUMERIC) as decimal_col;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql[0], static_cast<SQLINTEGER>(sql.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -680,11 +672,10 @@ TYPED_TEST(StatementTest,
DISABLED_TestGetDataPrecisionScaleUsesIRDAsDefault) {
TYPED_TEST(StatementTest, DISABLED_TestGetDataPrecisionScaleUsesARDWhenSet) {
// Verify that SQLGetData uses ARD precision/scale when set, for both
SQL_ARD_TYPE and
// SQL_C_DEFAULT
- std::wstring wsql = L"SELECT CAST('123.45' AS NUMERIC) as decimal_col;";
- std::vector<SQLWCHAR> sql(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT CAST('123.45' AS NUMERIC) as decimal_col;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql[0], static_cast<SQLINTEGER>(sql.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -726,11 +717,10 @@ TYPED_TEST(StatementTest,
DISABLED_TestGetDataPrecisionScaleUsesARDWhenSet) {
TYPED_TEST(StatementTest, TestSQLExecDirectGuidQueryUnsupported) {
// Query GUID as string as SQLite does not support GUID
- std::wstring wsql = L"SELECT 'C77313CF-4E08-47CE-B6DF-94DD2FCF3541' AS
guid;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 'C77313CF-4E08-47CE-B6DF-94DD2FCF3541' AS guid;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -743,7 +733,7 @@ TYPED_TEST(StatementTest,
TestSQLExecDirectGuidQueryUnsupported) {
}
TYPED_TEST(StatementTest, TestSQLExecDirectRowFetching) {
- std::wstring wsql =
+ SQLWCHAR wsql[] =
LR"(
SELECT 1 AS small_table
UNION ALL
@@ -751,10 +741,9 @@ TYPED_TEST(StatementTest, TestSQLExecDirectRowFetching) {
UNION ALL
SELECT 3;
)";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
// Fetch row 1
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -802,7 +791,7 @@ TYPED_TEST(StatementTest, TestSQLFetchScrollRowFetching) {
SQLLEN rows_fetched;
SQLSetStmtAttr(stmt, SQL_ATTR_ROWS_FETCHED_PTR, &rows_fetched, 0);
- std::wstring wsql =
+ SQLWCHAR wsql[] =
LR"(
SELECT 1 AS small_table
UNION ALL
@@ -810,10 +799,9 @@ TYPED_TEST(StatementTest, TestSQLFetchScrollRowFetching) {
UNION ALL
SELECT 3;
)";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
// Fetch row 1
ASSERT_EQ(SQL_SUCCESS, SQLFetchScroll(stmt, SQL_FETCH_NEXT, 0));
@@ -865,11 +853,10 @@ TYPED_TEST(StatementTest, TestSQLFetchScrollRowFetching) {
TYPED_TEST(StatementTest, TestSQLFetchScrollUnsupportedOrientation) {
// SQL_FETCH_NEXT is the only supported fetch orientation.
- std::wstring wsql = L"SELECT 1;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 1;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_ERROR, SQLFetchScroll(stmt, SQL_FETCH_PRIOR, 0));
@@ -903,11 +890,10 @@ TYPED_TEST(StatementTest,
TestSQLFetchScrollUnsupportedOrientation) {
}
TYPED_TEST(StatementTest, TestSQLExecDirectVarcharTruncation) {
- std::wstring wsql = L"SELECT 'VERY LONG STRING here' AS string_col;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 'VERY LONG STRING here' AS string_col;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -953,11 +939,10 @@ TYPED_TEST(StatementTest,
TestSQLExecDirectVarcharTruncation) {
}
TYPED_TEST(StatementTest, TestSQLExecDirectWVarcharTruncation) {
- std::wstring wsql = L"SELECT 'VERY LONG Unicode STRING 句子 here' AS
wstring_col;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 'VERY LONG Unicode STRING 句子 here' AS
wstring_col;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -1007,11 +992,10 @@ TEST_F(StatementMockTest,
TestSQLExecDirectVarbinaryTruncation) {
// Have binary test on mock test base as remote test servers tend to have
different
// formats for binary data
- std::wstring wsql = L"SELECT X'ABCDEFAB' AS c_varbinary;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT X'ABCDEFAB' AS c_varbinary;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -1052,9 +1036,9 @@ TYPED_TEST(StatementTest,
DISABLED_TestSQLExecDirectFloatTruncation) {
// GH-46985: return warning message instead of error on float truncation case
std::wstring wsql;
if constexpr (std::is_same_v<TypeParam, StatementMockTest>) {
- wsql = std::wstring(L"SELECT CAST(1.234 AS REAL) AS float_val");
+ wsql = L"SELECT CAST(1.234 AS REAL) AS float_val";
} else if constexpr (std::is_same_v<TypeParam, StatementRemoteTest>) {
- wsql = std::wstring(L"SELECT CAST(1.234 AS FLOAT) AS float_val");
+ wsql = L"SELECT CAST(1.234 AS FLOAT) AS float_val";
}
std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
@@ -1077,11 +1061,10 @@ TEST_F(StatementRemoteTest, TestSQLExecDirectNullQuery)
{
// 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.
- std::wstring wsql = L"SELECT null as null_col;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT null as null_col;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -1099,17 +1082,16 @@ TEST_F(StatementMockTest,
TestSQLExecDirectTruncationQueryNullIndicator) {
// Have binary test on mock test base as remote test servers tend to have
different
// formats for binary data
- std::wstring wsql =
+ SQLWCHAR wsql[] =
LR"(
SELECT 1,
'VERY LONG STRING here' AS string_col,
'VERY LONG Unicode STRING 句子 here' AS wstring_col,
X'ABCDEFAB' AS c_varbinary;
)";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -1150,11 +1132,10 @@ TEST_F(StatementRemoteTest,
TestSQLExecDirectNullQueryNullIndicator) {
// 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.
- std::wstring wsql = L"SELECT null as null_col;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT null as null_col;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -1651,15 +1632,14 @@ TEST_F(StatementRemoteTest, TestSQLBindColTimeQuery) {
ASSERT_EQ(SQL_SUCCESS,
SQLBindCol(stmt, 2, SQL_C_TYPE_TIME, &time_var_max, buf_len,
&ind));
- std::wstring wsql =
+ SQLWCHAR wsql[] =
LR"(
SELECT CAST(TIME '00:00:00' AS TIME) AS time_min,
CAST(TIME '23:59:59' AS TIME) AS time_max;
)";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -1685,11 +1665,10 @@ TEST_F(StatementMockTest, TestSQLBindColVarbinaryQuery)
{
ASSERT_EQ(SQL_SUCCESS,
SQLBindCol(stmt, 1, SQL_C_BINARY, &varbinary_val[0], buf_len,
&ind));
- std::wstring wsql = L"SELECT X'ABCDEF' AS c_varbinary;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT X'ABCDEF' AS c_varbinary;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -1708,11 +1687,10 @@ TEST_F(StatementRemoteTest, TestSQLBindColNullQuery) {
ASSERT_EQ(SQL_SUCCESS, SQLBindCol(stmt, 1, SQL_C_LONG, &val, 0, &ind));
- std::wstring wsql = L"SELECT null as null_col;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT null as null_col;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -1728,11 +1706,10 @@ TEST_F(StatementRemoteTest,
TestSQLBindColNullQueryNullIndicator) {
ASSERT_EQ(SQL_SUCCESS, SQLBindCol(stmt, 1, SQL_C_LONG, &val, 0, 0));
- std::wstring wsql = L"SELECT null as null_col;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT null as null_col;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_ERROR, SQLFetch(stmt));
// Verify invalid null indicator is reported, as it is required
@@ -1748,7 +1725,7 @@ TYPED_TEST(StatementTest, TestSQLBindColRowFetching) {
// should be updated after every SQLFetch call.
ASSERT_EQ(SQL_SUCCESS, SQLBindCol(stmt, 1, SQL_C_LONG, &val, buf_len, &ind));
- std::wstring wsql =
+ SQLWCHAR wsql[] =
LR"(
SELECT 1 AS small_table
UNION ALL
@@ -1756,10 +1733,9 @@ TYPED_TEST(StatementTest, TestSQLBindColRowFetching) {
UNION ALL
SELECT 3;
)";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
// Fetch row 1
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -1799,7 +1775,7 @@ TYPED_TEST(StatementTest, TestSQLBindColRowArraySize) {
ASSERT_EQ(SQL_SUCCESS,
SQLSetStmtAttr(stmt, SQL_ATTR_ROWS_FETCHED_PTR, &rows_fetched, 0));
- std::wstring wsql =
+ SQLWCHAR wsql[] =
LR"(
SELECT 1 AS small_table
UNION ALL
@@ -1807,10 +1783,9 @@ TYPED_TEST(StatementTest, TestSQLBindColRowArraySize) {
UNION ALL
SELECT 3;
)";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLSetStmtAttr(stmt, SQL_ATTR_ROW_ARRAY_SIZE,
reinterpret_cast<SQLPOINTER>(rows),
0));
@@ -1918,7 +1893,7 @@ TYPED_TEST(StatementTest,
TestSQLExtendedFetchRowFetching) {
ASSERT_EQ(SQL_SUCCESS,
SQLSetStmtAttr(stmt, SQL_ROWSET_SIZE,
reinterpret_cast<SQLPOINTER>(rows), 0));
- std::wstring wsql =
+ SQLWCHAR wsql[] =
LR"(
SELECT 1 AS small_table
UNION ALL
@@ -1926,10 +1901,9 @@ TYPED_TEST(StatementTest,
TestSQLExtendedFetchRowFetching) {
UNION ALL
SELECT 3;
)";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
// Fetch row 1-3.
SQLULEN row_count;
@@ -1965,11 +1939,10 @@ TEST_F(StatementRemoteTest,
DISABLED_TestSQLExtendedFetchQueryNullIndicator) {
ASSERT_EQ(SQL_SUCCESS, SQLBindCol(stmt, 1, SQL_C_LONG, &val, 0, nullptr));
- std::wstring wsql = L"SELECT null as null_col;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT null as null_col;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
SQLULEN row_count1;
SQLUSMALLINT row_status1[1];
@@ -1982,11 +1955,11 @@ TEST_F(StatementRemoteTest,
DISABLED_TestSQLExtendedFetchQueryNullIndicator) {
TYPED_TEST(StatementTest, TestSQLMoreResultsNoData) {
// Verify SQLMoreResults returns SQL_NO_DATA by default.
- std::wstring wsql = L"SELECT 1;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ SQLWCHAR wsql[] = L"SELECT 1;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
+
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_NO_DATA, SQLMoreResults(stmt));
}
@@ -2209,21 +2182,19 @@ TYPED_TEST(StatementTest,
SQLRowCountFunctionSequenceErrorOnNoQuery) {
}
TYPED_TEST(StatementTest, TestSQLFreeStmtSQLClose) {
- std::wstring wsql = L"SELECT 1;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 1;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLFreeStmt(stmt, SQL_CLOSE));
}
TYPED_TEST(StatementTest, TestSQLCloseCursor) {
- std::wstring wsql = L"SELECT 1;";
- std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
+ SQLWCHAR wsql[] = L"SELECT 1;";
+ SQLINTEGER wsql_len = std::wcslen(wsql);
- ASSERT_EQ(SQL_SUCCESS,
- SQLExecDirect(stmt, &sql0[0],
static_cast<SQLINTEGER>(sql0.size())));
+ ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
ASSERT_EQ(SQL_SUCCESS, SQLCloseCursor(stmt));
}