Skip to content

Commit 6d2dd06

Browse files
authored
Add tests for SQLGetFunctions
* Using `SQL_FUNC_EXISTS` macro fixed the issue of `api_exists` not read correctly * Fix SQLGetTypeInfo naming for ODBC ver 2 tests * Add more tests Add unsupported API checks. Add `TestSQLGetFunctionsODBCVer2`. Add `TestSQLGetFunctionsCheckSingleAPI`. * Update reset value * Add SQLDescribeCol function check
1 parent 524d981 commit 6d2dd06

File tree

3 files changed

+248
-7
lines changed

3 files changed

+248
-7
lines changed

cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ add_arrow_test(flight_sql_odbc_test
3535
connection_attr_test.cc
3636
connection_info_test.cc
3737
errors_test.cc
38+
get_functions_test.cc
3839
statement_attr_test.cc
3940
statement_test.cc
4041
tables_test.cc
Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
// Licensed to the Apache Software Foundation (ASF) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The ASF licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
#include "arrow/flight/sql/odbc/tests/odbc_test_suite.h"
18+
19+
#ifdef _WIN32
20+
# include <windows.h>
21+
#endif
22+
23+
#include <sql.h>
24+
#include <sqltypes.h>
25+
#include <sqlucode.h>
26+
27+
#include "gtest/gtest.h"
28+
29+
namespace arrow::flight::sql::odbc {
30+
31+
TYPED_TEST(FlightSQLODBCTestBase, TestSQLGetFunctionsAllFunctions) {
32+
// Verify driver manager return values for SQLGetFunctions
33+
this->connect();
34+
35+
SQLUSMALLINT api_exists[SQL_API_ODBC3_ALL_FUNCTIONS_SIZE];
36+
const std::vector<int> supported_functions = {
37+
SQL_API_SQLALLOCHANDLE, SQL_API_SQLBINDCOL, SQL_API_SQLGETDIAGFIELD,
38+
SQL_API_SQLCANCEL, SQL_API_SQLCLOSECURSOR, SQL_API_SQLGETDIAGREC,
39+
SQL_API_SQLCOLATTRIBUTE, SQL_API_SQLGETENVATTR, SQL_API_SQLCONNECT,
40+
SQL_API_SQLGETINFO, SQL_API_SQLGETSTMTATTR, SQL_API_SQLDESCRIBECOL,
41+
SQL_API_SQLGETTYPEINFO, SQL_API_SQLDISCONNECT, SQL_API_SQLNUMRESULTCOLS,
42+
SQL_API_SQLPREPARE, SQL_API_SQLEXECDIRECT, SQL_API_SQLEXECUTE, SQL_API_SQLROWCOUNT,
43+
SQL_API_SQLFETCH, SQL_API_SQLSETCONNECTATTR, SQL_API_SQLFETCHSCROLL,
44+
SQL_API_SQLFREEHANDLE, SQL_API_SQLFREESTMT, SQL_API_SQLGETCONNECTATTR,
45+
SQL_API_SQLSETENVATTR, SQL_API_SQLSETSTMTATTR, SQL_API_SQLGETDATA,
46+
SQL_API_SQLCOLUMNS, SQL_API_SQLTABLES, SQL_API_SQLNATIVESQL,
47+
SQL_API_SQLDRIVERCONNECT, SQL_API_SQLMORERESULTS, SQL_API_SQLPRIMARYKEYS,
48+
SQL_API_SQLFOREIGNKEYS,
49+
50+
// ODBC 2.0 APIs
51+
SQL_API_SQLSETSTMTOPTION, SQL_API_SQLGETSTMTOPTION, SQL_API_SQLSETCONNECTOPTION,
52+
SQL_API_SQLGETCONNECTOPTION, SQL_API_SQLALLOCCONNECT, SQL_API_SQLALLOCENV,
53+
SQL_API_SQLALLOCSTMT, SQL_API_SQLFREEENV, SQL_API_SQLFREECONNECT,
54+
55+
// Driver Manager APIs
56+
SQL_API_SQLGETFUNCTIONS, SQL_API_SQLDRIVERS, SQL_API_SQLDATASOURCES};
57+
const std::vector<int> unsupported_functions = {
58+
SQL_API_SQLPUTDATA, SQL_API_SQLGETDESCFIELD, SQL_API_SQLGETDESCREC,
59+
SQL_API_SQLCOPYDESC, SQL_API_SQLPARAMDATA, SQL_API_SQLENDTRAN,
60+
SQL_API_SQLSETCURSORNAME, SQL_API_SQLSETDESCFIELD, SQL_API_SQLSETDESCREC,
61+
SQL_API_SQLGETCURSORNAME, SQL_API_SQLSTATISTICS, SQL_API_SQLSPECIALCOLUMNS,
62+
SQL_API_SQLBINDPARAMETER, SQL_API_SQLBROWSECONNECT, SQL_API_SQLNUMPARAMS,
63+
SQL_API_SQLBULKOPERATIONS, SQL_API_SQLCOLUMNPRIVILEGES, SQL_API_SQLPROCEDURECOLUMNS,
64+
SQL_API_SQLDESCRIBEPARAM, SQL_API_SQLPROCEDURES, SQL_API_SQLSETPOS,
65+
SQL_API_SQLTABLEPRIVILEGES};
66+
SQLRETURN ret = SQLGetFunctions(this->conn, SQL_API_ODBC3_ALL_FUNCTIONS, api_exists);
67+
68+
EXPECT_EQ(ret, SQL_SUCCESS);
69+
70+
for (int api : supported_functions) {
71+
EXPECT_EQ(SQL_FUNC_EXISTS(api_exists, api), SQL_TRUE);
72+
}
73+
74+
for (int api : unsupported_functions) {
75+
EXPECT_EQ(SQL_FUNC_EXISTS(api_exists, api), SQL_FALSE);
76+
}
77+
78+
this->disconnect();
79+
}
80+
81+
TYPED_TEST(FlightSQLODBCTestBase, TestSQLGetFunctionsAllFunctionsODBCVer2) {
82+
// Verify driver manager return values for SQLGetFunctions
83+
this->connect(SQL_OV_ODBC2);
84+
85+
// ODBC 2.0 SQLGetFunctions returns 100 elements according to spec
86+
SQLUSMALLINT api_exists[100];
87+
const std::vector<int> supported_functions = {
88+
SQL_API_SQLCONNECT, SQL_API_SQLGETINFO, SQL_API_SQLDESCRIBECOL,
89+
SQL_API_SQLGETTYPEINFO, SQL_API_SQLDISCONNECT, SQL_API_SQLNUMRESULTCOLS,
90+
SQL_API_SQLPREPARE, SQL_API_SQLEXECDIRECT, SQL_API_SQLEXECUTE, SQL_API_SQLROWCOUNT,
91+
SQL_API_SQLFETCH, SQL_API_SQLFREESTMT, SQL_API_SQLGETDATA, SQL_API_SQLCOLUMNS,
92+
SQL_API_SQLTABLES, SQL_API_SQLNATIVESQL, SQL_API_SQLDRIVERCONNECT,
93+
SQL_API_SQLMORERESULTS, SQL_API_SQLSETSTMTOPTION, SQL_API_SQLGETSTMTOPTION,
94+
SQL_API_SQLSETCONNECTOPTION, SQL_API_SQLGETCONNECTOPTION, SQL_API_SQLALLOCCONNECT,
95+
SQL_API_SQLALLOCENV, SQL_API_SQLALLOCSTMT, SQL_API_SQLFREEENV,
96+
SQL_API_SQLFREECONNECT, SQL_API_SQLPRIMARYKEYS, SQL_API_SQLFOREIGNKEYS,
97+
98+
// Driver Manager APIs
99+
SQL_API_SQLGETFUNCTIONS, SQL_API_SQLDRIVERS, SQL_API_SQLDATASOURCES};
100+
const std::vector<int> unsupported_functions = {
101+
SQL_API_SQLPUTDATA, SQL_API_SQLPARAMDATA, SQL_API_SQLSETCURSORNAME,
102+
SQL_API_SQLGETCURSORNAME, SQL_API_SQLSTATISTICS, SQL_API_SQLSPECIALCOLUMNS,
103+
SQL_API_SQLBINDPARAMETER, SQL_API_SQLBROWSECONNECT, SQL_API_SQLNUMPARAMS,
104+
SQL_API_SQLBULKOPERATIONS, SQL_API_SQLCOLUMNPRIVILEGES, SQL_API_SQLPROCEDURECOLUMNS,
105+
SQL_API_SQLDESCRIBEPARAM, SQL_API_SQLPROCEDURES, SQL_API_SQLSETPOS,
106+
SQL_API_SQLTABLEPRIVILEGES};
107+
SQLRETURN ret = SQLGetFunctions(this->conn, SQL_API_ALL_FUNCTIONS, api_exists);
108+
109+
EXPECT_EQ(ret, SQL_SUCCESS);
110+
111+
for (int api : supported_functions) {
112+
EXPECT_EQ(api_exists[api], SQL_TRUE);
113+
}
114+
115+
for (int api : unsupported_functions) {
116+
EXPECT_EQ(api_exists[api], SQL_FALSE);
117+
}
118+
119+
this->disconnect();
120+
}
121+
122+
TYPED_TEST(FlightSQLODBCTestBase, TestSQLGetFunctionsSupportedSingleAPI) {
123+
this->connect();
124+
125+
const std::vector<SQLUSMALLINT> supported_functions = {
126+
SQL_API_SQLALLOCHANDLE, SQL_API_SQLBINDCOL, SQL_API_SQLGETDIAGFIELD,
127+
SQL_API_SQLCANCEL, SQL_API_SQLCLOSECURSOR, SQL_API_SQLGETDIAGREC,
128+
SQL_API_SQLCOLATTRIBUTE, SQL_API_SQLGETENVATTR, SQL_API_SQLCONNECT,
129+
SQL_API_SQLGETINFO, SQL_API_SQLGETSTMTATTR, SQL_API_SQLDESCRIBECOL,
130+
SQL_API_SQLGETTYPEINFO, SQL_API_SQLDISCONNECT, SQL_API_SQLNUMRESULTCOLS,
131+
SQL_API_SQLPREPARE, SQL_API_SQLEXECDIRECT, SQL_API_SQLEXECUTE, SQL_API_SQLROWCOUNT,
132+
SQL_API_SQLFETCH, SQL_API_SQLSETCONNECTATTR, SQL_API_SQLFETCHSCROLL,
133+
SQL_API_SQLFREEHANDLE, SQL_API_SQLFREESTMT, SQL_API_SQLGETCONNECTATTR,
134+
SQL_API_SQLSETENVATTR, SQL_API_SQLSETSTMTATTR, SQL_API_SQLGETDATA,
135+
SQL_API_SQLCOLUMNS, SQL_API_SQLTABLES, SQL_API_SQLNATIVESQL,
136+
SQL_API_SQLDRIVERCONNECT, SQL_API_SQLMORERESULTS, SQL_API_SQLPRIMARYKEYS,
137+
SQL_API_SQLFOREIGNKEYS,
138+
139+
// ODBC 2.0 APIs
140+
SQL_API_SQLSETSTMTOPTION, SQL_API_SQLGETSTMTOPTION, SQL_API_SQLSETCONNECTOPTION,
141+
SQL_API_SQLGETCONNECTOPTION, SQL_API_SQLALLOCCONNECT, SQL_API_SQLALLOCENV,
142+
SQL_API_SQLALLOCSTMT, SQL_API_SQLFREEENV, SQL_API_SQLFREECONNECT,
143+
144+
// Driver Manager APIs
145+
SQL_API_SQLGETFUNCTIONS, SQL_API_SQLDRIVERS, SQL_API_SQLDATASOURCES};
146+
SQLUSMALLINT api_exists;
147+
for (SQLUSMALLINT api : supported_functions) {
148+
SQLRETURN ret = SQLGetFunctions(this->conn, api, &api_exists);
149+
150+
EXPECT_EQ(ret, SQL_SUCCESS);
151+
152+
EXPECT_EQ(api_exists, SQL_TRUE);
153+
154+
api_exists = -1;
155+
}
156+
157+
this->disconnect();
158+
}
159+
160+
TYPED_TEST(FlightSQLODBCTestBase, TestSQLGetFunctionsUnsupportedSingleAPI) {
161+
this->connect();
162+
163+
const std::vector<SQLUSMALLINT> unsupported_functions = {
164+
SQL_API_SQLPUTDATA, SQL_API_SQLGETDESCFIELD, SQL_API_SQLGETDESCREC,
165+
SQL_API_SQLCOPYDESC, SQL_API_SQLPARAMDATA, SQL_API_SQLENDTRAN,
166+
SQL_API_SQLSETCURSORNAME, SQL_API_SQLSETDESCFIELD, SQL_API_SQLSETDESCREC,
167+
SQL_API_SQLGETCURSORNAME, SQL_API_SQLSTATISTICS, SQL_API_SQLSPECIALCOLUMNS,
168+
SQL_API_SQLBINDPARAMETER, SQL_API_SQLBROWSECONNECT, SQL_API_SQLNUMPARAMS,
169+
SQL_API_SQLBULKOPERATIONS, SQL_API_SQLCOLUMNPRIVILEGES, SQL_API_SQLPROCEDURECOLUMNS,
170+
SQL_API_SQLDESCRIBEPARAM, SQL_API_SQLPROCEDURES, SQL_API_SQLSETPOS,
171+
SQL_API_SQLTABLEPRIVILEGES};
172+
SQLUSMALLINT api_exists;
173+
for (SQLUSMALLINT api : unsupported_functions) {
174+
SQLRETURN ret = SQLGetFunctions(this->conn, api, &api_exists);
175+
176+
EXPECT_EQ(ret, SQL_SUCCESS);
177+
178+
EXPECT_EQ(api_exists, SQL_FALSE);
179+
180+
api_exists = -1;
181+
}
182+
183+
this->disconnect();
184+
}
185+
186+
TYPED_TEST(FlightSQLODBCTestBase, TestSQLGetFunctionsSupportedSingleAPIODBCVer2) {
187+
this->connect(SQL_OV_ODBC2);
188+
189+
const std::vector<SQLUSMALLINT> supported_functions = {
190+
SQL_API_SQLCONNECT, SQL_API_SQLGETINFO, SQL_API_SQLDESCRIBECOL,
191+
SQL_API_SQLGETTYPEINFO, SQL_API_SQLDISCONNECT, SQL_API_SQLNUMRESULTCOLS,
192+
SQL_API_SQLPREPARE, SQL_API_SQLEXECDIRECT, SQL_API_SQLEXECUTE, SQL_API_SQLROWCOUNT,
193+
SQL_API_SQLFETCH, SQL_API_SQLFREESTMT, SQL_API_SQLGETDATA, SQL_API_SQLCOLUMNS,
194+
SQL_API_SQLTABLES, SQL_API_SQLNATIVESQL, SQL_API_SQLDRIVERCONNECT,
195+
SQL_API_SQLMORERESULTS, SQL_API_SQLSETSTMTOPTION, SQL_API_SQLGETSTMTOPTION,
196+
SQL_API_SQLSETCONNECTOPTION, SQL_API_SQLGETCONNECTOPTION, SQL_API_SQLALLOCCONNECT,
197+
SQL_API_SQLALLOCENV, SQL_API_SQLALLOCSTMT, SQL_API_SQLFREEENV,
198+
SQL_API_SQLFREECONNECT, SQL_API_SQLPRIMARYKEYS, SQL_API_SQLFOREIGNKEYS,
199+
200+
// Driver Manager APIs
201+
SQL_API_SQLGETFUNCTIONS, SQL_API_SQLDRIVERS, SQL_API_SQLDATASOURCES};
202+
SQLUSMALLINT api_exists;
203+
for (SQLUSMALLINT api : supported_functions) {
204+
SQLRETURN ret = SQLGetFunctions(this->conn, api, &api_exists);
205+
206+
EXPECT_EQ(ret, SQL_SUCCESS);
207+
208+
EXPECT_EQ(api_exists, SQL_TRUE);
209+
210+
api_exists = -1;
211+
}
212+
213+
this->disconnect();
214+
}
215+
216+
TYPED_TEST(FlightSQLODBCTestBase, TestSQLGetFunctionsUnsupportedSingleAPIODBCVer2) {
217+
this->connect(SQL_OV_ODBC2);
218+
219+
const std::vector<SQLUSMALLINT> unsupported_functions = {
220+
SQL_API_SQLPUTDATA, SQL_API_SQLPARAMDATA, SQL_API_SQLSETCURSORNAME,
221+
SQL_API_SQLGETCURSORNAME, SQL_API_SQLSTATISTICS, SQL_API_SQLSPECIALCOLUMNS,
222+
SQL_API_SQLBINDPARAMETER, SQL_API_SQLBROWSECONNECT, SQL_API_SQLNUMPARAMS,
223+
SQL_API_SQLBULKOPERATIONS, SQL_API_SQLCOLUMNPRIVILEGES, SQL_API_SQLPROCEDURECOLUMNS,
224+
SQL_API_SQLDESCRIBEPARAM, SQL_API_SQLPROCEDURES, SQL_API_SQLSETPOS,
225+
SQL_API_SQLTABLEPRIVILEGES};
226+
SQLUSMALLINT api_exists;
227+
for (SQLUSMALLINT api : unsupported_functions) {
228+
SQLRETURN ret = SQLGetFunctions(this->conn, api, &api_exists);
229+
230+
EXPECT_EQ(ret, SQL_SUCCESS);
231+
232+
EXPECT_EQ(api_exists, SQL_FALSE);
233+
234+
api_exists = -1;
235+
}
236+
237+
this->disconnect();
238+
}
239+
240+
} // namespace arrow::flight::sql::odbc

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoAllTypes) {
521521
this->disconnect();
522522
}
523523

524-
TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoAllTypesVer2) {
524+
TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoAllTypesODBCVer2) {
525525
this->connect(SQL_OV_ODBC2);
526526

527527
SQLRETURN ret = SQLGetTypeInfo(this->stmt, SQL_ALL_TYPES);
@@ -1546,7 +1546,7 @@ TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoSQLDate) {
15461546
this->disconnect();
15471547
}
15481548

1549-
TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoDateVer2) {
1549+
TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoDateODBCVer2) {
15501550
this->connect(SQL_OV_ODBC2);
15511551

15521552
SQLRETURN ret = SQLGetTypeInfo(this->stmt, SQL_DATE);
@@ -1584,7 +1584,7 @@ TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoDateVer2) {
15841584
this->disconnect();
15851585
}
15861586

1587-
TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoSQLTypeDateVer2) {
1587+
TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoSQLTypeDateODBCVer2) {
15881588
this->connect(SQL_OV_ODBC2);
15891589

15901590
// Pass ODBC Ver 3 data type
@@ -1675,7 +1675,7 @@ TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoSQLTime) {
16751675
this->disconnect();
16761676
}
16771677

1678-
TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoTimeVer2) {
1678+
TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoTimeODBCVer2) {
16791679
this->connect(SQL_OV_ODBC2);
16801680

16811681
SQLRETURN ret = SQLGetTypeInfo(this->stmt, SQL_TIME);
@@ -1713,7 +1713,7 @@ TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoTimeVer2) {
17131713
this->disconnect();
17141714
}
17151715

1716-
TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoSQLTypeTimeVer2) {
1716+
TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoSQLTypeTimeODBCVer2) {
17171717
this->connect(SQL_OV_ODBC2);
17181718

17191719
// Pass ODBC Ver 3 data type
@@ -1804,7 +1804,7 @@ TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoSQLTimestamp) {
18041804
this->disconnect();
18051805
}
18061806

1807-
TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoSQLTimestampVer2) {
1807+
TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoSQLTimestampODBCVer2) {
18081808
this->connect(SQL_OV_ODBC2);
18091809

18101810
SQLRETURN ret = SQLGetTypeInfo(this->stmt, SQL_TIMESTAMP);
@@ -1842,7 +1842,7 @@ TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoSQLTimestampVer2) {
18421842
this->disconnect();
18431843
}
18441844

1845-
TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoSQLTypeTimestampVer2) {
1845+
TEST_F(FlightSQLODBCMockTestBase, TestSQLGetTypeInfoSQLTypeTimestampODBCVer2) {
18461846
this->connect(SQL_OV_ODBC2);
18471847

18481848
// Pass ODBC Ver 3 data type

0 commit comments

Comments
 (0)