/);
__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/
#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}
&&
@{$attrs->{_prefetch_select}}
)
||
- # grouped prefetch
+ # grouped prefetch (to satisfy group_by == select)
( $attrs->{group_by}
&&
@{$attrs->{group_by}}
}
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'
&&
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/};
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;
my @default_tests = ( undef, '', {}, [] );
-# plan (tests => scalar @tests + scalar @default_tests + 1);
-
test_order ($_) for @tests;
default_test_order ($_) for @default_tests;
[ [ 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' ] ],
);