Index: t3lib/class.t3lib_sqlparser.php =================================================================== --- t3lib/class.t3lib_sqlparser.php (revision 7409) +++ t3lib/class.t3lib_sqlparser.php (working copy) @@ -832,32 +832,48 @@ if (!$this->nextPart($parseString, '^(ON[[:space:]]+)')) { return $this->parseError('No join condition found in parseFromTables()!', $parseString); } - $field1 = $this->nextPart($parseString,'^([[:alnum:]_.]+)[[:space:]]*=[[:space:]]*', 1); - $field2 = $this->nextPart($parseString,'^([[:alnum:]_.]+)[[:space:]]+'); - if ($field1 && $field2) { - - // Explode fields into field and table: - $tableField = explode('.', $field1, 2); - $field1 = array(); - if (count($tableField) != 2) { - $field1['table'] = ''; - $field1['field'] = $tableField[0]; + $stack[$pnt]['JOIN'][$joinCnt]['ON'] = array(); + $condition = array('operator' => ''); + $parseCondition = TRUE; + while ($parseCondition) { + if (($fieldName = $this->nextPart($parseString, '^([[:alnum:]._]+)[[:space:]]*(<=|>=|<|>|=|!=)')) !== '') { + // Parse field name into field and table: + $tableField = explode('.', $fieldName, 2); + $condition['left'] = array(); + if (count($tableField) == 2) { + $condition['left']['table'] = $tableField[0]; + $condition['left']['field'] = $tableField[1]; + } else { + $condition['left']['table'] = ''; + $condition['left']['field'] = $tableField[0]; + } } else { - $field1['table'] = $tableField[0]; - $field1['field'] = $tableField[1]; + return $this->parseError('No join field found in parseFromTables()!', $parseString); } - $tableField = explode('.', $field2, 2); - $field2 = array(); - if (count($tableField) != 2) { - $field2['table'] = ''; - $field2['field'] = $tableField[0]; + // Find "comparator": + $condition['comparator'] = $this->nextPart($parseString, '^(<=|>=|<|>|=|!=)'); + if (($fieldName = $this->nextPart($parseString, '^([[:alnum:]._]+)')) !== '') { + // Parse field name into field and table: + $tableField = explode('.', $fieldName, 2); + $condition['right'] = array(); + if (count($tableField) == 2) { + $condition['right']['table'] = $tableField[0]; + $condition['right']['field'] = $tableField[1]; + } else { + $condition['right']['table'] = ''; + $condition['right']['field'] = $tableField[0]; + } } else { - $field2['table'] = $tableField[0]; - $field2['field'] = $tableField[1]; + return $this->parseError('No join field found in parseFromTables()!', $parseString); } - $stack[$pnt]['JOIN'][$joinCnt]['ON'] = array($field1, $field2); - $joinCnt++; - } else return $this->parseError('No join fields found in parseFromTables()!', $parseString); + $stack[$pnt]['JOIN'][$joinCnt]['ON'][] = $condition; + if (($operator = $this->nextPart($parseString, '^(AND|OR)')) !== '') { + $condition = array('operator' => $operator); + } else { + $parseCondition = FALSE; + } + } + $joinCnt++; } else return $this->parseError('No join table found in parseFromTables()!', $parseString); } @@ -1138,6 +1154,8 @@ $parseString = ltrim(substr($parseString,strlen($reg[$trimAll?0:1]))); return $reg[1]; } + // No match found + return ''; } /** @@ -1620,11 +1638,16 @@ $outputParts[$k] .= ' ' . $join['as_keyword'] . ' ' . $join['as']; } $outputParts[$k] .= ' ON '; - $outputParts[$k] .= ($join['ON'][0]['table']) ? $join['ON'][0]['table'] . '.' : ''; - $outputParts[$k] .= $join['ON'][0]['field']; - $outputParts[$k] .= '='; - $outputParts[$k] .= ($join['ON'][1]['table']) ? $join['ON'][1]['table'] . '.' : ''; - $outputParts[$k] .= $join['ON'][1]['field']; + foreach ($join['ON'] as $condition) { + if ($condition['operator'] !== '') { + $outputParts[$k] .= ' ' . $condition['operator'] . ' '; + } + $outputParts[$k] .= ($condition['left']['table']) ? $condition['left']['table'] . '.' : ''; + $outputParts[$k] .= $condition['left']['field']; + $outputParts[$k] .= $condition['comparator']; + $outputParts[$k] .= ($condition['right']['table']) ? $condition['right']['table'] . '.' : ''; + $outputParts[$k] .= $condition['right']['field']; + } } } }