no longer need to call the methods to add extra/options/comments, constructor has...
[dbsrgits/SQL-Translator-2.0-ish.git] / t / 47postgres-producer.t
CommitLineData
d4c630fa 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Test::More;
7use Test::Exception;
8use Data::Dumper;
9use FindBin qw/$Bin/;
10use Test::Differences;
11use SQL::Translator;
12use SQL::Translator::Object::Table;
13use SQL::Translator::Object::Column;
14
15my $PRODUCER = \&SQL::Translator::Producer::PostgreSQL::create_field;
16
17my $table = SQL::Translator::Object::Table->new( name => 'mytable');
18
19my $field1 = SQL::Translator::Object::Column->new( name => 'myfield',
20 table => $table,
21 data_type => 'VARCHAR',
22 size => 10,
23 default_value => undef,
24 is_auto_increment => 0,
25 is_nullable => 1,
26 is_foreign_key => 0,
27 is_unique => 0 );
28
29my $field1_sql = SQL::Translator::Producer::PostgreSQL::create_field($field1);
30
31is($field1_sql, 'myfield character varying(10)', 'Create field works');
32
33my $field2 = SQL::Translator::Object::Column->new( name => 'myfield',
34 table => $table,
35 data_type => 'VARCHAR',
36 size => 25,
37 default_value => undef,
38 is_auto_increment => 0,
39 is_nullable => 0,
40 is_foreign_key => 0,
41 is_unique => 0 );
42
43my $alter_field = SQL::Translator::Producer::PostgreSQL::alter_field($field1,
44 $field2);
45is($alter_field, qq[ALTER TABLE mytable ALTER COLUMN myfield SET NOT NULL
46ALTER TABLE mytable ALTER COLUMN myfield TYPE character varying(25)],
47 'Alter field works');
48
49$field1->name('field3');
50my $add_field = SQL::Translator::Producer::PostgreSQL::add_field($field1);
51
52is($add_field, 'ALTER TABLE mytable ADD COLUMN field3 character varying(10)', 'Add field works');
53
54my $drop_field = SQL::Translator::Producer::PostgreSQL::drop_field($field2);
55is($drop_field, 'ALTER TABLE mytable DROP COLUMN myfield', 'Drop field works');
56
57my $field3 = SQL::Translator::Object::Column->new( name => 'time_field',
58 table => $table,
59 data_type => 'TIME',
60 default_value => undef,
61 is_auto_increment => 0,
62 is_nullable => 0,
63 is_foreign_key => 0,
64 is_unique => 0 );
65
66my $field3_sql = SQL::Translator::Producer::PostgreSQL::create_field($field3);
67
68is($field3_sql, 'time_field time NOT NULL', 'Create time field works');
69
70my $field3_datetime_with_TZ = SQL::Translator::Object::Column->new(
71 name => 'datetime_with_TZ',
72 table => $table,
73 data_type => 'timestamp with time zone',
74 size => 7,
75);
76
77my $field3_datetime_with_TZ_sql =
78 SQL::Translator::Producer::PostgreSQL::create_field(
79 $field3_datetime_with_TZ
80 );
81
82is(
83 $field3_datetime_with_TZ_sql,
84 'datetime_with_TZ timestamp(6) with time zone',
85 'Create time field with time zone and size, works'
86);
87
88my $field3_time_without_TZ = SQL::Translator::Object::Column->new(
89 name => 'time_without_TZ',
90 table => $table,
91 data_type => 'time without time zone',
92 size => 2,
93);
94
95my $field3_time_without_TZ_sql
96 = SQL::Translator::Producer::PostgreSQL::create_field(
97 $field3_time_without_TZ
98 );
99
100is(
101 $field3_time_without_TZ_sql,
102 'time_without_TZ time(2) without time zone',
103 'Create time field without time zone but with size, works'
104);
105
106my $field4 = SQL::Translator::Object::Column->new( name => 'bytea_field',
107 table => $table,
108 data_type => 'bytea',
109 size => '16777215',
110 default_value => undef,
111 is_auto_increment => 0,
112 is_nullable => 0,
113 is_foreign_key => 0,
114 is_unique => 0 );
115
116my $field4_sql = SQL::Translator::Producer::PostgreSQL::create_field($field4);
117
118is($field4_sql, 'bytea_field bytea NOT NULL', 'Create bytea field works');
119
120my $field5 = SQL::Translator::Object::Column->new( name => 'enum_field',
121 table => $table,
122 data_type => 'enum',
123 extra => { list => [ 'Foo', 'Bar' ] },
124 is_auto_increment => 0,
125 is_nullable => 0,
126 is_foreign_key => 0,
127 is_unique => 0 );
128
129my $field5_sql = SQL::Translator::Producer::PostgreSQL::create_field($field5,{ postgres_version => 8.3 });
130
131is($field5_sql, 'enum_field mytable_enum_field_type NOT NULL', 'Create real enum field works');
132
133
134
135
136my $field6 = SQL::Translator::Object::Column->new(
137 name => 'character',
138 table => $table,
139 data_type => 'character',
140 size => '123',
141 default_value => 'foobar',
142 is_auto_increment => 0,
143 is_nullable => 0,
144 is_foreign_key => 0,
145 is_unique => 0);
146
147my $field7 = SQL::Translator::Object::Column->new(
148 name => 'character',
149 table => $table,
150 data_type => 'character',
151 size => '123',
152 default_value => undef,
153 is_auto_increment => 0,
154 is_nullable => 0,
155 is_foreign_key => 0,
156 is_unique => 0);
157
158$alter_field = SQL::Translator::Producer::PostgreSQL::alter_field($field6,
159 $field7);
160
161is($alter_field, q(ALTER TABLE mytable ALTER COLUMN character DROP DEFAULT), 'DROP DEFAULT');
162
163$field7->default_value(q(foo'bar'));
164
165$alter_field = SQL::Translator::Producer::PostgreSQL::alter_field($field6,
166 $field7);
167
168is($alter_field, q(ALTER TABLE mytable ALTER COLUMN character SET DEFAULT 'foo''bar'''), 'DEFAULT with escaping');
169
170$field7->default_value(\q(foobar));
171
172$alter_field = SQL::Translator::Producer::PostgreSQL::alter_field($field6,
173 $field7);
174
175is($alter_field, q(ALTER TABLE mytable ALTER COLUMN character SET DEFAULT foobar), 'DEFAULT unescaped if scalarref');
176
177$field7->is_nullable(1);
178$field7->default_value(q(foobar));
179
180$alter_field = SQL::Translator::Producer::PostgreSQL::alter_field($field6,
181 $field7);
182
183is($alter_field, q(ALTER TABLE mytable ALTER COLUMN character DROP NOT NULL), 'DROP NOT NULL');
184
185my $field8 = SQL::Translator::Object::Column->new( name => 'ts_field',
186 table => $table,
187 data_type => 'timestamp with time zone',
188 size => 6,
189 is_auto_increment => 0,
190 is_nullable => 0,
191 is_foreign_key => 0,
192 is_unique => 0 );
193
194my $field8_sql = SQL::Translator::Producer::PostgreSQL::create_field($field8,{ postgres_version => 8.3 });
195
196is($field8_sql, 'ts_field timestamp(6) with time zone NOT NULL', 'timestamp with precision');
197
198my $field9 = SQL::Translator::Object::Column->new( name => 'time_field',
199 table => $table,
200 data_type => 'time with time zone',
201 size => 6,
202 is_auto_increment => 0,
203 is_nullable => 0,
204 is_foreign_key => 0,
205 is_unique => 0 );
206
207my $field9_sql = SQL::Translator::Producer::PostgreSQL::create_field($field9,{ postgres_version => 8.3 });
208
209is($field9_sql, 'time_field time(6) with time zone NOT NULL', 'time with precision');
210
211my $field10 = SQL::Translator::Object::Column->new( name => 'interval_field',
212 table => $table,
213 data_type => 'interval',
214 size => 6,
215 is_auto_increment => 0,
216 is_nullable => 0,
217 is_foreign_key => 0,
218 is_unique => 0 );
219
220my $field10_sql = SQL::Translator::Producer::PostgreSQL::create_field($field10,{ postgres_version => 8.3 });
221
222is($field10_sql, 'interval_field interval(6) NOT NULL', 'time with precision');
223
224
225my $field11 = SQL::Translator::Object::Column->new( name => 'time_field',
226 table => $table,
227 data_type => 'time without time zone',
228 size => 6,
229 is_auto_increment => 0,
230 is_nullable => 0,
231 is_foreign_key => 0,
232 is_unique => 0 );
233
234my $field11_sql = SQL::Translator::Producer::PostgreSQL::create_field($field11,{ postgres_version => 8.3 });
235
236is($field11_sql, 'time_field time(6) without time zone NOT NULL', 'time with precision');
237
238
239
240my $field12 = SQL::Translator::Object::Column->new( name => 'time_field',
241 table => $table,
242 data_type => 'timestamp',
243 is_auto_increment => 0,
244 is_nullable => 0,
245 is_foreign_key => 0,
246 is_unique => 0 );
247
248my $field12_sql = SQL::Translator::Producer::PostgreSQL::create_field($field12,{ postgres_version => 8.3 });
249
250is($field12_sql, 'time_field timestamp NOT NULL', 'time with precision');
251
252
253{
254 # let's test default values! -- rjbs, 2008-09-30
255 my %field = (
256 table => $table,
257 data_type => 'VARCHAR',
258 size => 10,
259 is_auto_increment => 0,
260 is_nullable => 1,
261 is_foreign_key => 0,
262 is_unique => 0,
263 );
264
265 {
266 my $simple_default = SQL::Translator::Object::Column->new(
267 %field,
268 name => 'str_default',
269 default_value => 'foo',
270 );
271
272 is(
273 $PRODUCER->($simple_default),
274 q{str_default character varying(10) DEFAULT 'foo'},
275 'default str',
276 );
277 }
278
279 {
280 my $null_default = SQL::Translator::Object::Column->new(
281 %field,
282 name => 'null_default',
283 default_value => \'NULL',
284 );
285
286 is(
287 $PRODUCER->($null_default),
288 q{null_default character varying(10) DEFAULT NULL},
289 'default null',
290 );
291 }
292
293 {
294 my $null_default = SQL::Translator::Object::Column->new(
295 %field,
296 name => 'null_default_2',
297 default_value => 'NULL', # XXX: this should go away
298 );
299
300 is(
301 $PRODUCER->($null_default),
302 q{null_default_2 character varying(10) DEFAULT NULL},
303 'default null from special cased string',
304 );
305 }
306
307 {
308 my $func_default = SQL::Translator::Object::Column->new(
309 %field,
310 name => 'func_default',
311 default_value => \'func(funky)',
312 );
313
314 is(
315 $PRODUCER->($func_default),
316 q{func_default character varying(10) DEFAULT func(funky)},
317 'unquoted default from scalar ref',
318 );
319 }
320}
321
322
323my $view1 = SQL::Translator::Schema::View->new(
324 name => 'view_foo',
325 fields => [qw/id name/],
326 sql => 'SELECT id, name FROM thing',
327);
328my $create_opts = { add_replace_view => 1, no_comments => 1 };
329my $view1_sql1 = SQL::Translator::Producer::PostgreSQL::create_view($view1, $create_opts);
330
331my $view_sql_replace = "CREATE VIEW view_foo ( id, name ) AS
332 SELECT id, name FROM thing
333";
334is($view1_sql1, $view_sql_replace, 'correct "CREATE OR REPLACE VIEW" SQL');
335
336my $view2 = SQL::Translator::Schema::View->new(
337 name => 'view_foo2',
338 sql => 'SELECT id, name FROM thing',
339 extra => {
340 'temporary' => '1',
341 'check_option' => 'cascaded',
342 },
343);
344my $create2_opts = { add_replace_view => 1, no_comments => 1 };
345my $view2_sql1 = SQL::Translator::Producer::PostgreSQL::create_view($view2, $create2_opts);
346
347my $view2_sql_replace = "CREATE TEMPORARY VIEW view_foo2 AS
348 SELECT id, name FROM thing
349 WITH CASCADED CHECK OPTION";
350is($view2_sql1, $view2_sql_replace, 'correct "CREATE OR REPLACE VIEW" SQL 2');
351
352done_testing;