1--TEST--
2MySQL PDOStatement->execute()/fetch(), Non-SELECT
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
17		// Emulated PS first
18		$db->setAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY, 1);
19		if (1 != $db->getAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY))
20			printf("[002] Unable to turn on emulated prepared statements\n");
21
22		if (!is_object($stmt = $db->query('DESCRIBE test id')))
23			printf("[003] Emulated PS, DESCRIBE failed, %s\n", var_export($db->errorInfo(), true));
24
25		$describe = array();
26		$valid = false;
27		while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
28			$describe[] = $row;
29			foreach ($row as $column => $value)
30			if (isset($row['field']) && ($row['field'] == 'id'))
31				$valid = true;
32		}
33		if (empty($describe))
34			printf("[004] Emulated PS, DESCRIBE returned no results\n");
35		else if (!$valid)
36			printf("[005] Emulated PS, DESCRIBE, returned data seems wrong, dumping %s\n",
37				var_export($describe, true));
38
39		if (!is_object($stmt = $db->query('SHOW ENGINES')))
40			printf("[006] Emulated PS, SHOW failed, %s\n", var_export($db->errorInfo(), true));
41
42		$show = array();
43		$valid = false;
44		while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
45			$show[] = $row;
46			foreach ($row as $column => $value)
47				// MyISAM engine should be part of _every_ MySQL today
48				if ($value == 'MyISAM')
49					$valid = true;
50		}
51		if (empty($show))
52			printf("[007] Emulated PS, SHOW returned no results\n");
53		else if (!$valid)
54			printf("[008] Emulated PS, SHOW data seems wrong, dumping %s\n",
55				var_export($show, true));
56
57		if (!is_object($stmt = $db->query("EXPLAIN SELECT id FROM test")))
58			printf("[009] Emulated PS, EXPLAIN returned no results\n");
59
60		$explain = array();
61		while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
62			$explain[] = $row;
63
64		if (empty($explain))
65			printf("[010] Emulated PS, EXPLAIN returned no results\n");
66
67		// And now native PS
68		$db->setAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY, 0);
69		if (0 != $db->getAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY))
70			printf("[011] Unable to turn off emulated prepared statements\n");
71
72		$native_support = 'no';
73		if ($db->exec("PREPARE mystmt FROM 'DESCRIBE test id'")) {
74			$native_support = 'yes';
75			$db->exec('DEALLOCATE PREPARE mystmt');
76		}
77
78		if (!is_object($stmt = $db->query('DESCRIBE test id')))
79			printf("[012] Native PS (native support: %s), DESCRIBE failed, %s\n",
80				$native_support,
81				var_export($db->errorInfo(), true));
82
83		$describe_native = array();
84		$valid = false;
85		while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
86			$describe_native[] = $row;
87			foreach ($row as $column => $value)
88			if (isset($row['field']) && ($row['field'] == 'id'))
89				$valid = true;
90		}
91		if (empty($describe_native))
92			printf("[013] Native PS (native support: %s), DESCRIBE returned no results\n",
93				$native_support);
94		else if (!$valid)
95			printf("[014] Native PS (native support: %s), DESCRIBE, returned data seems wrong, dumping %s\n",
96				$native_support,
97				var_export($describe_native, true));
98
99		if ($describe != $describe_native)
100			printf("[015] Emulated and native PS (native support: %s) results of DESCRIBE differ: %s vs. %s\n",
101				$native_support,
102				var_export($describe, true),
103				var_export($describe_native, true));
104
105
106		$native_support = 'no';
107		if ($db->exec("PREPARE mystmt FROM 'SHOW ENGINES'")) {
108			$native_support = 'yes';
109			$db->exec('DEALLOCATE PREPARE mystmt');
110		}
111
112		if (!is_object($stmt = $db->query('SHOW ENGINES')))
113			printf("[016] Native PS (native support: %s), SHOW failed, %s\n",
114				$native_support,
115				var_export($db->errorInfo(), true));
116
117		$show_native = array();
118		$valid = false;
119		while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
120			$show_native[] = $row;
121			foreach ($row as $column => $value)
122				// MyISAM engine should be part of _every_ MySQL today
123				if ($value == 'MyISAM')
124					$valid = true;
125		}
126		if (empty($show_native))
127			printf("[017] Native PS (native support: %s), SHOW returned no results\n",
128				$native_support);
129		else if (!$valid)
130			printf("[018] Native PS (native support: %s), SHOW data seems wrong, dumping %s\n",
131				var_export($show_native, true));
132
133		if ($show != $show_native)
134			printf("Native PS (native support: %s) and emulated PS returned different data for SHOW: %s vs. %s\n",
135				$native_support,
136				var_export($show, true),
137				var_export($show_native, true));
138
139		$native_support = 'no';
140		if ($db->exec("PREPARE mystmt FROM 'EXPLAIN SELECT id FROM test'")) {
141			$native_support = 'yes';
142			$db->exec('DEALLOCATE PREPARE mystmt');
143		}
144
145		if (!is_object($stmt = $db->query("EXPLAIN SELECT id FROM test")))
146			printf("[012] Native PS (native support: %s), EXPLAIN failed, %s\n",
147				$native_support,
148				var_export($db->errorInfo(), true));
149
150		$explain_native = array();
151		while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
152			$explain_native[] = $row;
153
154		if (empty($explain_native))
155			printf("[013] Native PS (native support: %s), EXPLAIN returned no results\n",
156				$native_support);
157
158		if ($explain != $explain_native)
159			printf("Native PS (native support: %s) and emulated PS returned different data for EXPLAIN: %s vs. %s\n",
160				$native_support,
161				var_export($explain, true),
162				var_export($explain_native, true));
163
164		$stmt->execute();
165		$explain_native = $stmt->fetchAll(PDO::FETCH_ASSOC);
166		if ($explain != $explain_native)
167			printf("Native PS (native support: %s) and emulated PS returned different data for EXPLAIN: %s vs. %s\n",
168				$native_support,
169				var_export($explain, true),
170				var_export($explain_native, true));
171
172		$stmt->execute();
173		$stmt->execute();
174		// libmysql needs this - otherwise we get a 2015 error
175		if (!MYSQLPDOTest::isPDOMySQLnd())
176			$stmt->fetchAll(PDO::FETCH_ASSOC);
177
178	} catch (PDOException $e) {
179		printf("[001] %s [%s] %s\n",
180			$e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo()));
181	}
182
183	print "done!\n";
184?>
185--CLEAN--
186<?php
187require __DIR__ . '/mysql_pdo_test.inc';
188MySQLPDOTest::dropTestTable();
189?>
190--EXPECT--
191done!
192