Revert next result changes, improve tests

This commit is contained in:
David Puglielli 2017-11-15 17:39:00 -08:00
parent 07ac237def
commit 633024c22b
4 changed files with 703 additions and 277 deletions

View file

@ -1067,33 +1067,6 @@ int pdo_sqlsrv_stmt_next_rowset( _Inout_ pdo_stmt_t *stmt TSRMLS_DC )
SQLSRV_ASSERT( driver_stmt != NULL, "pdo_sqlsrv_stmt_next_rowset: driver_data object was null" ); SQLSRV_ASSERT( driver_stmt != NULL, "pdo_sqlsrv_stmt_next_rowset: driver_data object was null" );
// Return the correct error in case the user calls nextRowset() on a null result set.
// Null means that SQLNumResultCols() returns 0 and SQLRowCount does not return > 0. But first
// check that the statement has been executed and that we are not past the end of a non-null
// result set to make sure the user gets the correct error message. These checks are also
// done in core_sqlsrv_next_result(), but we cannot check for null results there because that
// function can be called without calling this one, and SQLSRV_ERROR_NO_FIELDS can then
// be triggered incorrectly.
CHECK_CUSTOM_ERROR( !driver_stmt->executed, driver_stmt, SQLSRV_ERROR_STATEMENT_NOT_EXECUTED ) {
throw core::CoreException();
}
CHECK_CUSTOM_ERROR( driver_stmt->past_next_result_end, driver_stmt, SQLSRV_ERROR_NEXT_RESULT_PAST_END ) {
throw core::CoreException();
}
// Now make sure the result set is not null.
bool has_result = core_sqlsrv_has_any_result( driver_stmt );
// Note that if fetch_called is false but has_result is true (i.e. the user is calling
// nextRowset() on a non-null result set before calling fetch()), it is handled
// in core_sqlsrv_next_result() below.
if( !driver_stmt->fetch_called ) {
CHECK_CUSTOM_ERROR( !has_result, driver_stmt, SQLSRV_ERROR_NO_FIELDS ) {
throw core::CoreException();
}
}
core_sqlsrv_next_result( static_cast<sqlsrv_stmt*>( stmt->driver_data ) TSRMLS_CC ); core_sqlsrv_next_result( static_cast<sqlsrv_stmt*>( stmt->driver_data ) TSRMLS_CC );
// clear the current meta data since the new result will generate new meta data // clear the current meta data since the new result will generate new meta data

View file

@ -560,32 +560,6 @@ PHP_FUNCTION( sqlsrv_next_result )
PROCESS_PARAMS( stmt, "r", _FN_, 0 ); PROCESS_PARAMS( stmt, "r", _FN_, 0 );
try { try {
// Return the correct error in case the user calls sqlsrv_next_result() on a null result set.
// Null means that SQLNumResultCols() returns 0 and SQLRowCount does not return > 0. But first
// check that the statement has been executed and that we are not past the end of a non-null
// result set to make sure the user gets the correct error message. These checks are also
// done in core_sqlsrv_next_result(), but we cannot check for null results there because that
// function can be called without calling this one, and SQLSRV_ERROR_NO_FIELDS can then
// be triggered incorrectly.
CHECK_CUSTOM_ERROR( !stmt->executed, stmt, SQLSRV_ERROR_STATEMENT_NOT_EXECUTED ) {
throw core::CoreException();
}
CHECK_CUSTOM_ERROR( stmt->past_next_result_end, stmt, SQLSRV_ERROR_NEXT_RESULT_PAST_END ) {
throw core::CoreException();
}
bool has_result = core_sqlsrv_has_any_result( stmt );
// Note that if fetch_called is false but has_result is true (i.e. the user is calling
// sqlsrv_next_result() on a non-null result set before calling fetch()), it is handled
// in core_sqlsrv_next_result() below.
if( !stmt->fetch_called ) {
CHECK_CUSTOM_ERROR( !has_result, stmt, SQLSRV_ERROR_NO_FIELDS ) {
throw core::CoreException();
}
}
core_sqlsrv_next_result( stmt TSRMLS_CC, true ); core_sqlsrv_next_result( stmt TSRMLS_CC, true );

View file

@ -1,100 +1,276 @@
--TEST-- --TEST--
Error messages from null result sets Error messages from nonempty, empty, and null result sets
--DESCRIPTION-- --DESCRIPTION--
Test that calling nextRowset() on an empty result set produces the correct error message. Fix for Github 507. Test that calling nextRowset() and fetching on nonempty, empty, and null result sets produces the correct results or error messages.
--SKIPIF-- --SKIPIF--
<?php require('skipif.inc'); ?> <?php require('skipif.inc'); ?>
--FILE-- --FILE--
<?php <?php
require_once("MsSetup.inc"); require_once("MsSetup.inc");
require_once("MsCommon.inc"); require_once("MsCommon.inc");
$conn = new PDO( "sqlsrv:Server = $server; Database = $databaseName; ", $uid, $pwd ); $conn = new PDO( "sqlsrv:Server = $server; Database = $databaseName; ", $uid, $pwd );
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
DropTable($conn, 'TestEmptySetTable'); DropTable($conn, 'TestEmptySetTable');
$stmt = $conn->query("CREATE TABLE TestEmptySetTable ([c1] nvarchar(10),[c2] nvarchar(10))"); $stmt = $conn->query("CREATE TABLE TestEmptySetTable ([c1] nvarchar(10),[c2] nvarchar(10))");
$stmt = $conn->query("INSERT INTO TestEmptySetTable (c1, c2) VALUES ('a', 'b')"); $stmt = $conn->query("INSERT INTO TestEmptySetTable (c1, c2) VALUES ('a', 'b')");
// Create a procedure that can return a result set or can return nothing // Create a procedure that can return a nonempty result set, an empty result set, or a null result
DropProc($conn, 'TestEmptySetProc'); DropProc($conn, 'TestEmptySetProc');
$stmt = $conn->query("CREATE PROCEDURE TestEmptySetProc @a nvarchar(10), @b nvarchar(10) $stmt = $conn->query("CREATE PROCEDURE TestEmptySetProc @a nvarchar(10), @b nvarchar(10)
AS SET NOCOUNT ON AS SET NOCOUNT ON
BEGIN BEGIN
IF @b='b' IF @b='b'
BEGIN BEGIN
SELECT 'a' as testValue SELECT 'a' as testValue
END END
ELSE ELSE IF @b='w'
BEGIN BEGIN
UPDATE TestEmptySetTable SET c2 = 'c' WHERE c1 = @a SELECT * FROM TestEmptySetTable WHERE c1 = @b
END END
END"); ELSE
BEGIN
// errors out when reaching the second nextRowset() call UPDATE TestEmptySetTable SET c2 = 'c' WHERE c1 = @a
// returned error indicates there are no more results END
echo "Return a nonempty result set:\n"; END");
try
{ // Call fetch on a nonempty result set
$stmt = $conn->query("TestEmptySetProc @a='a', @b='b'"); echo "Nonempty result set, call fetch first: ###############################\n";
$result = $stmt->fetchAll();
print_r($result); try
$stmt->nextRowset(); {
$result = $stmt->fetchAll(); $stmt = $conn->query("TestEmptySetProc @a='a', @b='b'");
print_r($result);
$stmt->nextRowset(); echo "First fetch...\n";
} $result = $stmt->fetchObject();
catch(Exception $e) print_r($result);
{
echo $e->getMessage()."\n"; echo "Next result...\n";
} $stmt->nextRowset();
// errors out indicating the result set contains no fields echo "Fetch...\n";
echo "Return an empty result set, call nextRowset on it before fetching anything:\n"; $result = $stmt->fetch();
try print_r($result);
{
$stmt = $conn->query("TestEmptySetProc @a='a', @b='c'"); echo "Next result...\n";
$stmt->nextRowset(); $stmt->nextRowset();
} }
catch(Exception $e) catch(Exception $e)
{ {
echo $e->getMessage()."\n"; echo $e->getMessage()."\n";
} }
// errors out indicating the result set contains no fields // Call next_result on a nonempty result set
echo "Return an empty result set, call fetch on it:\n"; echo "Nonempty result set, call next_result first: #########################\n";
try
{ try
$stmt = $conn->query("TestEmptySetProc @a='a', @b='c'"); {
$result = $stmt->fetchAll(); $stmt = $conn->query("TestEmptySetProc @a='a', @b='b'");
print_r($result);
} echo "Next result...\n";
catch(Exception $e) $stmt->nextRowset();
{
echo $e->getMessage()."\n"; echo "Fetch...\n";
} $result = $stmt->fetchObject();
print_r($result);
$stmt = $conn->query("DROP TABLE TestEmptySetTable");
$stmt = $conn->query("DROP PROCEDURE TestEmptySetProc"); echo "Next result...\n";
$stmt->nextRowset();
$conn = null; }
?> catch(Exception $e)
--EXPECT-- {
Return a nonempty result set: echo $e->getMessage()."\n";
Array }
(
[0] => Array // Call next_result twice in succession on a nonempty result set
( echo "Nonempty result set, call next_result twice: #########################\n";
[testValue] => a try
[0] => a {
) $stmt = $conn->query("TestEmptySetProc @a='a', @b='b'");
) echo "Next result...\n";
Array $stmt->nextRowset();
(
) echo "Next result...\n";
SQLSTATE[IMSSP]: There are no more results returned by the query. $stmt->nextRowset();
Return an empty result set, call nextRowset on it before fetching anything: }
SQLSTATE[IMSSP]: The active result for the query contains no fields. catch(Exception $e)
Return an empty result set, call fetch on it: {
SQLSTATE[IMSSP]: The active result for the query contains no fields. echo $e->getMessage()."\n";
}
// Call fetch on an empty result set
echo "Empty result set, call fetch first: ##################################\n";
try
{
$stmt = $conn->query("TestEmptySetProc @a='a', @b='w'");
echo "First fetch...\n";
$result = $stmt->fetchObject();
print_r($result);
echo "Next result...\n";
$stmt->nextRowset();
echo "Fetch...\n";
$result = $stmt->fetchObject();
print_r($result);
echo "Next result...\n";
$stmt->nextRowset();
}
catch(Exception $e)
{
echo $e->getMessage()."\n";
}
// Call next_result on an empty result set
echo "Empty result set, call next_result first: ############################\n";
try
{
$stmt = $conn->query("TestEmptySetProc @a='a', @b='w'");
echo "First go to next result...\n";
$stmt->nextRowset();
echo "Fetch...\n";
$result = $stmt->fetchObject();
print_r($result);
echo "Next result...\n";
$stmt->nextRowset();
}
catch(Exception $e)
{
echo $e->getMessage()."\n";
}
// Call next_result twice in succession on an empty result set
echo "Empty result set, call next_result twice: ############################\n";
try
{
$stmt = $conn->query("TestEmptySetProc @a='a', @b='w'");
echo "Next result...\n";
$stmt->nextRowset();
echo "Next result...\n";
$stmt->nextRowset();
}
catch(Exception $e)
{
echo $e->getMessage()."\n";
}
// Call fetch on a null result set
echo "Null result set, call fetch first: ###################################\n";
try
{
$stmt = $conn->query("TestEmptySetProc @a='a', @b='c'");
echo "Fetch...\n";
$result = $stmt->fetchObject();
print_r($result);
echo "Next result...\n";
$stmt->nextRowset();
}
catch(Exception $e)
{
echo $e->getMessage()."\n";
}
// Call next_result on a null result set
echo "Null result set, call next result first: #############################\n";
try
{
$stmt = $conn->query("TestEmptySetProc @a='a', @b='c'");
echo "Next result...\n";
$stmt->nextRowset();
echo "Fetch...\n";
$result = $stmt->fetchObject();
print_r($result);
}
catch(Exception $e)
{
echo $e->getMessage()."\n";
}
// Call next_result twice in succession on a null result set
echo "Null result set, call next result twice: #############################\n";
try
{
$stmt = $conn->query("TestEmptySetProc @a='a', @b='c'");
echo "Next result...\n";
$stmt->nextRowset();
echo "Next result...\n";
$stmt->nextRowset();
}
catch(Exception $e)
{
echo $e->getMessage()."\n";
}
$stmt = $conn->query("DROP TABLE TestEmptySetTable");
$stmt = $conn->query("DROP PROCEDURE TestEmptySetProc");
$stmt = null;
$conn = null;
?>
--EXPECT--
Nonempty result set, call fetch first: ###############################
First fetch...
stdClass Object
(
[testValue] => a
)
Next result...
Fetch...
Next result...
SQLSTATE[IMSSP]: There are no more results returned by the query.
Nonempty result set, call next_result first: #########################
Next result...
Fetch...
Next result...
SQLSTATE[IMSSP]: There are no more results returned by the query.
Nonempty result set, call next_result twice: #########################
Next result...
Next result...
SQLSTATE[IMSSP]: There are no more results returned by the query.
Empty result set, call fetch first: ##################################
First fetch...
Next result...
Fetch...
Next result...
SQLSTATE[IMSSP]: There are no more results returned by the query.
Empty result set, call next_result first: ############################
First go to next result...
Fetch...
Next result...
SQLSTATE[IMSSP]: There are no more results returned by the query.
Empty result set, call next_result twice: ############################
Next result...
Next result...
SQLSTATE[IMSSP]: There are no more results returned by the query.
Null result set, call fetch first: ###################################
Fetch...
SQLSTATE[IMSSP]: The active result for the query contains no fields.
Null result set, call next result first: #############################
Next result...
Fetch...
Null result set, call next result twice: #############################
Next result...
Next result...
SQLSTATE[IMSSP]: There are no more results returned by the query.

View file

@ -1,124 +1,427 @@
--TEST-- --TEST--
Error messages from null result sets Error messages from nonempty, empty, and null result sets
--DESCRIPTION-- --DESCRIPTION--
Test that calling sqlsrv_next_result() on a null result set produces the correct error message. Fix for Github 507. Test that calling sqlsrv_next_result() and fetching on nonempty, empty, and null result sets produces the correct results or error messages.
--SKIPIF-- --SKIPIF--
<?php require('skipif.inc'); ?> <?php require('skipif.inc'); ?>
--FILE-- --FILE--
<?php <?php
require_once("MsSetup.inc"); require_once("MsSetup.inc");
require_once("MsCommon.inc"); require_once("MsCommon.inc");
$conn = sqlsrv_connect($server, array("Database"=>$databaseName, "uid"=>$uid, "pwd"=>$pwd)); $conn = sqlsrv_connect($server, array("Database"=>$databaseName, "uid"=>$uid, "pwd"=>$pwd));
DropTable($conn, 'TestEmptySetTable'); DropTable($conn, 'TestEmptySetTable');
$stmt = sqlsrv_query($conn, "CREATE TABLE TestEmptySetTable ([c1] nvarchar(10),[c2] nvarchar(10))"); $stmt = sqlsrv_query($conn, "CREATE TABLE TestEmptySetTable ([c1] nvarchar(10),[c2] nvarchar(10))");
$stmt = sqlsrv_query($conn, "INSERT INTO TestEmptySetTable (c1, c2) VALUES ('a', 'b')"); $stmt = sqlsrv_query($conn, "INSERT INTO TestEmptySetTable (c1, c2) VALUES ('a', 'b')");
// Create a procedure that can return a result set or can return nothing // Create a procedure that can return a nonempty result set, an empty result set, or a null result
DropProc($conn, 'TestEmptySetProc'); DropProc($conn, 'TestEmptySetProc');
$stmt = sqlsrv_query($conn, "CREATE PROCEDURE TestEmptySetProc @a nvarchar(10), @b nvarchar(10) $stmt = sqlsrv_query($conn, "CREATE PROCEDURE TestEmptySetProc @a nvarchar(10), @b nvarchar(10)
AS SET NOCOUNT ON AS SET NOCOUNT ON
BEGIN BEGIN
IF @b='b' IF @b='b'
BEGIN BEGIN
SELECT 'a' as testValue SELECT 'a' as testValue
END END
ELSE ELSE IF @b='w'
BEGIN BEGIN
UPDATE TestEmptySetTable SET c2 = 'c' WHERE c1 = @a SELECT * FROM TestEmptySetTable WHERE c1 = @b
END END
END"); ELSE
BEGIN
// errors out when reaching the second nextRowset() call UPDATE TestEmptySetTable SET c2 = 'c' WHERE c1 = @a
// returned error indicates there are no more results END
echo "Return a nonempty result set:\n"; END");
$stmt = sqlsrv_query($conn,"TestEmptySetProc @a='a', @b='b'"); // Call fetch on a nonempty result set
$result = sqlsrv_fetch_array($stmt); echo "Nonempty result set, call fetch first: ###############################\n";
print_r($result);
sqlsrv_next_result($stmt); $stmt = sqlsrv_query($conn,"TestEmptySetProc @a='a', @b='b'");
$result = sqlsrv_fetch_array($stmt);
print_r($result); echo "First fetch...\n";
sqlsrv_next_result($stmt); $result = sqlsrv_fetch_array($stmt);//$result=sqlsrv_get_field($stmt,0);
print_r($result);
print_r(sqlsrv_errors()); print_r(sqlsrv_errors());
// errors out indicating the result set contains no fields echo "Next result...\n";
echo "Return an empty result set, call nextRowset on it before fetching anything:\n"; sqlsrv_next_result($stmt);
print_r(sqlsrv_errors());
$stmt = sqlsrv_query($conn, "TestEmptySetProc @a='a', @b='c'");
sqlsrv_next_result($stmt); echo "Fetch...\n";
print_r(sqlsrv_errors()); $result = sqlsrv_fetch_array($stmt);
print_r($result);
// errors out indicating the result set contains no fields print_r(sqlsrv_errors());
echo "Return an empty result set, call fetch on it:\n";
echo "Next result...\n";
$stmt = sqlsrv_query($conn, "TestEmptySetProc @a='a', @b='c'"); sqlsrv_next_result($stmt);
$result = sqlsrv_fetch_array($stmt); print_r(sqlsrv_errors());
print_r($result);
print_r(sqlsrv_errors()); // Call next_result on a nonempty result set
echo "Nonempty result set, call next_result first: #########################\n";
$stmt = sqlsrv_query($conn, "DROP TABLE TestEmptySetTable");
$stmt = sqlsrv_query($conn, "DROP PROCEDURE TestEmptySetProc"); $stmt = sqlsrv_query($conn,"TestEmptySetProc @a='a', @b='b'");
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn); echo "Next result...\n";
?> sqlsrv_next_result($stmt);
--EXPECTF-- print_r(sqlsrv_errors());
Return a nonempty result set:
Array echo "Fetch...\n";
( $result = sqlsrv_fetch_array($stmt);
[0] => a print_r($result);
[testValue] => a print_r(sqlsrv_errors());
)
Array echo "Next result...\n";
( sqlsrv_next_result($stmt);
[0] => Array print_r(sqlsrv_errors());
(
[0] => IMSSP // Call next_result twice in succession on a nonempty result set
[SQLSTATE] => IMSSP echo "Nonempty result set, call next_result twice: #########################\n";
[1] => -26
[code] => -26 $stmt = sqlsrv_query($conn, "TestEmptySetProc @a='a', @b='b'");
[2] => There are no more results returned by the query.
[message] => There are no more results returned by the query. echo "Next result...\n";
) sqlsrv_next_result($stmt);
print_r(sqlsrv_errors());
[1] => Array
( echo "Next result...\n";
[0] => HY010 sqlsrv_next_result($stmt);
[SQLSTATE] => HY010 print_r(sqlsrv_errors());
[1] => 0
[code] => 0 // Call fetch on an empty result set
[2] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]%r[ ]{0,1}%rFunction sequence error echo "Empty result set, call fetch first: ##################################\n";
[message] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]%r[ ]{0,1}%rFunction sequence error
) $stmt = sqlsrv_query($conn,"TestEmptySetProc @a='a', @b='w'");
) echo "First fetch...\n";
Return an empty result set, call nextRowset on it before fetching anything: $result = sqlsrv_fetch_array($stmt);
Array print_r($result);
( print_r(sqlsrv_errors());
[0] => Array
( echo "Next result...\n";
[0] => IMSSP sqlsrv_next_result($stmt);
[SQLSTATE] => IMSSP print_r(sqlsrv_errors());
[1] => -28
[code] => -28 echo "Fetch...\n";
[2] => The active result for the query contains no fields. $result = sqlsrv_fetch_array($stmt);
[message] => The active result for the query contains no fields. print_r($result);
) print_r(sqlsrv_errors());
) echo "Next result...\n";
Return an empty result set, call fetch on it: sqlsrv_next_result($stmt);
Array print_r(sqlsrv_errors());
(
[0] => Array // Call next_result on an empty result set
( echo "Empty result set, call next_result first: ############################\n";
[0] => IMSSP
[SQLSTATE] => IMSSP $stmt = sqlsrv_query($conn,"TestEmptySetProc @a='a', @b='w'");
[1] => -28
[code] => -28 echo "First go to next result...\n";
[2] => The active result for the query contains no fields. sqlsrv_next_result($stmt);
[message] => The active result for the query contains no fields. print_r(sqlsrv_errors());
)
echo "Fetch...\n";
) $result = sqlsrv_fetch_array($stmt);
print_r($result);
print_r(sqlsrv_errors());
echo "Next result...\n";
sqlsrv_next_result($stmt);
print_r(sqlsrv_errors());
// Call next_result twice in succession on an empty result set
echo "Empty result set, call next_result twice: ############################\n";
$stmt = sqlsrv_query($conn, "TestEmptySetProc @a='a', @b='w'");
echo "Next result...\n";
sqlsrv_next_result($stmt);
print_r(sqlsrv_errors());
echo "Next result...\n";
sqlsrv_next_result($stmt);
print_r(sqlsrv_errors());
// Call fetch on a null result set
echo "Null result set, call fetch first: ###################################\n";
$stmt = sqlsrv_query($conn, "TestEmptySetProc @a='a', @b='c'");
echo "Fetch...\n";
$result = sqlsrv_fetch_array($stmt);
print_r($result);
print_r(sqlsrv_errors());
echo "Next result...\n";
sqlsrv_next_result($stmt);
print_r(sqlsrv_errors());
// Call next_result on a null result set
echo "Null result set, call next result first: #############################\n";
$stmt = sqlsrv_query($conn, "TestEmptySetProc @a='a', @b='c'");
echo "Next result...\n";
sqlsrv_next_result($stmt);
print_r(sqlsrv_errors());
echo "Fetch...\n";
$result = sqlsrv_fetch_array($stmt);
print_r(sqlsrv_errors());
// Call next_result twice in succession on a null result set
echo "Null result set, call next result twice: #############################\n";
$stmt = sqlsrv_query($conn, "TestEmptySetProc @a='a', @b='c'");
echo "Next result...\n";
sqlsrv_next_result($stmt);
print_r(sqlsrv_errors());
echo "Next result...\n";
sqlsrv_next_result($stmt);
print_r(sqlsrv_errors());
$stmt = sqlsrv_query($conn, "DROP TABLE TestEmptySetTable");
$stmt = sqlsrv_query($conn, "DROP PROCEDURE TestEmptySetProc");
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
--EXPECTF--
Nonempty result set, call fetch first: ###############################
First fetch...
Array
(
[0] => a
[testValue] => a
)
Next result...
Fetch...
Array
(
[0] => Array
(
[0] => HY010
[SQLSTATE] => HY010
[1] => 0
[code] => 0
[2] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]Function sequence error
[message] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]Function sequence error
)
)
Next result...
Array
(
[0] => Array
(
[0] => IMSSP
[SQLSTATE] => IMSSP
[1] => -26
[code] => -26
[2] => There are no more results returned by the query.
[message] => There are no more results returned by the query.
)
[1] => Array
(
[0] => HY010
[SQLSTATE] => HY010
[1] => 0
[code] => 0
[2] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]Function sequence error
[message] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]Function sequence error
)
)
Nonempty result set, call next_result first: #########################
Next result...
Fetch...
Array
(
[0] => Array
(
[0] => HY010
[SQLSTATE] => HY010
[1] => 0
[code] => 0
[2] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]Function sequence error
[message] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]Function sequence error
)
)
Next result...
Array
(
[0] => Array
(
[0] => IMSSP
[SQLSTATE] => IMSSP
[1] => -26
[code] => -26
[2] => There are no more results returned by the query.
[message] => There are no more results returned by the query.
)
[1] => Array
(
[0] => HY010
[SQLSTATE] => HY010
[1] => 0
[code] => 0
[2] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]Function sequence error
[message] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]Function sequence error
)
)
Nonempty result set, call next_result twice: #########################
Next result...
Next result...
Array
(
[0] => Array
(
[0] => IMSSP
[SQLSTATE] => IMSSP
[1] => -26
[code] => -26
[2] => There are no more results returned by the query.
[message] => There are no more results returned by the query.
)
)
Empty result set, call fetch first: ##################################
First fetch...
Next result...
Fetch...
Array
(
[0] => Array
(
[0] => IMSSP
[SQLSTATE] => IMSSP
[1] => -22
[code] => -22
[2] => There are no more rows in the active result set. Since this result set is not scrollable, no more data may be retrieved.
[message] => There are no more rows in the active result set. Since this result set is not scrollable, no more data may be retrieved.
)
)
Next result...
Array
(
[0] => Array
(
[0] => IMSSP
[SQLSTATE] => IMSSP
[1] => -26
[code] => -26
[2] => There are no more results returned by the query.
[message] => There are no more results returned by the query.
)
)
Empty result set, call next_result first: ############################
First go to next result...
Fetch...
Array
(
[0] => Array
(
[0] => HY010
[SQLSTATE] => HY010
[1] => 0
[code] => 0
[2] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]Function sequence error
[message] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]Function sequence error
)
)
Next result...
Array
(
[0] => Array
(
[0] => IMSSP
[SQLSTATE] => IMSSP
[1] => -26
[code] => -26
[2] => There are no more results returned by the query.
[message] => There are no more results returned by the query.
)
[1] => Array
(
[0] => HY010
[SQLSTATE] => HY010
[1] => 0
[code] => 0
[2] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]Function sequence error
[message] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]Function sequence error
)
)
Empty result set, call next_result twice: ############################
Next result...
Next result...
Array
(
[0] => Array
(
[0] => IMSSP
[SQLSTATE] => IMSSP
[1] => -26
[code] => -26
[2] => There are no more results returned by the query.
[message] => There are no more results returned by the query.
)
)
Null result set, call fetch first: ###################################
Fetch...
Array
(
[0] => Array
(
[0] => IMSSP
[SQLSTATE] => IMSSP
[1] => -28
[code] => -28
[2] => The active result for the query contains no fields.
[message] => The active result for the query contains no fields.
)
)
Next result...
Null result set, call next result first: #############################
Next result...
Fetch...
Array
(
[0] => Array
(
[0] => HY010
[SQLSTATE] => HY010
[1] => 0
[code] => 0
[2] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]Function sequence error
[message] => [%rMicrosoft|unixODBC%r][%rODBC D|D%rriver Manager]Function sequence error
)
)
Null result set, call next result twice: #############################
Next result...
Next result...
Array
(
[0] => Array
(
[0] => IMSSP
[SQLSTATE] => IMSSP
[1] => -26
[code] => -26
[2] => There are no more results returned by the query.
[message] => There are no more results returned by the query.
)
)