X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F71mysql.t;h=de1e2fda72d8c7e03c4ea993fd176ace8970cec3;hb=4ca1fd6fb90a85f5138d11f580394025aa20ea4a;hp=84bebc727422e18b1e0d656819d9ff7e72890594;hpb=da6a5860c26c14db6145b7d3ba74bafe6a2a3742;p=dbsrgits%2FDBIx-Class.git diff --git a/t/71mysql.t b/t/71mysql.t index 84bebc7..de1e2fd 100644 --- a/t/71mysql.t +++ b/t/71mysql.t @@ -6,19 +6,21 @@ use Test::Exception; use DBI::Const::GetInfoType; use Scalar::Util qw/weaken/; +use DBIx::Class::Optional::Dependencies (); use lib qw(t/lib); use DBICTest; use DBIC::SqlMakerTest; -my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MYSQL_${_}" } qw/DSN USER PASS/}; +plan skip_all => 'Test needs ' . DBIx::Class::Optional::Dependencies->req_missing_for ('test_rdbms_mysql') + unless DBIx::Class::Optional::Dependencies->req_ok_for ('test_rdbms_mysql'); -#warn "$dsn $user $pass"; +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); -my $schema = DBICTest::Schema->connect($dsn, $user, $pass); +my $schema = DBICTest::Schema->connect($dsn, $user, $pass, { quote_names => 1 }); my $dbh = $schema->storage->dbh; @@ -48,7 +50,7 @@ $dbh->do("CREATE TABLE books (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, so #'dbi:mysql:host=localhost;database=dbic_test', 'dbic_test', ''); -# make sure sqlt_type overrides work (::Storage::DBI::mysql does this) +# make sure sqlt_type overrides work (::Storage::DBI::mysql does this) { my $schema = DBICTest::Schema->connect($dsn, $user, $pass); @@ -140,7 +142,7 @@ $schema->populate ('BooksInLibrary', [ ]); # -# try a distinct + prefetch on tables with identically named columns +# try a distinct + prefetch on tables with identically named columns # (mysql doesn't seem to like subqueries with equally named columns) # @@ -169,15 +171,10 @@ $schema->populate ('BooksInLibrary', [ } SKIP: { - my $mysql_version = $dbh->get_info( $GetInfoType{SQL_DBMS_VER} ); - skip "Cannot determine MySQL server version", 1 if !$mysql_version; - - my ($v1, $v2, $v3) = $mysql_version =~ /^(\d+)\.(\d+)(?:\.(\d+))?/; - skip "Cannot determine MySQL server version", 1 if !$v1 || !defined($v2); - - $v3 ||= 0; + my $norm_version = $schema->storage->_server_info->{normalized_dbms_version} + or skip "Cannot determine MySQL server version", 1; - if( ($v1 < 5) || ($v1 == 5 && $v2 == 0 && $v3 <= 3) ) { + if ($norm_version < 5.000003_01) { $test_type_info->{charfield}->{data_type} = 'VARCHAR'; } @@ -207,10 +204,10 @@ lives_ok { $cd->set_producers ([ $producer ]) } 'set_relationship doesnt die'; is_same_sql_bind ( $rs->as_query, '( - SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track, - artist.artistid, artist.name, artist.rank, artist.charfield - FROM cd me - INNER JOIN artist artist ON artist.artistid = me.artist + SELECT `me`.`cdid`, `me`.`artist`, `me`.`title`, `me`.`year`, `me`.`genreid`, `me`.`single_track`, + `artist`.`artistid`, `artist`.`name`, `artist`.`rank`, `artist`.`charfield` + FROM cd `me` + INNER JOIN `artist` `artist` ON `artist`.`artistid` = `me`.`artist` )', [], 'overriden default join type works', @@ -230,10 +227,10 @@ lives_ok { $cd->set_producers ([ $producer ]) } 'set_relationship doesnt die'; is_same_sql_bind ( $cdsrc->resultset->search({}, { prefetch => 'straight_artist' })->as_query, '( - SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track, - straight_artist.artistid, straight_artist.name, straight_artist.rank, straight_artist.charfield - FROM cd me - STRAIGHT_JOIN artist straight_artist ON straight_artist.artistid = me.artist + SELECT `me`.`cdid`, `me`.`artist`, `me`.`title`, `me`.`year`, `me`.`genreid`, `me`.`single_track`, + `straight_artist`.`artistid`, `straight_artist`.`name`, `straight_artist`.`rank`, `straight_artist`.`charfield` + FROM cd `me` + STRAIGHT_JOIN `artist` `straight_artist` ON `straight_artist`.`artistid` = `me`.`artist` )', [], 'straight joins correctly supported for mysql' @@ -295,8 +292,47 @@ NULLINSEARCH: { join => 'books', group_by => [ 'me.id', 'books.id' ] })->count(); }, 'count on grouped columns with the same name does not throw'); +} + +# a more contrived^Wcomplicated self-referential double-subquery test +{ + my $rs = $schema->resultset('Artist')->search({ name => { -like => 'baby_%' } }); + + $rs->populate([map { [$_] } ('name', map { "baby_$_" } (1..10) ) ]); + my ($count_sql, @count_bind) = @${$rs->count_rs->as_query}; + + my $complex_rs = $schema->resultset('Artist')->search( + { artistid => { + -in => $rs->get_column('artistid') + ->as_query + } }, + ); + + $complex_rs->update({ name => \[ "CONCAT( `name`, '_bell_out_of_', $count_sql )", @count_bind ] }); + + for (1..10) { + is ( + $schema->resultset('Artist')->search({ name => "baby_${_}_bell_out_of_10" })->count, + 1, + "Correctly updated babybell $_", + ); + } + my $ac = $schema->resultset('Artist')->count_rs; + my $old_count = $ac->next; + $ac->reset; + + my $orig_debug = $schema->storage->debug; + $schema->storage->debug(1); + my $query_count = 0; + $schema->storage->debugcb(sub { $query_count++ }); + $complex_rs->delete; + $schema->storage->debugcb(undef); + $schema->storage->debug($orig_debug); + + is ($query_count, 1, 'One delete query fired'); + is ($old_count - $ac->next, 10, '10 Artists correctly deleted'); } ZEROINSEARCH: { @@ -334,7 +370,7 @@ ZEROINSEARCH: { 'Zero-year groups successfully', ); - # convoluted search taken verbatim from list + # convoluted search taken verbatim from list my $restrict_rs = $rs->search({ -and => [ year => { '!=', 0 }, year => { '!=', undef } @@ -372,11 +408,15 @@ ZEROINSEARCH: { my $rs = $schema_autorecon->resultset('Artist'); + my ($parent_in, $child_out); + pipe( $parent_in, $child_out ) or die "Pipe open failed: $!"; my $pid = fork(); if (! defined $pid ) { die "fork() failed: $!" } elsif ($pid) { + close $child_out; + # sanity check $schema_autorecon->storage->dbh_do(sub { is ($_[1], $orig_dbh, 'Storage holds correct $dbh in parent'); @@ -384,27 +424,45 @@ ZEROINSEARCH: { # kill our $dbh $schema_autorecon->storage->_dbh(undef); - ok (! defined $orig_dbh, 'Parent $dbh handle is gone'); + + { + local $TODO = "Perl $] is known to leak like a sieve" + if DBIx::Class::_ENV_::PEEPEENESS; + + ok (! defined $orig_dbh, 'Parent $dbh handle is gone'); + } } else { - # wait for parent to kill its $dbh - sleep 1; + close $parent_in; #simulate a subtest to not confuse the parent TAP emission - Test::More->builder->reset; - Test::More->builder->plan('no_plan'); - Test::More->builder->_indent(' ' x 4); + my $tb = Test::More->builder; + $tb->reset; + for (qw/output failure_output todo_output/) { + close $tb->$_; + open ($tb->$_, '>&', $child_out); + } - ok ($orig_dbh, 'Now dead $dbh is still there for the child'); + # wait for parent to kill its $dbh + sleep 1; # try to do something dbic-esque $rs->create({ name => "Hardcore Forker $$" }); - ok (! defined $orig_dbh, 'DBIC operation triggered reconnect - old $dbh is gone'); + { + local $TODO = "Perl $] is known to leak like a sieve" + if DBIx::Class::_ENV_::PEEPEENESS; + ok (! defined $orig_dbh, 'DBIC operation triggered reconnect - old $dbh is gone'); + } + + done_testing; exit 0; } + while (my $ln = <$parent_in>) { + print " $ln"; + } wait; ok(!$?, 'Child subtests passed');