protected function parseJoinOperator(SQLTokenIterator $tokens)
 {
     $joinData = array('isInner' => false, 'isRight' => false);
     if ($tokens->seekTokenText(',')) {
         return $joinData;
     }
     if (!$tokens->isTokenNum(SqlToken::T_JOIN(), TokenIterator::NEXT, [SqlToken::T_LEFT(), SqlToken::T_RIGHT(), SqlToken::T_INNER(), SqlToken::T_OUTER(), SqlToken::T_CROSS()])) {
         return null;
     }
     while (true) {
         switch (true) {
             case $tokens->seekTokenNum(SqlToken::T_RIGHT()):
                 $joinData['isRight'] = true;
                 break;
             case $tokens->seekTokenNum(SqlToken::T_LEFT()):
                 $joinData['isRight'] = false;
                 break;
             case $tokens->seekTokenNum(SqlToken::T_INNER()):
                 $joinData['isInner'] = true;
                 break;
             case $tokens->seekTokenNum(SqlToken::T_CROSS()):
             case $tokens->seekTokenNum(SqlToken::T_OUTER()):
                 $joinData['isInner'] = false;
                 break;
             case $tokens->seekTokenNum(SqlToken::T_JOIN()):
                 return $joinData;
             default:
                 throw new MalformedSqlException("Invalid JOIN definition!");
         }
     }
 }