@@ -106,4 +106,118 @@ TEST(SQLFreeHandle, TestFreeNullHandles) {
106106 ASSERT_EQ (SQL_INVALID_HANDLE, SQLFreeHandle (SQL_HANDLE_ENV, env));
107107}
108108
109+ TEST (SQLGetEnvAttr, TestSQLGetEnvAttrODBCVersion) {
110+ SQLHENV env;
111+
112+ SQLINTEGER version;
113+
114+ // Allocate an environment handle
115+ ASSERT_EQ (SQL_SUCCESS, SQLAllocEnv (&env));
116+
117+ ASSERT_EQ (SQL_SUCCESS, SQLGetEnvAttr (env, SQL_ATTR_ODBC_VERSION, &version, 0 , 0 ));
118+
119+ ASSERT_EQ (SQL_OV_ODBC2, version);
120+
121+ ASSERT_EQ (SQL_SUCCESS, SQLFreeEnv (env));
122+ }
123+
124+ TEST (SQLSetEnvAttr, TestSQLSetEnvAttrODBCVersionValid) {
125+ SQLHENV env;
126+
127+ // Allocate an environment handle
128+ ASSERT_EQ (SQL_SUCCESS, SQLAllocEnv (&env));
129+
130+ // Attempt to set to supported version
131+ ASSERT_EQ (SQL_SUCCESS, SQLSetEnvAttr (env, SQL_ATTR_ODBC_VERSION,
132+ reinterpret_cast <void *>(SQL_OV_ODBC2), 0 ));
133+
134+ SQLINTEGER version;
135+ // Check ODBC version is set
136+ ASSERT_EQ (SQL_SUCCESS, SQLGetEnvAttr (env, SQL_ATTR_ODBC_VERSION, &version, 0 , 0 ));
137+
138+ ASSERT_EQ (SQL_OV_ODBC2, version);
139+
140+ ASSERT_EQ (SQL_SUCCESS, SQLFreeEnv (env));
141+ }
142+
143+ TEST (SQLSetEnvAttr, TestSQLSetEnvAttrODBCVersionInvalid) {
144+ SQLHENV env;
145+
146+ // Allocate an environment handle
147+ ASSERT_EQ (SQL_SUCCESS, SQLAllocEnv (&env));
148+
149+ // Attempt to set to unsupported version
150+ ASSERT_EQ (SQL_ERROR,
151+ SQLSetEnvAttr (env, SQL_ATTR_ODBC_VERSION, reinterpret_cast <void *>(1 ), 0 ));
152+
153+ ASSERT_EQ (SQL_SUCCESS, SQLFreeEnv (env));
154+ }
155+
156+ // GH-46574 TODO: enable TestSQLGetEnvAttrOutputNTS which requires connection support
157+ TYPED_TEST (ConnectionTest, DISABLED_TestSQLGetEnvAttrOutputNTS) {
158+ SQLINTEGER output_nts;
159+
160+ ASSERT_EQ (SQL_SUCCESS,
161+ SQLGetEnvAttr (this ->env , SQL_ATTR_OUTPUT_NTS, &output_nts, 0 , 0 ));
162+
163+ ASSERT_EQ (SQL_TRUE, output_nts);
164+ }
165+
166+ TYPED_TEST (ConnectionTest, DISABLED_TestSQLGetEnvAttrGetLength) {
167+ // Test is disabled because call to SQLGetEnvAttr is handled by the driver manager on
168+ // Windows. Windows driver manager ignores the length pointer.
169+ // This test case can be potentially used on macOS/Linux
170+ SQLINTEGER length;
171+ ASSERT_EQ (SQL_SUCCESS,
172+ SQLGetEnvAttr (this ->env , SQL_ATTR_ODBC_VERSION, nullptr , 0 , &length));
173+
174+ EXPECT_EQ (sizeof (SQLINTEGER), length);
175+ }
176+
177+ TYPED_TEST (ConnectionTest, DISABLED_TestSQLGetEnvAttrNullValuePointer) {
178+ // Test is disabled because call to SQLGetEnvAttr is handled by the driver manager on
179+ // Windows. The Windows driver manager doesn't error out when null pointer is passed.
180+ // This test case can be potentially used on macOS/Linux
181+ ASSERT_EQ (SQL_ERROR,
182+ SQLGetEnvAttr (this ->env , SQL_ATTR_ODBC_VERSION, nullptr , 0 , nullptr ));
183+ }
184+
185+ TEST (SQLSetEnvAttr, TestSQLSetEnvAttrOutputNTSValid) {
186+ SQLHENV env;
187+
188+ // Allocate an environment handle
189+ ASSERT_EQ (SQL_SUCCESS, SQLAllocEnv (&env));
190+
191+ // Attempt to set to output nts to supported version
192+ ASSERT_EQ (SQL_SUCCESS, SQLSetEnvAttr (env, SQL_ATTR_OUTPUT_NTS,
193+ reinterpret_cast <void *>(SQL_TRUE), 0 ));
194+
195+ ASSERT_EQ (SQL_SUCCESS, SQLFreeEnv (env));
196+ }
197+
198+ TEST (SQLSetEnvAttr, TestSQLSetEnvAttrOutputNTSInvalid) {
199+ SQLHENV env;
200+
201+ // Allocate an environment handle
202+ ASSERT_EQ (SQL_SUCCESS, SQLAllocEnv (&env));
203+
204+ // Attempt to set to output nts to unsupported false
205+ ASSERT_EQ (SQL_ERROR, SQLSetEnvAttr (env, SQL_ATTR_OUTPUT_NTS,
206+ reinterpret_cast <void *>(SQL_FALSE), 0 ));
207+
208+ ASSERT_EQ (SQL_SUCCESS, SQLFreeEnv (env));
209+ }
210+
211+ TEST (SQLSetEnvAttr, TestSQLSetEnvAttrNullValuePointer) {
212+ SQLHENV env;
213+
214+ // Allocate an environment handle
215+ ASSERT_EQ (SQL_SUCCESS, SQLAllocEnv (&env));
216+
217+ // Attempt to set using bad data pointer
218+ ASSERT_EQ (SQL_ERROR, SQLSetEnvAttr (env, SQL_ATTR_ODBC_VERSION, nullptr , 0 ));
219+
220+ ASSERT_EQ (SQL_SUCCESS, SQLFreeEnv (env));
221+ }
222+
109223} // namespace arrow::flight::sql::odbc
0 commit comments