Removed unintentionally doubled cd pk trigger from t/73oracle.t
[dbsrgits/DBIx-Class.git] / t / 73oracle.t
index bb34e50..f54f0ee 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);
@@ -359,13 +361,13 @@ if ( $schema->storage->isa('DBIx::Class::Storage::DBI::Oracle::Generic') ) {
     );
 
     $schema->resultset('Artist')->find({ name => 'cycle-root' })
-      ->update({ parentid => \'artistid' });
+      ->update({ parentid => { -ident => 'artistid' } });
 
     # select the whole tree
     {
       my $rs = $schema->resultset('Artist')->search({}, {
         start_with => { name => 'root' },
-        connect_by => { parentid => { -prior => \ 'artistid' } },
+        connect_by => { parentid => { -prior => { -ident => 'artistid' } } },
       });
 
       is_same_sql_bind (
@@ -400,10 +402,14 @@ 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' } },
+        connect_by => { parentid => { -prior => { -ident =>  'artistid' } } },
         order_siblings_by => { -desc => 'name' },
       });
 
@@ -430,7 +436,7 @@ if ( $schema->storage->isa('DBIx::Class::Storage::DBI::Oracle::Generic') ) {
     {
       my $rs = $schema->resultset('Artist')->search({ parentid => undef }, {
         start_with => { name => 'root' },
-        connect_by => { parentid => { -prior => \ 'artistid' } },
+        connect_by => { parentid => { -prior => { -ident => 'artistid' } } },
       });
 
       is_same_sql_bind (
@@ -453,13 +459,17 @@ 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'} },
         {
           join => 'cds',
           start_with => { 'me.name' => 'root' },
-          connect_by => { parentid => { -prior => \ 'artistid' } },
+          connect_by => { parentid => { -prior => { -ident => 'artistid' } } },
         }
       );
 
@@ -503,7 +513,7 @@ if ( $schema->storage->isa('DBIx::Class::Storage::DBI::Oracle::Generic') ) {
     {
       my $rs = $schema->resultset('Artist')->search({}, {
         start_with => { name => 'root' },
-        connect_by => { parentid => { -prior => \ 'artistid' } },
+        connect_by => { parentid => { -prior => { -ident => 'artistid' } } },
         order_by => { -asc => [ 'LEVEL', 'name' ] },
       });
 
@@ -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,19 +529,36 @@ 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' } },
+        connect_by => { parentid => { -prior => { -ident => 'artistid' } } },
         order_by => { -asc => 'name' },
         rows => 2,
       });
@@ -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,
         '(
@@ -594,7 +615,7 @@ if ( $schema->storage->isa('DBIx::Class::Storage::DBI::Oracle::Generic') ) {
       my $rs = $schema->resultset('Artist')->search({}, {
         select => ['count(rank)'],
         start_with => { name => 'root' },
-        connect_by => { parentid => { -prior => \ 'artistid' } },
+        connect_by => { parentid => { -prior => { -ident => 'artistid' } } },
         group_by => ['rank'],
         having => { 'count(rank)' => { '<', 2 } },
       });
@@ -623,7 +644,7 @@ if ( $schema->storage->isa('DBIx::Class::Storage::DBI::Oracle::Generic') ) {
     {
       my $rs = $schema->resultset('Artist')->search({}, {
         start_with => { name => 'cycle-root' },
-        connect_by => { parentid => { -prior => \ 'artistid' } },
+        connect_by => { parentid => { -prior => { -ident => 'artistid' } } },
       });
       eval { $rs->get_column ('name')->all };
       if ( $@ =~ /ORA-01436/ ){ # ORA-01436:  CONNECT BY loop in user data
@@ -634,11 +655,15 @@ 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' ],
-        connect_by_nocycle => { parentid => { -prior => \ 'artistid' } },
+        connect_by_nocycle => { parentid => { -prior => { -ident => 'artistid' } } },
       });
 
       is_same_sql_bind (
@@ -682,11 +707,19 @@ my $schema2;
 
 # test sequence detection from a different schema
 SKIP: {
+TODO: {
   skip ((join '',
 'Set DBICTEST_ORA_EXTRAUSER_DSN, _USER and _PASS to a *DIFFERENT* Oracle user',
 ' to run the cross-schema autoincrement test.'),
     1) unless $dsn2 && $user2 && $user2 ne $user;
 
+  # Oracle8i Reference Release 2 (8.1.6) 
+  #   http://download.oracle.com/docs/cd/A87860_01/doc/server.817/a76961/ch294.htm#993
+  # Oracle Database Reference 10g Release 2 (10.2)
+  #   http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/statviews_2107.htm#sthref1297
+  local $TODO = "On Oracle8i all_triggers view is empty, i don't yet know why..."
+    if $schema->storage->_server_info->{normalized_dbms_version} < 9;
+
   $schema2 = DBICTest::Schema->connect($dsn2, $user2, $pass2);
 
   my $schema1_dbh  = $schema->storage->dbh;
@@ -730,7 +763,7 @@ SKIP: {
   is $rs->result_source->column_info('artistid')->{sequence},
     qq[${schema_name}."ARTIST_PK_SEQ"],
     'quoted sequence name correctly extracted';
-}
+} }
 
 done_testing;
 
@@ -807,18 +840,6 @@ sub do_creates {
     END;
   });
   $dbh->do(qq{
-    CREATE OR REPLACE TRIGGER cd_insert_trg
-    BEFORE INSERT ON cd
-    FOR EACH ROW
-    BEGIN
-      IF :new.cdid IS NULL THEN
-        SELECT cd_seq.nextval
-        INTO :new.cdid
-        FROM DUAL;
-      END IF;
-    END;
-  });
-  $dbh->do(qq{
     CREATE OR REPLACE TRIGGER track_insert_trg
     BEFORE INSERT ON track
     FOR EACH ROW