📄 database.cpp
字号:
}
return;
case dbvmAndBool:
execute(expr->operand[0], iattr, sattr);
if (sattr.bvalue != 0) {
execute(expr->operand[1], iattr, sattr);
}
return;
case dbvmNotBool:
execute(expr->operand[0], iattr, sattr);
sattr.bvalue = !sattr.bvalue;
return;
case dbvmIsNull:
execute(expr->operand[0], iattr, sattr);
sattr.bvalue = sattr.oid == 0;
return;
case dbvmNegInt:
execute(expr->operand[0], iattr, sattr);
sattr.ivalue = -sattr.ivalue;
return;
case dbvmAddInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.ivalue += sattr2.ivalue;
return;
case dbvmSubInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.ivalue -= sattr2.ivalue;
return;
case dbvmMulInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.ivalue *= sattr2.ivalue;
return;
case dbvmDivInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
if (sattr2.ivalue == 0) {
iattr.removeTemporaries();
iattr.db->handleError(ArithmeticError, "Division by zero");
} else {
sattr.ivalue /= sattr2.ivalue;
}
return;
case dbvmAndInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.ivalue &= sattr2.ivalue;
return;
case dbvmOrInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.ivalue |= sattr2.ivalue;
return;
case dbvmNotInt:
execute(expr->operand[0], iattr, sattr);
sattr.ivalue = ~sattr.ivalue;
return;
case dbvmAbsInt:
execute(expr->operand[0], iattr, sattr);
if (sattr.ivalue < 0) {
sattr.ivalue = -sattr.ivalue;
}
return;
case dbvmPowerInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
if (sattr.ivalue == 2) {
sattr.ivalue = sattr2.ivalue < 64
? (nat8)1 << (int)sattr2.ivalue : 0;
} else if (sattr.ivalue == 0 && sattr2.ivalue < 0) {
iattr.removeTemporaries();
iattr.db->handleError(ArithmeticError,
"Raise zero to negative power");
} else {
sattr.ivalue = powerIntInt(sattr.ivalue, sattr2.ivalue);
}
return;
case dbvmEqInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.ivalue == sattr2.ivalue;
return;
case dbvmNeInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.ivalue != sattr2.ivalue;
return;
case dbvmGtInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.ivalue > sattr2.ivalue;
return;
case dbvmGeInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.ivalue >= sattr2.ivalue;
return;
case dbvmLtInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.ivalue < sattr2.ivalue;
return;
case dbvmLeInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = sattr.ivalue <= sattr2.ivalue;
return;
case dbvmBetweenInt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
if (sattr.ivalue < sattr2.ivalue) {
sattr.bvalue = false;
} else {
execute(expr->operand[2], iattr, sattr2);
sattr.bvalue = sattr.ivalue <= sattr2.ivalue;
}
return;
case dbvmNegReal:
execute(expr->operand[0], iattr, sattr);
sattr.fvalue = -sattr.fvalue;
return;
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 = (*(dbUDTComparator)expr->func.fptr)(sattr.raw, sattr2.raw, expr->offs) == 0;
return;
case dbvmNeBinary:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = (*(dbUDTComparator)expr->func.fptr)(sattr.raw, sattr2.raw, expr->offs) != 0;
return;
case dbvmGtBinary:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = (*(dbUDTComparator)expr->func.fptr)(sattr.raw, sattr2.raw, expr->offs) > 0;
return;
case dbvmGeBinary:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = (*(dbUDTComparator)expr->func.fptr)(sattr.raw, sattr2.raw, expr->offs) >= 0;
return;
case dbvmLtBinary:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = (*(dbUDTComparator)expr->func.fptr)(sattr.raw, sattr2.raw, expr->offs) < 0;
return;
case dbvmLeBinary:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
sattr.bvalue = (*(dbUDTComparator)expr->func.fptr)(sattr.raw, sattr2.raw, expr->offs) <= 0;
return;
case dbvmBetweenBinary:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
if ((*(dbUDTComparator)expr->func.fptr)(sattr.raw, sattr2.raw, expr->offs) < 0) {
sattr.bvalue = false;
} else {
execute(expr->operand[2], iattr, sattr2);
sattr.bvalue = (*(dbUDTComparator)expr->func.fptr)(sattr.raw, sattr2.raw, expr->offs) <= 0;
}
return;
case dbvmIntToReference:
execute(expr->operand[0], iattr, sattr);
sattr.oid = (oid_t)sattr.ivalue;
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 = (db_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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -