📄 database.cpp
字号:
case dbvmAddReal:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.fvalue += sattr2.fvalue;
return;
case dbvmSubReal:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.fvalue -= sattr2.fvalue;
return;
case dbvmMulReal:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.fvalue *= sattr2.fvalue;
return;
case dbvmDivReal:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
if (sattr2.fvalue == 0.0) {
iattr.removeTemporaries();
iattr.db->handleError(ArithmeticError, "Division by zero");
} else {
sattr.fvalue /= sattr2.fvalue;
}
return;
case dbvmAbsReal:
execute(expr->operand[0], iattr, sattr);
if (sattr.fvalue < 0) {
sattr.fvalue = -sattr.fvalue;
}
return;
case dbvmPowerReal:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
if (sattr.fvalue < 0) {
iattr.removeTemporaries();
iattr.db->handleError(ArithmeticError,
"Power operator returns complex result");
} else if (sattr.fvalue == 0.0 && sattr2.fvalue < 0) {
iattr.removeTemporaries();
iattr.db->handleError(ArithmeticError,
"Raise zero to negative power");
} else {
sattr.fvalue = pow(sattr.fvalue, sattr2.fvalue);
}
return;
case dbvmPowerRealInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
if (sattr.fvalue == 0.0 && sattr2.ivalue < 0) {
iattr.removeTemporaries();
iattr.db->handleError(ArithmeticError,
"Raise zero to negative power");
} else {
sattr.fvalue = powerRealInt(sattr.fvalue, sattr2.ivalue);
}
return;
case dbvmEqReal:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.fvalue == sattr2.fvalue;
return;
case dbvmNeReal:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.fvalue != sattr2.fvalue;
return;
case dbvmGtReal:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.fvalue > sattr2.fvalue;
return;
case dbvmGeReal:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.fvalue >= sattr2.fvalue;
return;
case dbvmLtReal:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.fvalue < sattr2.fvalue;
return;
case dbvmLeReal:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.fvalue <= sattr2.fvalue;
return;
case dbvmBetweenReal:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
if (sattr.fvalue < sattr2.fvalue) {
sattr.bvalue = false;
} else {
execute(expr->operand[2], iattr, sattr2);
sattr.bvalue = sattr.fvalue <= sattr2.fvalue;
}
return;
case dbvmEqBinary:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = memcmp(sattr.raw, sattr2.raw, expr->offs) == 0;
return;
case dbvmNeBinary:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = memcmp(sattr.raw, sattr2.raw, expr->offs) != 0;
return;
case dbvmGtBinary:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = memcmp(sattr.raw, sattr2.raw, expr->offs) > 0;
return;
case dbvmGeBinary:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = memcmp(sattr.raw, sattr2.raw, expr->offs) >= 0;
return;
case dbvmLtBinary:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = memcmp(sattr.raw, sattr2.raw, expr->offs) < 0;
return;
case dbvmLeBinary:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = memcmp(sattr.raw, sattr2.raw, expr->offs) <= 0;
return;
case dbvmBetweenBinary:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
if (memcmp(sattr.raw, sattr2.raw, expr->offs) < 0) {
sattr.bvalue = false;
} else {
execute(expr->operand[2], iattr, sattr2);
sattr.bvalue = memcmp(sattr.raw, sattr2.raw, expr->offs) <= 0;
}
return;
case dbvmIntToReal:
execute(expr->operand[0], iattr, sattr);
sattr.fvalue = (real8)sattr.ivalue;
return;
case dbvmRealToInt:
execute(expr->operand[0], iattr, sattr);
sattr.ivalue = (int8)sattr.fvalue;
return;
case dbvmIntToString:
execute(expr->operand[0], iattr, sattr);
convertIntToString(iattr, sattr);
return;
case dbvmRealToString:
execute(expr->operand[0], iattr, sattr);
convertRealToString(iattr, sattr);
return;
case dbvmStringConcat:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
concatenateStrings(iattr, sattr, sattr2);
return;
case dbvmUpperString:
execute(expr->operand[0], iattr, sattr);
uppercaseString(iattr, sattr);
return;
case dbvmLowerString:
execute(expr->operand[0], iattr, sattr);
lowercaseString(iattr, sattr);
return;
case dbvmEqString:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = compareStrings(sattr, sattr2) == 0;
return;
case dbvmNeString:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = compareStrings(sattr, sattr2) != 0;
return;
case dbvmGtString:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = compareStrings(sattr, sattr2) > 0;
return;
case dbvmGeString:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = compareStrings(sattr, sattr2) >= 0;
return;
case dbvmLtString:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = compareStrings(sattr, sattr2) < 0;
return;
case dbvmLeString:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = compareStrings(sattr, sattr2) <= 0;
return;
case dbvmLikeString:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = matchStrings(sattr, sattr2);
return;
case dbvmLikeEscapeString:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
execute(expr->operand[2], iattr, sattr3);
sattr.bvalue = matchStrings(sattr, sattr2, *sattr3.array.base);
return;
case dbvmBetweenString:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
if (compareStrings(sattr, sattr2) < 0) {
sattr.bvalue = false;
} else {
execute(expr->operand[2], iattr, sattr2);
sattr.bvalue = compareStrings(sattr, sattr2) <= 0;
}
return;
case dbvmEqBool:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.bvalue == sattr2.bvalue;
return;
case dbvmNeBool:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.bvalue != sattr2.bvalue;
return;
case dbvmEqReference:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.oid == sattr2.oid;
return;
case dbvmNeReference:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.oid != sattr2.oid;
return;
case dbvmDeref:
execute(expr->operand[0], iattr, sattr);
if (sattr.oid == 0) {
iattr.removeTemporaries();
iattr.db->handleError(NullReferenceError);
}
assert(!(iattr.db->currIndex[sattr.oid]
& (dbInternalObjectMarker|dbFreeHandleMarker)));
sattr.base = iattr.db->baseAddr + iattr.db->currIndex[sattr.oid];
return;
case dbvmFuncArg2Bool:
sattr.bvalue = (*(bool(*)(dbUserFunctionArgument const&))expr->func.fptr)
(dbUserFunctionArgument(expr, iattr, sattr, 0));
return;
case dbvmFuncArg2Int:
sattr.ivalue = (*(int8(*)(dbUserFunctionArgument const&))expr->func.fptr)
(dbUserFunctionArgument(expr, iattr, sattr, 0));
return;
case dbvmFuncArg2Real:
sattr.fvalue = (*(real8(*)(dbUserFunctionArgument const&))expr->func.fptr)
(dbUserFunctionArgument(expr, iattr, sattr, 0));
return;
case dbvmFuncArg2Str:
copyString(iattr, sattr,
(*(char*(*)(dbUserFunctionArgument const&))expr->func.fptr)
(dbUserFunctionArgument(expr, iattr, sattr, 0)));
return;
case dbvmFuncArgArg2Bool:
sattr.bvalue = (*(bool(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr)
(dbUserFunctionArgument(expr, iattr, sattr, 0),
dbUserFunctionArgument(expr, iattr, sattr, 1));
return;
case dbvmFuncArgArg2Int:
sattr.ivalue = (*(int8(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr)
(dbUserFunctionArgument(expr, iattr, sattr, 0),
dbUserFunctionArgument(expr, iattr, sattr, 1));
return;
case dbvmFuncArgArg2Real:
sattr.fvalue = (*(real8(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr)
(dbUserFunctionArgument(expr, iattr, sattr, 0),
dbUserFunctionArgument(expr, iattr, sattr, 1));
return;
case dbvmFuncArgArg2Str:
copyString(iattr, sattr,
(*(char*(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr)
(dbUserFunctionArgument(expr, iattr, sattr, 0),
dbUserFunctionArgument(expr, iattr, sattr, 1)));
return;
case dbvmFuncArgArgArg2Bool:
sattr.bvalue = (*(bool(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr)
(dbUserFunctionArgument(expr, iattr, sattr, 0),
dbUserFunctionArgument(expr, iattr, sattr, 1),
dbUserFunctionArgument(expr, iattr, sattr, 2));
return;
case dbvmFuncArgArgArg2Int:
sattr.ivalue = (*(int8(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr)
(dbUserFunctionArgument(expr, iattr, sattr, 0),
dbUserFunctionArgument(expr, iattr, sattr, 1),
dbUserFunctionArgument(expr, iattr, sattr, 2));
return;
case dbvmFuncArgArgArg2Real:
sattr.fvalue = (*(real8(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr)
(dbUserFunctionArgument(expr, iattr, sattr, 0),
dbUserFunctionArgument(expr, iattr, sattr, 1),
dbUserFunctionArgument(expr, iattr, sattr, 2));
return;
case dbvmFuncArgArgArg2Str:
copyString(iattr, sattr,
(*(char*(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr)
(dbUserFunctionArgument(expr, iattr, sattr, 0),
dbUserFunctionArgument(expr, iattr, sattr, 1),
dbUserFunctionArgument(expr, iattr, sattr, 2)));
return;
case dbvmFuncInt2Bool:
execute(expr->func.arg[0], iattr, sattr);
sattr.bvalue = (*(bool(*)(int8))expr->func.fptr)(sattr.ivalue);
return;
case dbvmFuncReal2Bool:
execute(expr->func.arg[0], iattr, sattr);
sattr.bvalue = (*(bool(*)(real8))expr->func.fptr)(sattr.fvalue);
return;
case dbvmFuncStr2Bool:
execute(expr->func.arg[0], iattr, sattr);
sattr.bvalue =
(*(bool(*)(char const*))expr->func.fptr)(sattr.array.base);
return;
case dbvmFuncInt2Int:
execute(expr->func.arg[0], iattr, sattr);
sattr.ivalue = (*(int8(*)(int8))expr->func.fptr)(sattr.ivalue);
return;
case dbvmFuncReal2Int:
execute(expr->func.arg[0], iattr, sattr);
sattr.ivalue = (*(int8(*)(real8))expr->func.fptr)(sattr.fvalue);
return;
case dbvmFuncStr2Int:
execute(expr->func.arg[0], iattr, sattr);
sattr.ivalue =
(*(int8(*)(char const*))expr->func.fptr)(sattr.array.base);
return;
case dbvmFuncInt2Real:
execute(expr->func.arg[0], iattr, sattr);
sattr.fvalue = (*(real8(*)(int8))expr->func.fptr)(sattr.ivalue);
return;
case dbvmFuncReal2Real:
execute(expr->func.arg[0], iattr, sattr);
sattr.fvalue = (*(real8(*)(real8))expr->func.fptr)(sattr.fvalue);
return;
case dbvmFuncStr2Real:
execute(expr->func.arg[0], iattr, sattr);
sattr.fvalue =
(*(real8(*)(char const*))expr->func.fptr)(sattr.array.base);
return;
case dbvmFuncInt2Str:
execute(expr->func.arg[0], iattr, sattr);
copyString(iattr, sattr,
(*(char*(*)(int8))expr->func.fptr)(sattr.ivalue));
return;
case dbvmFuncReal2Str:
execute(expr->func.arg[0], iattr, sattr);
copyString(iattr, sattr,
(*(char*(*)(real8))expr->func.fptr)(sattr.fvalue));
return;
case dbvmFuncStr2Str:
execute(expr->func.arg[0], iattr, sattr);
copyString(iattr, sattr,
(*(char*(*)(char const*))expr->func.fptr)(sattr.array.base));
return;
case dbvmInArrayBool:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
searchArrayOfBool(sattr, sattr2);
return;
case dbvmInArrayInt1:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
searchArrayOfInt1(sattr, sattr2);
return;
case dbvmInArrayInt2:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
searchArrayOfInt2(sattr, sattr2);
return;
case dbvmInArrayInt4:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
searchArrayOfInt4(sattr, sattr2);
return;
case dbvmInArrayInt8:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
searchArrayOfInt8(sattr, sattr2);
return;
case dbvmInArrayReal4:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
searchArrayOfReal4(sattr, sattr2);
return;
case dbvmInArrayReal8:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
searchArrayOfReal8(sattr, sattr2);
return;
case dbvmInArrayString:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
searchArrayOfString(sattr, sattr2);
return;
case dbvmInArrayReference:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
searchArrayOfReference(sattr, sattr2);
return;
case dbvmInString:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -