Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 17 additions & 9 deletions lib/SQL/Translator/Producer/PostgreSQL.pm
Original file line number Diff line number Diff line change
Expand Up @@ -955,17 +955,25 @@ sub alter_drop_constraint {
my $qt = $options->{quote_table_names} || '';
my $qc = $options->{quote_field_names} || '';

# attention: Postgres has a very special naming structure for naming
# foreign keys and primary keys. It names them using the name of the
# table as prefix and fkey or pkey as suffix, concatenated by an underscore
my $c_name;
if( $c->name ) {
# Already has a name, just quote it
$c_name = $qc . $c->name . $qc;
} elsif ( $c->type eq FOREIGN_KEY ) {
# Doesn't have a name, and is foreign key, append '_fkey'
$c_name = $qc . $c->table->name . '_' .
($c->fields)[0] . '_fkey' . $qc;
} elsif ( $c->type eq PRIMARY_KEY ) {
# Doesn't have a name, and is primary key, append '_pkey'
$c_name = $qc . $c->table->name . '_pkey' . $qc;
}

return sprintf(
'ALTER TABLE %s DROP CONSTRAINT %s',
$qt . $c->table->name . $qt,
# attention: Postgres has a very special naming structure
# for naming foreign keys, it names them uses the name of
# the table as prefix and fkey as suffix, concatenated by a underscore
$c->type eq FOREIGN_KEY
? $c->name
? $qc . $c->name . $qc
: $qc . $c->table->name . '_' . ($c->fields)[0] . '_fkey' . $qc
: $qc . $c->name . $qc
$qt . $c->table->name . $qt, $c_name
);
}

Expand Down
38 changes: 35 additions & 3 deletions t/47postgres-producer.t
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use FindBin qw/$Bin/;
#=============================================================================

BEGIN {
maybe_plan(51,
maybe_plan(55,
'SQL::Translator::Producer::PostgreSQL',
'Test::Differences',
)
Expand Down Expand Up @@ -124,13 +124,45 @@ for my $name ( 'foo', undef ) {
}
else {
is($fk_constraint_fk_ref->[0], 'ALTER TABLE mytable ADD FOREIGN KEY (myfield)
REFERENCES mytable2 (myfield_2) DEFERRABLE', 'Create named Foreign Key Constraint works');
REFERENCES mytable2 (myfield_2) DEFERRABLE', 'Create un-named Foreign Key Constraint works');

my $alter_fk_constraint = SQL::Translator::Producer::PostgreSQL::alter_drop_constraint($fk_constraint);
is($alter_fk_constraint, 'ALTER TABLE mytable DROP CONSTRAINT mytable_myfield_fkey', 'Alter drop named Foreign Key constraint works');
is($alter_fk_constraint, 'ALTER TABLE mytable DROP CONSTRAINT mytable_myfield_fkey', 'Alter drop un-named Foreign Key constraint works');
}
}

# check named, and unnamed primary keys
for my $name ( 'foo', undef ) {
my $pk_constraint = SQL::Translator::Schema::Constraint->new(
table => $table,
name => $name,
fields => [qw(myfield)],
type => 'PRIMARY_KEY',
);
my $pk_constraint_2 = SQL::Translator::Schema::Constraint->new(
table => $table,
name => $name,
fields => [qw(myfield)],
type => 'PRIMARY_KEY',
);

my ($pk_constraint_def_ref, $pk_constraint_pk_ref ) = SQL::Translator::Producer::PostgreSQL::create_constraint($pk_constraint);

if ( $name ) {
is($pk_constraint_def_ref->[0], "CONSTRAINT $name PRIMARY KEY (myfield)", 'Create Primary Key Constraint works');

# ToDo: may we should check if the constraint name was valid, or if next
# unused_name created has choosen a different one
my $alter_pk_constraint = SQL::Translator::Producer::PostgreSQL::alter_drop_constraint($pk_constraint);
is($alter_pk_constraint, "ALTER TABLE mytable DROP CONSTRAINT $name", 'Alter drop Primary Key constraint works');
}
else {
is($pk_constraint_def_ref->[0], 'PRIMARY KEY (myfield)', 'Create un-named Primary Key Constraint works');

my $alter_pk_constraint = SQL::Translator::Producer::PostgreSQL::alter_drop_constraint($pk_constraint);
is($alter_pk_constraint, 'ALTER TABLE mytable DROP CONSTRAINT mytable_pkey', 'Alter drop un-named Foreign Key constraint works');
}
}

my $alter_field = SQL::Translator::Producer::PostgreSQL::alter_field($field1,
$field2);
Expand Down