commit
ce6337709b
|
@ -734,7 +734,7 @@ SQLRETURN core_sqlsrv_execute( sqlsrv_stmt* stmt TSRMLS_DC, const char* sql, int
|
|||
// if the statement executed but failed in a subsequent operation before returning,
|
||||
// we need to cancel the statement and deref the output and stream parameters
|
||||
if ( stmt->send_streams_at_exec ) {
|
||||
zend_hash_clean( Z_ARRVAL( stmt->output_params ));
|
||||
finalize_output_parameters( stmt TSRMLS_CC );
|
||||
zend_hash_clean( Z_ARRVAL( stmt->param_streams ));
|
||||
}
|
||||
if( stmt->executed ) {
|
||||
|
|
60
test/pdo_sqlsrv/pdo_378_out_param_error.phpt
Normal file
60
test/pdo_sqlsrv/pdo_378_out_param_error.phpt
Normal file
|
@ -0,0 +1,60 @@
|
|||
--TEST--
|
||||
This test verifies that GitHub issue #378 is fixed in pdo_sqlsrv.
|
||||
--DESCRIPTION--
|
||||
GitHub issue #378 - output parameters appends garbage info when variable is initialized with different data type
|
||||
steps to reproduce the issue:
|
||||
1- create a store procedure with print and output parameter
|
||||
2- initialize output parameters to a different data type other than the type declared in sp.
|
||||
3 - call sp.
|
||||
--FILE--
|
||||
<?php
|
||||
require_once("pdo_tools.inc");
|
||||
require_once("autonomous_setup.php");
|
||||
|
||||
$conn = new PDO( "sqlsrv:Server=$serverName; Database = tempdb ", $username, $password);
|
||||
if (!$conn) {
|
||||
print_r($conn->errorInfo());
|
||||
}
|
||||
|
||||
//----------------Main---------------------------
|
||||
$procName = GetTempProcName();
|
||||
createSP($conn, $procName);
|
||||
executeSP($conn, $procName);
|
||||
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
|
||||
executeSP($conn, $procName);
|
||||
echo "Done";
|
||||
|
||||
//-------------------functions-------------------
|
||||
function createSP($conn, $procName){
|
||||
|
||||
$sp_sql="create proc $procName @p1 integer, @p2 integer, @p3 integer output
|
||||
as
|
||||
begin
|
||||
select @p3 = @p1 + @p2
|
||||
print @p3
|
||||
end
|
||||
";
|
||||
$stmt = $conn->exec($sp_sql);
|
||||
if ($stmt === false) { print("Failed to create stored procedure"); }
|
||||
}
|
||||
|
||||
function executeSP($conn, $procName){
|
||||
$expected = 3;
|
||||
$stmt = $conn->prepare("{call $procName( ?, ?, ? )}");
|
||||
$stmt->bindParam(1, $v1);
|
||||
$stmt->bindParam(2, $v2);
|
||||
$stmt->bindParam(3, $v3, PDO::PARAM_INT, 10);
|
||||
$v1 = 1;
|
||||
$v2 = 2;
|
||||
$v3 = 'str';
|
||||
$stmt->execute();
|
||||
if (!$stmt) {
|
||||
print_r($stmt->errorInfo());
|
||||
}
|
||||
if ( $v3 != $expected ) {
|
||||
print("The expected value is $expected, actual value is $v3\n");
|
||||
}
|
||||
}
|
||||
?>
|
||||
--EXPECT--
|
||||
Done
|
58
test/sqlsrv/sqlsrv_378_out_param_error.phpt
Normal file
58
test/sqlsrv/sqlsrv_378_out_param_error.phpt
Normal file
|
@ -0,0 +1,58 @@
|
|||
--TEST--
|
||||
This test verifies that GitHub issue #378 is fixed.
|
||||
--DESCRIPTION--
|
||||
GitHub issue #378 - output parameters appends garbage info when variable is initialized with different data type
|
||||
steps to reproduce the issue:
|
||||
1- create a store procedure with print and output parameter
|
||||
2- initialize output parameters to a different data type other than the type declared in sp.
|
||||
3- set the WarningsReturnAsErrors to true
|
||||
4 - call sp.
|
||||
--FILE--
|
||||
<?php
|
||||
require_once("tools.inc");
|
||||
require_once("autonomous_setup.php");
|
||||
|
||||
$conn = sqlsrv_connect($serverName, $connectionInfo);
|
||||
if( $conn === false ) {
|
||||
die( print_r( sqlsrv_errors(), true ));
|
||||
}
|
||||
//----------------Main---------------------------
|
||||
$procName = GetTempProcName();
|
||||
createSP($conn, $procName);
|
||||
|
||||
sqlsrv_configure( 'WarningsReturnAsErrors', true );
|
||||
executeSP($conn, $procName);
|
||||
|
||||
sqlsrv_configure( 'WarningsReturnAsErrors', false );
|
||||
executeSP($conn, $procName);
|
||||
echo "Done";
|
||||
//-------------------functions-------------------
|
||||
function createSP($conn, $procName){
|
||||
|
||||
$sp_sql="create proc $procName @p1 integer, @p2 integer, @p3 integer output
|
||||
as
|
||||
begin
|
||||
select @p3 = @p1 + @p2
|
||||
print @p3
|
||||
end
|
||||
";
|
||||
$stmt = sqlsrv_query($conn, $sp_sql);
|
||||
if ($stmt === false) { FatalError("Failed to create stored procedure"); }
|
||||
}
|
||||
|
||||
function executeSP($conn, $procName){
|
||||
$expected = 3;
|
||||
$v1 = 1;
|
||||
$v2 = 2;
|
||||
$v3 = 'str';
|
||||
$stmt = sqlsrv_query( $conn, "{call $procName( ?, ?, ? )}", array( $v1, $v2, array( &$v3, SQLSRV_PARAM_OUT )));
|
||||
if( $stmt === false ) {
|
||||
print_r( sqlsrv_errors(), true );
|
||||
}
|
||||
if ( $v3 != $expected ) {
|
||||
FatalError("The expected value is $expected, actual value is $v3\n");
|
||||
}
|
||||
}
|
||||
?>
|
||||
--EXPECT--
|
||||
Done
|
Loading…
Reference in a new issue