Skip to content

Commit b7d932f

Browse files
committed
change to raise a value error if an invalid value is passed to PDO::FB_TRANSACTION_ISOLATION_LEVEL.
1 parent b3caa01 commit b7d932f

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

ext/pdo_firebird/firebird_driver.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,8 +1080,10 @@ static bool pdo_firebird_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val
10801080
*/
10811081
H->txn_isolation_level = lval;
10821082
} else {
1083-
pdo_raise_impl_error(dbh, NULL, "HY000",
1084-
"Transaction isolation level must be PDO::FB_READ_COMMITTED, PDO::FB_REPEATABLE_READ, or PDO::PDO_FB_SERIALIZABLE");
1083+
zend_error_handling zeh;
1084+
zend_argument_value_error(2,
1085+
"PDO::FB_TRANSACTION_ISOLATION_LEVEL must be a valid transaction isolation level (PDO::FB_READ_COMMITTED, PDO::FB_REPEATABLE_READ, or PDO::FB_SERIALIZABLE)");
1086+
zend_restore_error_handling(&zeh);
10851087
return false;
10861088
}
10871089
}
@@ -1297,7 +1299,9 @@ static int pdo_firebird_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /*
12971299
) {
12981300
H->txn_isolation_level = txn_isolation_level;
12991301
} else {
1300-
H->txn_isolation_level = PDO_FB_REPEATABLE_READ;
1302+
zend_argument_value_error(4,
1303+
"PDO::FB_TRANSACTION_ISOLATION_LEVEL must be a valid transaction isolation level (PDO::FB_READ_COMMITTED, PDO::FB_REPEATABLE_READ, or PDO::FB_SERIALIZABLE)");
1304+
ret = 0;
13011305
}
13021306

13031307
do {

ext/pdo_firebird/tests/transaction_isolation_level_attr.phpt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,22 @@ foreach ($levelStrs as $levelStr) {
4141
unset($dbh);
4242
}
4343

44+
echo "Invalid value\n";
45+
try {
46+
$dbh = new PDO(
47+
PDO_FIREBIRD_TEST_DSN,
48+
PDO_FIREBIRD_TEST_USER,
49+
PDO_FIREBIRD_TEST_PASS,
50+
[
51+
PDO::FB_TRANSACTION_ISOLATION_LEVEL => PDO::ATTR_AUTOCOMMIT, // Invalid value
52+
],
53+
);
54+
} catch (Throwable $e) {
55+
echo $e->getMessage()."\n";
56+
}
57+
58+
unset($dbh);
59+
4460
echo "\n";
4561
echo "========== Set attr in setAttribute ==========\n";
4662

@@ -62,13 +78,22 @@ foreach ($levelStrs as $levelStr) {
6278
}
6379
}
6480

81+
echo "Invalid value\n";
82+
try {
83+
$dbh->setAttribute(PDO::FB_TRANSACTION_ISOLATION_LEVEL, PDO::ATTR_AUTOCOMMIT); // Invalid value
84+
} catch (Throwable $e) {
85+
echo $e->getMessage()."\n";
86+
}
87+
6588
unset($dbh);
6689
?>
6790
--EXPECT--
6891
========== Set attr in construct ==========
6992
OK: PDO::FB_READ_COMMITTED
7093
OK: PDO::FB_REPEATABLE_READ
7194
OK: PDO::FB_SERIALIZABLE
95+
Invalid value
96+
PDO::__construct(): Argument #4 ($options) PDO::FB_TRANSACTION_ISOLATION_LEVEL must be a valid transaction isolation level (PDO::FB_READ_COMMITTED, PDO::FB_REPEATABLE_READ, or PDO::FB_SERIALIZABLE)
7297

7398
========== Set attr in setAttribute ==========
7499
bool(true)
@@ -77,3 +102,5 @@ bool(true)
77102
OK: PDO::FB_REPEATABLE_READ
78103
bool(true)
79104
OK: PDO::FB_SERIALIZABLE
105+
Invalid value
106+
PDO::setAttribute(): Argument #2 ($value) PDO::FB_TRANSACTION_ISOLATION_LEVEL must be a valid transaction isolation level (PDO::FB_READ_COMMITTED, PDO::FB_REPEATABLE_READ, or PDO::FB_SERIALIZABLE)

0 commit comments

Comments
 (0)