From: Arthur Axel "fREW" Schmidt Date: Tue, 9 Jun 2009 21:49:10 +0000 (+0000) Subject: Added AmbiguousGlob.pm for silly servers like mssql and mysql. See docs for more... X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=48fe908793f2a2141bb687946c18f9a54ae2c47f;p=dbsrgits%2FDBIx-Class-Historic.git Added AmbiguousGlob.pm for silly servers like mssql and mysql. See docs for more info --- diff --git a/lib/DBIx/Class/Storage/DBI/AmbiguousGlob.pm b/lib/DBIx/Class/Storage/DBI/AmbiguousGlob.pm new file mode 100644 index 0000000..c848fc1 --- /dev/null +++ b/lib/DBIx/Class/Storage/DBI/AmbiguousGlob.pm @@ -0,0 +1,43 @@ +package DBIx::Class::Storage::DBI::AmbiguousGlob; + +use strict; +use warnings; + +use base 'DBIx::Class::Storage::DBI'; + +=head1 NAME + +DBIx::Class::Storage::DBI::AmbiguousGlob - Storage component for RDBMS supporting multicolumn in clauses + +=head1 DESCRIPTION + +Some servers choke on things like: + + COUNT(*) FROM (SELECT tab1.col, tab2.col FROM tab1 JOIN tab2 ... ) + +claiming that col is a duplicate column (it loses the table specifiers by +the time it gets to the *). Thus for any subquery count we select only the +primary keys of the main table in the inner query. This hopefully still +hits the indexes and keeps the server happy. + +At this point the only overriden method is C<_grouped_count_select()> + +=cut + +sub _grouped_count_select { + my ($self, $source, $rs_args) = @_; + my @pcols = map { join '.', $rs_args->{alias}, $_ } ($source->primary_columns); + return @pcols ? \@pcols : $rs_args->{group_by}; +} + +=head1 AUTHORS + +See L + +=head1 LICENSE + +You may distribute this code under the same terms as Perl itself. + +=cut + +1; diff --git a/lib/DBIx/Class/Storage/DBI/MSSQL.pm b/lib/DBIx/Class/Storage/DBI/MSSQL.pm index 40afe76..c6b9360 100644 --- a/lib/DBIx/Class/Storage/DBI/MSSQL.pm +++ b/lib/DBIx/Class/Storage/DBI/MSSQL.pm @@ -3,7 +3,7 @@ package DBIx::Class::Storage::DBI::MSSQL; use strict; use warnings; -use base qw/DBIx::Class::Storage::DBI/; +use base qw/DBIx::Class::Storage::DBI::AmbiguousGlob DBIx::Class::Storage::DBI/; sub _dbh_last_insert_id { my ($self, $dbh, $source, $col) = @_; diff --git a/lib/DBIx/Class/Storage/DBI/mysql.pm b/lib/DBIx/Class/Storage/DBI/mysql.pm index 221548a..e36b6d7 100644 --- a/lib/DBIx/Class/Storage/DBI/mysql.pm +++ b/lib/DBIx/Class/Storage/DBI/mysql.pm @@ -3,7 +3,7 @@ package DBIx::Class::Storage::DBI::mysql; use strict; use warnings; -use base qw/DBIx::Class::Storage::DBI::MultiColumnIn/; +use base qw/DBIx::Class::Storage::DBI::MultiColumnIn DBIx::Class::Storage::DBI::AmbiguousGlob/; __PACKAGE__->sql_maker_class('DBIx::Class::SQLAHacks::MySQL'); @@ -41,7 +41,7 @@ sub _svp_rollback { $self->dbh->do("ROLLBACK TO SAVEPOINT $name") } - + sub is_replicating { my $status = shift->dbh->selectrow_hashref('show slave status'); return ($status->{Slave_IO_Running} eq 'Yes') && ($status->{Slave_SQL_Running} eq 'Yes'); @@ -57,19 +57,6 @@ sub _subq_update_delete { return shift->_per_row_update_delete (@_); } -# MySql chokes on things like: -# COUNT(*) FROM (SELECT tab1.col, tab2.col FROM tab1 JOIN tab2 ... ) -# claiming that col is a duplicate column (it loses the table specifiers by -# the time it gets to the *). Thus for any subquery count we select only the -# primary keys of the main table in the inner query. This hopefully still -# hits the indexes and keeps mysql happy. -# (mysql does not care if the SELECT and the GROUP BY match) -sub _grouped_count_select { - my ($self, $source, $rs_args) = @_; - my @pcols = map { join '.', $rs_args->{alias}, $_ } ($source->primary_columns); - return @pcols ? \@pcols : $rs_args->{group_by}; -} - 1; =head1 NAME