X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fsqlmaker%2Flimit_dialects%2Ftoplimit.t;h=bb9ef9a9d2baffc8df731279408b48ae5ce19a3f;hb=f74d22e;hp=16f64dc6502b01f7b51d953f1063d219e3a7387b;hpb=d5dedbd62928f65a9071b4d9b6d56c6b663a073b;p=dbsrgits%2FDBIx-Class.git diff --git a/t/sqlmaker/limit_dialects/toplimit.t b/t/sqlmaker/limit_dialects/toplimit.t index 16f64dc..bb9ef9a 100644 --- a/t/sqlmaker/limit_dialects/toplimit.t +++ b/t/sqlmaker/limit_dialects/toplimit.t @@ -38,10 +38,49 @@ for my $null_order ( ) me ORDER BY me.id DESC )', - [ [ source => 'Library' ] ], + [ [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } + => 'Library' ] ], ); } +{ +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 => 2, + offset => 3, +}); + +is_same_sql_bind( + $rs_selectas_rel->as_query, + '( + SELECT TOP 2 owner_name, owner_books + FROM ( + SELECT TOP 5 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 = ? ) + ORDER BY me.id + ) me + ORDER BY me.id DESC + )', + [ [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } + => 'Library' ] ], + 'pagination with subqueries works' +); + +} for my $ord_set ( { @@ -141,7 +180,8 @@ for my $ord_set ( ) me ORDER BY $ord_set->{order_req} )", - [ [ source => 'Library' ] ], + [ [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } + => 'Library' ] ], ); } @@ -171,7 +211,10 @@ is_same_sql_bind ( WHERE ( source = ? ) ORDER BY title )', - [ [ source => 'Library' ], [ source => 'Library' ] ], + [ map { [ + { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } + => 'Library' ] + } (1,2) ], ); # test deprecated column mixing over join boundaries @@ -179,7 +222,7 @@ my $rs_selectas_top = $schema->resultset ('BooksInLibrary')->search ({}, { '+select' => ['owner.name'], '+as' => ['owner_name'], join => 'owner', - rows => 1 + rows => 1 }); is_same_sql_bind( $rs_selectas_top->search({})->as_query, @@ -190,8 +233,42 @@ is_same_sql_bind( $rs_selectas_top->search({})->as_query, JOIN owners owner ON owner.id = me.owner WHERE ( source = ? ) ORDER BY me.id - )', - [ [ 'source', 'Library' ] ], + )', + [ [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } + => 'Library' ] ], ); +{ + my $rs = $schema->resultset('Artist')->search({}, { + columns => 'name', + offset => 1, + order_by => 'name', + }); + local $rs->result_source->{name} = "weird \n newline/multi \t \t space containing \n table"; + + like ( + ${$rs->as_query}->[0], + qr| weird \s \n \s newline/multi \s \t \s \t \s space \s containing \s \n \s table|x, + 'Newlines/spaces preserved in final sql', + ); +} + +{ +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 TOP 1 me.id, me.owner FROM books me WHERE ( ( (EXISTS (SELECT COUNT( * ) FROM owners owner WHERE ( books.owner = owner.id ))) AND source = ? ) ) ORDER BY me.id)', + [ + [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ], + ], + 'Pagination with sub-query in WHERE works' +); + +} + done_testing;