Skip Menu |
 

This queue is for tickets about the DBIx-Class CPAN distribution.

Report information
The Basics
Id: 28451
Status: resolved
Priority: 0/
Queue: DBIx-Class

People
Owner: Nobody in particular
Requestors: ifomichev [...] cpan.org
Cc: mst [...] shadowcatsystems.co.uk
AdminCc:

Bug Information
Severity: Normal
Broken in: 0.08003
Fixed in: 0.08103



CC: mst [...] shadowcatsystems.co.uk
Download (untitled) / with headers
text/plain 1.1k
If there is a SELECT statement with several related tables under the same alias, values may be taken from a wrong table. Current result: 8<---------------------------------BEGIN----------------------------------- SELECT me.group_id, me.name, me.account_id, COUNT( person.person_id ), account.account_id, account.username, account.person_id, person.person_id, person.first_name, person.group_id FROM groups me LEFT JOIN people person ON ( person.group_id = me.group_id ) JOIN accounts account ON ( account.account_id = me.account_id ) JOIN people person_2 ON ( person_2.person_id = account.person_id ) GROUP BY me.group_id: name: foo owner: Fred members: 2 name: bar owner: Barney members: 1 8<----------------------------------END------------------------------------ Expected result (w/o SELECT statement, apparently :-): 8<---------------------------------BEGIN----------------------------------- name: foo owner: Barney members: 2 name: bar owner: Fred members: 1 8<----------------------------------END------------------------------------ see also http://www.mail-archive.com/dbix-class@lists.rawmode.org/msg03970.html
Subject: Person.pm
Download Person.pm
text/x-perl 348b
use strict; use warnings; package Schema::Person; use base qw/DBIx::Class/; __PACKAGE__->load_components( qw/ Core PK::Auto / ); __PACKAGE__->table( 'people' ); __PACKAGE__->add_columns( qw/ person_id first_name group_id / ); __PACKAGE__->set_primary_key( qw/ person_id / ); __PACKAGE__->belongs_to( 'group', 'Schema::Group', 'group_id' ); 1;
Subject: Group.pm
Download Group.pm
text/x-perl 541b
use strict; use warnings; package Schema::Group; use base qw/DBIx::Class/; __PACKAGE__->load_components( qw/ Core PK::Auto / ); __PACKAGE__->table( 'groups' ); __PACKAGE__->add_columns( qw/ group_id name account_id / ); __PACKAGE__->set_primary_key( qw/ group_id / ); __PACKAGE__->mk_group_accessors( column => 'member_count' ); __PACKAGE__->belongs_to( account => 'Schema::Account', 'account_id' ); #__PACKAGE__->has_many( person => 'Schema::Person', 'group_id' ); __PACKAGE__->has_many( members => 'Schema::Person', 'group_id' ); 1;
Subject: Account.pm
Download Account.pm
text/x-perl 434b
use strict; use warnings; package Schema::Account; use base qw/DBIx::Class/; __PACKAGE__->load_components( qw/ Core PK::Auto / ); __PACKAGE__->table( 'accounts' ); __PACKAGE__->add_columns( qw/ account_id username person_id / ); __PACKAGE__->set_primary_key( qw/ account_id / ); __PACKAGE__->belongs_to( person => 'Schema::Person', 'person_id' ); __PACKAGE__->has_many( administered_groups => 'Schema::Group', 'account_id' ); 1;
Subject: Schema.pm
Download Schema.pm
text/x-perl 112b
use strict; use warnings; package Schema; use base qw/DBIx::Class::Schema/; __PACKAGE__->load_classes(); 1;
Subject: test_dbic.pl
Download test_dbic.pl
text/x-perl 805b
#!/usr/bin/perl use strict; use warnings; use Schema; my $schema = Schema->connect( 'DBI:mysql:ifomichev_test', 'root' ); $schema->storage()->debug( 1 ); my $rs = $schema->resultset('Group')->search( undef, { # '+select' => [ { COUNT => 'person.person_id' } ], '+select' => [ { COUNT => 'members.person_id' } ], '+as' => [ qw/ member_count / ], # join => [ 'person' ], join => [ 'members' ], group_by => [ qw/ me.group_id / ], } ); $rs = $rs->search( undef, { prefetch => { account => 'person' }, }, ); foreach ( $rs->all() ) { print "name: " . $_->name() . "\n"; print "owner: " . $_->account()->person()->first_name() . "\n"; print "members: " . $_->member_count() . "\n"; print "\n"; }
Subject: ifomichev_test.sql
DROP TABLE IF EXISTS `accounts`; CREATE TABLE `accounts` ( `account_id` int(10) unsigned NOT NULL auto_increment, `username` varchar(255) NOT NULL, `person_id` int(10) unsigned default NULL, PRIMARY KEY (`account_id`), KEY `person_id` (`person_id`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERT INTO `accounts` VALUES (1,'barney',3),(2,'fred',1); DROP TABLE IF EXISTS `groups`; CREATE TABLE `groups` ( `group_id` int(10) unsigned NOT NULL auto_increment, `name` varchar(255) NOT NULL, `account_id` int(10) unsigned default NULL, PRIMARY KEY (`group_id`), KEY `account_id` (`account_id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; INSERT INTO `groups` VALUES (1,'foo',1),(2,'bar',2),(3,'baz',NULL); DROP TABLE IF EXISTS `people`; CREATE TABLE `people` ( `person_id` int(10) unsigned NOT NULL auto_increment, `first_name` varchar(255) NOT NULL, `group_id` int(10) unsigned default NULL, PRIMARY KEY (`person_id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; INSERT INTO `people` VALUES (1,'Fred',1),(2,'Wilma',1),(3,'Barney',2);
Download (untitled) / with headers
text/plain 363b
On Tue Jul 24 08:27:55 2007, IFOMICHEV wrote: Show quoted text
> If there is a SELECT statement with several related tables under the > same alias, values may be taken from a wrong table. >
Please checkout and try: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/0.08/branches/diamond_relationships This should be the final fix, and should appear on cpan within a week or so.
DBIx::Class 0.08103 just released on CPAN fixes this RT.


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

Please report any issues with rt.cpan.org to rt-cpan-admin@bestpractical.com.