Skip to content

Commit

Permalink
Add tests for disabled constraints and triggers for Oracle
Browse files Browse the repository at this point in the history
Also use the existing deferrability check to skip disabled foreign
keys even if DBD::Oracle returns them.
  • Loading branch information
ilmari committed May 13, 2015
1 parent 48c1a6c commit e38d150
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 8 deletions.
11 changes: 7 additions & 4 deletions lib/DBIx/Class/Schema/Loader/DBI/Oracle.pm
Original file line number Diff line number Diff line change
Expand Up @@ -88,19 +88,22 @@ select deferrable from all_constraints
where owner = ? and table_name = ? and constraint_name = ? and status = 'ENABLED'
EOF

my @enabled_rels;
foreach my $rel (@$rels) {
# Oracle does not have update rules
$rel->{attrs}{on_update} = 'NO ACTION';;

# DBD::Oracle's foreign_key_info does not return DEFERRABILITY, so we get it ourselves
my ($deferrable) = $self->dbh->selectrow_array(
# Also use this to filter out disabled foreign keys, which are returned by DBD::Oracle < 1.76
my $deferrable = $self->dbh->selectrow_array(
$deferrable_sth, undef, $table->schema, $table->name, $rel->{_constraint_name}
);
) or next;

$rel->{attrs}{is_deferrable} = $deferrable && $deferrable =~ /^DEFERRABLE/i ? 1 : 0;
$rel->{attrs}{is_deferrable} = $deferrable =~ /^DEFERRABLE/i ? 1 : 0;
push @enabled_rels, $rel;
}

return $rels;
return \@enabled_rels;
}

sub _table_uniq_info {
Expand Down
32 changes: 28 additions & 4 deletions t/10_05ora_common.t
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ my $auto_inc_cb = sub {
return (
qq{ CREATE SEQUENCE ${table}_${col}_seq START WITH 1 INCREMENT BY 1},
qq{
CREATE OR REPLACE TRIGGER ${table}_${col}_trigger
CREATE OR REPLACE TRIGGER ${table}_${col}_trg
BEFORE INSERT ON ${table}
FOR EACH ROW
BEGIN
Expand Down Expand Up @@ -181,9 +181,18 @@ my $tester = dbixcsl_common_tests->new(
on delete set null deferrable
)
},
q{
create table oracle_loader_test11 (
id int primary key disable,
ten_id int unique disable,
foreign key (ten_id) references oracle_loader_test10(id) disable
)
},
$auto_inc_cb->('oracle_loader_test11', 'id'),
'alter trigger oracle_loader_test11_id_trg disable',
],
drop => [qw/oracle_loader_test1 oracle_loader_test9 oracle_loader_test10/],
count => 7 + 31 * 2,
drop => [qw/oracle_loader_test1 oracle_loader_test9 oracle_loader_test10 oracle_loader_test11/],
count => 10 + 31 * 2, # basic + cross-schema * 2
run => sub {
my ($monikers, $classes);
($schema, $monikers, $classes) = @_;
Expand Down Expand Up @@ -223,6 +232,19 @@ my $tester = dbixcsl_common_tests->new(
is $rel_info->{attrs}{is_deferrable}, 1,
'DEFERRABLE clause introspected correctly';

my $source11 = $schema->source('OracleLoaderTest11');

# DBD::Oracle < 1.76 doesn't filter out disabled primary keys
my $uniqs = eval { DBD::Oracle->VERSION('1.76') } ? [] : ['primary'];
is_deeply [keys %{{$source11->unique_constraints}}], $uniqs,
'Disabled unique constraints not loaded';

ok !$source11->relationship_info('ten'),
'Disabled FK not loaded';

ok !$source11->column_info('id')->{is_auto_increment},
'Disabled autoinc trigger not loaded';

SKIP: {
skip 'Set the DBICTEST_ORA_EXTRAUSER_DSN, _USER and _PASS environment variables to run the cross-schema relationship tests', 31 * 2
unless $ENV{DBICTEST_ORA_EXTRAUSER_DSN};
Expand Down Expand Up @@ -485,8 +507,10 @@ else {

END {
if (not $ENV{SCHEMA_LOADER_TESTS_NOCLEANUP}) {
my $dbh1 = $schema->storage->dbh;
$dbh1->do($_) for $auto_inc_drop_cb->('oracle_loader_test11','id');

if (my $dbh2 = try { $extra_schema->storage->dbh }) {
my $dbh1 = $schema->storage->dbh;

try {
$dbh1->do($_) for $auto_inc_drop_cb->('oracle_loader_test8', 'id');
Expand Down

0 comments on commit e38d150

Please sign in to comment.