diff --git a/source/shared/core_stmt.cpp b/source/shared/core_stmt.cpp index 34b4dc034..9dd505ec6 100644 --- a/source/shared/core_stmt.cpp +++ b/source/shared/core_stmt.cpp @@ -2007,7 +2007,11 @@ void finalize_output_parameters( sqlsrv_stmt* stmt TSRMLS_DC ) // adjust the length of the string to the value returned by SQLBindParameter in the ind_ptr parameter char* str = Z_STRVAL_P( value_z ); SQLLEN str_len = stmt->param_ind_ptrs[ output_param->param_num ]; - if( str_len == SQL_NULL_DATA || str_len == 0 ) { + if( str_len == 0 ) { + core::sqlsrv_zval_stringl( value_z, "", 0 ); + continue; + } + if( str_len == SQL_NULL_DATA ) { zend_string_release( Z_STR_P( value_z )); ZVAL_NULL( value_z ); continue; diff --git a/test/pdo_sqlsrv/pdo_308_empty_output_param.phpt b/test/pdo_sqlsrv/pdo_308_empty_output_param.phpt new file mode 100644 index 000000000..80984d186 --- /dev/null +++ b/test/pdo_sqlsrv/pdo_308_empty_output_param.phpt @@ -0,0 +1,48 @@ +--TEST-- +GitHub issue #308 - empty string set to output parameter on stored procedure +--DESCRIPTION-- +Verifies GitHub issue 308 is fixed, empty string returned as output parameter will remain an empty string. +--SKIPIF-- +--FILE-- +setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); + +$procName = GetTempProcName(); + +$sql = "CREATE PROCEDURE $procName @TEST VARCHAR(200)='' OUTPUT +AS BEGIN +SET NOCOUNT ON; +SET @TEST=''; +SELECT HELLO_WORLD_COLUMN='THIS IS A COLUMN IN A SINGLE DATASET'; +END"; +$stmt = $conn->exec($sql); + +$sql = "EXEC $procName @Test = :Test"; +$stmt = $conn->prepare($sql); +$out = ''; +$stmt->bindParam(':Test', $out, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 200); +$stmt->execute(); + +$result = $stmt->fetchAll(); +$stmt->closeCursor(); + +echo "OUT value: "; +var_dump($out); + +// Free the statement and connection resources. +$stmt = null; +$conn = null; + +print "Done"; +?> +--EXPECT-- +OUT value: string(0) "" +Done \ No newline at end of file diff --git a/test/sqlsrv/srv_308_empty_output_param.phpt b/test/sqlsrv/srv_308_empty_output_param.phpt new file mode 100644 index 000000000..638acbea0 --- /dev/null +++ b/test/sqlsrv/srv_308_empty_output_param.phpt @@ -0,0 +1,47 @@ +--TEST-- +GitHub issue #308 - empty string set to output parameter on stored procedure +--DESCRIPTION-- +A variation of the example in GitHub issue 308. A NULL value returned as output parameter will remain as NULL. +--SKIPIF-- +--FILE-- + +--EXPECT-- +OUT value: NULL +Done