X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F88result_set_column.t;h=f27c5dd863a8cc6736136c1d62c114f4b26047b2;hb=8aae794001ecccdb26c2bbd1b92c97bba9e65d79;hp=b1c1e96d3cbad115c606ea5ff0fcc321299dc4da;hpb=722274d02c729c50a01db38b0d62042fbc48b5e7;p=dbsrgits%2FDBIx-Class.git diff --git a/t/88result_set_column.t b/t/88result_set_column.t index b1c1e96..f27c5dd 100644 --- a/t/88result_set_column.t +++ b/t/88result_set_column.t @@ -1,12 +1,19 @@ +BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) } + use strict; use warnings; use Test::More; use Test::Warn; use Test::Exception; -use lib qw(t/lib); -use DBICTest; -use DBIC::SqlMakerTest; + +# MASSIVE FIXME - there is a hole in ::RSC / as_subselect_rs +# losing the order. Needs a rework/extract of the realiaser, +# and that's a whole another bag of dicks +BEGIN { $ENV{DBIC_SHUFFLE_UNORDERED_RESULTSETS} = 0 } + + +use DBICTest ':DiffSQL'; my $schema = DBICTest->init_schema(); @@ -41,14 +48,16 @@ is($rs_title->min, 'Caterwaulin\' Blues', "min okay for title"); cmp_ok($rs_year->sum, '==', 9996, "three artists returned"); -my $rso_year = $rs->search({}, { order_by => 'cdid' })->get_column('year'); -is($rso_year->next, 1999, "reset okay"); +{ + my $rso_year = $rs->search({}, { order_by => 'cdid' })->get_column('year'); + is($rso_year->next, 1999, "reset okay"); -is($rso_year->first, 1999, "first okay"); + is($rso_year->first, 1999, "first okay"); -warnings_exist (sub { - is($rso_year->single, 1999, "single okay"); -}, qr/Query returned more than one row/, 'single warned'); + warnings_exist (sub { + is($rso_year->single, 1999, "single okay"); + }, qr/Query returned more than one row/, 'single warned'); +} # test distinct propagation @@ -248,17 +257,23 @@ is_same_sql_bind ( $schema->resultset('CD')->create({ artist => 1, title => 'dealbroker no tracks', year => 2001 }); + my $yp1 = \[ 'year + ?', 1 ]; + my $rs = $schema->resultset ('CD')->search ( { 'artist.name' => { '!=', 'evancarrol' }, 'tracks.trackid' => { '!=', undef } }, { order_by => 'me.year', join => [qw(artist tracks)], - columns => [ 'year', { cnt => { count => 'me.cdid' }} ], + columns => [ + 'year', + { cnt => { count => 'me.cdid' } }, + { year_plus_one => $yp1 }, + ], }, ); my $rstypes = { - 'explicitly grouped' => $rs->search_rs({}, { group_by => 'year' }), + 'explicitly grouped' => $rs->search_rs({}, { group_by => [ 'year', $yp1 ] } ), 'implicitly grouped' => $rs->search_rs({}, { distinct => 1 }), }; @@ -277,27 +292,37 @@ is_same_sql_bind ( # would silently drop the group_by entirely, likely ending up with nonsensival results # With the current behavior the user will at least get a nice fat exception from the # RDBMS (or maybe the RDBMS will even decide to handle the situation sensibly...) - warnings_exist { is_same_sql_bind( - $rstypes->{'implicitly grouped'}->get_column('cnt')->as_query, - '( - SELECT COUNT( me.cdid ) - FROM cd me - JOIN artist artist - ON artist.artistid = me.artist - LEFT JOIN track tracks - ON tracks.cd = me.cdid - WHERE artist.name != ? AND tracks.trackid IS NOT NULL - GROUP BY COUNT( me.cdid ) - ORDER BY MIN(me.year) - )', - [ [ { dbic_colname => 'artist.name', sqlt_datatype => 'varchar', sqlt_size => 100 } - => 'evancarrol' - ] ], - 'Expected (though nonsensical) SQL generated on rscol-with-distinct-over-function', - ) } qr/ - \QUse of distinct => 1 while selecting anything other than a column \E - \Qdeclared on the primary ResultSource is deprecated\E - /x, 'deprecation warning'; + for ( + [ cnt => 'COUNT( me.cdid )' ], + [ year_plus_one => 'year + ?' => [ {} => 1 ] ], + ) { + my ($col, $sel_grp_sql, @sel_grp_bind) = @$_; + + warnings_exist { is_same_sql_bind( + $rstypes->{'implicitly grouped'}->get_column($col)->as_query, + "( + SELECT $sel_grp_sql + FROM cd me + JOIN artist artist + ON artist.artistid = me.artist + LEFT JOIN track tracks + ON tracks.cd = me.cdid + WHERE artist.name != ? AND tracks.trackid IS NOT NULL + GROUP BY $sel_grp_sql + ORDER BY MIN(me.year) + )", + [ + @sel_grp_bind, + [ { dbic_colname => 'artist.name', sqlt_datatype => 'varchar', sqlt_size => 100 } + => 'evancarrol' ], + @sel_grp_bind, + ], + 'Expected (though nonsensical) SQL generated on rscol-with-distinct-over-function', + ) } qr/ + \QUse of distinct => 1 while selecting anything other than a column \E + \Qdeclared on the primary ResultSource is deprecated (you selected '$col')\E + /x, 'deprecation warning'; + } { local $TODO = 'multiplying join leaks through to the count aggregate... this may never actually work';