From: Peter Rabbitson Date: Tue, 26 May 2009 19:28:49 +0000 (+0000) Subject: Attempt to reproduce reported mysql error (failed) - fixed another bug in ResultSetCo... X-Git-Tag: v0.08103~1 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits%2FDBIx-Class.git;a=commitdiff_plain;h=bed3a173167f330281c09277bac5a0816f81b3f8 Attempt to reproduce reported mysql error (failed) - fixed another bug in ResultSetColumn along the way --- diff --git a/Changes b/Changes index 71ecbd8..5ecb57d 100644 --- a/Changes +++ b/Changes @@ -36,6 +36,8 @@ Revision history for DBIx::Class - "timestamp with time zone" columns (for Pg) now get inflated with a time zone information preserved - MSSQL Top limit-emulation improvements (GROUP BY and subquery support) + - ResultSetColumn will not lose the joins infered from a parent + resultset prefetch 0.08102 2009-04-30 08:29:00 (UTC) - Fixed two subtle bugs when using columns or select/as diff --git a/lib/DBIx/Class/ResultSetColumn.pm b/lib/DBIx/Class/ResultSetColumn.pm index 3ed9342..037b771 100644 --- a/lib/DBIx/Class/ResultSetColumn.pm +++ b/lib/DBIx/Class/ResultSetColumn.pm @@ -43,12 +43,11 @@ sub new { # prefetch causes additional columns to be fetched, but we can not just make a new # rs via the _resolved_attrs trick - we need to retain the separation between - # +select/+as and select/as - for my $attr (qw/prefetch collapse/) { - for (qw/attrs _attrs/) { - delete $new_parent_rs->{$_}{$attr} if ref $new_parent_rs->{$_}; - } - } + # +select/+as and select/as. At the same time we want to preserve any joins that the + # prefetch would otherwise generate. + my $init_attrs = $new_parent_rs->{attrs} ||= {}; + delete $init_attrs->{collapse}; + $init_attrs->{join} = $rs->_merge_attr( delete $init_attrs->{join}, delete $init_attrs->{prefetch} ); # If $column can be found in the 'as' list of the parent resultset, use the # corresponding element of its 'select' list (to keep any custom column diff --git a/t/71mysql.t b/t/71mysql.t index a2e868f..cb21aa7 100644 --- a/t/71mysql.t +++ b/t/71mysql.t @@ -14,7 +14,7 @@ my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MYSQL_${_}" } qw/DSN USER PASS/}; plan skip_all => 'Set $ENV{DBICTEST_MYSQL_DSN}, _USER and _PASS to run this test' unless ($dsn && $user); -plan tests => 11; +plan tests => 15; my $schema = DBICTest::Schema->connect($dsn, $user, $pass); @@ -36,6 +36,14 @@ $dbh->do("DROP TABLE IF EXISTS cd_to_producer;"); $dbh->do("CREATE TABLE cd_to_producer (cd INTEGER,producer INTEGER);"); +$dbh->do("DROP TABLE IF EXISTS owners;"); + +$dbh->do("CREATE TABLE owners (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL);"); + +$dbh->do("DROP TABLE IF EXISTS books;"); + +$dbh->do("CREATE TABLE books (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, source VARCHAR(100) NOT NULL, owner integer NOT NULL, title varchar(100) NOT NULL, price integer);"); + #'dbi:mysql:host=localhost;database=dbic_test', 'dbic_test', ''); # This is in Core now, but it's here just to test that it doesn't break @@ -87,6 +95,32 @@ my $test_type_info = { }, }; +$schema->populate ('Owners', [ + [qw/id name /], + [qw/1 wiggle/], + [qw/2 woggle/], + [qw/3 boggle/], +]); + +$schema->populate ('BooksInLibrary', [ + [qw/source owner title /], + [qw/nsa 1 secrets1/], + [qw/fbi 1 secrets2/], + [qw/cia 2 secrets3/], +]); + +# try a distinct + prefetch with tables with identical columns (mysql allegedly doesn't like this) +my $owners = $schema->resultset ('Owners')->search ( + { 'books.id' => { '!=', undef }}, + { prefetch => 'books', distinct => 1 } +); +my $owners2 = $schema->resultset ('Owners')->search ({ id => { -in => $owners->get_column ('me.id')->as_query }}); +for ($owners, $owners2) { + is ($_->all, 2, 'Prefetched grouped search returns correct number of rows'); + is ($_->count, 2, 'Prefetched grouped search returns correct count'); +} + + SKIP: { my $mysql_version = $dbh->get_info( $GetInfoType{SQL_DBMS_VER} ); skip "Cannot determine MySQL server version", 1 if !$mysql_version; diff --git a/t/lib/DBICTest.pm b/t/lib/DBICTest.pm index 70501bf..c69d229 100644 --- a/t/lib/DBICTest.pm +++ b/t/lib/DBICTest.pm @@ -310,7 +310,7 @@ sub populate_schema { ]); $schema->populate('Owners', [ - [ qw/ownerid name/ ], + [ qw/id name/ ], [ 1, "Newton" ], [ 2, "Waltham" ], ]); diff --git a/t/lib/DBICTest/Schema/Owners.pm b/t/lib/DBICTest/Schema/Owners.pm index 0c05b1d..70af33c 100644 --- a/t/lib/DBICTest/Schema/Owners.pm +++ b/t/lib/DBICTest/Schema/Owners.pm @@ -5,7 +5,7 @@ use base qw/DBICTest::BaseResult/; __PACKAGE__->table('owners'); __PACKAGE__->add_columns( - 'ownerid' => { + 'id' => { data_type => 'integer', is_auto_increment => 1, }, @@ -14,7 +14,7 @@ __PACKAGE__->add_columns( size => '100', }, ); -__PACKAGE__->set_primary_key('ownerid'); +__PACKAGE__->set_primary_key('id'); __PACKAGE__->has_many(books => "DBICTest::Schema::BooksInLibrary", "owner"); diff --git a/t/lib/sqlite.sql b/t/lib/sqlite.sql index ec68a99..4bcb485 100644 --- a/t/lib/sqlite.sql +++ b/t/lib/sqlite.sql @@ -1,6 +1,6 @@ -- -- Created by SQL::Translator::Producer::SQLite --- Created on Sat May 23 21:30:53 2009 +-- Created on Tue May 26 18:29:15 2009 -- @@ -305,7 +305,7 @@ CREATE TABLE onekey ( -- Table: owners -- CREATE TABLE owners ( - ownerid INTEGER PRIMARY KEY NOT NULL, + id INTEGER PRIMARY KEY NOT NULL, name varchar(100) NOT NULL );