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