X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FMSSQL.pm;h=178a0079698d8b39457b41978b7d4c78742104bb;hb=6dfbe2f861ff0d52f5b370a9059334ba8339be51;hp=be1c3992a3d56d5078c5a62e31ea1884ff42dc2f;hpb=2dde7fb770ab920c186ed18db544f6e76f90c8b3;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/MSSQL.pm b/lib/DBIx/Class/Storage/DBI/MSSQL.pm index be1c399..178a007 100644 --- a/lib/DBIx/Class/Storage/DBI/MSSQL.pm +++ b/lib/DBIx/Class/Storage/DBI/MSSQL.pm @@ -179,8 +179,9 @@ sub _execute { sub last_insert_id { shift->_identity } # -# MSSQL is retarded wrt ordered subselects. One needs to add a TOP 100% -# to *all* subqueries, do it here. +# MSSQL is retarded wrt ordered subselects. One needs to add a TOP +# to *all* subqueries, but one also can't use TOP 100 PERCENT +# http://sqladvice.com/forums/permalink/18496/22931/ShowThread.aspx#22931 # sub _select_args_to_query { my $self = shift; @@ -190,7 +191,8 @@ sub _select_args_to_query { # see if this is an ordered subquery my $attrs = $_[3]; if ( scalar $self->sql_maker->_order_by_chunks ($attrs->{order_by}) ) { - $sql =~ s/^ \s* SELECT \s/SELECT TOP 100 PERCENT /xi; + my $max = 2 ** 32; + $sql =~ s/^ \s* SELECT \s/SELECT TOP $max /xi; } return wantarray @@ -235,23 +237,27 @@ sub _get_mssql_version { if ($data->{Character_Value} =~ /^(\d+)\./) { return $1; } else { - $self->throw_exception(q{your MSSQL server doesn't have a version!}); + $self->throw_exception(q{Your ProductVersion's Character_Value is missing or malformed!}); } } -sub _sql_maker_opts { - my ( $self, $opts ) = @_; +sub sql_maker { + my $self = shift; - if ( $opts ) { - $self->{_sql_maker_opts} = { %$opts }; - } + unless ($self->_sql_maker) { + unless ($self->{_sql_maker_opts}{limit_dialect}) { + my $version = eval { $self->_get_mssql_version; } || 0; - my $version = $self->_get_mssql_version; + $self->{_sql_maker_opts} = { + limit_dialect => ($version >= 9 ? 'RowNumberOver' : 'Top'), + %{$self->{_sql_maker_opts}||{}} + }; + } + + my $maker = $self->next::method (@_); + } - return { - limit_dialect => ($version >= 9 ? 'RowNumberOver' : 'Top'), - %{$self->{_sql_maker_opts}||{}} - }; + return $self->_sql_maker; } 1;