[Dbix-class] Paging troubles - GROUP_BY missed

dreel dreel at bk.ru
Thu Sep 13 07:15:56 GMT 2007


I want to create a paged content and i'm using DBIx for it. When I write a query without paging - it works fine. SQL without paging:
<code>

$c->stash->{routes} = [$c->model('QDB::Route')->search( { 'n_1.net_id' => $c->stash->{net_id}, }, { alias => 'rt', # alias columns in accordance with "from" from => [ { rt => 'vi_route' }, [ { n_1 => 'vi_nodes', -join_type => 'inner' }, { 'rt.route_beg' => 'n_1.node_id', 'rt.net_id' => 'n_1.net_id' } ], [ { n_2 => 'vi_nodes', -join_type => 'inner' }, { 'rt.route_end' => 'n_2.node_id', 'rt.net_id' => 'n_2.net_id' } ], ], 'select' => [ 'rt.route_beg', 'rt.route_end', \'n_1.node_name AS node_name_beg', \'n_2.node_name AS node_name_end', \'COUNT(rt.route_beg) as grp_count', ], 'as' => [ qw/ route_beg route_end node_name_beg node_nam +e_end route_grp_count / ], 'group_by' => [qw/ rt.route_beg rt.route_end node_name_beg nod +e_name_end /], }, )];
</code>


Equivalent SQL is normal:

<code>

SELECT rt.route_beg, rt.route_end, n_1.node_name AS node_name_beg, n_2.node_name AS node_name_end, COUNT(rt.route_beg) as grp_count FROM vi_route rt INNER JOIN vi_nodes n_1 ON ( rt.net_id = n_1.net_id AND rt.route_beg = n_1.node_id ) INNER JOIN vi_nodes n_2 ON ( rt.net_id = n_2.net_id AND rt.route_end = n_2.node_id ) WHERE ( n_1.net_id = ? ) GROUP BY rt.route_beg, rt.route_end, n_1.node_name, n_2.node_name ORDER BY node_name_beg: 'param_value'
</code>

But if I add few lines:
<code>

page => 1, # page to return (defaults to 1) 
rows => 10, # number of results per page
</code>

It becomes wrong and throw exception( Because sql query becomes bad. Equivalent SQL becomes bad:
<code>

SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 10 rt.route_beg, rt.route_end, n_1.node_name AS no +de_name_beg, n_2.node_name AS node_name_end, COUNT(rt.route_beg) as g +rp_count FROM vi_route rt INNER JOIN vi_nodes n_1 ON ( rt.net_id = n_1.net_id AND rt.route_beg = n_1.node_id ) INNER JOI +N vi_nodes n_2 ON ( rt.net_id = n_2.net_id AND rt.route_end = n_2.node_id ) WHERE ( n_1.net_id = ? ) ORDER BY node_name_beg ASC ) AS foo #-- There must be GROUP BY CLAUSE but it's missed! --# ORDER BY node_name_beg DESC ) AS bar ORDER BY node_name_beg ASC : 'param_value'
<code>

DBIC missing group_by clause when generates sql for paged result. And sql server return error because aggregate function COUNT(rt.route_beg) not included in ORDER BY or GROUP BY clause. It's Sql Abstract Limit bug may be? Have any suggestions or decision?

--
dr.eel - threaten to your mind



More information about the DBIx-Class mailing list