Passed
Pull Request — master (#311)
by William
12:43
created

BufferedQueryTest::testExtract()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 39
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 4
eloc 13
c 2
b 0
f 0
nc 6
nop 4
dl 0
loc 39
rs 9.8333
1
<?php
2
3
namespace PhpMyAdmin\SqlParser\Tests\Utils;
4
5
use PhpMyAdmin\SqlParser\Tests\TestCase;
6
use PhpMyAdmin\SqlParser\Utils\BufferedQuery;
7
8
class BufferedQueryTest extends TestCase
9
{
10
    /**
11
     * @dataProvider extractProvider
12
     *
13
     * @param mixed $query
14
     * @param mixed $chunkSize
15
     */
16
    public function testExtract(
17
        $query,
18
        $chunkSize,
19
        array $options,
20
        array $expected
21
    ) {
22
        $chunks = str_split($query, $chunkSize);
23
        $count = count($chunks);
24
25
        /**
26
         * The array of extracted statements.
27
         *
28
         * @var array
29
         */
30
        $statements = array();
31
32
        /**
33
         * The `BufferedQuery` instance used for extraction.
34
         *
35
         * @var BufferedQuery
36
         */
37
        $bq = new BufferedQuery('', $options);
38
39
        // Feeding chunks and extracting queries.
40
        $i = 0;
41
        while ($i < $count) {
42
            if ($stmt = $bq->extract()) {
43
                $statements[] = $stmt;
44
            } else {
45
                $bq->query .= $chunks[$i++];
46
            }
47
        }
48
49
        // Feeding ended, extracting remaining queries.
50
        while ($stmt = $bq->extract(true)) {
51
            $statements[] = $stmt;
52
        }
53
54
        $this->assertEquals($expected, $statements);
55
    }
56
57
    public function extractProvider()
58
    {
59
        $query =
60
            '/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;' . "\n" .
61
            '/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;' . "\n" .
62
            '/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;' . "\n" .
63
            '/*!40101 SET NAMES utf8mb4 */;' . "\n" .
64
            '' . "\n" .
65
            'SET SQL_MODE = \'NO_AUTO_VALUE_ON_ZERO\';' . "\n" .
66
            'SET time_zone = "+00:00";' . "\n" .
67
            '' . "\n" .
68
            '/* a comment */ DELIMITER $$' . "\n" .
69
            '' . "\n" .
70
            '# Bash-like comment sytanx.' . "\n" .
71
            'CREATE DEFINER=`root`@`localhost` PROCEDURE `film_in_stock` (IN `p_film_id` INT, IN `p_store_id` INT, OUT `p_film_count` INT)  READS SQL DATA' . "\n" .
72
            'BEGIN' . "\n" .
73
            '     SELECT inventory_id' . "\n" .
74
            '     FROM inventory' . "\n" .
75
            '     WHERE film_id = p_film_id' . "\n" .
76
            '     AND store_id = p_store_id' . "\n" .
77
            '     AND inventory_in_stock(inventory_id);' . "\n" .
78
            '' . "\n" .
79
            '     SELECT FOUND_ROWS() INTO p_film_count;' . "\n" .
80
            'END$$' . "\n" .
81
            '' . "\n" .
82
            'DELIMITER ;' . "\n" .
83
            '' . "\n" .
84
            '-- --------------------------------------------------------' . "\n" .
85
            '' . "\n" .
86
            '--' . "\n" .
87
            '-- Table structure for `actor`' . "\n" .
88
            '--' . "\n" .
89
            '' . "\n" .
90
            '/* C-like comment syntax. */' . "\n" .
91
            'CREATE TABLE IF NOT EXISTS `actor` (' . "\n" .
92
            '`actor_id` SMALLINT(5) UNSIGNED NOT NULL,' . "\n" .
93
            '`first_name` VARCHAR(45) NOT NULL,' . "\n" .
94
            '`last_name` VARCHAR(45) NOT NULL,' . "\n" .
95
            '`last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' . "\n" .
96
            ') ENGINE=InnoDB DEFAULT CHARSET=utf8;' . "\n" .
97
            '' . "\n" .
98
            '/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;' . "\n" .
99
            '/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;' . "\n" .
100
            '/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */';
101
102
        return array(
103
            array(
104
                "SELECT '\'';\nSELECT '\'';",
105
                8,
106
                array(
107
                    'parse_delimiter' => true,
108
                    'add_delimiter' => true,
109
                ),
110
                array(
111
                    "SELECT '\'';",
112
                    "SELECT '\'';",
113
                ),
114
            ),
115
116
            array(
117
                "CREATE TABLE `test` (\n" .
118
                "  `txt` varchar(10)\n" .
119
                ");\n" .
120
                "INSERT INTO `test` (`txt`) VALUES('abc');\n" .
121
                "INSERT INTO `test` (`txt`) VALUES('\\\\');\n" .
122
                "INSERT INTO `test` (`txt`) VALUES('xyz');\n",
123
                8,
124
                array(
125
                    'parse_delimiter' => true,
126
                    'add_delimiter' => true,
127
                ),
128
                array(
129
                    "CREATE TABLE `test` (\n" .
130
                    "  `txt` varchar(10)\n" .
131
                    ');',
132
                    "INSERT INTO `test` (`txt`) VALUES('abc');",
133
                    "INSERT INTO `test` (`txt`) VALUES('\\\\');",
134
                    "INSERT INTO `test` (`txt`) VALUES('xyz');",
135
                ),
136
            ),
137
138
            array(
139
                'SELECT """""""";' .
140
                'SELECT """\\\\"""',
141
                8,
142
                array(
143
                    'parse_delimiter' => true,
144
                    'add_delimiter' => true,
145
                ),
146
                array(
147
                    'SELECT """""""";',
148
                    'SELECT """\\\\"""',
149
                ),
150
            ),
151
152
            array(
153
                'DELIMITER A_VERY_LONG_DEL' . "\n" .
154
                'SELECT 1 A_VERY_LONG_DEL' . "\n" .
155
                'DELIMITER ;',
156
                3,
157
                array(
158
                    'parse_delimiter' => true,
159
                    'add_delimiter' => true,
160
                ),
161
                array(
162
                    'DELIMITER A_VERY_LONG_DEL',
163
                    'SELECT 1 A_VERY_LONG_DEL',
164
                    'DELIMITER ;',
165
                ),
166
            ),
167
168
            array(
169
                $query,
170
                32,
171
                array(
172
                    'parse_delimiter' => false,
173
                    'add_delimiter' => false,
174
                ),
175
                array(
176
                    '/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */',
177
178
                    '/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */',
179
180
                    '/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */',
181
182
                    '/*!40101 SET NAMES utf8mb4 */',
183
184
                    'SET SQL_MODE = \'NO_AUTO_VALUE_ON_ZERO\'',
185
186
                    'SET time_zone = "+00:00"',
187
188
                    '# Bash-like comment sytanx.' . "\n" .
189
                    'CREATE DEFINER=`root`@`localhost` PROCEDURE `film_in_stock` (IN `p_film_id` INT, IN `p_store_id` INT, OUT `p_film_count` INT)  READS SQL DATA' . "\n" .
190
                    'BEGIN' . "\n" .
191
                    '     SELECT inventory_id' . "\n" .
192
                    '     FROM inventory' . "\n" .
193
                    '     WHERE film_id = p_film_id' . "\n" .
194
                    '     AND store_id = p_store_id' . "\n" .
195
                    '     AND inventory_in_stock(inventory_id);' . "\n" .
196
                    '' . "\n" .
197
                    '     SELECT FOUND_ROWS() INTO p_film_count;' . "\n" .
198
                    'END',
199
200
                    '-- --------------------------------------------------------' . "\n" .
201
                    '' . "\n" .
202
                    '--' . "\n" .
203
                    '-- Table structure for `actor`' . "\n" .
204
                    '--' . "\n" .
205
                    '' . "\n" .
206
                    '/* C-like comment syntax. */' . "\n" .
207
                    'CREATE TABLE IF NOT EXISTS `actor` (' . "\n" .
208
                    '`actor_id` SMALLINT(5) UNSIGNED NOT NULL,' . "\n" .
209
                    '`first_name` VARCHAR(45) NOT NULL,' . "\n" .
210
                    '`last_name` VARCHAR(45) NOT NULL,' . "\n" .
211
                    '`last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' . "\n" .
212
                    ') ENGINE=InnoDB DEFAULT CHARSET=utf8',
213
214
                    '/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */',
215
216
                    '/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */',
217
218
                    '/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */',
219
                ),
220
            ),
221
222
            array(
223
                $query,
224
                32,
225
                array(
226
                    'parse_delimiter' => true,
227
                    'add_delimiter' => false,
228
                ),
229
                array(
230
                    '/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */',
231
232
                    '/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */',
233
234
                    '/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */',
235
236
                    '/*!40101 SET NAMES utf8mb4 */',
237
238
                    'SET SQL_MODE = \'NO_AUTO_VALUE_ON_ZERO\'',
239
240
                    'SET time_zone = "+00:00"',
241
242
                    '/* a comment */  DELIMITER $$',
243
244
                    '# Bash-like comment sytanx.' . "\n" .
245
                    'CREATE DEFINER=`root`@`localhost` PROCEDURE `film_in_stock` (IN `p_film_id` INT, IN `p_store_id` INT, OUT `p_film_count` INT)  READS SQL DATA' . "\n" .
246
                    'BEGIN' . "\n" .
247
                    '     SELECT inventory_id' . "\n" .
248
                    '     FROM inventory' . "\n" .
249
                    '     WHERE film_id = p_film_id' . "\n" .
250
                    '     AND store_id = p_store_id' . "\n" .
251
                    '     AND inventory_in_stock(inventory_id);' . "\n" .
252
                    '' . "\n" .
253
                    '     SELECT FOUND_ROWS() INTO p_film_count;' . "\n" .
254
                    'END',
255
256
                    'DELIMITER ;',
257
258
                    '-- --------------------------------------------------------' . "\n" .
259
                    '' . "\n" .
260
                    '--' . "\n" .
261
                    '-- Table structure for `actor`' . "\n" .
262
                    '--' . "\n" .
263
                    '' . "\n" .
264
                    '/* C-like comment syntax. */' . "\n" .
265
                    'CREATE TABLE IF NOT EXISTS `actor` (' . "\n" .
266
                    '`actor_id` SMALLINT(5) UNSIGNED NOT NULL,' . "\n" .
267
                    '`first_name` VARCHAR(45) NOT NULL,' . "\n" .
268
                    '`last_name` VARCHAR(45) NOT NULL,' . "\n" .
269
                    '`last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' . "\n" .
270
                    ') ENGINE=InnoDB DEFAULT CHARSET=utf8',
271
272
                    '/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */',
273
274
                    '/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */',
275
276
                    '/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */',
277
                ),
278
            ),
279
280
            array(
281
                $query,
282
                64,
283
                array(
284
                    'parse_delimiter' => false,
285
                    'add_delimiter' => true,
286
                ),
287
                array(
288
                    '/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;',
289
290
                    '/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;',
291
292
                    '/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;',
293
294
                    '/*!40101 SET NAMES utf8mb4 */;',
295
296
                    'SET SQL_MODE = \'NO_AUTO_VALUE_ON_ZERO\';',
297
298
                    'SET time_zone = "+00:00";',
299
300
                    '# Bash-like comment sytanx.' . "\n" .
301
                    'CREATE DEFINER=`root`@`localhost` PROCEDURE `film_in_stock` (IN `p_film_id` INT, IN `p_store_id` INT, OUT `p_film_count` INT)  READS SQL DATA' . "\n" .
302
                    'BEGIN' . "\n" .
303
                    '     SELECT inventory_id' . "\n" .
304
                    '     FROM inventory' . "\n" .
305
                    '     WHERE film_id = p_film_id' . "\n" .
306
                    '     AND store_id = p_store_id' . "\n" .
307
                    '     AND inventory_in_stock(inventory_id);' . "\n" .
308
                    '' . "\n" .
309
                    '     SELECT FOUND_ROWS() INTO p_film_count;' . "\n" .
310
                    'END$$',
311
312
                    '-- --------------------------------------------------------' . "\n" .
313
                    '' . "\n" .
314
                    '--' . "\n" .
315
                    '-- Table structure for `actor`' . "\n" .
316
                    '--' . "\n" .
317
                    '' . "\n" .
318
                    '/* C-like comment syntax. */' . "\n" .
319
                    'CREATE TABLE IF NOT EXISTS `actor` (' . "\n" .
320
                    '`actor_id` SMALLINT(5) UNSIGNED NOT NULL,' . "\n" .
321
                    '`first_name` VARCHAR(45) NOT NULL,' . "\n" .
322
                    '`last_name` VARCHAR(45) NOT NULL,' . "\n" .
323
                    '`last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' . "\n" .
324
                    ') ENGINE=InnoDB DEFAULT CHARSET=utf8;',
325
326
                    '/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;',
327
328
                    '/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;',
329
330
                    '/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */',
331
                ),
332
            )
333
        );
334
    }
335
}
336