1--TEST--
2PDO::ATTR_ORACLE_NULLS
3--SKIPIF--
4<?php
5require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
6require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
7MySQLPDOTest::skip();
8?>
9--FILE--
10<?php
11	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
12	$db = MySQLPDOTest::factory();
13	MySQLPDOTest::createTestTable($db);
14
15	$tmp = array();
16	if (false !== @$db->setAttribute(PDO::ATTR_ORACLE_NULLS, $tmp))
17		printf("[001] Maybe PDO could indicate that this is not a proper way of setting ATTR_ORACLE_NULLS...\n");
18
19	$tmp = new stdClass();
20	if (false !== @$db->setAttribute(PDO::ATTR_ORACLE_NULLS, $tmp));
21		printf("[002] Maybe PDO could indicate that this is not a proper way of setting ATTR_ORACLE_NULLS...\n");
22
23	if (false !== @$db->setAttribute(PDO::ATTR_ORACLE_NULLS, 'pdo'))
24		printf("[003] Maybe PDO could indicate that this is not a proper way of setting ATTR_ORACLE_NULLS...\n");
25
26	$db->setAttribute(PDO::ATTR_ORACLE_NULLS, 1);
27	$stmt = $db->query("SELECT NULL AS z, '' AS a, ' ' AS b, TRIM(' ') as c, ' d' AS d, '" . chr(0) . " e' AS e");
28	var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
29
30	$db->setAttribute(PDO::ATTR_ORACLE_NULLS, 0);
31	$stmt = $db->query("SELECT NULL AS z, '' AS a, ' ' AS b, TRIM(' ') as c, ' d' AS d, '" . chr(0) . " e' AS e");
32	var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
33
34	$db->setAttribute(PDO::ATTR_ORACLE_NULLS, 1);
35	$stmt = $db->query('SELECT VERSION() as _version');
36	$row = $stmt->fetch(PDO::FETCH_ASSOC);
37	if ((int)substr($row['_version'], 0, 1) >= 5)
38		$have_procedures = true;
39	else
40		$have_procedures = false;
41
42	$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
43	$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
44
45	if ($have_procedures && (false !== $db->exec('DROP PROCEDURE IF EXISTS p')) &&
46		(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;"))) {
47		// requires MySQL 5+
48		$stmt = $db->prepare('CALL p()');
49		$stmt->execute();
50		$expected = array(
51			array(
52				"z" => NULL,
53				"a" => NULL,
54				"b" => " ",
55				"c" => NULL,
56				"d" => " d",
57				"e" => " e",
58			),
59		);
60		do {
61			$tmp = $stmt->fetchAll(PDO::FETCH_ASSOC);
62			if ($tmp != $expected) {
63				printf("[004] Expecting %s got %s\n",
64					var_export($expected, true), var_export($tmp, true));
65			}
66		} while ($stmt->nextRowset());
67
68		$stmt->execute();
69		do {
70			$tmp = $stmt->fetchAll(PDO::FETCH_ASSOC);
71			if ($tmp != $expected) {
72				printf("[005] Expecting %s got %s\n",
73					var_export($expected, true), var_export($tmp, true));
74			}
75		} while ($stmt->nextRowset());
76
77	}
78
79	if ($have_procedures)
80		@$db->exec('DROP PROCEDURE IF EXISTS p');
81
82	print "done!";
83?>
84--EXPECTF--
85[002] Maybe PDO could indicate that this is not a proper way of setting ATTR_ORACLE_NULLS...
86[003] Maybe PDO could indicate that this is not a proper way of setting ATTR_ORACLE_NULLS...
87array(1) {
88  [0]=>
89  array(6) {
90    [%u|b%"z"]=>
91    NULL
92    [%u|b%"a"]=>
93    NULL
94    [%u|b%"b"]=>
95    %unicode|string%(1) " "
96    [%u|b%"c"]=>
97    NULL
98    [%u|b%"d"]=>
99    %unicode|string%(2) " d"
100    [%u|b%"e"]=>
101    %unicode|string%(3) "%se"
102  }
103}
104array(1) {
105  [0]=>
106  array(6) {
107    [%u|b%"z"]=>
108    NULL
109    [%u|b%"a"]=>
110    %unicode|string%(0) ""
111    [%u|b%"b"]=>
112    %unicode|string%(1) " "
113    [%u|b%"c"]=>
114    %unicode|string%(0) ""
115    [%u|b%"d"]=>
116    %unicode|string%(2) " d"
117    [%u|b%"e"]=>
118    %unicode|string%(3) "%se"
119  }
120}
121done!