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

FormatterTest::formatQueries()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 294
Code Lines 275

Duplication

Lines 0
Ratio 0 %

Importance

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