Reformat tests/comments a bit
Peter Rabbitson [Tue, 27 Apr 2010 14:53:34 +0000 (14:53 +0000)]
lib/DBIx/Class/Storage/DBI.pm
t/sqlahacks/limit_dialects/rownumberover.t
t/sqlahacks/limit_dialects/toplimit.t

index 8e303b8..68593da 100644 (file)
@@ -42,7 +42,6 @@ __PACKAGE__->mk_group_accessors('inherited' => qw/
 /);
 __PACKAGE__->sql_maker_class('DBIx::Class::SQLAHacks');
 
-
 # Each of these methods need _determine_driver called before itself
 # in order to function reliably. This is a purely DRY optimization
 my @rdbms_specific_methods = qw/
@@ -1874,7 +1873,7 @@ sub _select_args {
     #limited has_many
     ( $attrs->{rows} && keys %{$attrs->{collapse}} )
        ||
-    # limited prefetch with RNO subqueries
+    # limited prefetch with RNO subqueries (otherwise a risk of column name clashes)
     (
       $attrs->{rows}
         &&
@@ -1885,7 +1884,7 @@ sub _select_args {
       @{$attrs->{_prefetch_select}}
     )
       ||
-    # grouped prefetch
+    # grouped prefetch (to satisfy group_by == select)
     ( $attrs->{group_by}
         &&
       @{$attrs->{group_by}}
@@ -1900,6 +1899,8 @@ sub _select_args {
   }
 
   elsif (
+    # the RNO limit dialect mangles the SQL such that the join gets lost
+    # wrap a subquery here
     ($attrs->{rows} || $attrs->{offset})
       &&
     $sql_maker->limit_dialect eq 'RowNumberOver'
@@ -1908,8 +1909,6 @@ sub _select_args {
       &&
     scalar $self->_parse_order_by ($attrs->{order_by})
   ) {
-    # the RNO limit dialect above mangles the SQL such that the join gets lost
-    # wrap a subquery here
 
     push @limit, delete @{$attrs}{qw/rows offset/};
 
index 64a68d7..2c11c58 100644 (file)
@@ -11,48 +11,67 @@ my $schema = DBICTest->init_schema;
 delete $schema->storage->_sql_maker->{_cached_syntax};
 $schema->storage->_sql_maker->limit_dialect ('RowNumberOver');
 
-my $rs_selectas_col = $schema->resultset ('BooksInLibrary')->search ({}, { '+select' => ['owner.name'], '+as' => ['owner.name'], join => 'owner', rows => 1 });
-
-is_same_sql_bind( $rs_selectas_col->search({})->as_query,
-                  "(SELECT 
-                      me.id, me.source, me.owner, me.title, me.price, 
-                      owner.name 
-                    FROM 
-                      (SELECT me.*, 
-                       ROW_NUMBER() OVER( ) AS rno__row__index 
-                       FROM 
-                         (SELECT me.id, me.source, me.owner, me.title, me.price, owner.name 
-                          FROM books me 
-                          JOIN owners owner ON owner.id = me.owner 
-                          WHERE ( source = ? ) 
-                         ) me 
-                       ) me 
-                    JOIN owners owner ON owner.id = me.owner
-                    WHERE rno__row__index BETWEEN 1 AND 1 )",
-                  [  [ 'source', 'Library' ] ],
-                );
-
-
-my $rs_selectas_rel = $schema->resultset ('BooksInLibrary')->search ({}, { '+select' => ['owner.name'], '+as' => ['owner_name'], join => 'owner', rows => 1 });
-
-is_same_sql_bind( $rs_selectas_rel->search({})->as_query,
-                  "(SELECT 
-                      me.id, me.source, me.owner, me.title, me.price, 
-                      owner.name 
-                    FROM 
-                      (SELECT me.*, 
-                       ROW_NUMBER() OVER( ) AS rno__row__index 
-                       FROM 
-                         (SELECT me.id, me.source, me.owner, me.title, me.price, owner.name 
-                          FROM books me 
-                          JOIN owners owner ON owner.id = me.owner 
-                          WHERE ( source = ? ) 
-                         ) me 
-                       ) me 
-                    JOIN owners owner ON owner.id = me.owner
-                    WHERE rno__row__index BETWEEN 1 AND 1 )",
-                  [  [ 'source', 'Library' ] ],
-                );
+my $rs_selectas_col = $schema->resultset ('BooksInLibrary')->search ({}, {
+  '+select' => ['owner.name'],
+  '+as' => ['owner.name'],
+  join => 'owner',
+  rows => 1,
+});
 
+use Data::Dumper;
+$Data::Dumper::Maxdepth = 4;
+#die Dumper $rs_selectas_col->_resolved_attrs;
+
+is_same_sql_bind(
+  $rs_selectas_col->as_query,
+  '(
+    SELECT  me.id, me.source, me.owner, me.title, me.price,
+            owner.name
+      FROM (
+        SELECT  me.*,
+                ROW_NUMBER() OVER( ) AS rno__row__index
+          FROM (
+            SELECT  me.id, me.source, me.owner, me.title, me.price,
+                    owner.name
+              FROM books me
+              JOIN owners owner ON owner.id = me.owner
+            WHERE ( source = ? )
+          ) me
+      ) me
+      JOIN owners owner ON owner.id = me.owner
+    WHERE rno__row__index BETWEEN 1 AND 1
+  )',
+  [  [ 'source', 'Library' ] ],
+);
+
+
+my $rs_selectas_rel = $schema->resultset ('BooksInLibrary')->search ({}, {
+  '+select' => ['owner.name'],
+  '+as' => ['owner_name'],
+  join => 'owner',
+  rows => 1
+});
+
+is_same_sql_bind(
+  $rs_selectas_rel->as_query,
+  '(
+    SELECT  me.id, me.source, me.owner, me.title, me.price,
+            owner.name
+      FROM (
+        SELECT  me.*,
+                ROW_NUMBER() OVER( ) AS rno__row__index
+          FROM (
+            SELECT  me.id, me.source, me.owner, me.title, me.price,
+                    owner.name
+              FROM books me
+              JOIN owners owner ON owner.id = me.owner
+            WHERE ( source = ? )
+          ) me
+      ) me
+      JOIN owners owner ON owner.id = me.owner
+    WHERE rno__row__index BETWEEN 1 AND 1
+  )',
+  [ [ 'source', 'Library' ] ],
+);
 
 done_testing;
index b449850..0f10062 100644 (file)
@@ -119,8 +119,6 @@ my @tests = (
 
 my @default_tests = ( undef, '', {}, [] );
 
-# plan (tests => scalar @tests + scalar @default_tests + 1);
-
 test_order ($_) for @tests;
 default_test_order ($_) for @default_tests;
 
@@ -151,17 +149,22 @@ me.id, me.source, me.owner, me.title, me.price, owner.id, owner.name FROM
   [ [ source => 'Library' ], [ source => 'Library' ] ],
 );
 
-my $rs_selectas_top = $schema->resultset ('BooksInLibrary')->search ({}, { '+select' => ['owner.name'], '+as' => ['owner_name'], join => 'owner', rows => 1 });
+my $rs_selectas_top = $schema->resultset ('BooksInLibrary')->search ({}, {
+  '+select' => ['owner.name'],
+  '+as' => ['owner_name'],
+  join => 'owner',
+  rows => 1 
+});
 
 is_same_sql_bind( $rs_selectas_top->search({})->as_query,
-                  "(SELECT 
-                      TOP 1 me.id, me.source, me.owner, me.title, me.price, 
-                      owner.name 
-                    FROM books me 
-                    JOIN owners owner ON owner.id = me.owner 
-                    WHERE ( source = ? )  
+                  '(SELECT
+                      TOP 1 me.id, me.source, me.owner, me.title, me.price,
+                      owner.name
+                    FROM books me
+                    JOIN owners owner ON owner.id = me.owner
+                    WHERE ( source = ? )
                     ORDER BY me.id ASC
-                   )",
+                   )',
                    [ [ 'source', 'Library' ] ],
                 );