in HSQL/src/org/hsqldb1/Expression.java [3295:3393]
Object getValue(Session session) throws HsqlException {
switch (exprType) {
case VALUE :
return valueData;
case COLUMN :
try {
return tableFilter.currentData[columnIndex];
} catch (NullPointerException e) {
String name = tableName == null ? columnName
: tableName + '.'
+ columnName;
throw Trace.error(Trace.COLUMN_NOT_FOUND, name);
}
case FUNCTION :
return function.getValue(session);
case QUERY :
return subQuery.select.getValue(session, dataType);
case NEGATE :
return Column.negate(eArg.getValue(session, dataType),
dataType);
case ALL :
case ANY :
return null;
case AND :
case OR :
case LIKE :
case EXISTS :
case IN :
case IS_NULL :
case NOT :
return test(session);
case CONVERT :
return Column.convertObject(session, eArg.getValue(session),
dataType, precision, scale);
case CASEWHEN :
Boolean result = eArg.test(session);
if (Boolean.TRUE.equals(result)) {
return eArg2.eArg.getValue(session, dataType);
} else {
return eArg2.eArg2.getValue(session, dataType);
}
// gets here from getAggregatedValue()
case ALTERNATIVE :
return new Object[] {
eArg.getValue(session, dataType),
eArg2.getValue(session, dataType)
};
}
// todo: simplify this
Object a = null,
b = null;
if (eArg != null) {
a = eArg.getValue(session, dataType);
}
if (eArg2 != null) {
b = eArg2.getValue(session, dataType);
}
switch (exprType) {
case ADD :
return Column.add(a, b, dataType);
case SUBTRACT :
return Column.subtract(a, b, dataType);
case MULTIPLY :
return Column.multiply(a, b, dataType);
case DIVIDE :
return Column.divide(a, b, dataType);
case CONCAT :
return Column.concat(a, b);
case SEQUENCE :
return ((NumberSequence) valueData).getValueObject();
default :
/** @todo fredt - make sure the expression type is always comparison here */
return test(session);
}
}