X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fsqlmaker%2Flimit_dialects%2Frno.t;h=457cf7dfdc13c0a893fb7c93393d9153ea142e5e;hb=f74d22e;hp=04fb045eaddc8563c8b4ad4554f928bbaeb7fdf0;hpb=0e773352a9c6c034dfb2526b8d68bf6ac1e2323b;p=dbsrgits%2FDBIx-Class.git diff --git a/t/sqlmaker/limit_dialects/rno.t b/t/sqlmaker/limit_dialects/rno.t index 04fb045..457cf7d 100644 --- a/t/sqlmaker/limit_dialects/rno.t +++ b/t/sqlmaker/limit_dialects/rno.t @@ -5,6 +5,12 @@ use Test::More; use lib qw(t/lib); use DBICTest; use DBIC::SqlMakerTest; +use DBIx::Class::SQLMaker::LimitDialects; + +my ($TOTAL, $OFFSET) = ( + DBIx::Class::SQLMaker::LimitDialects->__total_bindtype, + DBIx::Class::SQLMaker::LimitDialects->__offset_bindtype, +); my $schema = DBICTest->init_schema; @@ -34,10 +40,13 @@ is_same_sql_bind( WHERE ( source = ? ) ) me ) me - WHERE rno__row__index BETWEEN 1 AND 1 + WHERE rno__row__index >= ? AND rno__row__index <= ? )', - [ [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } - => 'Library' ] ], + [ + [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ], + [ $OFFSET => 1 ], + [ $TOTAL => 1 ], + ], ); $schema->storage->_sql_maker->quote_char ([qw/ [ ] /]); @@ -67,13 +76,96 @@ is_same_sql_bind( WHERE ( [source] = ? ) ) [me] ) [me] - WHERE [rno__row__index] BETWEEN 1 AND 1 + WHERE [rno__row__index] >= ? AND [rno__row__index] <= ? )', - [ [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } - => 'Library' ] ], + [ + [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ], + [ $OFFSET => 1 ], + [ $TOTAL => 1 ], + ], ); { +my $subq = $schema->resultset('Owners')->search({ + 'count.id' => { -ident => 'owner.id' }, + 'count.name' => 'fail', # no one would do this in real life +}, { alias => 'owner' })->count_rs; + +my $rs_selectas_rel = $schema->resultset('BooksInLibrary')->search ({}, { + columns => [ + { owner_name => 'owner.name' }, + { owner_books => $subq->as_query }, + ], + join => 'owner', + rows => 1, +}); + +is_same_sql_bind( + $rs_selectas_rel->as_query, + '( + SELECT [owner_name], [owner_books] + FROM ( + SELECT [owner_name], [owner_books], ROW_NUMBER() OVER( ) AS [rno__row__index] + FROM ( + SELECT [owner].[name] AS [owner_name], + ( SELECT COUNT( * ) FROM [owners] [owner] + WHERE [count].[id] = [owner].[id] and [count].[name] = ? ) AS [owner_books] + FROM [books] [me] + JOIN [owners] [owner] ON [owner].[id] = [me].[owner] + WHERE ( [source] = ? ) + ) [me] + ) [me] + WHERE [rno__row__index] >= ? AND [rno__row__index] <= ? + )', + [ + [ { dbic_colname => 'count.name' } => 'fail' ], + [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ], + [ $OFFSET => 1 ], + [ $TOTAL => 1 ], + ], +); + +}{ +my $subq = $schema->resultset('Owners')->search({ + 'count.id' => { -ident => 'owner.id' }, +}, { alias => 'owner' })->count_rs; + +my $rs_selectas_rel = $schema->resultset('BooksInLibrary')->search ({}, { + columns => [ + { owner_name => 'owner.name' }, + { owner_books => $subq->as_query }, + ], + join => 'owner', + rows => 1, +}); + +is_same_sql_bind( + $rs_selectas_rel->as_query, + '( + SELECT [owner_name], [owner_books] + FROM ( + SELECT [owner_name], [owner_books], ROW_NUMBER() OVER( ) AS [rno__row__index] + FROM ( + SELECT [owner].[name] AS [owner_name], + ( SELECT COUNT( * ) FROM [owners] [owner] WHERE [count].[id] = [owner].[id] ) AS [owner_books] + FROM [books] [me] + JOIN [owners] [owner] ON [owner].[id] = [me].[owner] + WHERE ( [source] = ? ) + ) [me] + ) [me] + WHERE [rno__row__index] >= ? AND [rno__row__index] <= ? + )', + [ + [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } + => 'Library' ], + [ $OFFSET => 1 ], + [ $TOTAL => 1 ], + ], +); + +} + +{ my $rs = $schema->resultset('Artist')->search({}, { columns => 'name', offset => 1, @@ -88,5 +180,35 @@ is_same_sql_bind( ); } +{ +my $subq = $schema->resultset('Owners')->search({ + 'books.owner' => { -ident => 'owner.id' }, +}, { alias => 'owner', select => ['id'] } )->count_rs; + +my $rs_selectas_rel = $schema->resultset('BooksInLibrary')->search( { -exists => $subq->as_query }, { select => ['id','owner'], rows => 1 } ); + +is_same_sql_bind( + $rs_selectas_rel->as_query, + '( + SELECT [id], [owner] FROM ( + SELECT [id], [owner], ROW_NUMBER() OVER( ) AS [rno__row__index] FROM ( + SELECT [me].[id], [me].[owner] + FROM [books] [me] + WHERE ( ( (EXISTS ( + SELECT COUNT( * ) FROM [owners] [owner] WHERE ( [books].[owner] = [owner].[id] ) + )) AND [source] = ? ) ) + ) [me] + ) [me] WHERE [rno__row__index] >= ? AND [rno__row__index] <= ? + )', + [ + [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ], + [ $OFFSET => 1 ], + [ $TOTAL => 1 ], + ], + 'Pagination with sub-query in WHERE works' +); + +} + done_testing;