From 2cac5a36758d5b89b81c7263d949a4a7eb0cdc5f Mon Sep 17 00:00:00 2001
From: Morton Jonuschat <m.jonuschat@mojocode.de>
Date: Thu, 16 Feb 2017 23:07:24 -0800
Subject: [PATCH] [BUGFIX] Fix functional tests for EXT:workspaces on
 PostgreSQL

Detect errors during execution of SQL statements using the
exceptions thrown by Doctrine DBAL instead of trying to use
Connection::errorCode().

The previous code doesn't work on MySQL if an actual error
occurs since an exception would be thrown earlier in the
process and the relevant code path would not be reached.

The happy path worked before because MySQL returns 0 as the
code when a statement executed successfully while PostgreSQL
returns '00000' which PHP does not consider to be empty.

Resolves: #79801
Releases: master
Change-Id: I508966b6731d256d1edff2267669d158a8d647bf
Reviewed-on: https://review.typo3.org/51731
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Andreas Fernandez <typo3@scripting-base.de>
Tested-by: Andreas Fernandez <typo3@scripting-base.de>
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Tested-by: Markus Klein <markus.klein@typo3.org>
---
 .../Fixtures/Frontend/JsonRenderer.ts         |  1 +
 .../version/Classes/Hook/DataHandlerHook.php  | 31 ++++++++++---------
 2 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/typo3/sysext/core/Tests/Functional/Fixtures/Frontend/JsonRenderer.ts b/typo3/sysext/core/Tests/Functional/Fixtures/Frontend/JsonRenderer.ts
index 78c96063530d..10d98527df86 100644
--- a/typo3/sysext/core/Tests/Functional/Fixtures/Frontend/JsonRenderer.ts
+++ b/typo3/sysext/core/Tests/Functional/Fixtures/Frontend/JsonRenderer.ts
@@ -239,6 +239,7 @@ page {
 }
 
 [globalVar = LIT:postgresql = {$databasePlatform}]
+page.10.15.select.where.wrap = "parenttable" = 'pages' AND parentid=|
 page.10.20.select.where = "colPos" = 0
 page.10.20.renderObj.20.select.where.wrap = "parenttable" = 'tt_content' AND "parentid" = |
 page.10.20.renderObj.20.renderObj.10.select.where.wrap = "parenttable" = 'tx_irretutorial_1nff_hotel' AND "parentid" = |
diff --git a/typo3/sysext/version/Classes/Hook/DataHandlerHook.php b/typo3/sysext/version/Classes/Hook/DataHandlerHook.php
index 2aabae355217..6d328b322ab3 100644
--- a/typo3/sysext/version/Classes/Hook/DataHandlerHook.php
+++ b/typo3/sysext/version/Classes/Hook/DataHandlerHook.php
@@ -14,6 +14,7 @@ namespace TYPO3\CMS\Version\Hook;
  * The TYPO3 project - inspiring people to share!
  */
 
+use Doctrine\DBAL\DBALException;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Database\ConnectionPool;
@@ -917,27 +918,29 @@ class DataHandlerHook
         // Execute swapping:
         $sqlErrors = [];
         $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable($table);
-        $connection->update(
-            $table,
-            $swapVersion,
-            ['uid' => (int)$id]
-        );
-
-        if ($connection->errorCode()) {
-            $sqlErrors[] = $connection->errorInfo();
-        } else {
+        try {
             $connection->update(
                 $table,
-                $curVersion,
-                ['uid' => (int)$swapWith]
+                $swapVersion,
+                ['uid' => (int)$id]
             );
+        } catch (DBALException $e) {
+            $sqlErrors[] = $e->getPrevious()->getMessage();
+        }
 
-            if ($connection->errorCode()) {
-                $sqlErrors[] = $connection->errorInfo();
-            } else {
+        if (empty($sqlErrors)) {
+            try {
+                $connection->update(
+                    $table,
+                    $curVersion,
+                    ['uid' => (int)$swapWith]
+                );
                 unlink($lockFileName);
+            } catch (DBALException $e) {
+                $sqlErrors[] = $e->getPrevious()->getMessage();
             }
         }
+
         if (!empty($sqlErrors)) {
             $dataHandler->newlog('During Swapping: SQL errors happened: ' . implode('; ', $sqlErrors), 2);
         } else {
-- 
GitLab