[Dbix-class] Cross product joins

Gavin Carr gavin at openfusion.com.au
Sun Jan 11 11:24:43 GMT 2009


On Sun, Jan 11, 2009 at 09:47:17PM +1100, Gavin Carr wrote:
> generates a hanging ON clause:
> 
>   ERROR:  syntax error at or near "WHERE" at character 239 [for Statement
>   "SELECT [...] FROM store s JOIN postcode p ON  WHERE ( p.postcode = ? )"
>   with ParamValues: 1='12345']

Digging further, the following patch to DBIx::Class::Storage::DBI 
seems to fix the hanging ON issue:

--- Storage/DBI.pm.dist 2009-01-11 21:31:53.000000000 +1100
+++ Storage/DBI.pm  2009-01-11 21:48:51.000000000 +1100
@@ -227,7 +227,9 @@
     } else {
       push(@sqlf, $self->_make_as($to));
     }
-    push(@sqlf, ' ON ', $self->_join_condition($on));
+    if (my $join_condition = $self->_join_condition($on)) {
+      push(@sqlf, ' ON ', $join_condition);
+    }
   }
   return join('', @sqlf);
 }

and cross joins are now working with that explicit 'from' I
posted, which is great. 

We should perhaps add the 'cross' -join_type to the 'from'
pod in DBIx::Class::ResultSet, if the list there is supposed to
be definitive (?):

--- ResultSet.pm.dist   2009-01-11 22:24:05.000000000 +1100
+++ ResultSet.pm        2009-01-11 22:24:34.000000000 +1100
@@ -2519,7 +2519,7 @@
   [
     { <alias1> => <table1> },
     [
-      { <alias2> => <table2>, -join_type => 'inner|left|right' },
+      { <alias2> => <table2>, -join_type => 'inner|left|right|cross' },
       [], # nested JOIN (optional)
       { <table1.column1> => <table2.column2>, ... (more conditions) },
     ],


Cheers,
Gavin




More information about the DBIx-Class mailing list