Skip to content

Commit 2634d8c

Browse files
Merge branch '6.0' into 6.1
* 6.0: [Messenger] Fix cannot select FOR UPDATE from view on Oracle
2 parents 42a8baa + 6a5e183 commit 2634d8c

File tree

1 file changed

+13
-0
lines changed
  • src/Symfony/Component/Messenger/Bridge/Doctrine/Transport

1 file changed

+13
-0
lines changed

src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Doctrine\DBAL\Exception\TableNotFoundException;
1919
use Doctrine\DBAL\LockMode;
2020
use Doctrine\DBAL\Platforms\MySQLPlatform;
21+
use Doctrine\DBAL\Platforms\OraclePlatform;
2122
use Doctrine\DBAL\Query\QueryBuilder;
2223
use Doctrine\DBAL\Result;
2324
use Doctrine\DBAL\Schema\AbstractSchemaManager;
@@ -183,6 +184,18 @@ public function get(): ?array
183184
);
184185
}
185186

187+
// Wrap the rownum query in a sub-query to allow writelocks without ORA-02014 error
188+
if ($this->driverConnection->getDatabasePlatform() instanceof OraclePlatform) {
189+
$sql = str_replace('SELECT a.* FROM', 'SELECT a.id FROM', $sql);
190+
191+
$wrappedQuery = $this->driverConnection->createQueryBuilder()
192+
->select('w.*')
193+
->from($this->configuration['table_name'], 'w')
194+
->where('w.id IN('.$sql.')');
195+
196+
$sql = $wrappedQuery->getSQL();
197+
}
198+
186199
// use SELECT ... FOR UPDATE to lock table
187200
$stmt = $this->executeQuery(
188201
$sql.' '.$this->driverConnection->getDatabasePlatform()->getWriteLockSQL(),

0 commit comments

Comments
 (0)