Index: class.ux_t3lib_db.php =================================================================== --- class.ux_t3lib_db.php (revision 32438) +++ class.ux_t3lib_db.php (working copy) @@ -1054,10 +1054,12 @@ foreach ($v['JOIN'] as $joinCnt => $join) { $from_table[$k]['JOIN'][$joinCnt]['withTable'] = $this->quoteName($join['withTable']); $from_table[$k]['JOIN'][$joinCnt]['as'] = ($join['as']) ? $this->quoteName($join['as']) : ''; - $from_table[$k]['JOIN'][$joinCnt]['ON'][0]['table'] = ($join['ON'][0]['table']) ? $this->quoteName($join['ON'][0]['table']) : ''; - $from_table[$k]['JOIN'][$joinCnt]['ON'][0]['field'] = $this->quoteName($join['ON'][0]['field']); - $from_table[$k]['JOIN'][$joinCnt]['ON'][1]['table'] = ($join['ON'][1]['table']) ? $this->quoteName($join['ON'][1]['table']) : ''; - $from_table[$k]['JOIN'][$joinCnt]['ON'][1]['field'] = $this->quoteName($join['ON'][1]['field']); + foreach ($from_table[$k]['JOIN'][$joinCnt]['ON'] as &$condition) { + $condition['left']['table'] = ($condition['left']['table']) ? $this->quoteName($condition['left']['table']) : ''; + $condition['left']['field'] = $this->quoteName($condition['left']['field']); + $condition['right']['table'] = ($condition['right']['table']) ? $this->quoteName($condition['right']['table']) : ''; + $condition['right']['field'] = $this->quoteName($condition['right']['field']); + } } } } @@ -2506,17 +2508,23 @@ } $onPartsArray = array(); // Mapping ON parts of the JOIN - if (is_array($join['ON'])) { - foreach ($join['ON'] as $onParts) { - if (isset($this->mapping[$onParts['table']]['mapFieldNames'][$onParts['field']])) { - $onParts['field'] = $this->mapping[$onParts['table']]['mapFieldNames'][$onParts['field']]; + if (is_array($tables[$k]['JOIN'][$joinCnt]['ON'])) { + foreach ($tables[$k]['JOIN'][$joinCnt]['ON'] as &$condition) { + // Left side of the comparator + if (isset($this->mapping[$condition['left']['table']]['mapFieldNames'][$condition['left']['field']])) { + $condition['left']['field'] = $this->mapping[$condition['left']['table']]['mapFieldNames'][$condition['left']['field']]; } - if (isset($this->mapping[$onParts['table']]['mapTableName'])) { - $onParts['table'] = $this->mapping[$onParts['table']]['mapTableName']; + if (isset($this->mapping[$condition['left']['table']]['mapTableName'])) { + $condition['left']['table'] = $this->mapping[$condition['left']['table']]['mapTableName']; } - $onPartsArray[] = $onParts; + // Right side of the comparator + if (isset($this->mapping[$condition['right']['table']]['mapFieldNames'][$condition['right']['field']])) { + $condition['right']['field'] = $this->mapping[$condition['right']['table']]['mapFieldNames'][$condition['right']['field']]; + } + if (isset($this->mapping[$condition['right']['table']]['mapTableName'])) { + $condition['right']['table'] = $this->mapping[$condition['right']['table']]['mapTableName']; + } } - $tables[$k]['JOIN'][$joinCnt]['ON'] = $onPartsArray; } } } Index: tests/sqlparser_general_testcase.php =================================================================== --- tests/sqlparser_general_testcase.php (revision 32438) +++ tests/sqlparser_general_testcase.php (working copy) @@ -316,6 +316,30 @@ $this->assertEquals($expected, $actual); } + /** + * @test + * @see http://bugs.typo3.org/view.php?id=14182 + */ + public function canParseMultipleJoinConditions() { + $sql = 'SELECT * FROM T1 LEFT OUTER JOIN T2 ON T2.pid = T1.uid AND T2.size = 4 WHERE T1.cr_userid = 1'; + $expected = 'SELECT * FROM T1 LEFT OUTER JOIN T2 ON T2.pid=T1.uid AND T2.size=4 WHERE T1.cr_userid = 1'; + $actual = $this->cleanSql($this->fixture->debug_testSQL($sql)); + + $this->assertEquals($expected, $actual); + } + + /** + * @test + * @see http://bugs.typo3.org/view.php?id=14182 + */ + public function canParseMultipleJoinConditionsWithLessThanOperator() { + $sql = 'SELECT * FROM T1 LEFT OUTER JOIN T2 ON T2.size < 4 OR T2.pid = T1.uid WHERE T1.cr_userid = 1'; + $expected = 'SELECT * FROM T1 LEFT OUTER JOIN T2 ON T2.size<4 OR T2.pid=T1.uid WHERE T1.cr_userid = 1'; + $actual = $this->cleanSql($this->fixture->debug_testSQL($sql)); + + $this->assertEquals($expected, $actual); + } + /////////////////////////////////////// // Tests concerning DB management ///////////////////////////////////////