File tree Expand file tree Collapse file tree 6 files changed +79
-0
lines changed
localtests/fail-rename-table Expand file tree Collapse file tree 6 files changed +79
-0
lines changed Original file line number Diff line number Diff line change @@ -255,7 +255,11 @@ func (this *Migrator) listenOnPanicAbort() {
255
255
// validateStatement validates the `alter` statement meets criteria.
256
256
// At this time this means:
257
257
// - column renames are approved
258
+ // - no table rename allowed
258
259
func (this * Migrator ) validateStatement () (err error ) {
260
+ if this .parser .IsRenameTable () {
261
+ return fmt .Errorf ("ALTER statement seems to RENAME the table. This is not supported, and you should run your RENAME outside gh-ost." )
262
+ }
259
263
if this .parser .HasNonTrivialRenames () && ! this .migrationContext .SkipRenamedColumns {
260
264
this .migrationContext .ColumnRenameMap = this .parser .GetNonTrivialRenames ()
261
265
if ! this .migrationContext .ApproveRenamedColumns {
Original file line number Diff line number Diff line change @@ -15,11 +15,13 @@ var (
15
15
sanitizeQuotesRegexp = regexp .MustCompile ("('[^']*')" )
16
16
renameColumnRegexp = regexp .MustCompile (`(?i)\bchange\s+(column\s+|)([\S]+)\s+([\S]+)\s+` )
17
17
dropColumnRegexp = regexp .MustCompile (`(?i)\bdrop\s+(column\s+|)([\S]+)$` )
18
+ renameTableRegexp = regexp .MustCompile (`(?i)\brename\s+(to|as)\s+` )
18
19
)
19
20
20
21
type Parser struct {
21
22
columnRenameMap map [string ]string
22
23
droppedColumns map [string ]bool
24
+ isRenameTable bool
23
25
}
24
26
25
27
func NewParser () * Parser {
@@ -86,6 +88,12 @@ func (this *Parser) parseAlterToken(alterToken string) (err error) {
86
88
this .droppedColumns [submatch [2 ]] = true
87
89
}
88
90
}
91
+ {
92
+ // rename table
93
+ if renameTableRegexp .MatchString (alterToken ) {
94
+ this .isRenameTable = true
95
+ }
96
+ }
89
97
return nil
90
98
}
91
99
@@ -115,3 +123,7 @@ func (this *Parser) HasNonTrivialRenames() bool {
115
123
func (this * Parser ) DroppedColumnsMap () map [string ]bool {
116
124
return this .droppedColumns
117
125
}
126
+
127
+ func (this * Parser ) IsRenameTable () bool {
128
+ return this .isRenameTable
129
+ }
Original file line number Diff line number Diff line change @@ -159,3 +159,42 @@ func TestParseAlterStatementDroppedColumns(t *testing.T) {
159
159
test .S (t ).ExpectTrue (parser .droppedColumns ["b" ])
160
160
}
161
161
}
162
+
163
+ func TestParseAlterStatementRenameTable (t * testing.T ) {
164
+
165
+ {
166
+ parser := NewParser ()
167
+ statement := "drop column b"
168
+ err := parser .ParseAlterStatement (statement )
169
+ test .S (t ).ExpectNil (err )
170
+ test .S (t ).ExpectFalse (parser .isRenameTable )
171
+ }
172
+ {
173
+ parser := NewParser ()
174
+ statement := "rename as something_else"
175
+ err := parser .ParseAlterStatement (statement )
176
+ test .S (t ).ExpectNil (err )
177
+ test .S (t ).ExpectTrue (parser .isRenameTable )
178
+ }
179
+ {
180
+ parser := NewParser ()
181
+ statement := "drop column b, rename as something_else"
182
+ err := parser .ParseAlterStatement (statement )
183
+ test .S (t ).ExpectNil (err )
184
+ test .S (t ).ExpectTrue (parser .isRenameTable )
185
+ }
186
+ {
187
+ parser := NewParser ()
188
+ statement := "engine=innodb rename as something_else"
189
+ err := parser .ParseAlterStatement (statement )
190
+ test .S (t ).ExpectNil (err )
191
+ test .S (t ).ExpectTrue (parser .isRenameTable )
192
+ }
193
+ {
194
+ parser := NewParser ()
195
+ statement := "rename as something_else, engine=innodb"
196
+ err := parser .ParseAlterStatement (statement )
197
+ test .S (t ).ExpectNil (err )
198
+ test .S (t ).ExpectTrue (parser .isRenameTable )
199
+ }
200
+ }
Original file line number Diff line number Diff line change
1
+ drop table if exists gh_ost_test;
2
+ create table gh_ost_test (
3
+ id int auto_increment,
4
+ i int not null ,
5
+ ts timestamp ,
6
+ primary key (id)
7
+ ) auto_increment= 1 ;
8
+
9
+ drop event if exists gh_ost_test;
10
+ delimiter ;;
11
+ create event gh_ost_test
12
+ on schedule every 1 second
13
+ starts current_timestamp
14
+ ends current_timestamp + interval 60 second
15
+ on completion not preserve
16
+ enable
17
+ do
18
+ begin
19
+ insert into gh_ost_test values (null , 11 , now());
20
+ insert into gh_ost_test values (null , 13 , now());
21
+ insert into gh_ost_test values (null , 17 , now());
22
+ end ;;
Original file line number Diff line number Diff line change
1
+ ALTER statement seems to RENAME the table
Original file line number Diff line number Diff line change
1
+ --alter="rename as something_else"
You can’t perform that action at this time.
0 commit comments