Improve trigger 'scope' attribute support (RT#119997)
[dbsrgits/SQL-Translator.git] / t / 63-spacial-pgsql.t
CommitLineData
e83ad71c 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Test::More;
7use Test::Exception;
8use Test::SQL::Translator qw(maybe_plan);
9
10use Data::Dumper;
11use FindBin qw/$Bin/;
12
13# Testing 1,2,3,4...
14#=============================================================================
15
16BEGIN {
17 maybe_plan(10,
18 'SQL::Translator::Producer::PostgreSQL',
19 'Test::Differences',
20 )
21}
22use Test::Differences;
23use SQL::Translator;
24
3963e31d 25my $options = { quote_identifiers => 1 };
e83ad71c 26
27my $schema = SQL::Translator::Schema->new( name => 'myschema' );
28
3963e31d 29my $table = SQL::Translator::Schema::Table->new( name => 'my\'table', schema => $schema );
e83ad71c 30
31my $field1 = SQL::Translator::Schema::Field->new( name => 'myfield',
32 table => $table,
33 data_type => 'geometry',
34 extra => {
aee4b66e 35 dimensions => 2,
36 geometry_type => 'POINT',
37 srid => -1
38 },
e83ad71c 39 default_value => undef,
40 is_auto_increment => 0,
41 is_nullable => 1,
42 is_foreign_key => 0,
43 is_unique => 0 );
44
3963e31d 45my $field1_sql = SQL::Translator::Producer::PostgreSQL::create_field($field1, $options);
e83ad71c 46
3963e31d 47is($field1_sql, '"myfield" geometry', 'Create geometry field works');
e83ad71c 48
3963e31d 49my $field1_geocol = SQL::Translator::Producer::PostgreSQL::add_geometry_column($field1, $options);
e83ad71c 50
3963e31d 51is($field1_geocol, "INSERT INTO geometry_columns VALUES ('','myschema','my''table','myfield','2','-1','POINT')", 'Add geometry column works');
e83ad71c 52
3963e31d 53my $field1_geocon = SQL::Translator::Producer::PostgreSQL::add_geometry_constraints($field1, $options);
e83ad71c 54
3963e31d 55is($field1_geocon, qq[ALTER TABLE "my'table" ADD CONSTRAINT "enforce_dims_myfield" CHECK ((ST_NDims("myfield") = 2));
56ALTER TABLE "my'table" ADD CONSTRAINT "enforce_srid_myfield" CHECK ((ST_SRID("myfield") = -1));
57ALTER TABLE "my'table" ADD CONSTRAINT "enforce_geotype_myfield" CHECK ((GeometryType("myfield") = 'POINT'::text OR "myfield" IS NULL))],
e83ad71c 58 'Add geometry constraints works');
59
60my $field2 = SQL::Translator::Schema::Field->new( name => 'myfield',
61 table => $table,
62 data_type => 'VARCHAR',
63 size => 25,
64 default_value => undef,
65 is_auto_increment => 0,
66 is_nullable => 0,
67 is_foreign_key => 0,
68 is_unique => 0 );
69
70my $alter_field = SQL::Translator::Producer::PostgreSQL::alter_field($field1,
3963e31d 71 $field2, $options);
72is($alter_field, qq[DELETE FROM geometry_columns WHERE f_table_schema = 'myschema' AND f_table_name = 'my''table' AND f_geometry_column = 'myfield';
73ALTER TABLE "my'table" DROP CONSTRAINT "enforce_dims_myfield";
74ALTER TABLE "my'table" DROP CONSTRAINT "enforce_srid_myfield";
75ALTER TABLE "my'table" DROP CONSTRAINT "enforce_geotype_myfield";
76ALTER TABLE "my'table" ALTER COLUMN "myfield" SET NOT NULL;
77ALTER TABLE "my'table" ALTER COLUMN "myfield" TYPE character varying(25)],
e83ad71c 78 'Alter field geometry to non geometry works');
79
80my $alter_field2 = SQL::Translator::Producer::PostgreSQL::alter_field($field2,
3963e31d 81 $field1, $options);
82is($alter_field2, qq[ALTER TABLE "my'table" ALTER COLUMN "myfield" DROP NOT NULL;
83ALTER TABLE "my'table" ALTER COLUMN "myfield" TYPE geometry;
84INSERT INTO geometry_columns VALUES ('','myschema','my''table','myfield','2','-1','POINT');
85ALTER TABLE "my'table" ADD CONSTRAINT "enforce_dims_myfield" CHECK ((ST_NDims("myfield") = 2));
86ALTER TABLE "my'table" ADD CONSTRAINT "enforce_srid_myfield" CHECK ((ST_SRID("myfield") = -1));
87ALTER TABLE "my'table" ADD CONSTRAINT "enforce_geotype_myfield" CHECK ((GeometryType("myfield") = 'POINT'::text OR "myfield" IS NULL))],
e83ad71c 88 'Alter field non geometry to geometry works');
89
90$field1->name('field3');
3963e31d 91my $add_field = SQL::Translator::Producer::PostgreSQL::add_field($field1, $options);
e83ad71c 92
3963e31d 93is($add_field, qq[ALTER TABLE "my'table" ADD COLUMN "field3" geometry;
94INSERT INTO geometry_columns VALUES ('','myschema','my''table','field3','2','-1','POINT');
95ALTER TABLE "my'table" ADD CONSTRAINT "enforce_dims_field3" CHECK ((ST_NDims("field3") = 2));
96ALTER TABLE "my'table" ADD CONSTRAINT "enforce_srid_field3" CHECK ((ST_SRID("field3") = -1));
97ALTER TABLE "my'table" ADD CONSTRAINT "enforce_geotype_field3" CHECK ((GeometryType("field3") = 'POINT'::text OR "field3" IS NULL))],
e83ad71c 98 'Add geometry field works');
99
3963e31d 100my $drop_field = SQL::Translator::Producer::PostgreSQL::drop_field($field1, $options);
101is($drop_field, qq[ALTER TABLE "my'table" DROP COLUMN "field3";
102DELETE FROM geometry_columns WHERE f_table_schema = 'myschema' AND f_table_name = 'my''table' AND f_geometry_column = 'field3'],
103 'Drop geometry field works');
e83ad71c 104
105$table->add_field($field1);
140a1dad 106
107my $field4 = SQL::Translator::Schema::Field->new( name => 'field4',
108 table => $table,
109 data_type => 'geography',
110 extra => {
aee4b66e 111 geography_type => 'POINT',
112 srid => -1
113 },
140a1dad 114 default_value => undef,
115 is_auto_increment => 0,
116 is_nullable => 1,
117 is_foreign_key => 0,
118 is_unique => 0 );
119$table->add_field($field4);
120
3963e31d 121my ($create_table,$fks) = SQL::Translator::Producer::PostgreSQL::create_table($table, $options);
e83ad71c 122is($create_table,qq[--
3963e31d 123-- Table: my'table
e83ad71c 124--
3963e31d 125CREATE TABLE "my'table" (
126 "field3" geometry,
127 "field4" geography(POINT,-1),
128 CONSTRAINT "enforce_dims_field3" CHECK ((ST_NDims("field3") = 2)),
129 CONSTRAINT "enforce_srid_field3" CHECK ((ST_SRID("field3") = -1)),
130 CONSTRAINT "enforce_geotype_field3" CHECK ((GeometryType("field3") = 'POINT'::text OR "field3" IS NULL))
e83ad71c 131);
3963e31d 132INSERT INTO geometry_columns VALUES ('','myschema','my''table','field3','2','-1','POINT')],
133 'Create table with geometry works.');
e83ad71c 134
3963e31d 135my $rename_table = SQL::Translator::Producer::PostgreSQL::rename_table($table, "table2", $options);
136is($rename_table,qq[ALTER TABLE "my'table" RENAME TO "table2";
137DELETE FROM geometry_columns WHERE f_table_schema = 'myschema' AND f_table_name = 'my''table' AND f_geometry_column = 'field3';
138INSERT INTO geometry_columns VALUES ('','myschema','table2','field3','2','-1','POINT')],
139 'Rename table with geometry works.');
e83ad71c 140
141$table->name("table2");
3963e31d 142my $drop_table = SQL::Translator::Producer::PostgreSQL::drop_table($table, $options);
143is($drop_table, qq[DROP TABLE "table2" CASCADE;
144DELETE FROM geometry_columns WHERE f_table_schema = 'myschema' AND f_table_name = 'table2' AND f_geometry_column = 'field3'],
145 'Drop table with geometry works.');
140a1dad 146