示例#1
0
// ************************************************************
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();
}
示例#2
0
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;
}