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