// ************************************************************ void testOperators (void) { Value *result; testName = "test value comparison and boolean operators"; MAKE_VALUE(result, DT_INT, 0); // equality OP_TRUE(stringToValue("i10"),stringToValue("i10"), valueEquals, "10 = 10"); OP_FALSE(stringToValue("i9"),stringToValue("i10"), valueEquals, "9 != 10"); OP_TRUE(stringToValue("sHello World"),stringToValue("sHello World"), valueEquals, "Hello World = Hello World"); OP_FALSE(stringToValue("sHello Worl"),stringToValue("sHello World"), valueEquals, "Hello Worl != Hello World"); OP_FALSE(stringToValue("sHello Worl"),stringToValue("sHello Wor"), valueEquals, "Hello Worl != Hello Wor"); // smaller OP_TRUE(stringToValue("i3"),stringToValue("i10"), valueSmaller, "3 < 10"); OP_TRUE(stringToValue("f5.0"),stringToValue("f6.5"), valueSmaller, "5.0 < 6.5"); // boolean OP_TRUE(stringToValue("bt"),stringToValue("bt"), boolAnd, "t AND t = t"); OP_FALSE(stringToValue("bt"),stringToValue("bf"), boolAnd, "t AND f = f"); OP_TRUE(stringToValue("bt"),stringToValue("bf"), boolOr, "t OR f = t"); OP_FALSE(stringToValue("bf"),stringToValue("bf"), boolOr, "f OR f = f"); TEST_CHECK(boolNot(stringToValue("bf"), result)); ASSERT_TRUE(result->v.boolV, "!f = t"); TEST_DONE(); }
RC evalExpr(Record *record, Schema *schema, Expr *expr, Value **result) { Value *lIn; Value *rIn; MAKE_VALUE(*result, DT_INT, -1); switch (expr->type) { case EXPR_OP: { Operator *op = expr->expr.op; bool twoArgs = (op->type != OP_BOOL_NOT); // lIn = (Value *) malloc(sizeof(Value)); // rIn = (Value *) malloc(sizeof(Value)); CHECK(evalExpr(record, schema, op->args[0], &lIn)); if (twoArgs) CHECK(evalExpr(record, schema, op->args[1], &rIn)); switch (op->type) { case OP_BOOL_NOT: CHECK(boolNot(lIn, *result)) ; break; case OP_BOOL_AND: CHECK(boolAnd(lIn, rIn, *result)) ; break; case OP_BOOL_OR: CHECK(boolOr(lIn, rIn, *result)) ; break; case OP_COMP_EQUAL: CHECK(valueEquals(lIn, rIn, *result)) ; break; case OP_COMP_SMALLER: CHECK(valueSmaller(lIn, rIn, *result)) ; break; default: break; } // cleanup freeVal(lIn); if (twoArgs) freeVal(rIn); } break; case EXPR_CONST: CPVAL(*result, expr->expr.cons); break; case EXPR_ATTRREF: free(*result); CHECK(getAttr(record, schema, expr->expr.attrRef, result)) ; break; } return RC_OK; }