Simplify _select_args_to_query - contortions not needed since 0e773352
Peter Rabbitson [Mon, 1 Apr 2013 06:16:09 +0000 (08:16 +0200)]
lib/DBIx/Class/ResultSet.pm
lib/DBIx/Class/Storage/DBI.pm
lib/DBIx/Class/Storage/DBI/MSSQL.pm

index b64140d..6cd34bd 100644 (file)
@@ -2540,16 +2540,9 @@ sub as_query {
 
   my $attrs = { %{ $self->_resolved_attrs } };
 
-  # For future use:
-  #
-  # in list ctx:
-  # my ($sql, \@bind, \%dbi_bind_attrs) = _select_args_to_query (...)
-  # $sql also has no wrapping parenthesis in list ctx
-  #
-  my $sqlbind = $self->result_source->storage
-    ->_select_args_to_query ($attrs->{from}, $attrs->{select}, $attrs->{where}, $attrs);
-
-  return $sqlbind;
+  $self->result_source->storage->_select_args_to_query (
+    $attrs->{from}, $attrs->{select}, $attrs->{where}, $attrs
+  );
 }
 
 =head2 find_or_new
index 1018638..265ae51 100644 (file)
@@ -2279,13 +2279,11 @@ sub _select_args_to_query {
     $self->_select_args(@_);
 
   # my ($sql, $prepared_bind) = $self->_gen_sql_bind($op, $ident, [ $select, $cond, $rs_attrs, $rows, $offset ]);
-  my ($sql, $prepared_bind) = $self->_gen_sql_bind($op, $ident, \@args);
-  $prepared_bind ||= [];
+  my ($sql, $bind) = $self->_gen_sql_bind($op, $ident, \@args);
 
-  return wantarray
-    ? ($sql, $prepared_bind)
-    : \[ "($sql)", @$prepared_bind ]
-  ;
+  # reuse the bind arrayref
+  unshift @{$bind}, "($sql)";
+  \$bind;
 }
 
 sub _select_args {
index 679fe7c..fc505fa 100644 (file)
@@ -106,28 +106,26 @@ sub last_insert_id { shift->_identity }
 # http://sqladvice.com/forums/permalink/18496/22931/ShowThread.aspx#22931
 #
 sub _select_args_to_query {
+  #my ($self, $ident, $select, $cond, $attrs) = @_;
   my $self = shift;
+  my $attrs = $_[3];
 
-  my ($sql, $prep_bind, @rest) = $self->next::method (@_);
+  my $sql_bind = $self->next::method (@_);
 
   # see if this is an ordered subquery
-  my $attrs = $_[3];
   if (
-    $sql !~ /^ \s* SELECT \s+ TOP \s+ \d+ \s+ /xi
-      &&
+    $$sql_bind->[0] !~ /^ \s* \( \s* SELECT \s+ TOP \s+ \d+ \s+ /xi
+      and
     scalar $self->_extract_order_criteria ($attrs->{order_by})
   ) {
     $self->throw_exception(
       'An ordered subselect encountered - this is not safe! Please see "Ordered Subselects" in DBIx::Class::Storage::DBI::MSSQL'
     ) unless $attrs->{unsafe_subselect_ok};
-    my $max = $self->sql_maker->__max_int;
-    $sql =~ s/^ \s* SELECT \s/SELECT TOP $max /xi;
+
+    $$sql_bind->[0] =~ s/^ \s* \( \s* SELECT (?=\s) / '(SELECT TOP ' . $self->sql_maker->__max_int /exi;
   }
 
-  return wantarray
-    ? ($sql, $prep_bind, @rest)
-    : \[ "($sql)", @$prep_bind ]
-  ;
+  $sql_bind;
 }