Fixed test for hierarchical queries with Oracle 8i.
[dbsrgits/DBIx-Class.git] / t / 73oracle.t
index b353e37..0013927 100644 (file)
@@ -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' ],
@@ -692,7 +717,7 @@ SKIP: {
   my $schema1_dbh  = $schema->storage->dbh;
 
   $schema1_dbh->do("GRANT INSERT ON artist TO $user2");
-  $schema1_dbh->do("GRANT SELECT ON artist_seq TO $user2");
+  $schema1_dbh->do("GRANT SELECT ON artist_pk_seq TO $user2");
 
   my $rs = $schema2->resultset('ArtistFQN');
 
@@ -704,14 +729,13 @@ SKIP: {
   } 'used autoinc sequence across schemas';
 
   # now quote the sequence name
-
   $schema1_dbh->do(qq{
-    CREATE OR REPLACE TRIGGER artist_insert_trg
+    CREATE OR REPLACE TRIGGER artist_insert_trg_pk
     BEFORE INSERT ON artist
     FOR EACH ROW
     BEGIN
       IF :new.artistid IS NULL THEN
-        SELECT "ARTIST_SEQ".nextval
+        SELECT "ARTIST_PK_SEQ".nextval
         INTO :new.artistid
         FROM DUAL;
       END IF;
@@ -729,7 +753,7 @@ SKIP: {
   my $schema_name = uc $user;
 
   is $rs->result_source->column_info('artistid')->{sequence},
-    qq[${schema_name}."ARTIST_SEQ"],
+    qq[${schema_name}."ARTIST_PK_SEQ"],
     'quoted sequence name correctly extracted';
 }