X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F71mysql.t;h=1e31e8cc2d1fb49fcec80fdac51ff610e06ea41a;hb=7664b1a03c8f4da961d1f9795c9af1d545a24ea1;hp=b4f01f4c46913098fbc23e1320aa900d856a2d05;hpb=7be5717eb2be4fa484e665853777f1c10c6deced;p=dbsrgits%2FDBIx-Class.git diff --git a/t/71mysql.t b/t/71mysql.t index b4f01f4..1e31e8c 100644 --- a/t/71mysql.t +++ b/t/71mysql.t @@ -17,12 +17,10 @@ plan skip_all => 'Test needs ' . DBIx::Class::Optional::Dependencies->req_missin my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MYSQL_${_}" } qw/DSN USER PASS/}; -#warn "$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; @@ -173,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); + my $norm_version = $schema->storage->_server_info->{normalized_dbms_version} + or skip "Cannot determine MySQL server version", 1; - $v3 ||= 0; - - if( ($v1 < 5) || ($v1 == 5 && $v2 == 0 && $v3 <= 3) ) { + if ($norm_version < 5.000003_01) { $test_type_info->{charfield}->{data_type} = 'VARCHAR'; } @@ -211,36 +204,13 @@ 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 - )', - [], - 'overriden default join type works', - ); -} - -{ - # Test support for straight joins - my $cdsrc = $schema->source('CD'); - my $artrel_info = $cdsrc->relationship_info ('artist'); - $cdsrc->add_relationship( - 'straight_artist', - $artrel_info->{class}, - $artrel_info->{cond}, - { %{$artrel_info->{attrs}}, join_type => 'straight' }, - ); - 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`, + `artist`.`artistid`, `artist`.`name`, `artist`.`rank`, `artist`.`charfield` + FROM cd `me` + INNER JOIN `artist` `artist` ON `artist`.`artistid` = `me`.`artist` )', [], - 'straight joins correctly supported for mysql' + 'overridden default join type works', ); } @@ -271,7 +241,7 @@ NULLINSEARCH: { my $artist = $artist2_rs->single; - is $artist => undef + is $artist => undef, => 'Nothing Found!'; } @@ -301,6 +271,61 @@ NULLINSEARCH: { }, '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 $_", + ); + } + + is ($rs->count, 10, '10 artists present'); + + my $orig_debug = $schema->storage->debug; + $schema->storage->debug(1); + my $query_count; + $schema->storage->debugcb(sub { $query_count++ }); + + $query_count = 0; + $complex_rs->delete; + + is ($query_count, 1, 'One delete query fired'); + is ($rs->count, 0, '10 Artists correctly deleted'); + + $rs->create({ + name => 'baby_with_cd', + cds => [ { title => 'babeeeeee', year => 2013 } ], + }); + is ($rs->count, 1, 'Artist with cd created'); + + $query_count = 0; + $schema->resultset('CD')->search_related('artist', + { 'artist.name' => { -like => 'baby_with_%' } } + )->delete; + is ($query_count, 1, 'And one more delete query fired'); + is ($rs->count, 0, 'Artist with cd deleted'); + + $schema->storage->debugcb(undef); + $schema->storage->debug($orig_debug); +} + ZEROINSEARCH: { my $cds_per_year = { 2001 => 2, @@ -391,9 +416,9 @@ ZEROINSEARCH: { # kill our $dbh $schema_autorecon->storage->_dbh(undef); - TODO: { + { local $TODO = "Perl $] is known to leak like a sieve" - if DBIx::Class::_ENV_::PEEPEENESS(); + if DBIx::Class::_ENV_::PEEPEENESS; ok (! defined $orig_dbh, 'Parent $dbh handle is gone'); } @@ -415,9 +440,9 @@ ZEROINSEARCH: { # try to do something dbic-esque $rs->create({ name => "Hardcore Forker $$" }); - TODO: { + { local $TODO = "Perl $] is known to leak like a sieve" - if DBIx::Class::_ENV_::PEEPEENESS(); + if DBIx::Class::_ENV_::PEEPEENESS; ok (! defined $orig_dbh, 'DBIC operation triggered reconnect - old $dbh is gone'); }