From a8900200c20cff122126d7ab9a055c173b530672 Mon Sep 17 00:00:00 2001 From: Ralph Schindler Date: Wed, 12 Mar 2014 12:40:22 -0500 Subject: [PATCH] Zend\Db\Sql Select Subselect Bugfixes: * Select Joins should share state when processing subselect * Decorators should be propagated down into subselects --- library/Zend/Db/Sql/AbstractSql.php | 10 +++++++++- library/Zend/Db/Sql/Select.php | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/library/Zend/Db/Sql/AbstractSql.php b/library/Zend/Db/Sql/AbstractSql.php index aad983d582e..a64942f8e71 100644 --- a/library/Zend/Db/Sql/AbstractSql.php +++ b/library/Zend/Db/Sql/AbstractSql.php @@ -13,6 +13,7 @@ use Zend\Db\Adapter\ParameterContainer; use Zend\Db\Adapter\Platform\PlatformInterface; use Zend\Db\Adapter\StatementContainer; +use Zend\Db\Sql\Platform\PlatformDecoratorInterface; abstract class AbstractSql { @@ -173,7 +174,14 @@ protected function processSubSelect(Select $subselect, PlatformInterface $platfo $subselect->processInfo['paramPrefix'] = 'subselect' . $subselect->processInfo['subselectCount']; // call subselect - $subselect->prepareStatement(new \Zend\Db\Adapter\Adapter($driver, $platform), $stmtContainer); + if ($this instanceof PlatformDecoratorInterface) { + /** @var Select|PlatformDecoratorInterface $subselectDecorator */ + $subselectDecorator = clone $this; + $subselectDecorator->setSubject($subselect); + $subselectDecorator->prepareStatement(new \Zend\Db\Adapter\Adapter($driver, $platform), $stmtContainer); + } else { + $subselect->prepareStatement(new \Zend\Db\Adapter\Adapter($driver, $platform), $stmtContainer); + } // copy count $this->processInfo['subselectCount'] = $subselect->processInfo['subselectCount']; diff --git a/library/Zend/Db/Sql/Select.php b/library/Zend/Db/Sql/Select.php index 030ccdd07ce..abf10de384f 100644 --- a/library/Zend/Db/Sql/Select.php +++ b/library/Zend/Db/Sql/Select.php @@ -745,7 +745,7 @@ protected function processJoins(PlatformInterface $platform, DriverInterface $dr $joinName = ($joinName[1] ? $platform->quoteIdentifier($joinName[1]) . $platform->getIdentifierSeparator() : '') . $platform->quoteIdentifier($joinName[0]); } else { if ($joinName instanceof Select) { - $joinName = '(' . $joinName->processSubSelect($joinName, $platform, $driver, $parameterContainer) . ')'; + $joinName = '(' . $this->processSubSelect($joinName, $platform, $driver, $parameterContainer) . ')'; } else { $joinName = $platform->quoteIdentifier($joinName); }