Skip to content

Commit 3e4b91e

Browse files
committed
Fixed bug #68371 PDO#getAttribute() cannot be called with platform-specific attribute names
1 parent 722dd46 commit 3e4b91e

File tree

4 files changed

+209
-0
lines changed

4 files changed

+209
-0
lines changed

ext/pdo_mysql/mysql_driver.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,7 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, long attr, zval *return_value
458458
ZVAL_LONG(return_value, H->buffered);
459459
break;
460460

461+
case PDO_ATTR_EMULATE_PREPARES:
461462
case PDO_MYSQL_ATTR_DIRECT_QUERY:
462463
ZVAL_LONG(return_value, H->emulate_prepare);
463464
break;

ext/pdo_mysql/tests/bug68371.phpt

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
--TEST--
2+
PDO MySQL Bug #38671 (PDO#getAttribute() cannot be called with platform-specific attribute names)
3+
--SKIPIF--
4+
<?php
5+
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
6+
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
7+
MySQLPDOTest::skip();
8+
?>
9+
--FILE--
10+
<?php
11+
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
12+
$pdo = MySQLPDOTest::factory();
13+
$pdo->setAttribute (\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
14+
15+
$attrs = array(
16+
// Extensive test: default value and set+get values
17+
PDO::ATTR_EMULATE_PREPARES => array(null, 1, 0),
18+
PDO::MYSQL_ATTR_DIRECT_QUERY => array(null, 0, 1),
19+
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => array(null, 0, 1),
20+
21+
// Just test the default
22+
PDO::ATTR_AUTOCOMMIT => array(null),
23+
PDO::ATTR_PREFETCH => array(null),
24+
PDO::ATTR_TIMEOUT => array(null),
25+
PDO::ATTR_ERRMODE => array(null),
26+
PDO::ATTR_SERVER_VERSION => array(null),
27+
PDO::ATTR_CLIENT_VERSION => array(null),
28+
PDO::ATTR_SERVER_INFO => array(null),
29+
PDO::ATTR_CONNECTION_STATUS => array(null),
30+
PDO::ATTR_CASE => array(null),
31+
PDO::ATTR_CURSOR_NAME => array(null),
32+
PDO::ATTR_CURSOR => array(null),
33+
PDO::ATTR_ORACLE_NULLS => array(null),
34+
PDO::ATTR_PERSISTENT => array(null),
35+
PDO::ATTR_STATEMENT_CLASS => array(null),
36+
PDO::ATTR_FETCH_TABLE_NAMES => array(null),
37+
PDO::ATTR_FETCH_CATALOG_NAMES => array(null),
38+
PDO::ATTR_DRIVER_NAME => array(null),
39+
PDO::ATTR_STRINGIFY_FETCHES => array(null),
40+
PDO::ATTR_MAX_COLUMN_LEN => array(null),
41+
PDO::ATTR_DEFAULT_FETCH_MODE => array(null),
42+
);
43+
44+
foreach ($attrs as $a => $vals) {
45+
foreach ($vals as $v) {
46+
try {
47+
if (!isset($v)) {
48+
var_dump($pdo->getAttribute($a));
49+
} else {
50+
$pdo->setAttribute($a, $v);
51+
if ($pdo->getAttribute($a) === $v) {
52+
echo "OK\n";
53+
} else {
54+
throw new \Exception('KO');
55+
}
56+
}
57+
} catch (\Exception $e) {
58+
if ($e->getCode() == 'IM001') {
59+
echo "ERR\n";
60+
} else {
61+
echo "ERR {$e->getMessage()}\n";
62+
}
63+
}
64+
}
65+
}
66+
67+
?>
68+
--EXPECTF--
69+
int(1)
70+
OK
71+
OK
72+
int(0)
73+
OK
74+
OK
75+
int(1)
76+
OK
77+
OK
78+
int(1)
79+
ERR
80+
ERR
81+
int(2)
82+
string(%d) "%s"
83+
string(%d) "%s"
84+
string(%d) "%s"
85+
string(%d) "%s"
86+
int(2)
87+
ERR
88+
ERR
89+
int(0)
90+
bool(false)
91+
array(1) {
92+
[0]=>
93+
string(12) "PDOStatement"
94+
}
95+
ERR
96+
ERR
97+
string(5) "mysql"
98+
ERR
99+
ERR
100+
int(4)
101+

ext/pdo_pgsql/pgsql_driver.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,14 @@ static int pdo_pgsql_get_attribute(pdo_dbh_t *dbh, long attr, zval *return_value
379379
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
380380

381381
switch (attr) {
382+
case PDO_ATTR_EMULATE_PREPARES:
383+
ZVAL_BOOL(return_value, H->emulate_prepares);
384+
break;
385+
386+
case PDO_PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT:
387+
ZVAL_BOOL(return_value, H->disable_native_prepares);
388+
break;
389+
382390
case PDO_ATTR_CLIENT_VERSION:
383391
ZVAL_STRING(return_value, PG_VERSION, 1);
384392
break;

ext/pdo_pgsql/tests/bug68371.phpt

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
--TEST--
2+
PDO PgSQL Bug #38671 (PDO#getAttribute() cannot be called with platform-specific attribute names)
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('pdo') || !extension_loaded('pdo_pgsql')) die('skip not loaded');
6+
require dirname(__FILE__) . '/config.inc';
7+
require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
8+
PDOTest::skip();
9+
?>
10+
--FILE--
11+
<?php
12+
13+
require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
14+
$pdo = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
15+
$pdo->setAttribute (\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
16+
17+
$attrs = array(
18+
// Extensive test: default value and set+get values
19+
PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT => array(null, true, false),
20+
PDO::ATTR_EMULATE_PREPARES => array(null, true, false),
21+
22+
// Just test the default
23+
PDO::ATTR_AUTOCOMMIT => array(null),
24+
PDO::ATTR_PREFETCH => array(null),
25+
PDO::ATTR_TIMEOUT => array(null),
26+
PDO::ATTR_ERRMODE => array(null),
27+
PDO::ATTR_SERVER_VERSION => array(null),
28+
PDO::ATTR_CLIENT_VERSION => array(null),
29+
PDO::ATTR_SERVER_INFO => array(null),
30+
PDO::ATTR_CONNECTION_STATUS => array(null),
31+
PDO::ATTR_CASE => array(null),
32+
PDO::ATTR_CURSOR_NAME => array(null),
33+
PDO::ATTR_CURSOR => array(null),
34+
PDO::ATTR_ORACLE_NULLS => array(null),
35+
PDO::ATTR_PERSISTENT => array(null),
36+
PDO::ATTR_STATEMENT_CLASS => array(null),
37+
PDO::ATTR_FETCH_TABLE_NAMES => array(null),
38+
PDO::ATTR_FETCH_CATALOG_NAMES => array(null),
39+
PDO::ATTR_DRIVER_NAME => array(null),
40+
PDO::ATTR_STRINGIFY_FETCHES => array(null),
41+
PDO::ATTR_MAX_COLUMN_LEN => array(null),
42+
PDO::ATTR_DEFAULT_FETCH_MODE => array(null),
43+
);
44+
45+
foreach ($attrs as $a => $vals) {
46+
foreach ($vals as $v) {
47+
try {
48+
if (!isset($v)) {
49+
var_dump($pdo->getAttribute($a));
50+
} else {
51+
$pdo->setAttribute($a, $v);
52+
if ($pdo->getAttribute($a) === $v) {
53+
echo "OK\n";
54+
} else {
55+
throw new \Exception('KO');
56+
}
57+
}
58+
} catch (\Exception $e) {
59+
if ($e->getCode() == 'IM001') {
60+
echo "ERR\n";
61+
} else {
62+
echo "ERR {$e->getMessage()}\n";
63+
}
64+
}
65+
}
66+
}
67+
68+
?>
69+
--EXPECTF--
70+
bool(false)
71+
OK
72+
OK
73+
bool(false)
74+
OK
75+
OK
76+
ERR
77+
ERR
78+
ERR
79+
int(2)
80+
string(%d) "%s"
81+
string(%d) "%s"
82+
string(%d) "%s"
83+
string(31) "%s"
84+
int(2)
85+
ERR
86+
ERR
87+
int(0)
88+
bool(false)
89+
array(1) {
90+
[0]=>
91+
string(12) "PDOStatement"
92+
}
93+
ERR
94+
ERR
95+
string(5) "pgsql"
96+
ERR
97+
ERR
98+
int(4)
99+

0 commit comments

Comments
 (0)