5 # Note that the bulk of the testing for the mysql producer is in
6 # 08postgres-to-mysql.t. This test is for additional stuff that can't be tested
7 # using an Oracle schema as source e.g. extra attributes.
13 use Test::SQL::Translator qw(maybe_plan);
19 #=============================================================================
24 'SQL::Translator::Producer::MySQL',
28 use Test::Differences;
33 my $yaml_in = <<EOSCHEMA;
41 mysql_collate: latin1_danish_ci
46 data_type: unsigned int
68 mysql_collate: utf8_general_ci
101 - reference_table: thing
105 - reference_table: thing
113 "SET foreign_key_checks=0;\n\n",
115 "DROP TABLE IF EXISTS `thing`;\n",
116 "CREATE TABLE `thing` (
117 `id` unsigned int auto_increment,
119 `swedish_name` varchar(32) CHARACTER SET swe7,
120 `description` text CHARACTER SET utf8 COLLATE utf8_general_ci,
124 UNIQUE `idx_unique_name` (`name`)
125 ) Type=InnoDB DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;\n\n",
127 "DROP TABLE IF EXISTS `thing2`;\n",
128 "CREATE TABLE `thing2` (
135 PRIMARY KEY (`id`, `foo`),
136 CONSTRAINT `thing2_fk_thing` FOREIGN KEY (`foo`) REFERENCES `thing` (`id`),
137 CONSTRAINT `thing2_fk_thing_1` FOREIGN KEY (`foo2`) REFERENCES `thing` (`id`)
140 "SET foreign_key_checks=1;\n\n"
144 my @stmts_no_drop = grep {$_ !~ /^DROP TABLE/} @stmts;
146 my $mysql_out = join("", @stmts_no_drop);
150 $sqlt = SQL::Translator->new(
156 quote_table_names => 1,
157 quote_field_names => 1
160 my $out = $sqlt->translate(\$yaml_in)
161 or die "Translate error:".$sqlt->error;
162 ok $out ne "", "Produced something!";
163 eq_or_diff $out, $mysql_out, "Scalar output looks right with quoting";
165 my @out = $sqlt->translate(\$yaml_in)
166 or die "Translat eerror:".$sqlt->error;
167 is_deeply \@out, \@stmts_no_drop, "Array output looks right with quoting";
170 @{$sqlt}{qw/quote_table_names quote_field_names/} = (0,0);
171 $out = $sqlt->translate(\$yaml_in)
172 or die "Translat eerror:".$sqlt->error;
174 @out = $sqlt->translate(\$yaml_in)
175 or die "Translat eerror:".$sqlt->error;
176 $mysql_out =~ s/`//g;
177 my @unquoted_stmts = map { s/`//g; $_} @stmts_no_drop;
178 eq_or_diff $out, $mysql_out, "Output looks right without quoting";
179 is_deeply \@out, \@unquoted_stmts, "Array output looks right without quoting";
181 @{$sqlt}{qw/add_drop_table quote_field_names quote_table_names/} = (1,1,1);
182 @out = $sqlt->translate(\$yaml_in)
183 or die "Translat eerror:".$sqlt->error;
184 $out = $sqlt->translate(\$yaml_in)
185 or die "Translat eerror:".$sqlt->error;
187 eq_or_diff $out, join("", @stmts), "Output looks right with DROP TABLEs";
188 is_deeply \@out, \@stmts, "Array output looks right with DROP TABLEs";
191 ###############################################################################
194 my $table = SQL::Translator::Schema::Table->new( name => 'mytable');
196 my $field1 = SQL::Translator::Schema::Field->new( name => 'myfield',
198 data_type => 'VARCHAR',
200 default_value => undef,
201 is_auto_increment => 0,
206 my $field1_sql = SQL::Translator::Producer::MySQL::create_field($field1);
208 is($field1_sql, 'myfield VARCHAR(10)', 'Create field works');
210 my $field2 = SQL::Translator::Schema::Field->new( name => 'myfield',
212 data_type => 'VARCHAR',
214 default_value => undef,
215 is_auto_increment => 0,
220 my $alter_field = SQL::Translator::Producer::MySQL::alter_field($field1,
222 is($alter_field, 'ALTER TABLE mytable CHANGE COLUMN myfield myfield VARCHAR(25) NOT NULL', 'Alter field works');
224 my $add_field = SQL::Translator::Producer::MySQL::add_field($field1);
226 is($add_field, 'ALTER TABLE mytable ADD COLUMN myfield VARCHAR(10)', 'Add field works');
228 my $drop_field = SQL::Translator::Producer::MySQL::drop_field($field2);
229 is($drop_field, 'ALTER TABLE mytable DROP COLUMN myfield', 'Drop field works');