Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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);
            }
        }
    }
}
Exemplo n.º 3
0
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']));
                    }
                }
            }
        }
    }
}