- Модуль: perfmon
- Путь к файлу: ~/bitrix/modules/perfmon/lib/sql/tokenizer.php
- Класс: BitrixPerfmonSqlTokenizer
- Вызов: Tokenizer::_tokenize
private function _tokenize($sql)
{
$this->tokens = array();
$tokenCount = 0;
$chars = '(),.:=;/';
$rawTokens = preg_split("/(
[ \t\n\r]+ # WHITESPACE
|\\+ # BACKSLASHES
|" # DOUBLE QUOTE
|' # SINGLE QUOTE
|`[^`]+` # BACK QUOTE
|\[[^\]]+\] # SQUARE QUOTE
|\/\*.*?\*\/ # COMMENTARY
|--.*?\n # COMMENTARY
|\#[^']*?\n # COMMENTARY
|[".preg_quote($chars, "/")."] # CHARACTER
)/xs", $sql, -1, PREG_SPLIT_DELIM_CAPTURE);
$isInSingleQuote = false;
$isInDoubleQuote = false;
foreach ($rawTokens as $i => $rawToken)
{
if ($rawToken === "")
continue;
/** @var Token $prevToken */
$prevToken = $this->tokens[$tokenCount-1] ?? null;
if ($isInSingleQuote)
{
$prevToken->appendText($rawToken);
if (
$rawToken === "'"
&& preg_match("/(\\)*'$/", $prevToken->text, $match)
&& (
mb_strlen($match[0]) === 0
|| (mb_strlen($match[0]) % 2) === 1
)
)
{
$isInSingleQuote = false;
}
}
elseif ($isInDoubleQuote)
{
$prevToken->appendText($rawToken);
if (
$rawToken === """
&& preg_match("/(\\)*"$/", $prevToken->text, $match)
&& (mb_strlen($match[0]) % 2) === 1
)
{
$isInDoubleQuote = false;
}
}
elseif ($rawToken[0] === "`")
{
$this->tokens[$tokenCount++] = new Token(Token::T_BACK_QUOTE, $rawToken);
}
elseif ($rawToken[0] === "[")
{
$this->tokens[$tokenCount++] = new Token(Token::T_SQUARE_QUOTE, $rawToken);
}
elseif (
($rawToken[0] === "/" && $rawToken[1] === '*')
|| ($rawToken[0] === "-" && $rawToken[1] === '-')
|| ($rawToken[0] === "#")
)
{
$this->tokens[$tokenCount++] = new Token(Token::T_COMMENT, $rawToken);
}
elseif (mb_strlen($rawToken) == 1 && mb_strpos($chars, $rawToken) !== false)
{
$this->tokens[$tokenCount++] = new Token(Token::T_CHAR, $rawToken);
}
elseif ($rawToken === """)
{
$this->tokens[$tokenCount++] = new Token(Token::T_DOUBLE_QUOTE, $rawToken);
$isInDoubleQuote = true;
}
elseif ($rawToken === "'")
{
$this->tokens[$tokenCount++] = new Token(Token::T_SINGLE_QUOTE, $rawToken);
$isInSingleQuote = true;
}
elseif (preg_match("/^[ \t\n\r]+$/", $rawToken))
{
$this->tokens[$tokenCount++] = new Token(Token::T_WHITESPACE, $rawToken);
}
else
{
if ($tokenCount > 0 && $prevToken->type === Token::T_STRING)
{
$prevToken->appendText($rawToken);
}
else
{
$this->tokens[$tokenCount++] = new Token(Token::T_STRING, $rawToken);
}
}
}
}