PEAR is discontinued

This is a static archive preserving historical releases and metadata. No new packages or updates will be published. For updates to existing packages, or to publish new packages, please use Composer and Packagist.

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.