function PHPSQLresolvePositionalArguments($sqlTree) { $returnTree = $sqlTree; //subqueries can be in FROM and WHERE if (!empty($returnTree['FROM'])) { foreach ($returnTree['FROM'] as &$fromNode) { if (isSubquery($fromNode)) { $fromNode['sub_tree'] = PHPSQLresolvePositionalArguments($fromNode['sub_tree']); $fromNode['base_expr'] = getBaseExpr($fromNode); } } } if (!empty($returnTree['WHERE'])) { foreach ($returnTree['WHERE'] as &$whereNode) { if (isSubquery($whereNode)) { $whereNode['sub_tree'] = PHPSQLresolvePositionalArguments($whereNode['sub_tree']); $whereNode['base_expr'] = getBaseExpr($whereNode); } } } //only do something if there is an ORDER BY if (!empty($returnTree['ORDER'])) { foreach ($returnTree['ORDER'] as &$orderNode) { if ($orderNode['expr_type'] === "pos") { $selNode = $returnTree['SELECT'][(int) $orderNode['base_expr'] - 1]; //rewrite things if (!isColref($selNode)) { $orderNode['expr_type'] = "colref"; if (hasAlias($selNode)) { $orderNode['base_expr'] = extractColumnAlias($selNode); } else { $orderNode['base_expr'] = buildEscapedString(array($selNode)); } $orderNode['no_quotes'] = array("delim" => ".", "parts" => array($orderNode['base_expr'])); } else { $orderNode['expr_type'] = $selNode['expr_type']; $orderNode['base_expr'] = $selNode['base_expr']; if (!empty($selNode['no_quotes'])) { $orderNode['no_quotes'] = $selNode['no_quotes']; } } } } } return $returnTree; }
function rewriteTableNameInSubqueries(&$subTree, $toThisTableName, $exceptThisTableName) { foreach ($subTree as &$node) { if (hasSubtree($node)) { rewriteTableNameInSubqueries($node['sub_tree'], $toThisTableName, $exceptThisTableName); } if (isColref($node)) { $currTable = extractTableName($node); if ($currTable !== $exceptThisTableName) { //if there is a * in the subquery somewhere if (!array_key_exists("no_quotes", $node)) { $node['no_quotes'] = array("delim" => ".", "parts" => array()); } $node['no_quotes']['parts'] = array($toThisTableName, implodeNoQuotes($node['no_quotes'])); $node['base_expr'] = getBaseExpr($node); } } } }
function _parseSqlAll_fixAliasesInNode(&$sqlTree, $fromList, &$selectTreeNode = FALSE) { foreach ($sqlTree as &$node) { if (isSubquery($node)) { _parseSqlAll_fixAliases($node['sub_tree']); } //only process colrefs if (!isColref($node) && !isExpression($node)) { continue; } $table = extractTableName($node); $column = extractColumnName($node); //we only need to change this column if it was retrieved from a subquery if ($table !== false && array_key_exists($table, $fromList) && isSubquery($fromList[$table]) && $fromList[$table]['sub_tree'] != NULL) { //look this column up in the sub select foreach ($fromList[$table]['sub_tree']['SELECT'] as $selNode) { if (hasAlias($selNode) && strpos($selNode['alias']['name'], $column)) { $node['base_expr'] = "`" . $table . "`.`" . trim($selNode['alias']['name'], "`") . "`"; $node['no_quotes'] = array("delim" => ".", "parts" => array($table, trim($selNode['alias']['name'], "`"))); } } } else { if ($selectTreeNode !== FALSE) { //go through the list of columns in the select tree part, and find the corresponding alias //we are doing this the cheep way: //take the column name in where/order/group and get rid of all ` and replace . with __ //this way we should end up with a name that should be contained in the SELECT column list $currAlias = str_replace(".", "__", str_replace("`", "", $node['base_expr'])); $strLenCurrAlias = strlen($currAlias); foreach ($selectTreeNode as $selNode) { $nodeAlias = trim($selNode['alias']['name'], "`"); $aliasStrPos = strpos($nodeAlias, $currAlias); if ($aliasStrPos !== FALSE && strlen($nodeAlias) == $aliasStrPos + $strLenCurrAlias) { $node['base_expr'] = $selNode['alias']['name']; $node['no_quotes'] = array("delim" => ".", "parts" => array($selNode['alias']['name'])); } } } } } }