diff --git a/typo3/sysext/dbal/Classes/Database/SqlParser.php b/typo3/sysext/dbal/Classes/Database/SqlParser.php index 3100541c86bc51a1cf44a0fa4313d1ab9c49fcc4..020a629b7ab728fced34faafa5f95dc17c6476e5 100644 --- a/typo3/sysext/dbal/Classes/Database/SqlParser.php +++ b/typo3/sysext/dbal/Classes/Database/SqlParser.php @@ -694,7 +694,7 @@ class SqlParser extends \TYPO3\CMS\Core\Database\SqlParser { $implodeString = ' ' . $operator . ' ' . $field . ' ' . $v['comparator']; // add opening brace before field - $lastFieldPos = strpos($output, $field); + $lastFieldPos = strrpos($output, $field); $output = substr_replace($output, '(', $lastFieldPos, 0); $output .= implode($implodeString, $listExpressions) . ')'; } diff --git a/typo3/sysext/dbal/Tests/Unit/Database/DatabaseConnectionOracleTest.php b/typo3/sysext/dbal/Tests/Unit/Database/DatabaseConnectionOracleTest.php index 3b7a241a61bef2dc1689a0aa1b32fb0520195384..7e57bc6f3cb5df5a611795886b79a78ae5c258e5 100644 --- a/typo3/sysext/dbal/Tests/Unit/Database/DatabaseConnectionOracleTest.php +++ b/typo3/sysext/dbal/Tests/Unit/Database/DatabaseConnectionOracleTest.php @@ -972,4 +972,28 @@ class DatabaseConnectionOracleTest extends AbstractTestCase { $expectedQuery = 'SELECT * FROM "tt_content" WHERE "uid" IN (0,1,2,3,4,5,6,7,8,9,10)'; $this->assertEquals($expectedQuery, $this->cleanSql($result)); } + + /** + * @test + */ + public function expressionListBracesAreSetCorrectly() { + $listMaxExpressions = 1000; + + $mockSpecificsOci8 = $this->getAccessibleMock('TYPO3\\CMS\\Dbal\\Database\\Specifics\\Oci8', array(), array(), '', FALSE); + $mockSpecificsOci8->expects($this->any())->method('getSpecific')->will($this->returnValue($listMaxExpressions)); + + $items = range(0, 1250); + $where = 'uid = 1981 AND uid IN(' . implode(',', $items) . ')'; + $result = $this->subject->SELECTquery('uid, pid', 'tt_content', $where); + + $chunks = array_chunk($items, $listMaxExpressions); + $whereExpr = array(); + foreach ($chunks as $chunk) { + $whereExpr[] = '"uid" IN (' . implode(',', $chunk) . ')'; + } + + $expectedWhere = '"uid" = 1981 AND (' . implode(' OR ', $whereExpr) . ')'; + $expectedQuery = 'SELECT "uid", "pid" FROM "tt_content" WHERE ' . $expectedWhere; + $this->assertEquals($expectedQuery, $this->cleanSql($result)); + } } \ No newline at end of file