1<?php
2
3/**
4 * Miscellaneous utilities.
5 */
6
7namespace PhpMyAdmin\SqlParser\Utils;
8
9use PhpMyAdmin\SqlParser\Components\Expression;
10use PhpMyAdmin\SqlParser\Statements\SelectStatement;
11
12/**
13 * Miscellaneous utilities.
14 *
15 * @category   Misc
16 *
17 * @license    https://www.gnu.org/licenses/gpl-2.0.txt GPL-2.0+
18 */
19class Misc
20{
21    /**
22     * Gets a list of all aliases and their original names.
23     *
24     * @param SelectStatement $statement the statement to be processed
25     * @param string          $database  the name of the database
26     *
27     * @return array
28     */
29    public static function getAliases($statement, $database)
30    {
31        if (! ($statement instanceof SelectStatement)
32            || empty($statement->expr)
33            || empty($statement->from)
34        ) {
35            return array();
36        }
37
38        $retval = array();
39
40        $tables = array();
41
42        /**
43         * Expressions that may contain aliases.
44         * These are extracted from `FROM` and `JOIN` keywords.
45         *
46         * @var Expression[]
47         */
48        $expressions = $statement->from;
49
50        // Adding expressions from JOIN.
51        if (! empty($statement->join)) {
52            foreach ($statement->join as $join) {
53                $expressions[] = $join->expr;
54            }
55        }
56
57        foreach ($expressions as $expr) {
58            if (! isset($expr->table) || ($expr->table === '')) {
59                continue;
60            }
61
62            $thisDb = (isset($expr->database) && ($expr->database !== '')) ?
63                $expr->database : $database;
64
65            if (! isset($retval[$thisDb])) {
66                $retval[$thisDb] = array(
67                    'alias' => null,
68                    'tables' => array()
69                );
70            }
71
72            if (! isset($retval[$thisDb]['tables'][$expr->table])) {
73                $retval[$thisDb]['tables'][$expr->table] = array(
74                    'alias' => (isset($expr->alias) && ($expr->alias !== '')) ?
75                        $expr->alias : null,
76                    'columns' => array()
77                );
78            }
79
80            if (! isset($tables[$thisDb])) {
81                $tables[$thisDb] = array();
82            }
83            $tables[$thisDb][$expr->alias] = $expr->table;
84        }
85
86        foreach ($statement->expr as $expr) {
87            if (! isset($expr->column, $expr->alias) || ($expr->column === '') || ($expr->alias === '')
88            ) {
89                continue;
90            }
91
92            $thisDb = (isset($expr->database) && ($expr->database !== '')) ?
93                $expr->database : $database;
94
95            if (isset($expr->table) && ($expr->table !== '')) {
96                $thisTable = isset($tables[$thisDb][$expr->table]) ?
97                    $tables[$thisDb][$expr->table] : $expr->table;
98                $retval[$thisDb]['tables'][$thisTable]['columns'][$expr->column] = $expr->alias;
99            } else {
100                foreach ($retval[$thisDb]['tables'] as &$table) {
101                    $table['columns'][$expr->column] = $expr->alias;
102                }
103            }
104        }
105
106        return $retval;
107    }
108}
109