diff --git a/typo3/sysext/core/Classes/Database/Query/Expression/ExpressionBuilder.php b/typo3/sysext/core/Classes/Database/Query/Expression/ExpressionBuilder.php index ad5cf5bdb8409ba250eac595050f7efb43410bac..692dd25b795a4731441599de00402e2b6c403f43 100644 --- a/typo3/sysext/core/Classes/Database/Query/Expression/ExpressionBuilder.php +++ b/typo3/sysext/core/Classes/Database/Query/Expression/ExpressionBuilder.php @@ -437,6 +437,18 @@ class ExpressionBuilder return $this->calculation('COUNT', $fieldName, $alias); } + /** + * Creates a LENGTH expression for the given field/alias. + * + * @param string $fieldName + * @param string|null $alias + * @return string + */ + public function length(string $fieldName, string $alias = null): string + { + return $this->calculation('LENGTH', $fieldName, $alias); + } + /** * Create a SQL aggregate function. * diff --git a/typo3/sysext/core/Classes/Integrity/DatabaseIntegrityCheck.php b/typo3/sysext/core/Classes/Integrity/DatabaseIntegrityCheck.php index 82be6f70cbb697d2511b4b818352d5ece2dca1c8..34eb270763e80a9ff4f33edc1974da0dbeca5e84 100644 --- a/typo3/sysext/core/Classes/Integrity/DatabaseIntegrityCheck.php +++ b/typo3/sysext/core/Classes/Integrity/DatabaseIntegrityCheck.php @@ -18,6 +18,7 @@ use Doctrine\DBAL\Types\Type; use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder; use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction; use TYPO3\CMS\Core\Database\RelationHandler; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -227,7 +228,11 @@ class DatabaseIntegrityCheck } $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table); $queryBuilder->getRestrictions()->removeAll(); - $queryResult = $queryBuilder->select('uid', 'pid', $GLOBALS['TCA'][$table]['ctrl']['label']) + $selectFields = ['uid', 'pid']; + if (!empty($GLOBALS['TCA'][$table]['ctrl']['label'])) { + $selectFields[] = $GLOBALS['TCA'][$table]['ctrl']['label']; + } + $queryResult = $queryBuilder->select(...$selectFields) ->from($table) ->where( $queryBuilder->expr()->notIn( @@ -422,7 +427,8 @@ class DatabaseIntegrityCheck $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class); foreach ($fkey_arrays as $table => $field_list) { if ($GLOBALS['TCA'][$table] && trim($field_list)) { - $schemaManager = $connectionPool->getConnectionForTable($table)->getSchemaManager(); + $connection = $connectionPool->getConnectionForTable($table); + $schemaManager = $connection->getSchemaManager(); $tableColumns = $schemaManager->listTableColumns($table); $queryBuilder = $connectionPool->getQueryBuilderForTable($table); @@ -433,9 +439,13 @@ class DatabaseIntegrityCheck $queryBuilder->select('uid') ->from($table); $whereClause = []; + foreach ($fields as $fieldName) { // The array index of $tableColumns is the lowercased column name! - $fieldType = $tableColumns[strtolower($fieldName)]->getType()->getName(); + // It is quoted for keywords + $column = $tableColumns[strtolower($fieldName)] + ?? $tableColumns[$connection->quoteIdentifier(strtolower($fieldName))]; + $fieldType = $column->getType()->getName(); if (in_array( $fieldType, [Type::BIGINT, Type::INTEGER, Type::SMALLINT, Type::DECIMAL, Type::FLOAT], @@ -456,6 +466,16 @@ class DatabaseIntegrityCheck $queryBuilder->createNamedParameter('', \PDO::PARAM_STR) ) ); + } elseif (in_array($fieldType, [Type::BLOB], true)) { + $whereClause[] = $queryBuilder->expr()->andX( + $queryBuilder->expr()->isNotNull($fieldName), + $queryBuilder->expr() + ->comparison( + $queryBuilder->expr()->length($fieldName), + ExpressionBuilder::GT, + $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT) + ) + ); } } $queryResult = $queryBuilder->orWhere(...$whereClause)->execute(); diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Expression/ExpressionBuilderTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Expression/ExpressionBuilderTest.php index 30798ba895e9d5afec3b49286e036a43c75e3105..4926d90b5db05e00a03de745bf7379162ad4e7c0 100644 --- a/typo3/sysext/core/Tests/Unit/Database/Query/Expression/ExpressionBuilderTest.php +++ b/typo3/sysext/core/Tests/Unit/Database/Query/Expression/ExpressionBuilderTest.php @@ -488,6 +488,23 @@ class ExpressionBuilderTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCa ); } + /** + * @test + */ + public function lengthQuotesIdentifier() + { + $this->connectionProphet->quoteIdentifier(Argument::cetera())->will(function ($args) { + $platform = new MockPlatform(); + return $platform->quoteIdentifier($args[0]); + }); + + $this->assertSame('LENGTH("tableName"."fieldName")', $this->subject->length('tableName.fieldName')); + $this->assertSame( + 'LENGTH("tableName"."fieldName") AS "anAlias"', + $this->subject->length('tableName.fieldName', 'anAlias') + ); + } + /** * @test */