Bug #72089
closedlogicalNot constraint in repository using DBAL throws error in sql parser if it is the first constraint in a queries only logicalAnd
0%
Description
Hi,
when I add some logicalAnd constraints and the first of them is a logicalNot constraint, an exception is thrown with the message
"Catchable fatal error: Argument 1 passed to TYPO3\CMS\Dbal\Database\DatabaseConnection::_quoteWhereClause() must be of the type array, string given, called in XXX\typo3_src\typo3_src-6.2.15\typo3\sysext\dbal\Classes\Database\DatabaseConnection.php on line 1276 and defined in XXX\typo3_src\typo3_src-6.2.15\typo3\sysext\dbal\Classes\Database\DatabaseConnection.php on line 1736".
My repository contains these constraints:
[...]
$andConstraints = array();
$andConstraints[] = $query->logicalNot($query->equals('type', 3)); // Keine internen Termine.
$andConstraints[] = $query->greaterThanOrEqual('date', $currentTimeObj->format('Y-m-d'));
$andConstraints[] = $query->equals('seriesId', (int)$event->getSeriesId());
$query->matching($query->logicalAnd($andConstraints));
$events = $query->execute();
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($events);
The Error occures in typo3\sysext\core\Classes\Database\SqlParser.php, function parseWhereClause() while trying to get the $fieldName in line 1086 and throws the message "SQL engine parse ERROR: No field name found as expected in parseWhereClause(): near "(tx_villaevents_domain_model_event.type = '3') AND"". This message string is then the reason for the thrown error described above where an array is expected.
The full generated SQL where clause is "((NOT (tx_villaevents_domain_model_event.type = '3') AND tx_villaevents_domain_model_event.date >= '2015-12-07') AND tx_villaevents_domain_model_event.series_id = '18742')"
Now the trick:
If I change the ordering of my constraints in my query that the logicalNot is NOT the first, all is fine!
I suggest to fix the bug that a logicalNot can be used as first constraint too.
Environment:
- TYPO3 6.2.15
- dbal 6.2.0 used
- adodb 6.2.0 used
- access to external tables via dbal configured for connection of type "adodb" with driver "mysqli"
- TYPO3 DB is connected as type "native" with default config of LocalConfiguration.
Best regards,
Michael
Updated by Steffen Müller almost 9 years ago
- Project changed from 1865 to TYPO3 Core
- Is Regression set to No
Updated by Morton Jonuschat about 8 years ago
- Category changed from 999 to Database API (Doctrine DBAL)
- Status changed from New to Closed
Solved on TYPO3 8/master by the migration to Doctrine DBAL.