Start transactions in a portable manner
[dbsrgits/SQL-Translator.git] / t / 30sqlt-new-diff-mysql.t
CommitLineData
4d438549 1#!/usr/bin/perl
2# vim: set ft=perl:
3
4use strict;
5use warnings;
6use SQL::Translator;
7
8use File::Spec::Functions qw(catfile updir tmpdir);
9use FindBin qw($Bin);
10use Test::More;
11use Test::Differences;
12use Test::SQL::Translator qw(maybe_plan);
13
07d6e5f7 14plan tests => 5;
4d438549 15
16use_ok('SQL::Translator::Diff') or die "Cannot continue\n";
17
18my $tr = SQL::Translator->new;
19
07d6e5f7 20my ( $source_schema, $target_schema, $parsed_sql_schema ) = map {
4d438549 21 my $t = SQL::Translator->new;
22 $t->parser( 'YAML' )
23 or die $tr->error;
24 my $out = $t->translate( catfile($Bin, qw/data diff/, $_ ) )
25 or die $tr->error;
26
27 my $schema = $t->schema;
28 unless ( $schema->name ) {
29 $schema->name( $_ );
30 }
31 ($schema);
07d6e5f7 32} (qw( create1.yml create2.yml ));
4d438549 33
34# Test for differences
35my $out = SQL::Translator::Diff::schema_diff( $source_schema, 'MySQL', $target_schema, 'MySQL', { no_batch_alters => 1} );
36eq_or_diff($out, <<'## END OF DIFF', "Diff as expected");
37-- Convert schema 'create1.yml' to 'create2.yml':
38
39BEGIN TRANSACTION;
40
41SET foreign_key_checks=0;
42
43
44CREATE TABLE added (
45 id integer(11)
46);
47
48
49SET foreign_key_checks=1;
50
51
46bf5655 52ALTER TABLE old_name RENAME TO new_name;
4d438549 53ALTER TABLE employee DROP FOREIGN KEY FK5302D47D93FE702E;
54ALTER TABLE person DROP UNIQUE UC_age_name;
55ALTER TABLE person DROP INDEX u_name;
56ALTER TABLE employee DROP COLUMN job_title;
46bf5655 57ALTER TABLE new_name ADD COLUMN new_field integer;
4d438549 58ALTER TABLE person ADD COLUMN is_rock_star tinyint(4) DEFAULT '1';
59ALTER TABLE person CHANGE COLUMN person_id person_id integer(11) NOT NULL auto_increment;
60ALTER TABLE person CHANGE COLUMN name name varchar(20) NOT NULL;
61ALTER TABLE person CHANGE COLUMN age age integer(11) DEFAULT '18';
62ALTER TABLE person CHANGE COLUMN iq iq integer(11) DEFAULT '0';
63ALTER TABLE person CHANGE COLUMN description physical_description text;
64ALTER TABLE person ADD UNIQUE INDEX unique_name (name);
65ALTER TABLE employee ADD CONSTRAINT FK5302D47D93FE702E_diff FOREIGN KEY (employee_id) REFERENCES person (person_id);
66ALTER TABLE person ADD UNIQUE UC_person_id (person_id);
67ALTER TABLE person ADD UNIQUE UC_age_name (age, name);
68ALTER TABLE person ENGINE=InnoDB;
69ALTER TABLE deleted DROP FOREIGN KEY fk_fake;
70DROP TABLE deleted;
71
72COMMIT;
73## END OF DIFF
74
4d438549 75$out = SQL::Translator::Diff::schema_diff($source_schema, 'MySQL', $target_schema, 'MySQL',
76 { ignore_index_names => 1,
77 ignore_constraint_names => 1
78 });
79
80eq_or_diff($out, <<'## END OF DIFF', "Diff as expected");
81-- Convert schema 'create1.yml' to 'create2.yml':
82
83BEGIN TRANSACTION;
84
85SET foreign_key_checks=0;
86
87
88CREATE TABLE added (
89 id integer(11)
90);
91
92
93SET foreign_key_checks=1;
94
95
96ALTER TABLE employee DROP COLUMN job_title;
46bf5655 97ALTER TABLE old_name RENAME TO new_name,
98 ADD COLUMN new_field integer;
4d438549 99ALTER TABLE person DROP UNIQUE UC_age_name,
100 ADD COLUMN is_rock_star tinyint(4) DEFAULT '1',
101 CHANGE COLUMN person_id person_id integer(11) NOT NULL auto_increment,
102 CHANGE COLUMN name name varchar(20) NOT NULL,
103 CHANGE COLUMN age age integer(11) DEFAULT '18',
104 CHANGE COLUMN iq iq integer(11) DEFAULT '0',
105 CHANGE COLUMN description physical_description text,
106 ADD UNIQUE UC_person_id (person_id),
107 ADD UNIQUE UC_age_name (age, name),
108 ENGINE=InnoDB;
109ALTER TABLE deleted DROP FOREIGN KEY fk_fake;
110DROP TABLE deleted;
111
112COMMIT;
113## END OF DIFF
114
115
116# Test for sameness
117$out = SQL::Translator::Diff::schema_diff($source_schema, 'MySQL', $source_schema, 'MySQL' );
118
119eq_or_diff($out, <<'## END OF DIFF', "No differences found");
120-- Convert schema 'create1.yml' to 'create1.yml':
121
122-- No differences found
123
124## END OF DIFF
125
07d6e5f7 126{
127 my $t = SQL::Translator->new;
128 $t->parser( 'MySQL' )
129 or die $tr->error;
130 my $out = $t->translate( catfile($Bin, qw/data mysql create.sql/ ) )
131 or die $tr->error;
46bf5655 132
133 # Lets remove the renamed table so we dont have to change the SQL or other tests
134 $target_schema->drop_table('new_name');
07d6e5f7 135
136 my $schema = $t->schema;
137 unless ( $schema->name ) {
138 $schema->name( 'create.sql' );
139 }
140
141 # Now lets change the type of one of the 'integer' columns so that it
142 # matches what the mysql parser sees for '<col> interger'.
143 my $field = $target_schema->get_table('employee')->get_field('employee_id');
144 $field->data_type('integer');
145 $field->size(0);
146 $out = SQL::Translator::Diff::schema_diff($schema, 'MySQL', $target_schema, 'MySQL' );
147 eq_or_diff($out, <<'## END OF DIFF', "No differences found");
148-- Convert schema 'create.sql' to 'create2.yml':
149
150BEGIN TRANSACTION;
151
152SET foreign_key_checks=0;
153
154
155CREATE TABLE added (
156 id integer(11)
157);
158
159
160SET foreign_key_checks=1;
161
162
163ALTER TABLE employee DROP FOREIGN KEY FK5302D47D93FE702E,
164 DROP COLUMN job_title,
1c680eb9 165 ADD CONSTRAINT FK5302D47D93FE702E_diff FOREIGN KEY (employee_id) REFERENCES person (person_id);
07d6e5f7 166ALTER TABLE person DROP UNIQUE UC_age_name,
167 DROP INDEX u_name,
168 ADD COLUMN is_rock_star tinyint(4) DEFAULT '1',
169 CHANGE COLUMN person_id person_id integer(11) NOT NULL auto_increment,
170 CHANGE COLUMN name name varchar(20) NOT NULL,
171 CHANGE COLUMN age age integer(11) DEFAULT '18',
172 CHANGE COLUMN iq iq integer(11) DEFAULT '0',
173 CHANGE COLUMN description physical_description text,
174 ADD UNIQUE INDEX unique_name (name),
175 ADD UNIQUE UC_person_id (person_id),
176 ADD UNIQUE UC_age_name (age, name),
177 ENGINE=InnoDB;
178DROP TABLE deleted;
179
180COMMIT;
181## END OF DIFF
182}