Passed
Pull Request — master (#433)
by
unknown
02:54
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
110
    public function testBuilderEventWithDefiner(): void
111
    {
112
        $query = 'ALTER DEFINER=user EVENT myEvent ENABLE';
113
        $parser = new Parser($query);
114
        $stmt = $parser->statements[0];
115
        $this->assertEquals($query, $stmt->build());
116
    }
117
118
    /**
119
     * @return Generator<string, array{string}>
120
     */
121
    public static function provideBuilderForRenameColumn(): Generator
122
    {
123
        $query = 'ALTER TABLE myTable RENAME COLUMN a TO b';
124
125
        yield 'Single RENAME COLUMN' => [$query];
126
127
        $query = 'ALTER TABLE myTable RENAME COLUMN a TO b, RENAME COLUMN b TO a';
128
129
        yield 'Multiple RENAME COLUMN' => [$query];
130
131
        $query = 'ALTER TABLE myTable ' .
132
            'RENAME COLUMN a TO b, ' .
133
            'RENAME COLUMN b TO a, ' .
134
            'RENAME INDEX oldIndex TO newIndex, ' .
135
            'RENAME TO newTable';
136
137
        yield 'Mixed RENAME COLUMN + RENAME INDEX + RENAME table' => [$query];
138
139
        $query = 'ALTER TABLE myTable ' .
140
            'RENAME TO newTable, ' .
141
            'RENAME INDEX oldIndex TO newIndex, ' .
142
            'RENAME COLUMN b TO a, ' .
143
            'RENAME COLUMN a TO b';
144
145
        yield 'Mixed RENAME table + RENAME INDEX + RENAME COLUMNS' => [$query];
146
    }
147
148
    /**
149
     * @dataProvider provideBuilderForRenameColumn
150
     */
151
    public function testBuilderRenameColumn(string $query): void
152
    {
153
        $parser = new Parser($query);
154
        $stmt = $parser->statements[0];
155
        $this->assertEquals($query, $stmt->build());
156
    }
157
}
158