From 912db580e088b39046e0c39e8d97f9551cf44287 Mon Sep 17 00:00:00 2001 From: rscales Date: Tue, 29 Jul 2025 00:51:50 +0100 Subject: [PATCH 1/3] Implement tests for SQLRowCount --- .../flight/sql/odbc/tests/statement_test.cc | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) 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 45e4a29f9fa3..0092dba62db0 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/statement_test.cc +++ b/cpp/src/arrow/flight/sql/odbc/tests/statement_test.cc @@ -2400,4 +2400,50 @@ TYPED_TEST(FlightSQLODBCTestBase, TestSQLNativeSqlReturnsErrorOnBadInputs) { this->disconnect(); } +TEST_F(FlightSQLODBCMockTestBase, SQLRowCountReturnsNegativeOneOnSelect) { + this->connect(); + this->CreateTestTables(); + + SQLLEN rowCount = 0; + SQLLEN expectedValue = -1; + SQLWCHAR sqlQuery[] = L"SELECT * FROM TestTable;"; + SQLINTEGER queryLength = static_cast(wcslen(sqlQuery)); + + SQLRETURN ret = SQLExecDirect(this->stmt, sqlQuery, queryLength); + + EXPECT_EQ(ret, SQL_SUCCESS); + + ret = SQLFetch(this->stmt); + + EXPECT_EQ(ret, SQL_SUCCESS); + + CheckIntColumn(this->stmt, 1, 1); + CheckStringColumnW(this->stmt, 2, L"One"); + CheckIntColumn(this->stmt, 3, 1); + + ret = SQLRowCount(this->stmt, &rowCount); + + EXPECT_EQ(ret, SQL_SUCCESS); + + EXPECT_EQ(rowCount, expectedValue); + + this->disconnect(); +} + +TYPED_TEST(FlightSQLODBCTestBase, SQLRowCountFunctionSequenceErrorOnNoQuery) { + this->connect(); + + SQLLEN rowCount = 0; + SQLLEN expectedValue = 0; + + SQLRETURN ret = SQLRowCount(this->stmt, &rowCount); + + EXPECT_EQ(ret, SQL_ERROR); + VerifyOdbcErrorState(SQL_HANDLE_STMT, this->stmt, error_state_HY010); + + EXPECT_EQ(rowCount, expectedValue); + + this->disconnect(); +} + } // namespace arrow::flight::sql::odbc From 5119a013cb392f5fb72d846ec867ffabe88b210e Mon Sep 17 00:00:00 2001 From: rscales Date: Tue, 29 Jul 2025 18:13:03 +0100 Subject: [PATCH 2/3] Update based on comments from review --- .../flight/sql/odbc/tests/statement_test.cc | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) 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 0092dba62db0..1067970b6c42 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/statement_test.cc +++ b/cpp/src/arrow/flight/sql/odbc/tests/statement_test.cc @@ -2400,13 +2400,12 @@ TYPED_TEST(FlightSQLODBCTestBase, TestSQLNativeSqlReturnsErrorOnBadInputs) { this->disconnect(); } -TEST_F(FlightSQLODBCMockTestBase, SQLRowCountReturnsNegativeOneOnSelect) { +TYPED_TEST(FlightSQLODBCTestBase, SQLRowCountReturnsNegativeOneOnSelect) { this->connect(); - this->CreateTestTables(); SQLLEN rowCount = 0; SQLLEN expectedValue = -1; - SQLWCHAR sqlQuery[] = L"SELECT * FROM TestTable;"; + SQLWCHAR sqlQuery[] = L"SELECT 1 AS col1, 'One' AS col2, 3 AS col3 "; SQLINTEGER queryLength = static_cast(wcslen(sqlQuery)); SQLRETURN ret = SQLExecDirect(this->stmt, sqlQuery, queryLength); @@ -2419,7 +2418,7 @@ TEST_F(FlightSQLODBCMockTestBase, SQLRowCountReturnsNegativeOneOnSelect) { CheckIntColumn(this->stmt, 1, 1); CheckStringColumnW(this->stmt, 2, L"One"); - CheckIntColumn(this->stmt, 3, 1); + CheckIntColumn(this->stmt, 3, 3); ret = SQLRowCount(this->stmt, &rowCount); @@ -2430,6 +2429,31 @@ TEST_F(FlightSQLODBCMockTestBase, SQLRowCountReturnsNegativeOneOnSelect) { this->disconnect(); } +TYPED_TEST(FlightSQLODBCTestBase, SQLRowCountReturnsSuccessOnNullptr) { + this->connect(); + + SQLWCHAR sqlQuery[] = L"SELECT 1 AS col1, 'One' AS col2, 3 AS col3 "; + SQLINTEGER queryLength = static_cast(wcslen(sqlQuery)); + + SQLRETURN ret = SQLExecDirect(this->stmt, sqlQuery, queryLength); + + EXPECT_EQ(ret, SQL_SUCCESS); + + ret = SQLFetch(this->stmt); + + EXPECT_EQ(ret, SQL_SUCCESS); + + CheckIntColumn(this->stmt, 1, 1); + CheckStringColumnW(this->stmt, 2, L"One"); + CheckIntColumn(this->stmt, 3, 3); + + ret = SQLRowCount(this->stmt, 0); + + EXPECT_EQ(ret, SQL_SUCCESS); + + this->disconnect(); +} + TYPED_TEST(FlightSQLODBCTestBase, SQLRowCountFunctionSequenceErrorOnNoQuery) { this->connect(); From 6417200f73b94432070b7c372bbbdec2bf3041e3 Mon Sep 17 00:00:00 2001 From: rscales Date: Tue, 29 Jul 2025 18:31:22 +0100 Subject: [PATCH 3/3] Fix formatting issues --- cpp/src/arrow/flight/sql/odbc/tests/statement_test.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 1067970b6c42..d70f2f76bf2d 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/statement_test.cc +++ b/cpp/src/arrow/flight/sql/odbc/tests/statement_test.cc @@ -2405,7 +2405,7 @@ TYPED_TEST(FlightSQLODBCTestBase, SQLRowCountReturnsNegativeOneOnSelect) { SQLLEN rowCount = 0; SQLLEN expectedValue = -1; - SQLWCHAR sqlQuery[] = L"SELECT 1 AS col1, 'One' AS col2, 3 AS col3 "; + SQLWCHAR sqlQuery[] = L"SELECT 1 AS col1, 'One' AS col2, 3 AS col3"; SQLINTEGER queryLength = static_cast(wcslen(sqlQuery)); SQLRETURN ret = SQLExecDirect(this->stmt, sqlQuery, queryLength); @@ -2432,7 +2432,7 @@ TYPED_TEST(FlightSQLODBCTestBase, SQLRowCountReturnsNegativeOneOnSelect) { TYPED_TEST(FlightSQLODBCTestBase, SQLRowCountReturnsSuccessOnNullptr) { this->connect(); - SQLWCHAR sqlQuery[] = L"SELECT 1 AS col1, 'One' AS col2, 3 AS col3 "; + SQLWCHAR sqlQuery[] = L"SELECT 1 AS col1, 'One' AS col2, 3 AS col3"; SQLINTEGER queryLength = static_cast(wcslen(sqlQuery)); SQLRETURN ret = SQLExecDirect(this->stmt, sqlQuery, queryLength);