quote SQLite identifiers
[dbsrgits/SQL-Translator.git] / t / 30sqlt-new-diff-sqlite.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
14plan tests => 4;
15
16use_ok('SQL::Translator::Diff') or die "Cannot continue\n";
17
18my $tr = SQL::Translator->new;
19
20my ( $source_schema, $target_schema ) = map {
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);
32} (qw/create1.yml create2.yml/);
33
34# Test for differences
35my $out = SQL::Translator::Diff::schema_diff( $source_schema, 'SQLite', $target_schema, 'SQLite',
36 { no_batch_alters => 1,
37 ignore_missing_methods => 1,
38 output_db => 'SQLite',
39 }
40);
24d9fe69 41
4d438549 42eq_or_diff($out, <<'## END OF DIFF', "Diff as expected");
24d9fe69 43-- Convert schema 'create1.yml' to 'create2.yml':;
4d438549 44
804f9d60 45BEGIN;
4d438549 46
d8cf2279 47CREATE TABLE 'added' (
48 'id' int(11)
4d438549 49);
50
d8cf2279 51ALTER TABLE 'old_name' RENAME TO 'new_name';
24d9fe69 52
d8cf2279 53DROP INDEX 'FK5302D47D93FE702E';
24d9fe69 54
d8cf2279 55DROP INDEX 'UC_age_name';
24d9fe69 56
d8cf2279 57DROP INDEX 'u_name';
24d9fe69 58
59-- SQL::Translator::Producer::SQLite cant drop_field;
60
d8cf2279 61ALTER TABLE 'new_name' ADD COLUMN 'new_field' int;
24d9fe69 62
d8cf2279 63ALTER TABLE 'person' ADD COLUMN 'is_rock_star' tinyint(4) DEFAULT 1;
24d9fe69 64
65-- SQL::Translator::Producer::SQLite cant alter_field;
66
67-- SQL::Translator::Producer::SQLite cant rename_field;
68
d8cf2279 69CREATE UNIQUE INDEX 'unique_name' ON 'person' ('name');
24d9fe69 70
d8cf2279 71CREATE UNIQUE INDEX 'UC_person_id' ON 'person' ('person_id');
24d9fe69 72
d8cf2279 73CREATE UNIQUE INDEX 'UC_age_name' ON 'person' ('age', 'name');
24d9fe69 74
d8cf2279 75DROP TABLE 'deleted';
4d438549 76
24d9fe69 77
4d438549 78COMMIT;
24d9fe69 79
4d438549 80## END OF DIFF
81
82
83$out = SQL::Translator::Diff::schema_diff($source_schema, 'SQLite', $target_schema, 'SQLite',
84 { ignore_index_names => 1,
85 ignore_constraint_names => 1,
86 output_db => 'SQLite',
87 });
88
89eq_or_diff($out, <<'## END OF DIFF', "Diff as expected");
24d9fe69 90-- Convert schema 'create1.yml' to 'create2.yml':;
4d438549 91
804f9d60 92BEGIN;
4d438549 93
d8cf2279 94CREATE TABLE 'added' (
95 'id' int(11)
4d438549 96);
97
d8cf2279 98CREATE TEMPORARY TABLE 'employee_temp_alter' (
99 'position' varchar(50) NOT NULL,
100 'employee_id' int(11) NOT NULL,
101 PRIMARY KEY ('position', 'employee_id'),
102 FOREIGN KEY('employee_id') REFERENCES 'person'('person_id')
4d438549 103);
24d9fe69 104
d8cf2279 105INSERT INTO 'employee_temp_alter' SELECT 'position', 'employee_id' FROM 'employee';
24d9fe69 106
d8cf2279 107DROP TABLE 'employee';
24d9fe69 108
d8cf2279 109CREATE TABLE 'employee' (
110 'position' varchar(50) NOT NULL,
111 'employee_id' int(11) NOT NULL,
112 PRIMARY KEY ('position', 'employee_id'),
113 FOREIGN KEY('employee_id') REFERENCES 'person'('person_id')
4d438549 114);
24d9fe69 115
d8cf2279 116INSERT INTO 'employee' SELECT 'position', 'employee_id' FROM 'employee_temp_alter';
24d9fe69 117
d8cf2279 118DROP TABLE 'employee_temp_alter';
4d438549 119
d8cf2279 120ALTER TABLE 'old_name' RENAME TO 'new_name';
24d9fe69 121
d8cf2279 122ALTER TABLE 'new_name' ADD COLUMN 'new_field' int;
24d9fe69 123
d8cf2279 124CREATE TEMPORARY TABLE 'person_temp_alter' (
125 'person_id' INTEGER PRIMARY KEY NOT NULL,
126 'name' varchar(20) NOT NULL,
127 'age' int(11) DEFAULT 18,
128 'weight' double(11,2),
129 'iq' int(11) DEFAULT 0,
130 'is_rock_star' tinyint(4) DEFAULT 1,
131 'physical_description' text
4d438549 132);
24d9fe69 133
d8cf2279 134INSERT INTO 'person_temp_alter' SELECT 'person_id', 'name', 'age', 'weight', 'iq', 'is_rock_star', 'physical_description' FROM 'person';
24d9fe69 135
d8cf2279 136DROP TABLE 'person';
24d9fe69 137
d8cf2279 138CREATE TABLE 'person' (
139 'person_id' INTEGER PRIMARY KEY NOT NULL,
140 'name' varchar(20) NOT NULL,
141 'age' int(11) DEFAULT 18,
142 'weight' double(11,2),
143 'iq' int(11) DEFAULT 0,
144 'is_rock_star' tinyint(4) DEFAULT 1,
145 'physical_description' text
4d438549 146);
24d9fe69 147
d8cf2279 148CREATE UNIQUE INDEX 'unique_name02' ON 'person' ('name');
24d9fe69 149
d8cf2279 150CREATE UNIQUE INDEX 'UC_person_id02' ON 'person' ('person_id');
24d9fe69 151
d8cf2279 152CREATE UNIQUE INDEX 'UC_age_name02' ON 'person' ('age', 'name');
24d9fe69 153
d8cf2279 154INSERT INTO 'person' SELECT 'person_id', 'name', 'age', 'weight', 'iq', 'is_rock_star', 'physical_description' FROM 'person_temp_alter';
24d9fe69 155
d8cf2279 156DROP TABLE 'person_temp_alter';
4d438549 157
d8cf2279 158DROP TABLE 'deleted';
4d438549 159
24d9fe69 160
4d438549 161COMMIT;
24d9fe69 162
4d438549 163## END OF DIFF
164
963fd5fc 165# Note the 02 in the 3 names above (end of diff) are an implementation
166# quirk - there is nothing to reset the global seen-names register
167# The rewrite should abolish this altogether, and carry the register in
168# the main schema object
4d438549 169
170# Test for sameness
171$out = SQL::Translator::Diff::schema_diff($source_schema, 'MySQL', $source_schema, 'MySQL' );
172
173eq_or_diff($out, <<'## END OF DIFF', "No differences found");
24d9fe69 174-- Convert schema 'create1.yml' to 'create1.yml':;
4d438549 175
24d9fe69 176-- No differences found;
4d438549 177
178## END OF DIFF
179