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

FormatterTest::formatQueries()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 325
Code Lines 307

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 307
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 325
rs 8

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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\Formatter;
9
use ReflectionMethod;
10
11
class FormatterTest extends TestCase
12
{
13
    /**
14
     * @param mixed $default
15
     * @param mixed $overriding
16
     * @param mixed $expected
17
     *
18
     * @dataProvider mergeFormats
19
     */
20
    public function testMergeFormats($default, $overriding, $expected)
21
    {
22
        $formatter = $this->getMockBuilder('PhpMyAdmin\SqlParser\Utils\Formatter')
23
            ->disableOriginalConstructor()
24
            ->setMethods(['getDefaultOptions', 'getDefaultFormats'])
25
            ->getMock();
26
27
        $formatter->expects($this->once())
28
            ->method('getDefaultOptions')
29
            ->willReturn([
30
                'type' => 'text',
31
                'line_ending' => null,
32
                'indentation' => null,
33
                'clause_newline' => null,
34
                'parts_newline' => null,
35
            ]);
36
37
        $formatter->expects($this->once())
38
            ->method('getDefaultFormats')
39
            ->willReturn($default);
40
41
        $expectedOptions = [
42
            'type' => 'test-type',
43
            'line_ending' => '<br>',
44
            'indentation' => '    ',
45
            'clause_newline' => null,
46
            'parts_newline' => 0,
47
            'formats' => $expected,
48
        ];
49
50
        $overridingOptions = [
51
            'type' => 'test-type',
52
            'line_ending' => '<br>',
53
            'formats' => $overriding,
54
        ];
55
56
        $reflectionMethod = new ReflectionMethod($formatter, 'getMergedOptions');
57
        $reflectionMethod->setAccessible(true);
58
        $this->assertEquals($expectedOptions, $reflectionMethod->invoke($formatter, $overridingOptions));
59
    }
60
61
    public function mergeFormats()
62
    {
63
        // [default[], overriding[], expected[]]
64
        return [
65
            'empty formats' => [
66
                'default' => [
67
                    [
68
                        'type' => 0,
69
                        'flags' => 0,
70
                        'html' => '',
71
                        'cli' => '',
72
                        'function' => '',
73
                    ],
74
                ],
75
                'overriding' => [
76
                    [],
77
                ],
78
                'expected' => [
79
                    [
80
                        'type' => 0,
81
                        'flags' => 0,
82
                        'html' => '',
83
                        'cli' => '',
84
                        'function' => '',
85
                    ],
86
                ],
87
            ],
88
            'no flags' => [
89
                'default' => [
90
                    [
91
                        'type' => 0,
92
                        'flags' => 0,
93
                        'html' => 'html',
94
                        'cli' => 'cli',
95
                    ],
96
                    [
97
                        'type' => 0,
98
                        'flags' => 1,
99
                        'html' => 'html',
100
                        'cli' => 'cli',
101
                    ],
102
                ],
103
                'overriding' => [
104
                    [
105
                        'type' => 0,
106
                        'html' => 'new html',
107
                        'cli' => 'new cli',
108
                    ],
109
                ],
110
                'expected' => [
111
                    [
112
                        'type' => 0,
113
                        'flags' => 0,
114
                        'html' => 'new html',
115
                        'cli' => 'new cli',
116
                        'function' => '',
117
                    ],
118
                    [
119
                        'type' => 0,
120
                        'flags' => 1,
121
                        'html' => 'html',
122
                        'cli' => 'cli',
123
                    ],
124
                ],
125
            ],
126
            'with flags' => [
127
                'default' => [
128
                    [
129
                        'type' => -1,
130
                        'flags' => 0,
131
                        'html' => 'html',
132
                        'cli' => 'cli',
133
                    ],
134
                    [
135
                        'type' => 0,
136
                        'flags' => 0,
137
                        'html' => 'html',
138
                        'cli' => 'cli',
139
                    ],
140
                    [
141
                        'type' => 0,
142
                        'flags' => 1,
143
                        'html' => 'html',
144
                        'cli' => 'cli',
145
                    ],
146
                ],
147
                'overriding' => [
148
                    [
149
                        'type' => 0,
150
                        'flags' => 0,
151
                        'html' => 'new html',
152
                        'cli' => 'new cli',
153
                    ],
154
                ],
155
                'expected' => [
156
                    [
157
                        'type' => -1,
158
                        'flags' => 0,
159
                        'html' => 'html',
160
                        'cli' => 'cli',
161
                    ],
162
                    [
163
                        'type' => 0,
164
                        'flags' => 0,
165
                        'html' => 'new html',
166
                        'cli' => 'new cli',
167
                        'function' => '',
168
                    ],
169
                    [
170
                        'type' => 0,
171
                        'flags' => 1,
172
                        'html' => 'html',
173
                        'cli' => 'cli',
174
                    ],
175
                ],
176
            ],
177
            'with extra formats' => [
178
                'default' => [
179
                    [
180
                        'type' => 0,
181
                        'flags' => 0,
182
                        'html' => 'html',
183
                        'cli' => 'cli',
184
                    ],
185
                ],
186
                'overriding' => [
187
                    [
188
                        'type' => 0,
189
                        'flags' => 1,
190
                        'html' => 'new html',
191
                        'cli' => 'new cli',
192
                    ],
193
                    [
194
                        'type' => 1,
195
                        'html' => 'new html',
196
                        'cli' => 'new cli',
197
                    ],
198
                    [
199
                        'type' => 1,
200
                        'flags' => 1,
201
                        'html' => 'new html',
202
                        'cli' => 'new cli',
203
                    ],
204
                ],
205
                'expected' => [
206
                    [
207
                        'type' => 0,
208
                        'flags' => 0,
209
                        'html' => 'html',
210
                        'cli' => 'cli',
211
                    ],
212
                    [
213
                        'type' => 0,
214
                        'flags' => 1,
215
                        'html' => 'new html',
216
                        'cli' => 'new cli',
217
                        'function' => '',
218
                    ],
219
                    [
220
                        'type' => 1,
221
                        'flags' => 0,
222
                        'html' => 'new html',
223
                        'cli' => 'new cli',
224
                        'function' => '',
225
                    ],
226
                    [
227
                        'type' => 1,
228
                        'flags' => 1,
229
                        'html' => 'new html',
230
                        'cli' => 'new cli',
231
                        'function' => '',
232
                    ],
233
                ],
234
            ],
235
        ];
236
    }
237
238
    /**
239
     * @param mixed $query
240
     * @param mixed $text
241
     * @param mixed $cli
242
     * @param mixed $html
243
     *
244
     * @dataProvider formatQueries
245
     */
246
    public function testFormat($query, $text, $cli, $html, array $options = [])
247
    {
248
        // Test TEXT format
249
        $this->assertEquals(
250
            $text,
251
            Formatter::format($query, ['type' => 'text'] + $options),
252
            'Text formatting failed.'
253
        );
254
255
        // Test CLI format
256
        $this->assertEquals(
257
            $cli,
258
            Formatter::format($query, ['type' => 'cli'] + $options),
259
            'CLI formatting failed.'
260
        );
261
262
        // Test HTML format
263
        $this->assertEquals(
264
            $html,
265
            Formatter::format($query, ['type' => 'html'] + $options),
266
            'HTML formatting failed.'
267
        );
268
    }
269
270
    public function formatQueries()
271
    {
272
        return [
273
            'empty' => [
274
                'query' => '',
275
                'text' => '',
276
                'cli' => "\x1b[0m",
277
                'html' => '',
278
            ],
279
            'minimal' => [
280
                'query' => 'select 1',
281
                'text' => 'SELECT' . "\n" .
282
                    '    1',
283
                'cli' => "\x1b[35mSELECT\n" .
284
                    "    \x1b[92m1\x1b[0m",
285
                'html' => '<span class="sql-reserved">SELECT</span><br/>' .
286
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-number">1</span>',
287
            ],
288
            'simply' => [
289
                'query' => 'select * from tbl where 1',
290
                'text' => 'SELECT' . "\n" .
291
                    '    *' . "\n" .
292
                    'FROM' . "\n" .
293
                    '    tbl' . "\n" .
294
                    'WHERE' . "\n" .
295
                    '    1',
296
                'cli' => "\x1b[35mSELECT\n" .
297
                    "    \x1b[39m*\n" .
298
                    "\x1b[35mFROM\n" .
299
                    "    \x1b[39mtbl\n" .
300
                    "\x1b[35mWHERE\n" .
301
                    "    \x1b[92m1\x1b[0m",
302
                'html' => '<span class="sql-reserved">SELECT</span><br/>' .
303
                    '&nbsp;&nbsp;&nbsp;&nbsp;*<br/>' .
304
                    '<span class="sql-reserved">FROM</span><br/>' .
305
                    '&nbsp;&nbsp;&nbsp;&nbsp;tbl<br/>' .
306
                    '<span class="sql-reserved">WHERE</span><br/>' .
307
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-number">1</span>',
308
            ],
309
            'typical' => [
310
                'query' => 'SELECT id, if(id=1,"Si","No") from `tbl` where id = 0 or ' .
311
                    'id = 1 group by id order by id desc limit 1 offset 0',
312
                'text' => 'SELECT' . "\n" .
313
                    '    id,' . "\n" .
314
                    '    IF(id = 1, "Si", "No")' . "\n" .
315
                    'FROM' . "\n" .
316
                    '    `tbl`' . "\n" .
317
                    'WHERE' . "\n" .
318
                    '    id = 0 OR id = 1' . "\n" .
319
                    'GROUP BY' . "\n" .
320
                    '    id' . "\n" .
321
                    'ORDER BY' . "\n" .
322
                    '    id' . "\n" .
323
                    'DESC' . "\n" .
324
                    'LIMIT 1 OFFSET 0',
325
                'cli' => "\x1b[35mSELECT\n" .
326
                    "    \x1b[39mid,\n" .
327
                    "    \x1b[35mIF\x1b[39m(id = \x1b[92m1\x1b[39m, \x1b[91m\"Si\"\x1b[39m, \x1b[91m\"No\"\x1b[39m)\n" .
328
                    "\x1b[35mFROM\n" .
329
                    "    \x1b[36m`tbl`\n" .
330
                    "\x1b[35mWHERE\n" .
331
                    "    \x1b[39mid = \x1b[92m0 \x1b[35mOR \x1b[39mid = \x1b[92m1\n" .
332
                    "\x1b[35mGROUP BY\n" .
333
                    "    \x1b[39mid\n" .
334
                    "\x1b[35mORDER BY\n" .
335
                    "    \x1b[39mid\n" .
336
                    "\x1b[35mDESC\n" .
337
                    "LIMIT \x1b[92m1 \x1b[95mOFFSET \x1b[92m0\x1b[0m",
338
                'html' => '<span class="sql-reserved">SELECT</span><br/>' .
339
                    '&nbsp;&nbsp;&nbsp;&nbsp;id,<br/>' .
340
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-reserved">IF</span>(id = ' .
341
                    '<span class="sql-number">1</span>, <span class="sql-string">"Si"</span>, ' .
342
                    '<span class="sql-string">"No"</span>)<br/>' .
343
                    '<span class="sql-reserved">FROM</span><br/>' .
344
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-variable">`tbl`</span><br/>' .
345
                    '<span class="sql-reserved">WHERE</span><br/>' .
346
                    '&nbsp;&nbsp;&nbsp;&nbsp;id = <span class="sql-number">0</span> ' .
347
                    '<span class="sql-reserved">OR</span> id = <span class="sql-number">1</span><br/>' .
348
                    '<span class="sql-reserved">GROUP BY</span><br/>' .
349
                    '&nbsp;&nbsp;&nbsp;&nbsp;id<br/>' .
350
                    '<span class="sql-reserved">ORDER BY</span><br/>' .
351
                    '&nbsp;&nbsp;&nbsp;&nbsp;id<br/>' .
352
                    '<span class="sql-reserved">DESC</span><br/>' .
353
                    '<span class="sql-reserved">LIMIT</span> <span class="sql-number">1</span> ' .
354
                    '<span class="sql-keyword">OFFSET</span> <span class="sql-number">0</span>',
355
            ],
356
            'comments' => [
357
                'query' => 'select /* Comment */ *' . "\n" .
358
                    'from tbl # Comment' . "\n" .
359
                    'where 1 -- Comment',
360
                'text' => 'SELECT' . "\n" .
361
                    '    /* Comment */ *' . "\n" .
362
                    'FROM' . "\n" .
363
                    '    tbl # Comment' . "\n" .
364
                    'WHERE' . "\n" .
365
                    '    1 -- Comment',
366
                'cli' => "\x1b[35mSELECT\n" .
367
                    "    \x1b[37m/* Comment */ \x1b[39m*\n" .
368
                    "\x1b[35mFROM\n" .
369
                    "    \x1b[39mtbl \x1b[37m# Comment\n" .
370
                    "\x1b[35mWHERE\n" .
371
                    "    \x1b[92m1 \x1b[37m-- Comment\x1b[0m",
372
                'html' => '<span class="sql-reserved">SELECT</span><br/>' .
373
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-comment">/* Comment */</span> *<br/>' .
374
                    '<span class="sql-reserved">FROM</span><br/>' .
375
                    '&nbsp;&nbsp;&nbsp;&nbsp;tbl <span class="sql-comment"># Comment</span><br/>' .
376
                    '<span class="sql-reserved">WHERE</span><br/>' .
377
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-number">1</span> ' .
378
                    '<span class="sql-comment">-- Comment</span>',
379
            ],
380
            'strip comments' => [
381
                'query' => 'select /* Comment */ *' . "\n" .
382
                    'from tbl # Comment' . "\n" .
383
                    'where 1 -- Comment',
384
                'text' => 'SELECT' . "\n" .
385
                    '    *' . "\n" .
386
                    'FROM' . "\n" .
387
                    '    tbl' . "\n" .
388
                    'WHERE' . "\n" .
389
                    '    1',
390
                'cli' => "\x1b[35mSELECT\n" .
391
                    "    \x1b[39m*\n" .
392
                    "\x1b[35mFROM\n" .
393
                    "    \x1b[39mtbl\n" .
394
                    "\x1b[35mWHERE\n" .
395
                    "    \x1b[92m1\x1b[0m",
396
                'html' => '<span class="sql-reserved">SELECT</span><br/>' .
397
                    '&nbsp;&nbsp;&nbsp;&nbsp;*<br/>' .
398
                    '<span class="sql-reserved">FROM</span><br/>' .
399
                    '&nbsp;&nbsp;&nbsp;&nbsp;tbl<br/>' .
400
                    '<span class="sql-reserved">WHERE</span><br/>' .
401
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-number">1</span>',
402
                'options' => ['remove_comments' => true],
403
            ],
404
            'keywords' => [
405
                'query' => 'select hex("1")',
406
                'text' => 'SELECT' . "\n" .
407
                    '    HEX("1")',
408
                'cli' => "\x1b[35mSELECT\n" .
409
                    "    \x1b[95mHEX\x1b[39m(\x1b[91m\"1\"\x1b[39m)\x1b[0m",
410
                'html' => '<span class="sql-reserved">SELECT</span><br/>' .
411
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-keyword">HEX</span>(<span class="sql-string">"1"</span>)',
412
            ],
413
            'distinct count' => [
414
                'query' => 'select distinct count(*)',
415
                'text' => 'SELECT DISTINCT' . "\n" .
416
                    '    COUNT(*)',
417
                'cli' => "\x1b[35mSELECT DISTINCT\n" .
418
                    "    \x1b[95mCOUNT\x1b[39m(*)\x1b[0m",
419
                'html' => '<span class="sql-reserved">SELECT</span> <span class="sql-reserved">DISTINCT</span><br/>' .
420
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-keyword">COUNT</span>(*)',
421
            ],
422
            'create procedure' => [
423
                'query' => 'create procedure test_procedure() begin from tbl select *; end',
424
                'text' => 'CREATE PROCEDURE test_procedure()' . "\n" .
425
                    'BEGIN' . "\n" .
426
                    '    FROM' . "\n" .
427
                    '        tbl' . "\n" .
428
                    '    SELECT' . "\n" .
429
                    '        *;' . "\n" .
430
                    'END',
431
                'cli' => "\x1b[35mCREATE PROCEDURE \x1b[39mtest_procedure()\n" .
432
                    "\x1b[95mBEGIN\n" .
433
                    "    \x1b[35mFROM\n" .
434
                    "        \x1b[39mtbl\n" .
435
                    "    \x1b[35mSELECT\n" .
436
                    "        \x1b[39m*;\n" .
437
                    "\x1b[95mEND\x1b[0m",
438
                'html' => '<span class="sql-reserved">CREATE</span> ' .
439
                    '<span class="sql-reserved">PROCEDURE</span> test_procedure()<br/>' .
440
                    '<span class="sql-keyword">BEGIN</span><br/>' .
441
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-reserved">FROM</span><br/>' .
442
                    '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tbl<br/>' .
443
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-reserved">SELECT</span><br/>' .
444
                    '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*;<br/>' .
445
                    '<span class="sql-keyword">END</span>',
446
            ],
447
            'insert' => [
448
                'query' => 'insert into foo values (0, 0, 0), (1, 1, 1)',
449
                'text' => 'INSERT INTO foo' . "\n" .
450
                    'VALUES(0, 0, 0),(1, 1, 1)',
451
                'cli' => "\x1b[35mINSERT INTO \x1b[39mfoo\n" .
452
                    "\x1b[35mVALUES\x1b[39m(\x1b[92m0\x1b[39m, \x1b[92m0\x1b[39m, " .
453
                    "\x1b[92m0\x1b[39m),(\x1b[92m1\x1b[39m, \x1b[92m1\x1b[39m, \x1b[92m1\x1b[39m)\x1b[0m",
454
                'html' => '<span class="sql-reserved">INSERT</span> <span class="sql-reserved">INTO</span> foo<br/>' .
455
                    '<span class="sql-reserved">VALUES</span>(<span class="sql-number">0</span>, ' .
456
                    '<span class="sql-number">0</span>, <span class="sql-number">0</span>),(' .
457
                    '<span class="sql-number">1</span>, <span class="sql-number">1</span>, ' .
458
                    '<span class="sql-number">1</span>)',
459
            ],
460
            'string as alias' => [
461
                'query' => 'select "Text" as bar',
462
                'text' => 'SELECT' . "\n" .
463
                    '    "Text" AS bar',
464
                'cli' => "\x1b[35mSELECT\n" .
465
                    "    \x1b[91m\"Text\" \x1b[35mAS \x1b[39mbar\x1b[0m",
466
                'html' => '<span class="sql-reserved">SELECT</span><br/>' .
467
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-string">"Text"</span> ' .
468
                    '<span class="sql-reserved">AS</span> bar',
469
            ],
470
            'escape cli' => [
471
                'query' => "select 'text\x1b[33mcolor-inj'",
472
                'text' => 'SELECT' . "\n" .
473
                    "    'text\x1B[33mcolor-inj'",
474
                'cli' => "\x1b[35mSELECT\n" .
475
                    "    \x1b[91m'text\\x1B[33mcolor-inj'\x1b[0m",
476
                'html' => '<span class="sql-reserved">SELECT</span><br/>' .
477
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-string">\'text' . "\x1b[33m" . 'color-inj\'</span>',
478
            ],
479
            'escape html' => [
480
                'query' => "select '<s>xss' from `<s>xss` , <s>nxss /*s<s>xss*/",
481
                'text' => 'SELECT' . "\n" .
482
                    '    \'<s>xss\'' . "\n" .
483
                    'FROM' . "\n" .
484
                    '    `<s>xss`,' . "\n" .
485
                    '    < s > nxss /*s<s>xss*/',
486
                'cli' => "\x1b[35mSELECT\n" .
487
                    "    \x1b[91m'<s>xss'\n" .
488
                    "\x1b[35mFROM\n" .
489
                    "    \x1b[36m`<s>xss`\x1b[39m,\n" .
490
                    "    < s > nxss \x1b[37m/*s<s>xss*/\x1b[0m",
491
                'html' => '<span class="sql-reserved">SELECT</span><br/>' .
492
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-string">\'&lt;s&gt;xss\'</span><br/>' .
493
                    '<span class="sql-reserved">FROM</span><br/>' .
494
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-variable">`&lt;s&gt;xss`</span>,' .
495
                    '<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt; s &gt; nxss <span class="sql-comment">/*s&lt;s&gt;xss*/</span>',
496
            ],
497
            'create table' => [
498
                'query' => 'create table if not exists `pma__bookmark` (' . "\n" .
499
                    '`id` int(11) not null auto_increment,' . "\n" .
500
                    '`dbase` varchar(255) not null default "",' . "\n" .
501
                    '`user` varchar(255) not null default "",' . "\n" .
502
                    '`label` varchar(255) collate utf8_general_ci not null default "",' . "\n" .
503
                    '`query` text not null,' . "\n" .
504
                    'primary key (`id`)',
505
                'text' => 'CREATE TABLE IF NOT EXISTS `pma__bookmark`(' . "\n" .
506
                    '    `id` INT(11) NOT NULL AUTO_INCREMENT,' . "\n" .
507
                    '    `dbase` VARCHAR(255) NOT NULL DEFAULT "",' . "\n" .
508
                    '    `user` VARCHAR(255) NOT NULL DEFAULT "",' . "\n" .
509
                    '    `label` VARCHAR(255) COLLATE utf8_general_ci NOT NULL DEFAULT "",' . "\n" .
510
                    '    `query` TEXT NOT NULL,' . "\n" .
511
                    '    PRIMARY KEY(`id`)',
512
                'cli' => "\x1b[35mCREATE TABLE IF NOT EXISTS \x1b[36m`pma__bookmark`\x1b[39m(\n" .
513
                    "    \x1b[36m`id` \x1b[35mINT\x1b[39m(\x1b[92m11\x1b[39m) " .
514
                    "\x1b[35mNOT NULL \x1b[95mAUTO_INCREMENT\x1b[39m,\n" .
515
                    "    \x1b[36m`dbase` \x1b[35mVARCHAR\x1b[39m(\x1b[92m255\x1b[39m) " .
516
                    "\x1b[35mNOT NULL DEFAULT \x1b[91m\"\"\x1b[39m,\n" .
517
                    "    \x1b[36m`user` \x1b[35mVARCHAR\x1b[39m(\x1b[92m255\x1b[39m) " .
518
                    "\x1b[35mNOT NULL DEFAULT \x1b[91m\"\"\x1b[39m,\n" .
519
                    "    \x1b[36m`label` \x1b[35mVARCHAR\x1b[39m(\x1b[92m255\x1b[39m) " .
520
                    "\x1b[35mCOLLATE \x1b[39mutf8_general_ci \x1b[35mNOT NULL DEFAULT \x1b[91m\"\"\x1b[39m,\n" .
521
                    "    \x1b[36m`query` \x1b[95mTEXT \x1b[35mNOT NULL\x1b[39m,\n" .
522
                    "    \x1b[35mPRIMARY KEY\x1b[39m(\x1b[36m`id`\x1b[39m)\x1b[0m",
523
                'html' => '<span class="sql-reserved">CREATE</span> <span class="sql-reserved">TABLE</span> ' .
524
                    '<span class="sql-reserved">IF NOT EXISTS</span> <span class="sql-variable">' .
525
                    '`pma__bookmark`</span>(<br/>' .
526
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-variable">`id`</span> ' .
527
                    '<span class="sql-reserved">INT</span>(<span class="sql-number">11</span>) ' .
528
                    '<span class="sql-reserved">NOT NULL</span> <span class="sql-keyword">AUTO_INCREMENT</span>,<br/>' .
529
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-variable">`dbase`</span> ' .
530
                    '<span class="sql-reserved">VARCHAR</span>(<span class="sql-number">255</span>) ' .
531
                    '<span class="sql-reserved">NOT NULL</span> <span class="sql-reserved">DEFAULT</span> ' .
532
                    '<span class="sql-string">""</span>,<br/>' .
533
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-variable">`user`</span> ' .
534
                    '<span class="sql-reserved">VARCHAR</span>(<span class="sql-number">255</span>) ' .
535
                    '<span class="sql-reserved">NOT NULL</span> <span class="sql-reserved">DEFAULT</span> ' .
536
                    '<span class="sql-string">""</span>,<br/>' .
537
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-variable">`label`</span> ' .
538
                    '<span class="sql-reserved">VARCHAR</span>(<span class="sql-number">255</span>) ' .
539
                    '<span class="sql-reserved">COLLATE</span> utf8_general_ci ' .
540
                    '<span class="sql-reserved">NOT NULL</span> <span class="sql-reserved">DEFAULT</span> ' .
541
                    '<span class="sql-string">""</span>,<br/>' .
542
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-variable">`query`</span> ' .
543
                    '<span class="sql-keyword">TEXT</span> <span class="sql-reserved">NOT NULL</span>,<br/>' .
544
                    '&nbsp;&nbsp;&nbsp;&nbsp;<span class="sql-reserved">' .
545
                    'PRIMARY KEY</span>(<span class="sql-variable">`id`</span>)',
546
            ],
547
            'join' => [
548
                'query' => 'join tbl2 on c1=c2',
549
                'text' => 'JOIN tbl2 ON c1 = c2',
550
                'cli' => "\x1b[35mJOIN \x1b[39mtbl2 \x1b[35mON \x1b[39mc1 = c2" .
551
                    "\x1b[0m",
552
                'html' => '<span class="sql-reserved">JOIN</span> tbl2 <span class="sql-reserved">ON</span> c1 = c2',
553
            ],
554
            'named param' => [
555
                'query' => 'select * from tbl where col = :param',
556
                'text' => 'SELECT' . "\n" .
557
                    '    *' . "\n" .
558
                    'FROM' . "\n" .
559
                    '    tbl' . "\n" .
560
                    'WHERE' . "\n" .
561
                    '    col = :param',
562
                'cli' => "\x1b[35mSELECT\n" .
563
                    "    \x1b[39m*\n" .
564
                    "\x1b[35mFROM\n" .
565
                    "    \x1b[39mtbl\n" .
566
                    "\x1b[35mWHERE\n" .
567
                    "    \x1b[39mcol = \x1b[31m:param\x1b[0m",
568
                'html' => '<span class="sql-reserved">SELECT</span><br/>' .
569
                    '&nbsp;&nbsp;&nbsp;&nbsp;*<br/>' .
570
                    '<span class="sql-reserved">FROM</span><br/>' .
571
                    '&nbsp;&nbsp;&nbsp;&nbsp;tbl<br/>' .
572
                    '<span class="sql-reserved">WHERE</span><br/>' .
573
                    '&nbsp;&nbsp;&nbsp;&nbsp;col = <span class="sql-parameter">:param</span>',
574
            ],
575
            'anon param' => [
576
                'query' => 'select * from tbl where col = ?',
577
                'text' => 'SELECT' . "\n" .
578
                    '    *' . "\n" .
579
                    'FROM' . "\n" .
580
                    '    tbl' . "\n" .
581
                    'WHERE' . "\n" .
582
                    '    col = ?',
583
                'cli' => "\x1b[35mSELECT\n" .
584
                    "    \x1b[39m*\n" .
585
                    "\x1b[35mFROM\n" .
586
                    "    \x1b[39mtbl\n" .
587
                    "\x1b[35mWHERE\n" .
588
                    "    \x1b[39mcol = \x1b[31m?\x1b[0m",
589
                'html' => '<span class="sql-reserved">SELECT</span><br/>' .
590
                    '&nbsp;&nbsp;&nbsp;&nbsp;*<br/>' .
591
                    '<span class="sql-reserved">FROM</span><br/>' .
592
                    '&nbsp;&nbsp;&nbsp;&nbsp;tbl<br/>' .
593
                    '<span class="sql-reserved">WHERE</span><br/>' .
594
                    '&nbsp;&nbsp;&nbsp;&nbsp;col = <span class="sql-parameter">?</span>',
595
            ],
596
        ];
597
    }
598
}
599