PEAR is archived and read-only

This mirror preserves historical PEAR package releases and metadata so existing references remain available.

Home » Database » DB_DataObject » Bug #10241

Cascading joins when one involves composite keys fails

Details

Submitted2007-03-02 07:02 UTC
Fromdsanders at baselinesolutions dot com dot au
StatusBogus
PackageDB_DataObject
PHP Version5.2.1
OSIrrelevant
Roadmaps(Not assigned)

Comments

[2007-03-02 07:02 UTC] dsanders at baselinesolutions dot com dot au

Description:
------------
When calling joinAdd() using composite keys and using a joinee object that has already been joined to a third table, incorrect SQL is formed.

Test script:
---------------
links.ini:

[test_b]
fk_a,fk_b=test_a:key_a,key_b
fk_0 = test_0:id

$test_0 = DB_DataObject::factory('test_0');
$test_a = DB_DataObject::factory('test_a');
$test_b = DB_DataObject::factory('test_b');

$test_b->joinAdd($test_0);
$test_a->joinAdd($test_b);

DB_DataObject::debugLevel(1);
$test_a->find();

Expected result:
----------------
DO_Test_a: find:
DO_Test_a: QUERY: SELECT *
FROM test_a

INNER JOIN test_b ON test_b.fk_a=test_a.key_a AND test_b.fk_b=test_a.key_b
INNER JOIN test_0 ON test_0.id=test_b.fk_0

Actual result:
--------------
DO_Test_a: find:
DO_Test_a: QUERY: SELECT *
FROM test_a

INNER JOIN test_b ON test_b.fk_a=test_a.key_a
INNER JOIN test_0 ON test_0.id=test_b.fk_0 AND test_b.fk_b=test_a.key_b
INNER JOIN test_0 ON test_0.id=test_b.fk_0

[2007-03-02 07:11 UTC] dsanders at baselinesolutions dot com dot au

Here's a patch (basically only use {$appendJoin} in the final iteration):

@@ -3229,11 +3229,14 @@ class DB_DataObject extends DB_DataObjec
$key_count = count($ofield);
for($i = 0; $i < $key_count; $i++) {
if ($i == 0) {
- $this->_join .= " ON {$joinAs}.{$ofield[$i]}={$table}.{$tfield[$i]} {$appendJoin} ";
+ $this->_join .= " ON {$joinAs}.{$ofield[$i]}={$table}.{$tfield[$i]} ";
}
- else {
+ else if ($i == $key_count - 1) {
$this->_join .= " AND {$joinAs}.{$ofield[$i]}={$table}.{$tfield[$i]} {$appendJoin} ";
}
+ else {
+ $this->_join .= " AND {$joinAs}.{$ofield[$i]}={$table}.{$tfield[$i]} ";
+ }
}
} else {
$this->_join .= " ON {$joinAs}.{$ofield}={$table}.{$tfield} {$appendJoin} ";

[2007-03-02 07:17 UTC] dsanders at baselinesolutions dot com dot au

Sorry I'm an idiot, the correct package is DB_DataObject

[2007-03-02 07:22 UTC] dsanders at baselinesolutions dot com dot au

Added package version

[2007-03-02 07:40 UTC] dsanders at baselinesolutions dot com dot au

I see now it was fixed in CVS about a week ago.