diff --git a/go/sql/parser.go b/go/sql/parser.go index 72e44ea62..dfe02b815 100644 --- a/go/sql/parser.go +++ b/go/sql/parser.go @@ -150,6 +150,11 @@ func (atp *AlterTableParser) ParseAlterStatement(alterStatement string) (err err break } } + // Strip any trailing statement terminator. A trailing semicolon would + // otherwise be carried into alterStatementOptions and, when the options are + // spliced into a larger statement (e.g. appending ", ALGORITHM=INSTANT"), + // break it into two statements under multiStatements=true. + atp.alterStatementOptions = strings.TrimRight(atp.alterStatementOptions, "; \t\r\n") for _, alterToken := range atp.tokenizeAlterStatement(atp.alterStatementOptions) { alterToken = atp.sanitizeQuotesFromAlterStatement(alterToken) atp.parseAlterToken(alterToken) diff --git a/go/sql/parser_test.go b/go/sql/parser_test.go index b69742bdd..c2cabbe9e 100644 --- a/go/sql/parser_test.go +++ b/go/sql/parser_test.go @@ -26,6 +26,27 @@ func TestParseAlterStatement(t *testing.T) { require.False(t, parser.IsAutoIncrementDefined()) } +func TestParseAlterStatementTrailingSemicolon(t *testing.T) { + statements := []string{ + "add column t int;", + "add column t int ;", + "add column t int; \t\r\n", + "ADD KEY idx_username (`username`);", + } + expected := []string{ + "add column t int", + "add column t int", + "add column t int", + "ADD KEY idx_username (`username`)", + } + for i, statement := range statements { + parser := NewAlterTableParser() + err := parser.ParseAlterStatement(statement) + require.NoError(t, err) + require.Equal(t, expected[i], parser.alterStatementOptions) + } +} + func TestParseAlterStatementrivialRename(t *testing.T) { statement := "add column t int, change ts ts timestamp, engine=innodb" parser := NewAlterTableParser()