private void replaceColumnReferences(RangeVariable range, Expression[] list) {

      if (indexCond != null) {
        for (int i = 0; i < indexCond.length; i++) {
          if (indexCond[i] != null) {
            indexCond[i] = indexCond[i].replaceColumnReferences(range, list);
          }
        }
      }

      if (indexEndCond != null) {
        for (int i = 0; i < indexEndCond.length; i++) {
          if (indexEndCond[i] != null) {
            indexEndCond[i] = indexEndCond[i].replaceColumnReferences(range, list);
          }
        }
      }

      if (indexEndCondition != null) {
        indexEndCondition = indexEndCondition.replaceColumnReferences(range, list);
      }

      if (excludeConditions != null) {
        excludeConditions = excludeConditions.replaceColumnReferences(range, list);
      }

      if (nonIndexCondition != null) {
        nonIndexCondition = nonIndexCondition.replaceColumnReferences(range, list);
      }

      if (terminalCondition != null) {
        terminalCondition = terminalCondition.replaceColumnReferences(range, list);
      }
    }
  public void replaceColumnReferences(RangeVariable range, Expression[] list) {

    QueryExpression queryExpression = rangeTable.getQueryExpression();
    Expression dataExpression = rangeTable.getDataExpression();

    if (dataExpression != null) {
      dataExpression = dataExpression.replaceColumnReferences(range, list);
    }

    if (queryExpression != null) {
      queryExpression.replaceColumnReferences(range, list);
    }

    if (joinCondition != null) {
      joinCondition = joinCondition.replaceColumnReferences(range, list);
    }

    for (int i = 0; i < joinConditions.length; i++) {
      joinConditions[i].replaceColumnReferences(range, list);
    }

    for (int i = 0; i < whereConditions.length; i++) {
      whereConditions[i].replaceColumnReferences(range, list);
    }
  }
  void moveConditionsToInner(Session session, RangeVariable[] ranges) {

    Expression[] colExpr;
    int exclude;
    HsqlArrayList conditionsList;
    Expression condition = null;

    if (whereConditions.length > 1) {
      return;
    }

    if (joinConditions.length > 1) {
      return;
    }

    for (int i = 0; i < ranges.length; i++) {
      if (ranges[i].isLeftJoin || ranges[i].isRightJoin) {
        return;
      }
    }

    exclude = ArrayUtil.find(ranges, this);
    conditionsList = new HsqlArrayList();

    addConditionsToList(conditionsList, joinConditions[0].indexCond);

    if (joinConditions[0].indexCond != null
        && joinConditions[0].indexCond[0] != joinConditions[0].indexEndCond[0]) {
      addConditionsToList(conditionsList, joinConditions[0].indexEndCond);
    }

    addConditionsToList(conditionsList, whereConditions[0].indexCond);
    addConditionsToList(conditionsList, whereConditions[0].indexEndCond);
    RangeVariableResolver.decomposeAndConditions(
        session, joinConditions[0].nonIndexCondition, conditionsList);
    RangeVariableResolver.decomposeAndConditions(
        session, whereConditions[0].nonIndexCondition, conditionsList);

    for (int i = conditionsList.size() - 1; i >= 0; i--) {
      Expression e = (Expression) conditionsList.get(i);

      if (e == null || e.isTrue() || e.hasReference(ranges, exclude)) {
        conditionsList.remove(i);

        continue;
      }
    }

    if (conditionsList.size() == 0) {
      if (rangeTable.isView()) {
        ((TableDerived) rangeTable).resetToView();
      }

      return;
    }

    QueryExpression queryExpression = rangeTable.getQueryExpression();

    colExpr = ((QuerySpecification) queryExpression).exprColumns;

    for (int i = 0; i < conditionsList.size(); i++) {
      Expression e = (Expression) conditionsList.get(i);
      OrderedHashSet set = e.collectRangeVariables(null);

      e = e.duplicate();
      e = e.replaceColumnReferences(this, colExpr);

      if (e.collectAllSubqueries(null) != null) {
        return;
      }

      if (set != null) {
        for (int j = 0; j < set.size(); j++) {
          RangeVariable range = (RangeVariable) set.get(j);

          if (this != range && range.rangeType == RangeVariable.TABLE_RANGE) {
            queryExpression.setCorrelated();
          }
        }
      }

      condition = ExpressionLogical.andExpressions(condition, e);
    }

    queryExpression.addExtraConditions(condition);
  }
  public void replaceColumnReference(RangeVariable range, Expression[] list) {

    if (joinCondition != null) {
      joinCondition.replaceColumnReferences(range, list);
    }
  }