github.com/walf443/mgr@v0.0.0-20150203144449-6f7a3a548462/sqlparser/mysql/ast_test.go (about) 1 package mysql 2 3 import ( 4 "testing" 5 ) 6 7 func TestGenDropTableStatement(t *testing.T) { 8 testGenStatement(t, "DROP TABLE `hoge`;", &DropTableStatement{TableNames: []TableNameIdentifier{TableNameIdentifier{Name: "hoge"}}}) 9 testGenStatement(t, "DROP TABLE `fuga`, `hoge`;", &DropTableStatement{TableNames: []TableNameIdentifier{TableNameIdentifier{Name: "fuga"}, TableNameIdentifier{Name: "hoge"}}}) 10 testGenStatement(t, "DROP TABLE `TABLE`;", &DropTableStatement{TableNames: []TableNameIdentifier{TableNameIdentifier{Name: "TABLE"}}}) 11 testGenStatement(t, "DROP TABLE `hoge`.`fuga`;", &DropTableStatement{TableNames: []TableNameIdentifier{TableNameIdentifier{Database: "hoge", Name: "fuga"}}}) 12 } 13 14 func TestGenDropDatabaseStatement(t *testing.T) { 15 testGenStatement(t, "DROP DATABASE `hoge`;", &DropDatabaseStatement{DatabaseName: DatabaseNameIdentifier{Name: "hoge"}}) 16 } 17 18 func TestGenCreateDatabaseStatement(t *testing.T) { 19 testGenStatement(t, "CREATE DATABASE `hoge`;", &CreateDatabaseStatement{DatabaseName: DatabaseNameIdentifier{Name: "hoge"}}) 20 } 21 22 func TestGenAlterStatement(t *testing.T) { 23 testGenStatement(t, "ALTER TABLE `hoge` DROP `foo`;", &AlterTableStatement{TableNameIdentifier{Name: "hoge", Database: ""}, []AlterSpecification{ 24 &AlterSpecificationDropColumn{ColumnNameIdentifier{"foo"}}, 25 }}) 26 testGenStatement(t, "ALTER TABLE `hoge` DROP INDEX `foo`;", &AlterTableStatement{TableNameIdentifier{Name: "hoge", Database: ""}, []AlterSpecification{ 27 &AlterSpecificationDropIndex{IndexNameIdentifier{"foo"}}, 28 }}) 29 testGenStatement(t, "ALTER TABLE `hoge` ADD INDEX `foo` (`bar`, `baz`);", &AlterTableStatement{TableNameIdentifier{Name: "hoge", Database: ""}, []AlterSpecification{ 30 &AlterSpecificationAddIndex{IndexNameIdentifier{"foo"}, []ColumnNameIdentifier{ColumnNameIdentifier{"bar"}, ColumnNameIdentifier{"baz"}}, false}, 31 }}) 32 testGenStatement(t, "ALTER TABLE `hoge` ADD INDEX (`bar`, `baz`);", &AlterTableStatement{TableNameIdentifier{Name: "hoge", Database: ""}, []AlterSpecification{ 33 &AlterSpecificationAddIndex{IndexNameIdentifier{""}, []ColumnNameIdentifier{ColumnNameIdentifier{"bar"}, ColumnNameIdentifier{"baz"}}, false}, 34 }}) 35 testGenStatement(t, "ALTER TABLE `hoge` ADD UNIQUE INDEX (`bar`, `baz`);", &AlterTableStatement{TableNameIdentifier{Name: "hoge", Database: ""}, []AlterSpecification{ 36 &AlterSpecificationAddIndex{IndexNameIdentifier{""}, []ColumnNameIdentifier{ColumnNameIdentifier{"bar"}, ColumnNameIdentifier{"baz"}}, true}, 37 }}) 38 testGenStatement(t, "ALTER TABLE `hoge` ADD `foo` INT(10) UNSIGNED DEFAULT NULL;", &AlterTableStatement{TableNameIdentifier{Name: "hoge", Database: ""}, []AlterSpecification{ 39 &AlterSpecificationAddColumn{ColumnNameIdentifier{"foo"}, ColumnDefinition{ 40 &DataTypeDefinitionNumber{DATATYPE_INT, 10, true, false}, 41 true, 42 false, 43 &DefaultDefinitionNull{}, 44 }}, 45 }}) 46 } 47 48 func TestGenCreateTableStatement(t *testing.T) { 49 testGenStatement(t, "CREATE TABLE `hoge` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,\n\t`another_id` INT(10) UNSIGNED NOT NULL ,\n\tPRIMARY KEY ( `id` ),\n\tUNIQUE KEY `another_id` ( `another_id` ),\n\tINDEX `another_id2` ( `another_id` )\n) ENGINE=InnoDB COMMENT \"hoge\";", &CreateTableStatement{TableNameIdentifier{"hoge", ""}, []CreateDefinition{ 50 &CreateDefinitionColumn{ColumnNameIdentifier{"id"}, ColumnDefinition{&DataTypeDefinitionNumber{DATATYPE_INT, 10, true, false}, false, true, &DefaultDefinitionEmpty{}}}, 51 &CreateDefinitionColumn{ColumnNameIdentifier{"another_id"}, ColumnDefinition{&DataTypeDefinitionNumber{DATATYPE_INT, 10, true, false}, false, false, &DefaultDefinitionEmpty{}}}, 52 &CreateDefinitionPrimaryIndex{[]ColumnNameIdentifier{ColumnNameIdentifier{"id"}}}, 53 &CreateDefinitionUniqueIndex{IndexNameIdentifier{"another_id"}, []ColumnNameIdentifier{ColumnNameIdentifier{"another_id"}}}, 54 &CreateDefinitionIndex{IndexNameIdentifier{"another_id2"}, []ColumnNameIdentifier{ColumnNameIdentifier{"another_id"}}}, 55 }, []TableOption{TableOption{"ENGINE", "InnoDB"}, TableOption{"COMMENT", "hoge"}}}) 56 } 57 58 func TestGenColumnDefinition(t *testing.T) { 59 testGenColumnDefinition(t, "INT DEFAULT NULL", ColumnDefinition{&DataTypeDefinitionNumber{DATATYPE_INT, 0, false, false}, true, false, &DefaultDefinitionNull{}}) 60 testGenColumnDefinition(t, "INT(10) UNSIGNED DEFAULT NULL", ColumnDefinition{&DataTypeDefinitionNumber{DATATYPE_INT, 10, true, false}, true, false, &DefaultDefinitionNull{}}) 61 testGenColumnDefinition(t, "INT(10) UNSIGNED ZEROFILL DEFAULT NULL", ColumnDefinition{&DataTypeDefinitionNumber{DATATYPE_INT, 10, true, true}, true, false, &DefaultDefinitionNull{}}) 62 testGenColumnDefinition(t, "DATE ", ColumnDefinition{&DataTypeDefinitionSimple{DATATYPE_DATE}, true, false, &DefaultDefinitionEmpty{}}) 63 testGenColumnDefinition(t, "DATE DEFAULT \"2015/01/04\"", ColumnDefinition{&DataTypeDefinitionSimple{DATATYPE_DATE}, true, false, &DefaultDefinitionString{"2015/01/04"}}) 64 testGenColumnDefinition(t, "DATE DEFAULT CURRENT_TIMESTAMP", ColumnDefinition{&DataTypeDefinitionSimple{DATATYPE_DATE}, true, false, &DefaultDefinitionCurrentTimestamp{}}) 65 testGenColumnDefinition(t, "DATE DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP", ColumnDefinition{&DataTypeDefinitionSimple{DATATYPE_DATE}, true, false, &DefaultDefinitionCurrentTimestamp{true}}) 66 67 testGenColumnDefinition(t, "DECIMAL(10, 2) UNSIGNED ZEROFILL DEFAULT NULL", ColumnDefinition{&DataTypeDefinitionFraction{DATATYPE_DECIMAL, 10, 2, true, true}, true, false, &DefaultDefinitionNull{}}) 68 testGenColumnDefinition(t, "DECIMAL(10) UNSIGNED DEFAULT NULL", ColumnDefinition{&DataTypeDefinitionFraction{DATATYPE_DECIMAL, 10, 0, true, false}, true, false, &DefaultDefinitionNull{}}) 69 testGenColumnDefinition(t, "DECIMAL DEFAULT NULL", ColumnDefinition{&DataTypeDefinitionFraction{DATATYPE_DECIMAL, 0, 0, false, false}, true, false, &DefaultDefinitionNull{}}) 70 71 testGenColumnDefinition(t, "VARCHAR(255) DEFAULT NULL", ColumnDefinition{&DataTypeDefinitionString{DATATYPE_VARCHAR, 255, "", ""}, true, false, &DefaultDefinitionNull{}}) 72 testGenColumnDefinition(t, "VARCHAR(255) CHARACTER SET utf8mb4 DEFAULT NULL", ColumnDefinition{&DataTypeDefinitionString{DATATYPE_VARCHAR, 255, "utf8mb4", ""}, true, false, &DefaultDefinitionNull{}}) 73 testGenColumnDefinition(t, "VARCHAR(255) COLLATE utf8mb4_general_ci DEFAULT NULL", ColumnDefinition{&DataTypeDefinitionString{DATATYPE_VARCHAR, 255, "", "utf8mb4_general_ci"}, true, false, &DefaultDefinitionNull{}}) 74 75 testGenColumnDefinition(t, "TEXT CHARACTER SET utf8mb4 ", ColumnDefinition{&DataTypeDefinitionTextBlob{DATATYPE_TEXT, false, "utf8mb4", ""}, true, false, &DefaultDefinitionEmpty{}}) 76 testGenColumnDefinition(t, "TEXT BINARY COLLATE utf8mb4_general_ci ", ColumnDefinition{&DataTypeDefinitionTextBlob{DATATYPE_TEXT, true, "", "utf8mb4_general_ci"}, true, false, &DefaultDefinitionEmpty{}}) 77 } 78 79 func testGenStatement(t *testing.T, expected string, input Statement) { 80 result := input.ToQuery() 81 if result != expected { 82 t.Errorf("Failed test to generage SQL\n\tInput: %+#v \n\tExpect\t: \"%s\"\n\tBut Got\t: \"%s\"", input, expected, result) 83 } 84 } 85 86 func testGenColumnDefinition(t *testing.T, expected string, input ColumnDefinition) { 87 specAddColumn := AlterSpecificationAddColumn{ColumnNameIdentifier{"foo"}, ColumnDefinition{}} 88 specAddColumn.ColumnDefinition = input 89 statement := AlterTableStatement{TableNameIdentifier{Name: "hoge", Database: ""}, []AlterSpecification{}} 90 statement.AlterSpecifications = append(statement.AlterSpecifications, &specAddColumn) 91 testGenStatement(t, "ALTER TABLE `hoge` ADD `foo` "+expected+";", &statement) 92 }