// // can not reduce expression because it might be a union except
// // query with distinct
// read(")");
// return new ConditionExists(query);
// }
Expression r = readConcat();
while (true) {
// // special case: NOT NULL is not part of an expression (as in CREATE
// // TABLE TEST(ID INT DEFAULT 0 NOT NULL))
// int backup = parseIndex;
boolean not = false;
if (readIf("NOT")) {
not = true;
// if (isToken("NULL")) {
// // this really only works for NOT NULL!
// parseIndex = backup;
// currentToken = "NOT";
// break;
// }
}
Operator op = readCustom(not);
if (op != null) {
Expression b;
switch (op.getCardinality()) {
case ZERO: {
b = null;
break;
}
case ONE: {
b = readConcat();
break;
}
case MULTI: {
read("(");
Collection<Expression> v = new ArrayList<Expression>();
Expression last;
do {
last = readExpression();
v.add(last);
} while (readIf(","));
read(")");
b = new Parameter(session, v);
break;
}
default:
throw new IllegalArgumentException("Can't handle "
+ op.getCardinality());
}
Expression esc = null;
if (readIf("ESCAPE")) {
esc = readConcat();
}
recompileAlways = true;
r = new Comparison(session, op.getName(), r, b);
} //else if (readIf("REGEXP")) {
// Expression b = readConcat();
// r = new CompareLike(database.getCompareMode(), r, b, null, true);
// } else
if (readIf("IS")) {
String type;
if (readIf("NOT")) {
type = Operator.IS_NOT_NULL;
} else {
type = Operator.IS_NULL;
}
read("NULL");
r = new Comparison(session, type, r, null);
// } else if (readIf("IN")) {
// if (SysProperties.OPTIMIZE_IN && !SysProperties.OPTIMIZE_IN_LIST) {
// recompileAlways = true;
// }
// read("(");
// if (readIf(")")) {
// r = ValueExpression.get(ValueBoolean.get(false));
// } else {
// if (isToken("SELECT") || isToken("FROM")) {
// Query query = parseSelect();
// r = new ConditionInSelect(database, r, query, false, Comparison.EQUAL);
// } else {
// ObjectArray<Expression> v = ObjectArray.newInstance();
// Expression last;
// do {
// last = readExpression();
// v.add(last);
// } while (readIf(","));
// if (v.size() == 1 && (last instanceof Subquery)) {
// Subquery s = (Subquery) last;
// Query q = s.getQuery();
// r = new ConditionInSelect(database, r, q, false, Comparison.EQUAL);
// } else {
// r = new ConditionIn(database, r, v);
// }
// }
// read(")");
// }
// } else if (readIf("BETWEEN")) {
// Expression low = readConcat();
// read("AND");
// Expression high = readConcat();
// Expression condLow = new Comparison(session, Comparison.SMALLER_EQUAL, low, r);
// Expression condHigh = new Comparison(session, Comparison.BIGGER_EQUAL, high, r);
// r = new ConditionAndOr(ConditionAndOr.AND, condLow, condHigh);
} else {
String compareType = getCompareType(currentTokenType);
if (compareType == null) {
break;
}
read();
// if (readIf("ALL")) {
// read("(");
// Query query = parseSelect();
// r = new ConditionInSelect(database, r, query, true, compareType);
// read(")");
// } else if (readIf("ANY") || readIf("SOME")) {
// read("(");
// Query query = parseSelect();
// r = new ConditionInSelect(database, r, query, false, compareType);
// read(")");
// } else {
Expression right = readConcat();
// if (readIf("(") && readIf("+") && readIf(")")) {
// // support for a subset of old-fashioned Oracle outer
// // join with (+)
// if (r instanceof ExpressionColumn && right instanceof ExpressionColumn) {
// ExpressionColumn leftCol = (ExpressionColumn) r;