Index: class.ux_t3lib_sqlparser.php =================================================================== --- class.ux_t3lib_sqlparser.php (revision 26402) +++ class.ux_t3lib_sqlparser.php (working copy) @@ -75,7 +75,7 @@ $this->lastStopKeyWord = strtoupper(str_replace(array(' ',"\t","\r","\n"), '', $this->lastStopKeyWord)); return $stack; } - if (!preg_match('/^(LEFT|JOIN|INNER)[[:space:]]+/i', $parseString)) { + if (!preg_match('/^(LEFT|RIGHT|JOIN|INNER)[[:space:]]+/i', $parseString)) { $stack[$pnt]['as_keyword'] = $this->nextPart($parseString,'^(AS[[:space:]]+)'); $stack[$pnt]['as'] = $this->nextPart($parseString,'^([[:alnum:]_]+)[[:space:]]*'); } @@ -83,7 +83,7 @@ // Looking for JOIN $joinCnt = 0; - while ($join = $this->nextPart($parseString,'^(LEFT[[:space:]]+JOIN|LEFT[[:space:]]+OUTER[[:space:]]+JOIN|INNER[[:space:]]+JOIN|JOIN)[[:space:]]+')) { + while ($join = $this->nextPart($parseString,'^(LEFT[[:space:]]+JOIN|LEFT[[:space:]]+OUTER[[:space:]]+JOIN|RIGHT[[:space:]]+JOIN|RIGHT[[:space:]]+OUTER[[:space:]]+JOIN|INNER[[:space:]]+JOIN|JOIN)[[:space:]]+')) { $stack[$pnt]['JOIN'][$joinCnt]['type'] = $join; if ($stack[$pnt]['JOIN'][$joinCnt]['withTable'] = $this->nextPart($parseString, '^([[:alnum:]_]+)[[:space:]]+', 1)) { if (!preg_match('/^ON[[:space:]]+/i', $parseString)) { Index: tests/sqlparser_general_testcase.php =================================================================== --- tests/sqlparser_general_testcase.php (revision 26402) +++ tests/sqlparser_general_testcase.php (working copy) @@ -167,7 +167,19 @@ /** * @test + * @see http://bugs.typo3.org/view.php?id=12596 */ + public function parseFromTablesWithRightOuterJoinReturnsArray() { + $parseString = 'tx_powermail_fieldsets RIGHT JOIN tt_content ON tx_powermail_fieldsets.tt_content = tt_content.uid'; + $tables = $this->fixture->parseFromTables($parseString); + + $this->assertTrue(is_array($tables), $tables); + $this->assertTrue(empty($parseString), 'parseString is not empty'); + } + + /** + * @test + */ public function parseFromTablesWithMultipleJoinsReturnsArray() { $parseString = 'be_users LEFT OUTER JOIN pages ON be_users.uid = pages.cruser_id INNER JOIN cache_pages cp ON cp.page_id = pages.uid'; $tables = $this->fixture->parseFromTables($parseString); @@ -178,7 +190,19 @@ /** * @test + * @see http://bugs.typo3.org/view.php?id=12596 */ + public function parseFromTablesWithMultipleJoinsAndParenthesesReturnsArray() { + $parseString = 'tx_powermail_fieldsets RIGHT JOIN tt_content ON tx_powermail_fieldsets.tt_content = tt_content.uid LEFT JOIN tx_powermail_fields ON tx_powermail_fieldsets.uid = tx_powermail_fields.fieldset'; + $tables = $this->fixture->parseFromTables($parseString); + + $this->assertTrue(is_array($tables), $tables); + $this->assertTrue(empty($parseString), 'parseString is not empty'); + } + + /** + * @test + */ public function parseWhereClauseReturnsArray() { $parseString = 'uid IN (1,2) AND (starttime < ' . time() . ' OR cruser_id + 10 < 20)'; $where = $this->fixture->parseWhereClause($parseString);