File tree Expand file tree Collapse file tree
localtests/fail-rename-table Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -255,7 +255,11 @@ func (this *Migrator) listenOnPanicAbort() {
255255// validateStatement validates the `alter` statement meets criteria.
256256// At this time this means:
257257// - column renames are approved
258+ // - no table rename allowed
258259func (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+ }
259263 if this .parser .HasNonTrivialRenames () && ! this .migrationContext .SkipRenamedColumns {
260264 this .migrationContext .ColumnRenameMap = this .parser .GetNonTrivialRenames ()
261265 if ! this .migrationContext .ApproveRenamedColumns {
Original file line number Diff line number Diff line change @@ -15,11 +15,13 @@ var (
1515 sanitizeQuotesRegexp = regexp .MustCompile ("('[^']*')" )
1616 renameColumnRegexp = regexp .MustCompile (`(?i)\bchange\s+(column\s+|)([\S]+)\s+([\S]+)\s+` )
1717 dropColumnRegexp = regexp .MustCompile (`(?i)\bdrop\s+(column\s+|)([\S]+)$` )
18+ renameTableRegexp = regexp .MustCompile (`(?i)\brename\s+(to|as)\s+` )
1819)
1920
2021type Parser struct {
2122 columnRenameMap map [string ]string
2223 droppedColumns map [string ]bool
24+ isRenameTable bool
2325}
2426
2527func NewParser () * Parser {
@@ -86,6 +88,12 @@ func (this *Parser) parseAlterToken(alterToken string) (err error) {
8688 this .droppedColumns [submatch [2 ]] = true
8789 }
8890 }
91+ {
92+ // rename table
93+ if renameTableRegexp .MatchString (alterToken ) {
94+ this .isRenameTable = true
95+ }
96+ }
8997 return nil
9098}
9199
@@ -115,3 +123,7 @@ func (this *Parser) HasNonTrivialRenames() bool {
115123func (this * Parser ) DroppedColumnsMap () map [string ]bool {
116124 return this .droppedColumns
117125}
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) {
159159 test .S (t ).ExpectTrue (parser .droppedColumns ["b" ])
160160 }
161161}
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