Passed
Push — master ( d28f1e...3416cc )
by Maurício
03:59 queued 15s
created

AlterStatementTest::testBuilderForAlterRoutine()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
c 0
b 0
f 0
nc 1
nop 1
dl 0
loc 5
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpMyAdmin\SqlParser\Tests\Builder;
6
7
use Generator;
8
use PhpMyAdmin\SqlParser\Parser;
9
use PhpMyAdmin\SqlParser\Tests\TestCase;
10
use PHPUnit\Framework\Attributes\DataProvider;
11
12
class AlterStatementTest extends TestCase
13
{
14
    public function testBuilder(): void
15
    {
16
        $query = 'ALTER TABLE `actor` ' .
17
            'ADD PRIMARY KEY (`actor_id`), ' .
18
            'ADD KEY `idx_actor_last_name` (`last_name`)';
19
20
        $parser = new Parser($query);
21
        $stmt = $parser->statements[0];
22
23
        $this->assertEquals($query, $stmt->build());
24
    }
25
26
    public function testBuilderWithExpression(): void
27
    {
28
        $query = 'ALTER TABLE `table` '
29
                . 'ADD UNIQUE KEY `functional_index`'
30
                . ' (`field1`,`field2`, (IFNULL(`field3`,0)))';
31
32
        $parser = new Parser($query);
33
        $stmt = $parser->statements[0];
34
35
        $this->assertEquals($query, $stmt->build());
36
    }
37
38
    public function testBuilderWithComments(): void
39
    {
40
        $query = 'ALTER /* comment */ TABLE `actor` ' .
41
            'ADD PRIMARY KEY (`actor_id`), -- comment at the end of the line' . "\n" .
42
            'ADD KEY `idx_actor_last_name` (`last_name`) -- and that is the last comment.';
43
44
        $expectedQuery = 'ALTER TABLE `actor` ' .
45
            'ADD PRIMARY KEY (`actor_id`), ' .
46
            'ADD KEY `idx_actor_last_name` (`last_name`)';
47
48
        $parser = new Parser($query);
49
        $stmt = $parser->statements[0];
50
51
        $this->assertEquals($expectedQuery, $stmt->build());
52
    }
53
54
    public function testBuilderWithCommentsOnOptions(): void
55
    {
56
        $query = 'ALTER EVENT `myEvent` /* comment */ ' .
57
            'ON SCHEDULE -- Comment at the end of the line' . "\n" .
58
            'AT "2023-01-01 01:23:45"';
59
60
        $expectedQuery = 'ALTER EVENT `myEvent` ' .
61
            'ON SCHEDULE AT "2023-01-01 01:23:45"';
62
63
        $parser = new Parser($query);
64
        $stmt = $parser->statements[0];
65
66
        $this->assertEquals($expectedQuery, $stmt->build());
67
    }
68
69
    public function testBuilderCompressed(): void
70
    {
71
        $query = 'ALTER TABLE `user` CHANGE `message` `message` TEXT COMPRESSED';
72
        $parser = new Parser($query);
73
        $stmt = $parser->statements[0];
74
        $this->assertEquals($query, $stmt->build());
75
    }
76
77
    public function testBuilderPartitions(): void
78
    {
79
        $parser = new Parser('ALTER TABLE t1 PARTITION BY HASH(id) PARTITIONS 8');
80
        $stmt = $parser->statements[0];
81
82
        $this->assertEquals('ALTER TABLE t1 PARTITION BY  HASH(id) PARTITIONS 8', $stmt->build());
83
84
        $parser = new Parser('ALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2002))');
85
        $stmt = $parser->statements[0];
86
87
        $this->assertEquals(
88
            "ALTER TABLE t1 ADD PARTITION (\n" .
89
            "PARTITION p3 VALUES LESS THAN (2002)\n" .
90
            ')',
91
            $stmt->build(),
92
        );
93
94
        $parser = new Parser('ALTER TABLE p PARTITION BY LINEAR KEY ALGORITHM=2 (id) PARTITIONS 32;');
95
        $stmt = $parser->statements[0];
96
97
        $this->assertEquals(
98
            'ALTER TABLE p PARTITION BY  LINEAR KEY ALGORITHM=2 (id) PARTITIONS 32',
99
            $stmt->build(),
100
        );
101
102
        $parser = new Parser('ALTER TABLE t1 DROP PARTITION p0, p1;');
103
        $stmt = $parser->statements[0];
104
105
        $this->assertEquals(
106
            'ALTER TABLE t1 DROP PARTITION  p0, p1',
107
            $stmt->build(),
108
        );
109
110
        $parser = new Parser(
111
            'ALTER TABLE trips PARTITION BY RANGE (MONTH(trip_date))'
112
            . ' (' . "\n"
113
            . ' PARTITION p01 VALUES LESS THAN (02),' . "\n"
114
            . ' PARTITION p02 VALUES LESS THAN (03),' . "\n"
115
            . ' PARTITION p03 VALUES LESS THAN (04),' . "\n"
116
            . ' PARTITION p04 VALUES LESS THAN (05),' . "\n"
117
            . ' PARTITION p05 VALUES LESS THAN (06),' . "\n"
118
            . ' PARTITION p06 VALUES LESS THAN (07),' . "\n"
119
            . ' PARTITION p07 VALUES LESS THAN (08),' . "\n"
120
            . ' PARTITION p08 VALUES LESS THAN (09),' . "\n"
121
            . ' PARTITION p09 VALUES LESS THAN (10),' . "\n"
122
            . ' PARTITION p10 VALUES LESS THAN (11),' . "\n"
123
            . ' PARTITION p11 VALUES LESS THAN (12),' . "\n"
124
            . ' PARTITION p12 VALUES LESS THAN (13),' . "\n"
125
            . ' PARTITION pmaxval VALUES LESS THAN MAXVALUE' . "\n"
126
            . ');',
127
        );
128
        $stmt = $parser->statements[0];
129
130
        $this->assertEquals(
131
            'ALTER TABLE trips PARTITION BY  RANGE (MONTH(trip_date))  (' . "\n"
132
            . 'PARTITION p01 VALUES LESS THAN (02),' . "\n"
133
            . 'PARTITION p02 VALUES LESS THAN (03),' . "\n"
134
            . 'PARTITION p03 VALUES LESS THAN (04),' . "\n"
135
            . 'PARTITION p04 VALUES LESS THAN (05),' . "\n"
136
            . 'PARTITION p05 VALUES LESS THAN (06),' . "\n"
137
            . 'PARTITION p06 VALUES LESS THAN (07),' . "\n"
138
            . 'PARTITION p07 VALUES LESS THAN (08),' . "\n"
139
            . 'PARTITION p08 VALUES LESS THAN (09),' . "\n"
140
            . 'PARTITION p09 VALUES LESS THAN (10),' . "\n"
141
            . 'PARTITION p10 VALUES LESS THAN (11),' . "\n"
142
            . 'PARTITION p11 VALUES LESS THAN (12),' . "\n"
143
            . 'PARTITION p12 VALUES LESS THAN (13),' . "\n"
144
            . 'PARTITION pmaxval VALUES LESS THAN MAXVALUE' . "\n"
145
            . ')',
146
            $stmt->build(),
147
        );
148
    }
149
150
    public function testBuilderEventWithDefiner(): void
151
    {
152
        $query = 'ALTER DEFINER=user EVENT myEvent ENABLE';
153
        $parser = new Parser($query);
154
        $stmt = $parser->statements[0];
155
        $this->assertEquals($query, $stmt->build());
156
    }
157
158
    /** @return Generator<string, array{string}> */
159
    public static function provideBuilderForRenameColumn(): Generator
160
    {
161
        $query = 'ALTER TABLE myTable RENAME COLUMN a TO b';
162
163
        yield 'Single RENAME COLUMN' => [$query];
164
165
        $query = 'ALTER TABLE myTable RENAME COLUMN a TO b, RENAME COLUMN b TO a';
166
167
        yield 'Multiple RENAME COLUMN' => [$query];
168
169
        $query = 'ALTER TABLE myTable ' .
170
            'RENAME COLUMN a TO b, ' .
171
            'RENAME COLUMN b TO a, ' .
172
            'RENAME INDEX oldIndex TO newIndex, ' .
173
            'RENAME TO newTable';
174
175
        yield 'Mixed RENAME COLUMN + RENAME INDEX + RENAME table' => [$query];
176
177
        $query = 'ALTER TABLE myTable ' .
178
            'RENAME TO newTable, ' .
179
            'RENAME INDEX oldIndex TO newIndex, ' .
180
            'RENAME COLUMN b TO a, ' .
181
            'RENAME COLUMN a TO b';
182
183
        yield 'Mixed RENAME table + RENAME INDEX + RENAME COLUMNS' => [$query];
184
    }
185
186
    #[DataProvider('provideBuilderForRenameColumn')]
187
    public function testBuilderRenameColumn(string $query): void
188
    {
189
        $parser = new Parser($query);
190
        $stmt = $parser->statements[0];
191
        $this->assertEquals($query, $stmt->build());
192
    }
193
194
    /** @return Generator<string, array{string}> */
195
    public static function provideBuilderForAlterRoutine(): Generator
196
    {
197
        $query = 'ALTER FUNCTION func_name COMMENT "test"';
198
199
        yield 'Function with only comment' => [$query];
200
201
        $query = 'ALTER FUNCTION func_name LANGUAGE SQL';
202
203
        yield 'Function with only language' => [$query];
204
205
        $query = 'ALTER FUNCTION func_name COMMENT "test" LANGUAGE SQL CONTAINS SQL SQL SECURITY DEFINER';
206
207
        yield 'Function with all options combinations #1' => [$query];
208
209
        $query = 'ALTER FUNCTION func_name COMMENT "test" LANGUAGE SQL NO SQL SQL SECURITY INVOKER';
210
211
        yield 'Function with all options combinations #2' => [$query];
212
213
        $query = 'ALTER FUNCTION func_name COMMENT "test" LANGUAGE SQL READS SQL DATA';
214
215
        yield 'Function with all remaining options #1' => [$query];
216
217
        $query = 'ALTER FUNCTION func_name COMMENT "test" LANGUAGE SQL MODIFIES SQL DATA';
218
219
        yield 'Function with all remaining options #2' => [$query];
220
221
        $query = 'ALTER PROCEDURE func_name COMMENT "test"';
222
223
        yield 'Procedure with only comment' => [$query];
224
225
        $query = 'ALTER PROCEDURE proc_name LANGUAGE SQL';
226
227
        yield 'Procedure with only language' => [$query];
228
229
        $query = 'ALTER PROCEDURE proc_name COMMENT "test" LANGUAGE SQL CONTAINS SQL SQL SECURITY DEFINER';
230
231
        yield 'Procedure with all options combinations #1' => [$query];
232
233
        $query = 'ALTER PROCEDURE proc_name COMMENT "test" LANGUAGE SQL NO SQL SQL SECURITY INVOKER';
234
235
        yield 'Procedure with all options combinations #2' => [$query];
236
237
        $query = 'ALTER PROCEDURE proc_name COMMENT "test" LANGUAGE SQL READS SQL DATA';
238
239
        yield 'Procedure with all remaining options #1' => [$query];
240
241
        $query = 'ALTER PROCEDURE proc_name COMMENT "test" LANGUAGE SQL MODIFIES SQL DATA';
242
243
        yield 'Procedure with all remaining options #2' => [$query];
244
    }
245
246
    /** @dataProvider provideBuilderForAlterRoutine */
247
    public function testBuilderForAlterRoutine(string $query): void
248
    {
249
        $parser = new Parser($query);
250
        $stmt = $parser->statements[0];
251
        $this->assertEquals($query, $stmt->build());
252
    }
253
}
254