diff --git a/source/pdo_sqlsrv/pdo_stmt.cpp b/source/pdo_sqlsrv/pdo_stmt.cpp index ff92c6d4..d8b086a7 100644 --- a/source/pdo_sqlsrv/pdo_stmt.cpp +++ b/source/pdo_sqlsrv/pdo_stmt.cpp @@ -393,17 +393,20 @@ int pdo_sqlsrv_stmt_close_cursor(pdo_stmt_t *stmt TSRMLS_DC) try { - SQLSRV_ASSERT( stmt != NULL, "pdo_sqlsrv_stmt_next_rowset: pdo_stmt object was null" ); + SQLSRV_ASSERT( stmt != NULL, "pdo_sqlsrv_stmt_close_cursor: pdo_stmt object was null" ); sqlsrv_stmt* driver_stmt = reinterpret_cast( stmt->driver_data ); - SQLSRV_ASSERT( driver_stmt != NULL, "pdo_sqlsrv_stmt_next_rowset: driver_data object was null" ); + SQLSRV_ASSERT( driver_stmt != NULL, "pdo_sqlsrv_stmt_close_cursor: driver_data object was null" ); // to "close the cursor" means we make the statement ready for execution again. To do this, we // skip all the result sets on the current statement. - while( driver_stmt->past_next_result_end == false ) { - - core_sqlsrv_next_result( driver_stmt TSRMLS_CC ); + // If the statement has not been executed there are no next results to iterate over. + if ( driver_stmt->executed == true ) + { + while( driver_stmt->past_next_result_end == false ) { + core_sqlsrv_next_result( driver_stmt TSRMLS_CC ); + } } } catch( core::CoreException& ) { @@ -412,7 +415,7 @@ int pdo_sqlsrv_stmt_close_cursor(pdo_stmt_t *stmt TSRMLS_DC) } catch( ... ) { - DIE( "pdo_sqlsrv_stmt_next_rowset: Unknown exception occurred while advanding to the next result set." ); + DIE( "pdo_sqlsrv_stmt_close_cursor: Unknown exception occurred while advancing to the next result set." ); } return 1; diff --git a/test/pdo_sqlsrv/pdo_267_closeCursor.phpt b/test/pdo_sqlsrv/pdo_267_closeCursor.phpt new file mode 100644 index 00000000..b49bdf20 --- /dev/null +++ b/test/pdo_sqlsrv/pdo_267_closeCursor.phpt @@ -0,0 +1,70 @@ +--TEST-- +Test closeCursor with a stmt before/after execute and fetch. +--SKIPIF-- +--FILE-- +setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); + + // prepare a stmt but don't execute, then closeCursor. + $stmt = $conn->prepare("select 123 as 'IntCol'"); + $ret = $stmt->closeCursor(); + var_dump($ret); + $ret = $stmt->closeCursor(); + var_dump($ret); + + // prepare a stmt and execute, then closeCursor. + $stmt = $conn->prepare("select 123 as 'IntCol'"); + $stmt->execute(); + $ret = $stmt->closeCursor(); + var_dump($ret); + $ret = $stmt->closeCursor(); + var_dump($ret); + + + // use two stmt, execute, and fetch, then closeCursor. + // use one with client side buffering. + $stmt1 = $conn->query("select 123 as 'IntCol'"); + $stmt2 = $conn->prepare("select 'abc' as 'Charcol'", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_BUFFERED)); + $result = $stmt1->fetch(PDO::FETCH_NUM); + print_r($result[0]); + echo "\n"; + $ret = $stmt1->closeCursor(); + var_dump($ret); + $stmt2->execute(); + $result = $stmt2->fetch(PDO::FETCH_NUM); + print_r($result[0]); + echo "\n"; + $ret = $stmt2->closeCursor(); + var_dump($ret); + + $stmt1 = null; + $stmt2 = null; + $stmt = null; + $conn = null; + +} + +catch( PDOException $e ) { + var_dump($e); + exit; +} + +print "Done"; +?> + +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) +123 +bool(true) +abc +bool(true) +Done \ No newline at end of file