Fix Top-limit problem of missed bindvars
Peter Rabbitson [Mon, 31 May 2010 15:13:28 +0000 (15:13 +0000)]
lib/DBIx/Class/SQLAHacks.pm
lib/DBIx/Class/Storage/DBI.pm
t/746mssql.t

index d2dc16e..faa3a48 100644 (file)
@@ -340,6 +340,12 @@ sub _Top {
 
       $mid_sel .= ', ' . $extra_order_sel->{$extra_col};
     }
+
+    # since whatever order bindvals there are, they will be realiased
+    # and need to show up in front of the entire initial inner subquery
+    # Unshift *from_bind* to make this happen (horrible, horrible, but
+    # we don't have another mechanism yet)
+    unshift @{$self->{from_bind}}, @{$self->{order_bind}};
   }
 
   # and this is order re-alias magic
index 1bc266e..1989821 100644 (file)
@@ -1466,7 +1466,9 @@ sub _dbh_execute {
 
   # Can this fail without throwing an exception anyways???
   my $rv = $sth->execute();
-  $self->throw_exception($sth->errstr) if !$rv;
+  $self->throw_exception(
+    $sth->errstr || $sth->err || 'Unknown error: execute() returned false, but error flags were not set...'
+  ) if !$rv;
 
   $self->_query_end( $sql, @$bind );
 
index 1438cee..a4d6001 100644 (file)
@@ -301,6 +301,7 @@ for my $dialect (
       is ($limited_rs->count_rs->next, 6, "$test_type: Correct count_rs of limited right-sorted joined resultset");
 
       my $queries;
+      my $orig_debug = $schema->storage->debug;
       $schema->storage->debugcb(sub { $queries++; });
       $schema->storage->debug(1);
 
@@ -312,7 +313,7 @@ for my $dialect (
       is ($queries, 1, "$test_type: Only one query with prefetch");
 
       $schema->storage->debugcb(undef);
-      $schema->storage->debug(0);
+      $schema->storage->debug($orig_debug);
 
       is_deeply (
         [map { $_->name } ($limited_rs->search_related ('owner')->all) ],
@@ -338,7 +339,10 @@ for my $dialect (
     my ($sql, @bind) = @${$owners->page(3)->as_query};
     is_deeply (
       \@bind,
-      [ ([ 'me.name' => 'somebogusstring' ], [ test => 'xxx' ]) x 2 ],  # double because of the prefetch subq
+      [
+        $dialect eq 'Top' ? [ test => 'xxx' ] : (),                 # the extra re-order bind
+        ([ 'me.name' => 'somebogusstring' ], [ test => 'xxx' ]) x 2 # double because of the prefetch subq
+      ],
     );
 
     is ($owners->page(1)->all, 3, "$test_type: has_many prefetch returns correct number of rows");