Boolean test()

in HSQL/src/org/hsqldb1/Expression.java [3406:3527]


    Boolean test(Session session) throws HsqlException {

        switch (exprType) {

            case TRUE :
                return Boolean.TRUE;

            case FALSE :
                return Boolean.FALSE;

            case NOT :
                if (eArg2 != null) {
                    Trace.doAssert(false, "Expression.test");
                }

                Boolean result = eArg.test(session);

                return result == null ? null
                                      : result.booleanValue() ? Boolean.FALSE
                                                              : Boolean.TRUE;

            case AND : {
                Boolean r1 = eArg.test(session);

                if (r1 == null) {
                    return null;
                }

                Boolean r2 = eArg2.test(session);

                if (r2 == null) {
                    return null;
                }

                return r1.booleanValue() && r2.booleanValue() ? Boolean.TRUE
                                                              : Boolean.FALSE;
            }
            case OR : {
                boolean r1 = Boolean.TRUE.equals(eArg.test(session));

                if (r1) {
                    return Boolean.TRUE;
                }

                return Boolean.TRUE.equals(eArg2.test(session)) ? Boolean.TRUE
                                                                : Boolean
                                                                .FALSE;
            }
            case IS_NULL :
                return eArg.getValue(session) == null ? Boolean.TRUE
                                                      : Boolean.FALSE;

            case LIKE :
                String s = (String) eArg2.getValue(session, Types.VARCHAR);

                if (eArg2.isParam || eArg2.exprType != VALUE) {
                    likeObject.resetPattern(session, s);
                }

                String c = (String) eArg.getValue(session, Types.VARCHAR);

                return likeObject.compare(session, c);

            case IN :
                return eArg2.testInCondition(session, eArg.getValue(session));

            case EXISTS :
                return eArg.testExistsCondition(session);

            case FUNCTION :
                Object value = Column.convertObject(function.getValue(session),
                                                    Types.BOOLEAN);

                return (Boolean) value;
        }

        if (eArg == null || eArg2 == null) {
            if (exprType == COLUMN) {
                if (dataType == Types.BOOLEAN
                        || Types.isNumberType(dataType)) {
                    Object value = Column.convertObject(getValue(session),
                                                        Types.BOOLEAN);

                    return (Boolean) value;
                }
            }

            throw Trace.error(Trace.NOT_A_CONDITION);
        }

        if (eArg2.exprType == Expression.ANY
                || eArg2.exprType == Expression.ALL) {
            return testAnyAllCondition(session, eArg.getValue(session));
        }

        Object o1 = eArg.getValue(session);
        Object o2 = eArg2.getValue(session);

        if (o1 == null || o2 == null) {
/*
 TableFilter.swapCondition() ensures that with LEFT OUTER, eArg is the
 column expression for the table on the right hand side.
 We do not join tables on nulls apart from outer joins
 Any comparison operator can exist in WHERE or JOIN conditions
*/
            if (eArg.tableFilter != null && eArg.tableFilter.isOuterJoin) {
                if (isInJoin) {
                    if (eArg.tableFilter.isCurrentOuter && o1 == null) {
                        return Boolean.TRUE;
                    }
                } else {

                    // this is used in WHERE <OUTER JOIN COL> IS [NOT] NULL
                    eArg.tableFilter.nonJoinIsNull = o2 == null;
                }
            }

            return null;
        }

        return compareValues(session, o1, o2);
    }