SqlParser\Utils\Query::getFirstStatement PHP Method

getFirstStatement() public static method

Gets the first full statement in the query.
public static getFirstStatement ( string $query, string $delimiter = null ) : array
$query string The query to be analyzed.
$delimiter string The delimiter to be used.
return array Array containing the first full query, the remaining part of the query and the last delimiter.
    public static function getFirstStatement($query, $delimiter = null)
    {
        $lexer = new Lexer($query, false, $delimiter);
        $list = $lexer->list;
        /**
         * Whether a full statement was found.
         *
         * @var bool $fullStatement
         */
        $fullStatement = false;
        /**
         * The first full statement.
         *
         * @var string $statement
         */
        $statement = '';
        for ($list->idx = 0; $list->idx < $list->count; ++$list->idx) {
            $token = $list->tokens[$list->idx];
            if ($token->type === Token::TYPE_COMMENT) {
                continue;
            }
            $statement .= $token->token;
            if ($token->type === Token::TYPE_DELIMITER && !empty($token->token)) {
                $delimiter = $token->token;
                $fullStatement = true;
                break;
            }
        }
        // No statement was found so we return the entire query as being the
        // remaining part.
        if (!$fullStatement) {
            return array(null, $query, $delimiter);
        }
        // At least one query was found so we have to build the rest of the
        // remaining query.
        $query = '';
        for (++$list->idx; $list->idx < $list->count; ++$list->idx) {
            $query .= $list->tokens[$list->idx]->token;
        }
        return array(trim($statement), $query, $delimiter);
    }

Usage Example

Example #1
0
 public function testGetFirstStatement()
 {
     $query = 'USE saki';
     $delimiter = null;
     list($statement, $query, $delimiter) = Query::getFirstStatement($query, $delimiter);
     $this->assertEquals(null, $statement);
     $this->assertEquals('USE saki', $query);
     $query = 'USE sakila; ' . '/*test comment*/' . 'SELECT * FROM actor; ' . 'DELIMITER $$ ' . 'UPDATE actor SET last_name = "abc"$$' . '/*!SELECT * FROM actor WHERE last_name = "abc"*/$$';
     $delimiter = null;
     list($statement, $query, $delimiter) = Query::getFirstStatement($query, $delimiter);
     $this->assertEquals('USE sakila;', $statement);
     list($statement, $query, $delimiter) = Query::getFirstStatement($query, $delimiter);
     $this->assertEquals('SELECT * FROM actor;', $statement);
     list($statement, $query, $delimiter) = Query::getFirstStatement($query, $delimiter);
     $this->assertEquals('DELIMITER $$', $statement);
     $this->assertEquals('$$', $delimiter);
     list($statement, $query, $delimiter) = Query::getFirstStatement($query, $delimiter);
     $this->assertEquals('UPDATE actor SET last_name = "abc"$$', $statement);
     list($statement, $query, $delimiter) = Query::getFirstStatement($query, $delimiter);
     $this->assertEquals('SELECT * FROM actor WHERE last_name = "abc"$$', $statement);
 }