Skip to content

Commit 740fa22

Browse files
author
Eugen Konkov
committed
Prioritize renames before create and alter
Renames should go first, otherwise it could not be possible to add a new column with the name which was just renamed to something. Eg. SRC:x->DST:y, Create DST:x. Otherwise we can not run 'Create DST:x', because schema still have 'x' column.
1 parent b4d619f commit 740fa22

File tree

6 files changed

+19
-15
lines changed

6 files changed

+19
-15
lines changed

lib/SQL/Translator/Diff.pm

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,13 +292,17 @@ sub produce_diff_sql {
292292
()
293293
}
294294

295+
# Renames should go first, otherwise it could not be possible to add a new column with
296+
# the name which was just renamed to something. Eg. SRC:x->DST:y, Create DST:x.
297+
# Otherwise we can not run 'Create DST:x', because schema still have 'x' column.
298+
295299
} qw/rename_table
296300
alter_drop_constraint
297301
alter_drop_index
298302
drop_field
303+
rename_field
299304
add_field
300305
alter_field
301-
rename_field
302306
alter_create_index
303307
alter_create_constraint
304308
alter_table/),

lib/SQL/Translator/Producer/PostgreSQL.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1188,9 +1188,9 @@ sub batch_alter_table {
11881188
# now add everything else
11891189
push @sql, batch_alter_table_statements(
11901190
$diff_hash, $options, qw(
1191+
rename_field
11911192
add_field
11921193
alter_field
1193-
rename_field
11941194
alter_create_index
11951195
alter_create_constraint
11961196
alter_table

lib/SQL/Translator/Utils.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,9 +394,9 @@ sub batch_alter_table_statements {
394394
alter_drop_constraint
395395
alter_drop_index
396396
drop_field
397+
rename_field
397398
add_field
398399
alter_field
399-
rename_field
400400
alter_create_index
401401
alter_create_constraint
402402
alter_table

t/30sqlt-new-diff-mysql.t

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ ALTER TABLE person DROP INDEX u_name;
7272
7373
ALTER TABLE employee DROP COLUMN job_title;
7474
75+
ALTER TABLE person CHANGE COLUMN description physical_description text NULL;
76+
7577
ALTER TABLE new_name ADD COLUMN new_field integer NULL;
7678
7779
ALTER TABLE person ADD COLUMN is_rock_star tinyint(4) NULL DEFAULT 1;
@@ -84,8 +86,6 @@ ALTER TABLE person CHANGE COLUMN age age integer(11) NULL DEFAULT 18;
8486
8587
ALTER TABLE person CHANGE COLUMN iq iq integer(11) NULL DEFAULT 0;
8688
87-
ALTER TABLE person CHANGE COLUMN description physical_description text NULL;
88-
8989
ALTER TABLE person ADD UNIQUE INDEX unique_name (name);
9090
9191
ALTER TABLE employee ADD CONSTRAINT FK5302D47D93FE702E_diff FOREIGN KEY (employee_id) REFERENCES person (person_id);
@@ -136,12 +136,12 @@ ALTER TABLE old_name RENAME TO new_name,
136136
ADD COLUMN new_field integer NULL;
137137
138138
ALTER TABLE person DROP CONSTRAINT UC_age_name,
139+
CHANGE COLUMN description physical_description text NULL,
139140
ADD COLUMN is_rock_star tinyint(4) NULL DEFAULT 1,
140141
CHANGE COLUMN person_id person_id integer(11) NOT NULL auto_increment,
141142
CHANGE COLUMN name name varchar(20) NOT NULL,
142143
CHANGE COLUMN age age integer(11) NULL DEFAULT 18,
143144
CHANGE COLUMN iq iq integer(11) NULL DEFAULT 0,
144-
CHANGE COLUMN description physical_description text NULL,
145145
ADD UNIQUE UC_person_id (person_id),
146146
ADD UNIQUE UC_age_name (age, name),
147147
ENGINE=InnoDB;
@@ -207,13 +207,13 @@ ALTER TABLE employee DROP FOREIGN KEY FK5302D47D93FE702E,
207207
208208
ALTER TABLE person DROP CONSTRAINT UC_age_name,
209209
DROP INDEX u_name,
210+
CHANGE COLUMN description physical_description text NULL,
210211
ADD COLUMN is_rock_star tinyint(4) NULL DEFAULT 1,
211212
ADD COLUMN value double(8, 2) NULL DEFAULT 0.00,
212213
CHANGE COLUMN person_id person_id integer(11) NOT NULL auto_increment,
213214
CHANGE COLUMN name name varchar(20) NOT NULL,
214215
CHANGE COLUMN age age integer(11) NULL DEFAULT 18,
215216
CHANGE COLUMN iq iq integer(11) NULL DEFAULT 0,
216-
CHANGE COLUMN description physical_description text NULL,
217217
ADD UNIQUE INDEX unique_name (name),
218218
ADD UNIQUE UC_person_id (person_id),
219219
ADD UNIQUE UC_age_name (age, name),

t/30sqlt-new-diff-pgsql.t

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ ALTER TABLE "person" DROP CONSTRAINT "UC_age_name";
8383
8484
DROP INDEX "u_name";
8585
86+
ALTER TABLE "person" RENAME COLUMN "description" TO "physical_description";
87+
8688
ALTER TABLE "person" ADD COLUMN "is_rock_star" smallint DEFAULT 1;
8789
8890
ALTER TABLE "person" ALTER COLUMN "person_id" TYPE serial;
@@ -99,8 +101,6 @@ ALTER TABLE "person" ALTER COLUMN "nickname" SET NOT NULL;
99101
100102
ALTER TABLE "person" ALTER COLUMN "nickname" TYPE character varying(24);
101103
102-
ALTER TABLE "person" RENAME COLUMN "description" TO "physical_description";
103-
104104
ALTER TABLE "person" ADD CONSTRAINT "unique_name" UNIQUE ("name");
105105
106106
ALTER TABLE "person" ADD CONSTRAINT "UC_person_id" UNIQUE ("person_id");
@@ -151,6 +151,8 @@ ALTER TABLE new_name ADD COLUMN new_field integer;
151151
152152
ALTER TABLE person DROP CONSTRAINT UC_age_name;
153153
154+
ALTER TABLE person RENAME COLUMN description TO physical_description;
155+
154156
ALTER TABLE person ADD COLUMN is_rock_star smallint DEFAULT 1;
155157
156158
ALTER TABLE person ALTER COLUMN person_id TYPE serial;
@@ -167,8 +169,6 @@ ALTER TABLE person ALTER COLUMN nickname SET NOT NULL;
167169
168170
ALTER TABLE person ALTER COLUMN nickname TYPE character varying(24);
169171
170-
ALTER TABLE person RENAME COLUMN description TO physical_description;
171-
172172
ALTER TABLE person ADD CONSTRAINT UC_person_id UNIQUE (person_id);
173173
174174
ALTER TABLE person ADD CONSTRAINT UC_age_name UNIQUE (age, name);
@@ -190,10 +190,10 @@ eq_or_diff($out, <<'## END OF DIFF', "No differences found");
190190
191191
## END OF DIFF
192192

193-
is shift @warns, q!SQL::Translator::Diff::schema_diff(): Renamed table can't find old table "not_exists" for renamed table!,
194-
'Warning: old table not found';
195193
is shift @warns, q!SQL::Translator::Diff::schema_diff(): Renamed column can't find old column "old_name.not_exists" for renamed column!,
196194
'Warning: old column not found';
195+
is shift @warns, q!SQL::Translator::Diff::schema_diff(): Renamed table can't find old table "not_exists" for renamed table!,
196+
'Warning: old table not found';
197197

198198

199199
sub diff_it {

t/30sqlt-new-diff-sqlite.t

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,14 @@ DROP INDEX u_name;
6363
6464
-- SQL::Translator::Producer::SQLite cant drop_field;
6565
66+
-- SQL::Translator::Producer::SQLite cant rename_field;
67+
6668
ALTER TABLE new_name ADD COLUMN new_field int;
6769
6870
ALTER TABLE person ADD COLUMN is_rock_star tinyint(4) DEFAULT 1;
6971
7072
-- SQL::Translator::Producer::SQLite cant alter_field;
7173
72-
-- SQL::Translator::Producer::SQLite cant rename_field;
73-
7474
CREATE UNIQUE INDEX unique_name ON person (name);
7575
7676
CREATE UNIQUE INDEX UC_person_id ON person (person_id);

0 commit comments

Comments
 (0)