Skip to content

Commit 3a3ee49

Browse files
author
Shlomi Noach
authored
Merge pull request #588 from github/reject-rename-table
Rejecting RENAME TO|AS
2 parents 90a28be + 24ed4ce commit 3a3ee49

File tree

6 files changed

+79
-0
lines changed

6 files changed

+79
-0
lines changed

go/logic/migrator.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff 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
258259
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+
}
259263
if this.parser.HasNonTrivialRenames() && !this.migrationContext.SkipRenamedColumns {
260264
this.migrationContext.ColumnRenameMap = this.parser.GetNonTrivialRenames()
261265
if !this.migrationContext.ApproveRenamedColumns {

go/sql/parser.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff 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

2021
type Parser struct {
2122
columnRenameMap map[string]string
2223
droppedColumns map[string]bool
24+
isRenameTable bool
2325
}
2426

2527
func 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 {
115123
func (this *Parser) DroppedColumnsMap() map[string]bool {
116124
return this.droppedColumns
117125
}
126+
127+
func (this *Parser) IsRenameTable() bool {
128+
return this.isRenameTable
129+
}

go/sql/parser_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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 ;;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER statement seems to RENAME the table
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
--alter="rename as something_else"

0 commit comments

Comments
 (0)