1--TEST--
2MySQL PDO class inTransaction
3--EXTENSIONS--
4pdo_mysql
5--SKIPIF--
6<?php
7require_once __DIR__ . '/inc/mysql_pdo_test.inc';
8MySQLPDOTest::skip();
9?>
10--FILE--
11<?php
12require_once __DIR__ . '/inc/mysql_pdo_test.inc';
13
14const BEGIN = ['BEGIN', 'START TRANSACTION'];
15const END = ['COMMIT', 'ROLLBACK'];
16
17$db = MySQLPDOTest::factory();
18// $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // mysql does not support
19foreach (BEGIN as $begin) {
20    foreach (END as $end) {
21        foreach (['exec', 'query', 'execute'] as $w) {
22            foreach ([$begin, $end] as $command) {
23                switch ($w) {
24                    case 'exec':
25                        $db->exec($command);
26                        break;
27                    case'query':
28                        $db->query($command)->execute();
29                        break;
30                    case 'execute':
31                        /* EMULATE_PREPARES = QUERY */
32                        $db->prepare($command)->execute();
33                        break;
34                    default:
35                        assert(0);
36                }
37                var_dump($db->inTransaction());
38            }
39        }
40    }
41}
42echo "\n";
43
44// Mixing PDO transaction API and explicit queries.
45foreach (END as $end) {
46    $db->beginTransaction();
47    var_dump($db->inTransaction());
48    $db->exec($end);
49    var_dump($db->inTransaction());
50}
51
52$db->exec('START TRANSACTION');
53var_dump($db->inTransaction());
54$db->rollBack();
55var_dump($db->inTransaction());
56$db->exec('START TRANSACTION');
57var_dump($db->inTransaction());
58$db->commit();
59var_dump($db->inTransaction());
60echo "\n";
61
62// DDL query causes an implicit commit.
63$db->beginTransaction();
64var_dump($db->inTransaction());
65$db->exec('DROP TABLE IF EXISTS pdo_mysql_inTransaction');
66var_dump($db->inTransaction());
67
68// We should be able to start a new transaction after the implicit commit.
69$db->beginTransaction();
70var_dump($db->inTransaction());
71$db->commit();
72var_dump($db->inTransaction());
73
74?>
75--EXPECT--
76bool(true)
77bool(false)
78bool(true)
79bool(false)
80bool(true)
81bool(false)
82bool(true)
83bool(false)
84bool(true)
85bool(false)
86bool(true)
87bool(false)
88bool(true)
89bool(false)
90bool(true)
91bool(false)
92bool(true)
93bool(false)
94bool(true)
95bool(false)
96bool(true)
97bool(false)
98bool(true)
99bool(false)
100
101bool(true)
102bool(false)
103bool(true)
104bool(false)
105bool(true)
106bool(false)
107bool(true)
108bool(false)
109
110bool(true)
111bool(false)
112bool(true)
113bool(false)
114