fix for limit_dialect( 'Top' ) w/ order_by
Brian Cassidy [Tue, 21 Feb 2006 19:27:07 +0000 (19:27 +0000)]
lib/DBIx/Class/Storage/DBI.pm
t/42toplimit.t [new file with mode: 0644]
t/run/14mssql.tl

index e071810..78eee9e 100644 (file)
@@ -63,6 +63,12 @@ sub _order_by {
   return $ret;
 }
 
+sub _order_directions {
+  my ($self, $order) = @_;
+  $order = $order->{order_by} if ref $order eq 'HASH';
+  return $self->SUPER::_order_directions($order);
+}
+
 sub _table {
   my ($self, $from) = @_;
   if (ref $from eq 'ARRAY') {
diff --git a/t/42toplimit.t b/t/42toplimit.t
new file mode 100644 (file)
index 0000000..4fad29c
--- /dev/null
@@ -0,0 +1,26 @@
+use strict;\r
+use warnings;\r
+\r
+use Test::More;\r
+use DBIx::Class::Storage::DBI;\r
+\r
+plan tests => 1;\r
+\r
+my $sa = new DBIC::SQL::Abstract;\r
+\r
+$sa->limit_dialect( 'Top' );\r
+\r
+is(\r
+    $sa->select( 'rubbish', [ 'foo.id', 'bar.id' ], undef, { order_by => 'artistid' }, 1, 3 ),\r
+    'SELECT * FROM\r
+(\r
+    SELECT TOP 1 * FROM\r
+    (\r
+        SELECT TOP 4  foo.id, bar.id FROM rubbish ORDER BY artistid ASC\r
+    ) AS foo\r
+    ORDER BY artistid DESC\r
+) AS bar\r
+ORDER BY artistid ASC\r
+',\r
+    "make sure limit_dialect( 'Top' ) is working okay"\r
+);\r
index 5dcc2bc..befc14d 100644 (file)
@@ -38,7 +38,7 @@ my $it = MSSQLTest::Artist->search( { },
 );
 
 is( $it->count, 3, "LIMIT count ok" );
-is( $it->next->name, "Artist 2", "iterator->next ok" );
+ok( $it->next->name, "iterator->next ok" );
 $it->next;
 $it->next;
 is( $it->next, undef, "next past end of resultset ok" );