From: Peter Rabbitson Date: Mon, 31 May 2010 15:13:28 +0000 (+0000) Subject: Fix Top-limit problem of missed bindvars X-Git-Tag: v0.08122~46 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=25abda27234677d2fc89230c0e11bb2fe56b6b20;p=dbsrgits%2FDBIx-Class.git Fix Top-limit problem of missed bindvars --- diff --git a/lib/DBIx/Class/SQLAHacks.pm b/lib/DBIx/Class/SQLAHacks.pm index d2dc16e..faa3a48 100644 --- a/lib/DBIx/Class/SQLAHacks.pm +++ b/lib/DBIx/Class/SQLAHacks.pm @@ -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 diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index 1bc266e..1989821 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -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 ); diff --git a/t/746mssql.t b/t/746mssql.t index 1438cee..a4d6001 100644 --- a/t/746mssql.t +++ b/t/746mssql.t @@ -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");