Passed
Branch master (366c16)
by William
03:30
created

BufferedQueryTest   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 329
Duplicated Lines 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
eloc 207
c 3
b 0
f 0
dl 0
loc 329
rs 10
wmc 5

2 Methods

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