fix uninitialized warning and a bug in ResultSet
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI.pm
index 28e3465..2939f4a 100644 (file)
@@ -1581,6 +1581,14 @@ sub _subq_update_delete {
 
   # quick check if we got a sane rs on our hands
   my @pcols = $rsrc->primary_columns;
+  unless (@pcols) {
+    $self->throw_exception (
+      sprintf (
+        "You must declare primary key(s) on source '%s' (via set_primary_key) in order to update or delete complex resultsets",
+        $rsrc->source_name || $rsrc->from
+      )
+    );
+  }
 
   my $sel = $rs->_resolved_attrs->{select};
   $sel = [ $sel ] unless ref $sel eq 'ARRAY';
@@ -1782,13 +1790,13 @@ sub _select_args {
   elsif (
     ($attrs->{rows} || $attrs->{offset})
       &&
-    ($sql_maker->limit_dialect eq 'RowNumberOver' || $sql_maker->limit_dialect eq 'Top' )
+    $sql_maker->limit_dialect eq 'RowNumberOver'
       &&
     (ref $ident eq 'ARRAY' && @$ident > 1)  # indicates a join
       &&
     scalar $sql_maker->_order_by_chunks ($attrs->{order_by})
   ) {
-    # the two limit dialects above mangle the SQL such that the join gets lost
+    # the RNO limit dialect above mangles the SQL such that the join gets lost
     # wrap a subquery here
 
     push @limit, delete @{$attrs}{qw/rows offset/};
@@ -2365,10 +2373,19 @@ sub deployment_statements {
     data => $schema,
   );
 
-  my $ret = $tr->translate
-    or $self->throw_exception( 'Unable to produce deployment statements: ' . $tr->error);
+  my @ret;
+  my $wa = wantarray;
+  if ($wa) {
+    @ret = $tr->translate;
+  }
+  else {
+    $ret[0] = $tr->translate;
+  }
 
-  return $ret;
+  $self->throw_exception( 'Unable to produce deployment statements: ' . $tr->error)
+    unless (@ret && defined $ret[0]);
+
+  return $wa ? @ret : $ret[0];
 }
 
 sub deploy {
@@ -2493,6 +2510,34 @@ sub lag_behind_master {
   sub _sqlt_minimum_version { $minimum_sqlt_version };
 }
 
+=head2 relname_to_table_alias
+
+=over 4
+
+=item Arguments: $relname, $join_count
+
+=back
+
+L<DBIx::Class> uses L<DBIx::Class::Relationship> names as table aliases in
+queries.
+
+This hook is to allow specific L<DBIx::Class::Storage> drivers to change the
+way these aliases are named.
+
+The default behavior is C<"$relname_$join_count" if $join_count > 1>, otherwise
+C<"$relname">.
+
+=cut
+
+sub relname_to_table_alias {
+  my ($self, $relname, $join_count) = @_;
+
+  my $alias = ($join_count && $join_count > 1 ?
+    join('_', $relname, $join_count) : $relname);
+
+  return $alias;
+}
+
 sub DESTROY {
   my $self = shift;