1--TEST--
2PDO::ATTR_ORACLE_NULLS
3--SKIPIF--
4<?php
5require_once(__DIR__ . DIRECTORY_SEPARATOR . 'skipif.inc');
6require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
7MySQLPDOTest::skip();
8?>
9--FILE--
10<?php
11    require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
12    $db = MySQLPDOTest::factory();
13    MySQLPDOTest::createTestTable($db);
14
15    try {
16        $db->setAttribute(PDO::ATTR_ORACLE_NULLS, []);
17    } catch (\TypeError $e) {
18        echo $e->getMessage(), \PHP_EOL;
19    }
20    try {
21        $db->setAttribute(PDO::ATTR_ORACLE_NULLS, new stdClass());
22    } catch (\TypeError $e) {
23        echo $e->getMessage(), \PHP_EOL;
24    }
25    try {
26        /* Currently passes... */
27        $db->setAttribute(PDO::ATTR_ORACLE_NULLS, 'pdo');
28    } catch (\TypeError $e) {
29        echo $e->getMessage(), \PHP_EOL;
30    }
31
32    $db->setAttribute(PDO::ATTR_ORACLE_NULLS, 1);
33    $stmt = $db->query("SELECT NULL AS z, '' AS a, ' ' AS b, TRIM(' ') as c, ' d' AS d, '" . chr(0) . " e' AS e");
34    var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
35
36    $db->setAttribute(PDO::ATTR_ORACLE_NULLS, 0);
37    $stmt = $db->query("SELECT NULL AS z, '' AS a, ' ' AS b, TRIM(' ') as c, ' d' AS d, '" . chr(0) . " e' AS e");
38    var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
39
40    $db->setAttribute(PDO::ATTR_ORACLE_NULLS, 1);
41    $stmt = $db->query('SELECT VERSION() as _version');
42    $row = $stmt->fetch(PDO::FETCH_ASSOC);
43    if ((int)strtok($row['_version'], '.') >= 5)
44        $have_procedures = true;
45    else
46        $have_procedures = false;
47
48    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
49    $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
50
51    if ($have_procedures && (false !== $db->exec('DROP PROCEDURE IF EXISTS p')) &&
52        (false !== $db->exec("CREATE PROCEDURE p() BEGIN SELECT NULL as z, '' AS a, ' ' AS b, TRIM(' ') as c, ' d' AS d, ' e' AS e; END;"))) {
53        // requires MySQL 5+
54        $stmt = $db->prepare('CALL p()');
55        $stmt->execute();
56        do {
57            var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
58        } while ($stmt->nextRowset());
59
60        $stmt->execute();
61        do {
62            var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
63        } while ($stmt->nextRowset());
64
65    }
66
67    if ($have_procedures)
68        @$db->exec('DROP PROCEDURE IF EXISTS p');
69
70    print "done!";
71?>
72--EXPECTF--
73Attribute value must be of type int for selected attribute, array given
74Attribute value must be of type int for selected attribute, stdClass given
75array(1) {
76  [0]=>
77  array(6) {
78    ["z"]=>
79    NULL
80    ["a"]=>
81    NULL
82    ["b"]=>
83    string(1) " "
84    ["c"]=>
85    NULL
86    ["d"]=>
87    string(2) " d"
88    ["e"]=>
89    string(3) "%se"
90  }
91}
92array(1) {
93  [0]=>
94  array(6) {
95    ["z"]=>
96    NULL
97    ["a"]=>
98    string(0) ""
99    ["b"]=>
100    string(1) " "
101    ["c"]=>
102    string(0) ""
103    ["d"]=>
104    string(2) " d"
105    ["e"]=>
106    string(3) "%se"
107  }
108}
109array(1) {
110  [0]=>
111  array(6) {
112    ["z"]=>
113    NULL
114    ["a"]=>
115    string(0) ""
116    ["b"]=>
117    string(1) " "
118    ["c"]=>
119    string(0) ""
120    ["d"]=>
121    string(2) " d"
122    ["e"]=>
123    string(2) " e"
124  }
125}
126array(0) {
127}
128array(1) {
129  [0]=>
130  array(6) {
131    ["z"]=>
132    NULL
133    ["a"]=>
134    string(0) ""
135    ["b"]=>
136    string(1) " "
137    ["c"]=>
138    string(0) ""
139    ["d"]=>
140    string(2) " d"
141    ["e"]=>
142    string(2) " e"
143  }
144}
145array(0) {
146}
147done!
148