From 75aa64ec18dc2b1fbdb6c783f37147ae12685cdb Mon Sep 17 00:00:00 2001 From: v-dareck Date: Wed, 25 Jan 2017 13:55:55 -0800 Subject: [PATCH 1/4] Issue 37. sqlsrv_has_rows does not fetch if already true. Change sqlsrv_has_rows to not scroll if already true when using forward only cursor. --- source/sqlsrv/stmt.cpp | 2 +- test/sqlsrv/srv_037_sqlsrv_has_rows.phpt | 102 +++++++++++++++++++++++ 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 test/sqlsrv/srv_037_sqlsrv_has_rows.phpt diff --git a/source/sqlsrv/stmt.cpp b/source/sqlsrv/stmt.cpp index 40165e4e..37510af6 100644 --- a/source/sqlsrv/stmt.cpp +++ b/source/sqlsrv/stmt.cpp @@ -957,7 +957,7 @@ PHP_FUNCTION( sqlsrv_has_rows ) throw ss::SSException(); } - if( !stmt->fetch_called ) { + if( !stmt->has_rows && !stmt->fetch_called ) { determine_stmt_has_rows( stmt TSRMLS_CC ); } diff --git a/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt b/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt new file mode 100644 index 00000000..cdaf6876 --- /dev/null +++ b/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt @@ -0,0 +1,102 @@ +--TEST-- +sqlsrv_has_rows() using a forward and scrollable cursor +--SKIPIF-- +--FILE-- +"buffered")) + ?: die( print_r(sqlsrv_errors(), true)); + +// if we skip the next four calls it's fine +echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; +echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; +echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; +echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; + +if (sqlsrv_has_rows($stmt)) { + while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC)) + { + echo $row[0]."\n"; + } +} + +$query = "SELECT ID FROM $tableName where ID='nomatch'"; +$stmt = sqlsrv_query($conn, $query) + ?: die( print_r(sqlsrv_errors(), true)); + +echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; +echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; + +// Fetch data using a scrollable cursor +$stmt = sqlsrv_query($conn, $query, [], array("Scrollable"=>"buffered")) + ?: die( print_r(sqlsrv_errors(), true)); + +echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; +echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; + + +// DROP database +$stmt = sqlsrv_query($conn,"DROP DATABASE ". $dbName); + +sqlsrv_free_stmt($stmt); +sqlsrv_close($conn); +print "Done" +?> + +--EXPECT-- +Has Rows? Yes! +Has Rows? Yes! +Has Rows? Yes! +Has Rows? Yes! +1998.1 +-2004 +2016 +4.2EUR +Has Rows? Yes! +Has Rows? Yes! +Has Rows? Yes! +Has Rows? Yes! +1998.1 +-2004 +2016 +4.2EUR +Has Rows? NO! +Has Rows? NO! +Has Rows? NO! +Has Rows? NO! +Done From 911f07180fef06487f297f9cdc457dfff0076922 Mon Sep 17 00:00:00 2001 From: v-dareck Date: Thu, 26 Jan 2017 10:55:43 -0800 Subject: [PATCH 2/4] Remove comment line from test. --- test/sqlsrv/srv_037_sqlsrv_has_rows.phpt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt b/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt index cdaf6876..88b5a8c1 100644 --- a/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt +++ b/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt @@ -24,8 +24,7 @@ $stmt = sqlsrv_query($conn, $query) ?: die( print_r( sqlsrv_errors(), true) ); $query = "SELECT ID FROM $tableName"; $stmt = sqlsrv_query($conn, $query) ?: die( print_r(sqlsrv_errors(), true)); - -// if we skip the next four calls it's fine + echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; From ed7d6492b51a598c9ad0628e0453dbca7e2a7be9 Mon Sep 17 00:00:00 2001 From: v-dareck Date: Thu, 26 Jan 2017 11:25:07 -0800 Subject: [PATCH 3/4] Update test comments. --- test/sqlsrv/srv_037_sqlsrv_has_rows.phpt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt b/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt index 88b5a8c1..37533866 100644 --- a/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt +++ b/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt @@ -24,7 +24,8 @@ $stmt = sqlsrv_query($conn, $query) ?: die( print_r( sqlsrv_errors(), true) ); $query = "SELECT ID FROM $tableName"; $stmt = sqlsrv_query($conn, $query) ?: die( print_r(sqlsrv_errors(), true)); - + +// repeated calls should return true and fetch should work. echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; @@ -41,7 +42,6 @@ if (sqlsrv_has_rows($stmt)) { $stmt = sqlsrv_query($conn, $query, [], array("Scrollable"=>"buffered")) ?: die( print_r(sqlsrv_errors(), true)); -// if we skip the next four calls it's fine echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; @@ -58,6 +58,7 @@ $query = "SELECT ID FROM $tableName where ID='nomatch'"; $stmt = sqlsrv_query($conn, $query) ?: die( print_r(sqlsrv_errors(), true)); +// repeated calls should return false if there are no rows. echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; @@ -65,6 +66,7 @@ echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; $stmt = sqlsrv_query($conn, $query, [], array("Scrollable"=>"buffered")) ?: die( print_r(sqlsrv_errors(), true)); +// repeated calls should return false if there are no rows. echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; echo "Has Rows?" . (sqlsrv_has_rows($stmt) ? " Yes!" : " NO!") . "\n"; From 2db27a8769f89d55e92edec8f4870263b3da5669 Mon Sep 17 00:00:00 2001 From: v-dareck Date: Thu, 26 Jan 2017 12:34:32 -0800 Subject: [PATCH 4/4] Add Description section to phpt test. --- test/sqlsrv/srv_037_sqlsrv_has_rows.phpt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt b/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt index 37533866..c93bef77 100644 --- a/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt +++ b/test/sqlsrv/srv_037_sqlsrv_has_rows.phpt @@ -1,5 +1,9 @@ --TEST-- sqlsrv_has_rows() using a forward and scrollable cursor +--DESCRIPTION-- +This test calls sqlsrv_has_rows multiple times. Previously, multiple calls +with a forward cursor would advance the cursor. Subsequent fetch calls +would then fail. --SKIPIF-- --FILE--