|
1 | 1 | package canal
|
2 | 2 |
|
3 | 3 | import (
|
4 |
| - "bytes" |
5 | 4 | "flag"
|
6 | 5 | "fmt"
|
7 | 6 | "testing"
|
8 | 7 | "time"
|
9 | 8 |
|
10 | 9 | . "github.com/pingcap/check"
|
11 | 10 | "github.com/pingcap/errors"
|
| 11 | + "github.com/pingcap/parser" |
12 | 12 | "github.com/siddontang/go-log/log"
|
13 | 13 | "github.com/siddontang/go-mysql/mysql"
|
14 | 14 | )
|
@@ -140,98 +140,138 @@ func (s *canalTestSuite) TestCanalFilter(c *C) {
|
140 | 140 |
|
141 | 141 | func TestCreateTableExp(t *testing.T) {
|
142 | 142 | cases := []string{
|
143 |
| - "CREATE TABLE `mydb.mytable` (`id` int(10)) ENGINE=InnoDB", |
144 |
| - "CREATE TABLE `mytable` (`id` int(10)) ENGINE=InnoDB", |
145 |
| - "CREATE TABLE IF NOT EXISTS `mytable` (`id` int(10)) ENGINE=InnoDB", |
146 |
| - "CREATE TABLE IF NOT EXISTS mytable (`id` int(10)) ENGINE=InnoDB", |
| 143 | + "CREATE TABLE /*generated by server */ mydb.mytable (`id` int(10)) ENGINE=InnoDB", |
| 144 | + "CREATE TABLE `mydb`.`mytable` (`id` int(10)) ENGINE=InnoDB", |
| 145 | + "CREATE TABLE IF NOT EXISTS mydb.`mytable` (`id` int(10)) ENGINE=InnoDB", |
| 146 | + "CREATE TABLE IF NOT EXISTS `mydb`.mytable (`id` int(10)) ENGINE=InnoDB", |
147 | 147 | }
|
148 |
| - table := []byte("mytable") |
149 |
| - db := []byte("mydb") |
| 148 | + table := "mytable" |
| 149 | + db := "mydb" |
| 150 | + pr := parser.New() |
150 | 151 | for _, s := range cases {
|
151 |
| - m := expCreateTable.FindSubmatch([]byte(s)) |
152 |
| - mLen := len(m) |
153 |
| - if m == nil || !bytes.Equal(m[mLen-1], table) || (len(m[mLen-2]) > 0 && !bytes.Equal(m[mLen-2], db)) { |
154 |
| - t.Fatalf("TestCreateTableExp: case %s failed\n", s) |
| 152 | + stmts, _, err := pr.Parse(s, "", "") |
| 153 | + if err != nil { |
| 154 | + t.Fatalf("TestCreateTableExp:case %s failed\n", s) |
| 155 | + } |
| 156 | + for _, st := range stmts { |
| 157 | + nodes := parseStmt(st) |
| 158 | + if len(nodes) == 0 { |
| 159 | + continue |
| 160 | + } |
| 161 | + if nodes[0].db != db || nodes[0].table != table { |
| 162 | + t.Fatalf("TestCreateTableExp:case %s failed\n", s) |
| 163 | + } |
155 | 164 | }
|
156 | 165 | }
|
157 | 166 | }
|
158 |
| - |
159 | 167 | func TestAlterTableExp(t *testing.T) {
|
160 | 168 | cases := []string{
|
161 |
| - "ALTER TABLE `mydb`.`mytable` ADD `field2` DATE NULL AFTER `field1`;", |
| 169 | + "ALTER TABLE /*generated by server*/ `mydb`.`mytable` ADD `field2` DATE NULL AFTER `field1`;", |
162 | 170 | "ALTER TABLE `mytable` ADD `field2` DATE NULL AFTER `field1`;",
|
163 | 171 | "ALTER TABLE mydb.mytable ADD `field2` DATE NULL AFTER `field1`;",
|
164 | 172 | "ALTER TABLE mytable ADD `field2` DATE NULL AFTER `field1`;",
|
165 | 173 | "ALTER TABLE mydb.mytable ADD field2 DATE NULL AFTER `field1`;",
|
166 | 174 | }
|
167 | 175 |
|
168 |
| - table := []byte("mytable") |
169 |
| - db := []byte("mydb") |
| 176 | + table := "mytable" |
| 177 | + db := "mydb" |
| 178 | + pr := parser.New() |
170 | 179 | for _, s := range cases {
|
171 |
| - m := expAlterTable.FindSubmatch([]byte(s)) |
172 |
| - mLen := len(m) |
173 |
| - if m == nil || !bytes.Equal(m[mLen-1], table) || (len(m[mLen-2]) > 0 && !bytes.Equal(m[mLen-2], db)) { |
174 |
| - t.Fatalf("TestAlterTableExp: case %s failed\n", s) |
| 180 | + stmts, _, err := pr.Parse(s, "", "") |
| 181 | + if err != nil { |
| 182 | + t.Fatalf("TestAlterTableExp:case %s failed\n", s) |
| 183 | + } |
| 184 | + for _, st := range stmts { |
| 185 | + nodes := parseStmt(st) |
| 186 | + if len(nodes) == 0 { |
| 187 | + continue |
| 188 | + } |
| 189 | + rdb := nodes[0].db |
| 190 | + rtable := nodes[0].table |
| 191 | + if (len(rdb) > 0 && rdb != db) || rtable != table { |
| 192 | + t.Fatalf("TestAlterTableExp:case %s failed db %s,table %s\n", s, rdb, rtable) |
| 193 | + } |
175 | 194 | }
|
176 | 195 | }
|
177 | 196 | }
|
178 | 197 |
|
179 | 198 | func TestRenameTableExp(t *testing.T) {
|
180 | 199 | cases := []string{
|
181 |
| - "rename table `mydb`.`mytable` to `mydb`.`mytable1`", |
182 |
| - "rename table `mytable` to `mytable1`", |
183 |
| - "rename table mydb.mytable to mydb.mytable1", |
184 |
| - "rename table mytable to mytable1", |
185 |
| - |
186 |
| - "rename table `mydb`.`mytable` to `mydb`.`mytable2`, `mydb`.`mytable3` to `mydb`.`mytable1`", |
187 |
| - "rename table `mytable` to `mytable2`, `mytable3` to `mytable1`", |
188 |
| - "rename table mydb.mytable to mydb.mytable2, mydb.mytable3 to mydb.mytable1", |
189 |
| - "rename table mytable to mytable2, mytable3 to mytable1", |
| 200 | + "rename /* generate by server */table `mydb`.`mytable0` to `mydb`.`mytable0tmp`", |
| 201 | + "rename table `mytable0` to `mytable0tmp`", |
| 202 | + "rename table mydb.mytable0 to mydb.mytable0tmp", |
| 203 | + "rename table mytable0 to mytable0tmp", |
| 204 | + |
| 205 | + "rename table `mydb`.`mytable0` to `mydb`.`mytable0tmp`, `mydb`.`mytable1` to `mydb`.`mytable1tmp`", |
| 206 | + "rename table `mytable0` to `mytable0tmp`, `mytable1` to `mytable1tmp`", |
| 207 | + "rename table mydb.mytable0 to mydb.mytable0tmp, mydb.mytable1 to mydb.mytable1tmp", |
| 208 | + "rename table mytable0 to mytable0tmp, mytable1 to mytabletmp", |
190 | 209 | }
|
191 |
| - table := []byte("mytable") |
192 |
| - db := []byte("mydb") |
| 210 | + baseTable := "mytable" |
| 211 | + db := "mydb" |
| 212 | + pr := parser.New() |
193 | 213 | for _, s := range cases {
|
194 |
| - m := expRenameTable.FindSubmatch([]byte(s)) |
195 |
| - mLen := len(m) |
196 |
| - if m == nil || !bytes.Equal(m[mLen-1], table) || (len(m[mLen-2]) > 0 && !bytes.Equal(m[mLen-2], db)) { |
197 |
| - t.Fatalf("TestRenameTableExp: case %s failed\n", s) |
| 214 | + stmts, _, err := pr.Parse(s, "", "") |
| 215 | + if err != nil { |
| 216 | + t.Fatalf("TestRenameTableExp:case %s failed\n", s) |
| 217 | + } |
| 218 | + for _, st := range stmts { |
| 219 | + nodes := parseStmt(st) |
| 220 | + if len(nodes) == 0 { |
| 221 | + continue |
| 222 | + } |
| 223 | + for i, node := range nodes { |
| 224 | + rdb := node.db |
| 225 | + rtable := node.table |
| 226 | + table := fmt.Sprintf("%s%d", baseTable, i) |
| 227 | + if (len(rdb) > 0 && rdb != db) || rtable != table { |
| 228 | + t.Fatalf("TestRenameTableExp:case %s failed db %s,table %s\n", s, rdb, rtable) |
| 229 | + } |
| 230 | + } |
198 | 231 | }
|
199 | 232 | }
|
200 | 233 | }
|
201 | 234 |
|
202 | 235 | func TestDropTableExp(t *testing.T) {
|
203 | 236 | cases := []string{
|
204 |
| - "drop table test1", |
205 |
| - "DROP TABLE test1", |
206 |
| - "DROP TABLE test1", |
207 |
| - "DROP table IF EXISTS test.test1", |
208 |
| - "drop table `test1`", |
209 |
| - "DROP TABLE `test1`", |
210 |
| - "DROP table IF EXISTS `test`.`test1`", |
211 |
| - "DROP TABLE `test1` /* generated by server */", |
212 |
| - "DROP table if exists test1", |
213 |
| - "DROP table if exists `test1`", |
214 |
| - "DROP table if exists test.test1", |
215 |
| - "DROP table if exists `test`.test1", |
216 |
| - "DROP table if exists `test`.`test1`", |
217 |
| - "DROP table if exists test.`test1`", |
218 |
| - "DROP table if exists test.`test1`", |
| 237 | + "drop table test0", |
| 238 | + "DROP TABLE test0", |
| 239 | + "DROP TABLE test0", |
| 240 | + "DROP table IF EXISTS test.test0", |
| 241 | + "drop table `test0`", |
| 242 | + "DROP TABLE `test0`", |
| 243 | + "DROP table IF EXISTS `test`.`test0`", |
| 244 | + "DROP TABLE `test0` /* generated by server */", |
| 245 | + "DROP /*generated by server */ table if exists test0", |
| 246 | + "DROP table if exists `test0`", |
| 247 | + "DROP table if exists test.test0", |
| 248 | + "DROP table if exists `test`.test0", |
| 249 | + "DROP table if exists `test`.`test0`", |
| 250 | + "DROP table if exists test.`test0`", |
| 251 | + "DROP table if exists test.`test0`", |
219 | 252 | }
|
220 | 253 |
|
221 |
| - table := []byte("test1") |
| 254 | + baseTable := "test" |
| 255 | + db := "test" |
| 256 | + pr := parser.New() |
222 | 257 | for _, s := range cases {
|
223 |
| - m := expDropTable.FindSubmatch([]byte(s)) |
224 |
| - mLen := len(m) |
225 |
| - if m == nil { |
226 |
| - t.Fatalf("TestDropTableExp: case %s failed\n", s) |
227 |
| - return |
228 |
| - } |
229 |
| - if mLen < 4 { |
230 |
| - t.Fatalf("TestDropTableExp: case %s failed\n", s) |
231 |
| - return |
| 258 | + stmts, _, err := pr.Parse(s, "", "") |
| 259 | + if err != nil { |
| 260 | + t.Fatalf("TestDropTableExp:case %s failed\n", s) |
232 | 261 | }
|
233 |
| - if !bytes.Equal(m[mLen-1], table) { |
234 |
| - t.Fatalf("TestDropTableExp: case %s failed\n", s) |
| 262 | + for _, st := range stmts { |
| 263 | + nodes := parseStmt(st) |
| 264 | + if len(nodes) == 0 { |
| 265 | + continue |
| 266 | + } |
| 267 | + for i, node := range nodes { |
| 268 | + rdb := node.db |
| 269 | + rtable := node.table |
| 270 | + table := fmt.Sprintf("%s%d", baseTable, i) |
| 271 | + if (len(rdb) > 0 && rdb != db) || rtable != table { |
| 272 | + t.Fatalf("TestDropTableExp:case %s failed db %s,table %s\n", s, rdb, rtable) |
| 273 | + } |
| 274 | + } |
235 | 275 | }
|
236 | 276 | }
|
237 | 277 | }
|
0 commit comments