зеркало из https://github.com/microsoft/msphpsql.git
Fix restoring PDO::ATTR_ERRMODE after PDO::lastInsertId() call failed (#1330)
This commit is contained in:
Родитель
3826f1a522
Коммит
f52fb48335
|
@ -1598,6 +1598,9 @@ zend_string * pdo_sqlsrv_dbh_last_id(_Inout_ pdo_dbh_t *dbh, _In_ const zend_str
|
|||
|
||||
driver_stmt->~sqlsrv_stmt();
|
||||
} catch( core::CoreException& ) {
|
||||
// restore error handling to its previous mode
|
||||
dbh->error_mode = prev_err_mode;
|
||||
|
||||
// copy any errors on the statement to the connection so that the user sees them, since the statement is released
|
||||
// before this method returns
|
||||
strcpy_s( dbh->error_code, sizeof( dbh->error_code ),
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
--TEST--
|
||||
Confirm that PDO::ATTR_ERRMODE value should be restored whether PDO::lastInsertId() call succeeded or not.
|
||||
--SKIPIF--
|
||||
<?php require('skipif_mid-refactor.inc'); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
require_once("MsCommon_mid-refactor.inc");
|
||||
|
||||
try {
|
||||
$conn = connect();
|
||||
|
||||
// create temporary tables
|
||||
createTable($conn, "table1", array(new columnMeta("int", "id", "IDENTITY(100,2)"), "val" => "int"));
|
||||
createTable($conn, "table2", array(new columnMeta("int", "id", "IDENTITY(200,2)"), "val" => "int"));
|
||||
createTable($conn, "table3", array("id" => "int", "val" => "int"));
|
||||
|
||||
insertRow($conn, "table1", array("val" => 1), "exec");
|
||||
insertRow($conn, "table2", array("val" => 2), "exec");
|
||||
$conn->lastInsertId();
|
||||
var_dump($conn->getAttribute(PDO::ATTR_ERRMODE));
|
||||
|
||||
insertRow($conn, "table2", array("val" => 3), "exec");
|
||||
insertRow($conn, "table1", array("val" => 4), "exec");
|
||||
$conn->lastInsertId();
|
||||
var_dump($conn->getAttribute(PDO::ATTR_ERRMODE));
|
||||
|
||||
// Should restore original value even if PDO::lastInsertId() failed.
|
||||
insertRow($conn, "table3", array("id" => 1, "val" => 1), "exec");
|
||||
$conn->lastInsertId();
|
||||
var_dump($conn->getAttribute(PDO::ATTR_ERRMODE));
|
||||
|
||||
dropTable($conn, "table1");
|
||||
dropTable($conn, "table2");
|
||||
dropTable($conn, "table3");
|
||||
|
||||
// Should trigger exception
|
||||
$tsql = "SELECT * FROM dummy";
|
||||
$conn->exec($tsql);
|
||||
|
||||
unset($conn);
|
||||
} catch (PDOException $e) {
|
||||
print_r($e->getMessage());
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
--EXPECTREGEX--
|
||||
int\(2\)
|
||||
int\(2\)
|
||||
int\(2\)
|
||||
.*Invalid object name \'dummy\'\.
|
Загрузка…
Ссылка в новой задаче