Passed
Push — master ( 7c26e5...2f0566 )
by William
03:26
created

AlterStatementTest::testBuilderRenameColumn()   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
nc 1
nop 1
dl 0
loc 5
rs 10
c 0
b 0
f 0
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
11
class AlterStatementTest extends TestCase
12
{
13
    public function testBuilder(): void
14
    {
15
        $query = 'ALTER TABLE `actor` ' .
16
            'ADD PRIMARY KEY (`actor_id`), ' .
17
            'ADD KEY `idx_actor_last_name` (`last_name`)';
18
19
        $parser = new Parser($query);
20
        $stmt = $parser->statements[0];
21
22
        $this->assertEquals($query, $stmt->build());
23
    }
24
25
    public function testBuilderWithExpression(): void
26
    {
27
        $query = 'ALTER TABLE `table` '
28
                . 'ADD UNIQUE KEY `functional_index`'
29
                . ' (`field1`,`field2`, (IFNULL(`field3`,0)))';
30
31
        $parser = new Parser($query);
32
        $stmt = $parser->statements[0];
33
34
        $this->assertEquals($query, $stmt->build());
35
    }
36
37
    public function testBuilderWithComments(): void
38
    {
39
        $query = 'ALTER /* comment */ TABLE `actor` ' .
40
            'ADD PRIMARY KEY (`actor_id`), -- comment at the end of the line' . "\n" .
41
            'ADD KEY `idx_actor_last_name` (`last_name`) -- and that is the last comment.';
42
43
        $expectedQuery = 'ALTER TABLE `actor` ' .
44
            'ADD PRIMARY KEY (`actor_id`), ' .
45
            'ADD KEY `idx_actor_last_name` (`last_name`)';
46
47
        $parser = new Parser($query);
48
        $stmt = $parser->statements[0];
49
50
        $this->assertEquals($expectedQuery, $stmt->build());
51
    }
52
53
    public function testBuilderWithCommentsOnOptions(): void
54
    {
55
        $query = 'ALTER EVENT `myEvent` /* comment */ ' .
56
            'ON SCHEDULE -- Comment at the end of the line' . "\n" .
57
            'AT "2023-01-01 01:23:45"';
58
59
        $expectedQuery = 'ALTER EVENT `myEvent` ' .
60
            'ON SCHEDULE AT "2023-01-01 01:23:45"';
61
62
        $parser = new Parser($query);
63
        $stmt = $parser->statements[0];
64
65
        $this->assertEquals($expectedQuery, $stmt->build());
66
    }
67
68
    public function testBuilderCompressed(): void
69
    {
70
        $query = 'ALTER TABLE `user` CHANGE `message` `message` TEXT COMPRESSED';
71
        $parser = new Parser($query);
72
        $stmt = $parser->statements[0];
73
        $this->assertEquals($query, $stmt->build());
74
    }
75
76
    public function testBuilderPartitions(): void
77
    {
78
        $parser = new Parser('ALTER TABLE t1 PARTITION BY HASH(id) PARTITIONS 8');
79
        $stmt = $parser->statements[0];
80
81
        $this->assertEquals('ALTER TABLE t1 PARTITION BY  HASH(id) PARTITIONS 8', $stmt->build());
82
83
        $parser = new Parser('ALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2002))');
84
        $stmt = $parser->statements[0];
85
86
        $this->assertEquals(
87
            "ALTER TABLE t1 ADD PARTITION (\n" .
88
            "PARTITION p3 VALUES LESS THAN (2002)\n" .
89
            ')',
90
            $stmt->build()
91
        );
92
93
        $parser = new Parser('ALTER TABLE p PARTITION BY LINEAR KEY ALGORITHM=2 (id) PARTITIONS 32;');
94
        $stmt = $parser->statements[0];
95
96
        $this->assertEquals(
97
            'ALTER TABLE p PARTITION BY  LINEAR KEY ALGORITHM=2 (id) PARTITIONS 32',
98
            $stmt->build()
99
        );
100
101
        $parser = new Parser('ALTER TABLE t1 DROP PARTITION p0, p1;');
102
        $stmt = $parser->statements[0];
103
104
        $this->assertEquals(
105
            'ALTER TABLE t1 DROP PARTITION  p0, p1',
106
            $stmt->build()
107
        );
108
109
        $parser = new Parser(
110
            'ALTER TABLE trips PARTITION BY RANGE (MONTH(trip_date))'
111
            . ' (' . "\n"
112
            . ' PARTITION p01 VALUES LESS THAN (02),' . "\n"
113
            . ' PARTITION p02 VALUES LESS THAN (03),' . "\n"
114
            . ' PARTITION p03 VALUES LESS THAN (04),' . "\n"
115
            . ' PARTITION p04 VALUES LESS THAN (05),' . "\n"
116
            . ' PARTITION p05 VALUES LESS THAN (06),' . "\n"
117
            . ' PARTITION p06 VALUES LESS THAN (07),' . "\n"
118
            . ' PARTITION p07 VALUES LESS THAN (08),' . "\n"
119
            . ' PARTITION p08 VALUES LESS THAN (09),' . "\n"
120
            . ' PARTITION p09 VALUES LESS THAN (10),' . "\n"
121
            . ' PARTITION p10 VALUES LESS THAN (11),' . "\n"
122
            . ' PARTITION p11 VALUES LESS THAN (12),' . "\n"
123
            . ' PARTITION p12 VALUES LESS THAN (13),' . "\n"
124
            . ' PARTITION pmaxval VALUES LESS THAN MAXVALUE' . "\n"
125
            . ');'
126
        );
127
        $stmt = $parser->statements[0];
128
129
        $this->assertEquals(
130
            'ALTER TABLE trips PARTITION BY  RANGE (MONTH(trip_date))  (' . "\n"
131
            . 'PARTITION p01 VALUES LESS THAN (02),' . "\n"
132
            . 'PARTITION p02 VALUES LESS THAN (03),' . "\n"
133
            . 'PARTITION p03 VALUES LESS THAN (04),' . "\n"
134
            . 'PARTITION p04 VALUES LESS THAN (05),' . "\n"
135
            . 'PARTITION p05 VALUES LESS THAN (06),' . "\n"
136
            . 'PARTITION p06 VALUES LESS THAN (07),' . "\n"
137
            . 'PARTITION p07 VALUES LESS THAN (08),' . "\n"
138
            . 'PARTITION p08 VALUES LESS THAN (09),' . "\n"
139
            . 'PARTITION p09 VALUES LESS THAN (10),' . "\n"
140
            . 'PARTITION p10 VALUES LESS THAN (11),' . "\n"
141
            . 'PARTITION p11 VALUES LESS THAN (12),' . "\n"
142
            . 'PARTITION p12 VALUES LESS THAN (13),' . "\n"
143
            . 'PARTITION pmaxval VALUES LESS THAN MAXVALUE' . "\n"
144
            . ')',
145
            $stmt->build()
146
        );
147
    }
148
149
    public function testBuilderEventWithDefiner(): void
150
    {
151
        $query = 'ALTER DEFINER=user EVENT myEvent ENABLE';
152
        $parser = new Parser($query);
153
        $stmt = $parser->statements[0];
154
        $this->assertEquals($query, $stmt->build());
155
    }
156
157
    /**
158
     * @return Generator<string, array{string}>
159
     */
160
    public static function provideBuilderForRenameColumn(): Generator
161
    {
162
        $query = 'ALTER TABLE myTable RENAME COLUMN a TO b';
163
164
        yield 'Single RENAME COLUMN' => [$query];
165
166
        $query = 'ALTER TABLE myTable RENAME COLUMN a TO b, RENAME COLUMN b TO a';
167
168
        yield 'Multiple RENAME COLUMN' => [$query];
169
170
        $query = 'ALTER TABLE myTable ' .
171
            'RENAME COLUMN a TO b, ' .
172
            'RENAME COLUMN b TO a, ' .
173
            'RENAME INDEX oldIndex TO newIndex, ' .
174
            'RENAME TO newTable';
175
176
        yield 'Mixed RENAME COLUMN + RENAME INDEX + RENAME table' => [$query];
177
178
        $query = 'ALTER TABLE myTable ' .
179
            'RENAME TO newTable, ' .
180
            'RENAME INDEX oldIndex TO newIndex, ' .
181
            'RENAME COLUMN b TO a, ' .
182
            'RENAME COLUMN a TO b';
183
184
        yield 'Mixed RENAME table + RENAME INDEX + RENAME COLUMNS' => [$query];
185
    }
186
187
    /**
188
     * @dataProvider provideBuilderForRenameColumn
189
     */
190
    public function testBuilderRenameColumn(string $query): void
191
    {
192
        $parser = new Parser($query);
193
        $stmt = $parser->statements[0];
194
        $this->assertEquals($query, $stmt->build());
195
    }
196
}
197