From: Robert Bohne Date: Sun, 13 Jun 2010 16:56:13 +0000 (+0200) Subject: Fixed test for hierarchical queries with Oracle 8i. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=ba12b23f087c99f1e773551eb253ac8cf89febf8;p=dbsrgits%2FDBIx-Class-Historic.git Fixed test for hierarchical queries with Oracle 8i. --- diff --git a/lib/DBIx/Class/SQLMaker/OracleJoins.pm b/lib/DBIx/Class/SQLMaker/OracleJoins.pm index 8350198..b62c483 100644 --- a/lib/DBIx/Class/SQLMaker/OracleJoins.pm +++ b/lib/DBIx/Class/SQLMaker/OracleJoins.pm @@ -1,7 +1,7 @@ package # Hide from PAUSE DBIx::Class::SQLMaker::OracleJoins; -use base qw( DBIx::Class::SQLMaker ); +use base qw( DBIx::Class::SQLMaker::Oracle ); use Carp::Clan qw/^DBIx::Class|^SQL::Abstract/; sub select { diff --git a/t/73oracle.t b/t/73oracle.t index bb34e50..0013927 100644 --- a/t/73oracle.t +++ b/t/73oracle.t @@ -52,6 +52,8 @@ plan skip_all => 'Set $ENV{DBICTEST_ORA_DSN}, _USER and _PASS to run this test. DBICTest::Schema->load_classes('ArtistFQN'); my $schema = DBICTest::Schema->connect($dsn, $user, $pass); +note "Oracle Version: " . $schema->storage->_server_info->{dbms_version}; + my $dbh = $schema->storage->dbh; do_creates($dbh); @@ -400,7 +402,11 @@ if ( $schema->storage->isa('DBIx::Class::Storage::DBI::Oracle::Generic') ) { } # use order siblings by statement - { + SKIP: { + # http://download.oracle.com/docs/cd/A87860_01/doc/server.817/a85397/state21b.htm#2066123 + skip q{Oracle8i doesn't support ORDER SIBLINGS BY}, 1 + if $schema->storage->_server_info->{normalized_dbms_version} < 9; + my $rs = $schema->resultset('Artist')->search({}, { start_with => { name => 'root' }, connect_by => { parentid => { -prior => \ 'artistid' } }, @@ -453,7 +459,11 @@ if ( $schema->storage->isa('DBIx::Class::Storage::DBI::Oracle::Generic') ) { } # combine a connect by with a join - { + SKIP: { + # http://download.oracle.com/docs/cd/A87860_01/doc/server.817/a85397/state21b.htm#2066123 + skip q{Oracle8i doesn't support connect by with join}, 1 + if $schema->storage->_server_info->{normalized_dbms_version} < 9; + my $rs = $schema->resultset('Artist')->search( {'cds.title' => { -like => '%cd'} }, { @@ -511,7 +521,7 @@ if ( $schema->storage->isa('DBIx::Class::Storage::DBI::Oracle::Generic') ) { $rs->as_query, '( SELECT me.artistid, me.name, me.rank, me.charfield, me.parentid - FROM artist me + FROM artist me START WITH name = ? CONNECT BY parentid = PRIOR artistid ORDER BY LEVEL ASC, name ASC @@ -519,16 +529,33 @@ if ( $schema->storage->isa('DBIx::Class::Storage::DBI::Oracle::Generic') ) { [ [ name => 'root' ] ], ); + + # Don't use "$rs->get_column ('name')->all" they build a query arround the $rs. + # If $rs has a order by, the order by is in the subquery and this doesn't work with Oracle 8i. + # TODO: write extra test and fix order by handling on Oracle 8i is_deeply ( - [ $rs->get_column ('name')->all ], + [ map { $_->[1] } $rs->cursor->all ], [ qw/root child1 child2 grandchild greatgrandchild/ ], - 'Connect By with a order_by - result name ok' + 'Connect By with a order_by - result name ok (without get_column)' ); + + SKIP: { + skip q{Connect By with a order_by - result name ok (with get_column), Oracle8i doesn't support order by in a subquery},1 + if $schema->storage->_server_info->{normalized_dbms_version} < 9; + is_deeply ( + [ $rs->get_column ('name')->all ], + [ qw/root child1 child2 grandchild greatgrandchild/ ], + 'Connect By with a order_by - result name ok (with get_column)' + ); + } } # limit a connect by - { + SKIP: { + skip q{Oracle8i doesn't support order by in a subquery}, 1 + if $schema->storage->_server_info->{normalized_dbms_version} < 9; + my $rs = $schema->resultset('Artist')->search({}, { start_with => { name => 'root' }, connect_by => { parentid => { -prior => \ 'artistid' } }, @@ -562,12 +589,6 @@ if ( $schema->storage->isa('DBIx::Class::Storage::DBI::Oracle::Generic') ) { 'LIMIT a Connect By query - correct names' ); - # TODO: - # prints "START WITH name = ? - # CONNECT BY artistid = PRIOR parentid " - # after count_subq, - # I will fix this later... - # is_same_sql_bind ( $rs->count_rs->as_query, '( @@ -634,7 +655,11 @@ if ( $schema->storage->isa('DBIx::Class::Storage::DBI::Oracle::Generic') ) { } # select the whole cycle tree with nocylce - { + SKIP: { + # http://download.oracle.com/docs/cd/A87860_01/doc/server.817/a85397/expressi.htm#1023748 + skip q{Oracle8i doesn't support connect by nocycle}, 1 + if $schema->storage->_server_info->{normalized_dbms_version} < 9; + my $rs = $schema->resultset('Artist')->search({}, { start_with => { name => 'cycle-root' }, '+select' => [ \ 'CONNECT_BY_ISCYCLE' ],