Пример #1
0
 private void setEvaluatableRecursive(TableFilter f) {
   for (; f != null; f = f.getJoin()) {
     f.setEvaluatable(f, true);
     if (condition != null) {
       condition.setEvaluatable(f, true);
     }
     TableFilter n = f.getNestedJoin();
     if (n != null) {
       setEvaluatableRecursive(n);
     }
     Expression on = f.getJoinCondition();
     if (on != null) {
       if (!on.isEverything(ExpressionVisitor.EVALUATABLE_VISITOR)) {
         if (session.getDatabase().getSettings().nestedJoins) {
           // need to check that all added are bound to a table
           on = on.optimize(session);
           if (!f.isJoinOuter() && !f.isJoinOuterIndirect()) {
             f.removeJoinCondition();
             addCondition(on);
           }
         } else {
           if (f.isJoinOuter()) {
             // this will check if all columns exist - it may or may not throw an exception
             on = on.optimize(session);
             // it is not supported even if the columns exist
             throw DbException.get(ErrorCode.UNSUPPORTED_OUTER_JOIN_CONDITION_1, on.getSQL());
           }
           f.removeJoinCondition();
           // need to check that all added are bound to a table
           on = on.optimize(session);
           addCondition(on);
         }
       }
     }
     on = f.getFilterCondition();
     if (on != null) {
       if (!on.isEverything(ExpressionVisitor.EVALUATABLE_VISITOR)) {
         f.removeFilterCondition();
         addCondition(on);
       }
     }
     // this is only important for subqueries, so they know
     // the result columns are evaluatable
     for (Expression e : expressions) {
       e.setEvaluatable(f, true);
     }
   }
 }