From: Peter Rabbitson Date: Tue, 27 Apr 2010 14:53:34 +0000 (+0000) Subject: Reformat tests/comments a bit X-Git-Tag: v0.08122~99 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits%2FDBIx-Class.git;a=commitdiff_plain;h=41eac66492bf7c8a93b0a057ed5bd44b712cebb2 Reformat tests/comments a bit --- diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index 8e303b8..68593da 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -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/}; diff --git a/t/sqlahacks/limit_dialects/rownumberover.t b/t/sqlahacks/limit_dialects/rownumberover.t index 64a68d7..2c11c58 100644 --- a/t/sqlahacks/limit_dialects/rownumberover.t +++ b/t/sqlahacks/limit_dialects/rownumberover.t @@ -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; diff --git a/t/sqlahacks/limit_dialects/toplimit.t b/t/sqlahacks/limit_dialects/toplimit.t index b449850..0f10062 100644 --- a/t/sqlahacks/limit_dialects/toplimit.t +++ b/t/sqlahacks/limit_dialects/toplimit.t @@ -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' ] ], );