vitess.io/vitess@v0.16.2/go/vt/vttablet/onlineddl/vrepl/parser_test.go (about) 1 /* 2 Copyright 2016 GitHub Inc. 3 See https://github.com/github/gh-ost/blob/master/LICENSE 4 */ 5 /* 6 Copyright 2021 The Vitess Authors. 7 8 Licensed under the Apache License, Version 2.0 (the "License"); 9 you may not use this file except in compliance with the License. 10 You may obtain a copy of the License at 11 12 http://www.apache.org/licenses/LICENSE-2.0 13 14 Unless required by applicable law or agreed to in writing, software 15 distributed under the License is distributed on an "AS IS" BASIS, 16 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 See the License for the specific language governing permissions and 18 limitations under the License. 19 */ 20 21 package vrepl 22 23 import ( 24 "testing" 25 26 "github.com/stretchr/testify/assert" 27 ) 28 29 func TestParseAlterStatement(t *testing.T) { 30 statement := "alter table t add column t int, engine=innodb" 31 parser := NewAlterTableParser() 32 err := parser.ParseAlterStatement(statement) 33 assert.NoError(t, err) 34 assert.False(t, parser.HasNonTrivialRenames()) 35 assert.False(t, parser.IsAutoIncrementDefined()) 36 } 37 38 func TestParseAlterStatementTrivialRename(t *testing.T) { 39 statement := "alter table t add column t int, change ts ts timestamp, engine=innodb" 40 parser := NewAlterTableParser() 41 err := parser.ParseAlterStatement(statement) 42 assert.NoError(t, err) 43 assert.False(t, parser.HasNonTrivialRenames()) 44 assert.False(t, parser.IsAutoIncrementDefined()) 45 assert.Equal(t, len(parser.columnRenameMap), 1) 46 assert.Equal(t, parser.columnRenameMap["ts"], "ts") 47 } 48 49 func TestParseAlterStatementWithAutoIncrement(t *testing.T) { 50 51 statements := []string{ 52 "auto_increment=7", 53 "auto_increment = 7", 54 "AUTO_INCREMENT = 71", 55 "AUTO_INCREMENT 23", 56 "AUTO_INCREMENT 23", 57 "add column t int, change ts ts timestamp, auto_increment=7 engine=innodb", 58 "add column t int, change ts ts timestamp, auto_increment =7 engine=innodb", 59 "add column t int, change ts ts timestamp, AUTO_INCREMENT = 7 engine=innodb", 60 "add column t int, change ts ts timestamp, engine=innodb auto_increment=73425", 61 "add column t int, change ts ts timestamp, engine=innodb, auto_increment=73425", 62 "add column t int, change ts ts timestamp, engine=innodb, auto_increment 73425", 63 "add column t int, change ts ts timestamp, engine innodb, auto_increment 73425", 64 "add column t int, change ts ts timestamp, engine innodb auto_increment 73425", 65 } 66 for _, statement := range statements { 67 parser := NewAlterTableParser() 68 statement := "alter table t " + statement 69 err := parser.ParseAlterStatement(statement) 70 assert.NoError(t, err) 71 assert.True(t, parser.IsAutoIncrementDefined()) 72 } 73 } 74 75 func TestParseAlterStatementTrivialRenames(t *testing.T) { 76 statement := "alter table t add column t int, change ts ts timestamp, CHANGE f `f` float, engine=innodb" 77 parser := NewAlterTableParser() 78 err := parser.ParseAlterStatement(statement) 79 assert.NoError(t, err) 80 assert.False(t, parser.HasNonTrivialRenames()) 81 assert.False(t, parser.IsAutoIncrementDefined()) 82 assert.Equal(t, len(parser.columnRenameMap), 2) 83 assert.Equal(t, parser.columnRenameMap["ts"], "ts") 84 assert.Equal(t, parser.columnRenameMap["f"], "f") 85 } 86 87 func TestParseAlterStatementNonTrivial(t *testing.T) { 88 statements := []string{ 89 `add column b bigint, change f fl float, change i count int, engine=innodb`, 90 "add column b bigint, change column `f` fl float, change `i` `count` int, engine=innodb", 91 "add column b bigint, change column `f` fl float, change `i` `count` int, change ts ts timestamp, engine=innodb", 92 `change 93 f fl float, 94 CHANGE COLUMN i 95 count int, engine=innodb`, 96 } 97 98 for _, statement := range statements { 99 statement := "alter table t " + statement 100 parser := NewAlterTableParser() 101 err := parser.ParseAlterStatement(statement) 102 assert.NoError(t, err) 103 assert.False(t, parser.IsAutoIncrementDefined()) 104 renames := parser.GetNonTrivialRenames() 105 assert.Equal(t, len(renames), 2) 106 assert.Equal(t, renames["i"], "count") 107 assert.Equal(t, renames["f"], "fl") 108 } 109 } 110 111 func TestParseAlterStatementDroppedColumns(t *testing.T) { 112 113 { 114 parser := NewAlterTableParser() 115 statement := "alter table t drop column b" 116 err := parser.ParseAlterStatement(statement) 117 assert.NoError(t, err) 118 assert.Equal(t, len(parser.droppedColumns), 1) 119 assert.True(t, parser.droppedColumns["b"]) 120 } 121 { 122 parser := NewAlterTableParser() 123 statement := "alter table t drop column b, drop key c_idx, drop column `d`" 124 err := parser.ParseAlterStatement(statement) 125 assert.NoError(t, err) 126 assert.Equal(t, len(parser.droppedColumns), 2) 127 assert.True(t, parser.droppedColumns["b"]) 128 assert.True(t, parser.droppedColumns["d"]) 129 } 130 { 131 parser := NewAlterTableParser() 132 statement := "alter table t drop column b, drop key c_idx, drop column `d`, drop `e`, drop primary key, drop foreign key fk_1" 133 err := parser.ParseAlterStatement(statement) 134 assert.NoError(t, err) 135 assert.Equal(t, len(parser.droppedColumns), 3) 136 assert.True(t, parser.droppedColumns["b"]) 137 assert.True(t, parser.droppedColumns["d"]) 138 assert.True(t, parser.droppedColumns["e"]) 139 } 140 { 141 parser := NewAlterTableParser() 142 statement := "alter table t drop column b, drop bad statement, add column i int" 143 err := parser.ParseAlterStatement(statement) 144 assert.Error(t, err) 145 } 146 } 147 148 func TestParseAlterStatementRenameTable(t *testing.T) { 149 tt := []struct { 150 alter string 151 isRename bool 152 }{ 153 { 154 alter: "alter table t drop column b", 155 }, 156 { 157 alter: "alter table t rename as something_else", 158 isRename: true, 159 }, 160 { 161 alter: "alter table t rename to something_else", 162 isRename: true, 163 }, 164 { 165 alter: "alter table t drop column b, rename as something_else", 166 isRename: true, 167 }, 168 { 169 alter: "alter table t engine=innodb, rename as something_else", 170 isRename: true, 171 }, 172 { 173 alter: "alter table t rename as something_else, engine=innodb", 174 isRename: true, 175 }, 176 } 177 for _, tc := range tt { 178 t.Run(tc.alter, func(t *testing.T) { 179 parser := NewAlterTableParser() 180 err := parser.ParseAlterStatement(tc.alter) 181 assert.NoError(t, err) 182 assert.Equal(t, tc.isRename, parser.isRenameTable) 183 }) 184 } 185 }