📄 database.cpp
字号:
sattr.fvalue = *(real4*)((char*)expr->var + iattr.paramBase); return; case dbvmLoadVarReal8: sattr.fvalue = *(real8*)((char*)expr->var + iattr.paramBase); return; case dbvmLoadVarReference: sattr.oid = *(oid_t*)((char*)expr->var + iattr.paramBase); return; case dbvmLoadVarRectangle: sattr.rvalue = *(rectangle*)((char*)expr->var + iattr.paramBase); return; case dbvmLoadVarString: sattr.array.base = (char*)((char*)expr->var + iattr.paramBase); sattr.array.size = strlen((char*)sattr.array.base) + 1; return; case dbvmLoadVarStringPtr: sattr.array.base = *(char**)((char*)expr->var + iattr.paramBase); sattr.array.size = strlen((char*)sattr.array.base) + 1; return; case dbvmLoadVarArrayOfOid: case dbvmLoadVarArrayOfInt4: case dbvmLoadVarArrayOfInt8: sattr.array.base = (char*)((dbAnyArray*)((char*)expr->var + iattr.paramBase))->base(); sattr.array.size = ((dbAnyArray*)((char*)expr->var + iattr.paramBase))->length(); return; case dbvmLoadVarArrayOfOidPtr: case dbvmLoadVarArrayOfInt4Ptr: case dbvmLoadVarArrayOfInt8Ptr: { dbAnyArray* arr = *(dbAnyArray**)((char*)expr->var + iattr.paramBase); sattr.array.base = (char*)arr->base(); sattr.array.size = arr->length(); return; } case dbvmLoadVarRawBinary: sattr.raw = (void*)((char*)expr->var + iattr.paramBase); return;#ifdef USE_STD_STRING case dbvmLoadVarStdString: sattr.array.base = (char*)((std::string*)((char*)expr->var + iattr.paramBase))->c_str(); sattr.array.size = ((std::string*)((char*)expr->var + iattr.paramBase))->length() + 1; return;#endif case dbvmLoadTrue: sattr.bvalue = true; return; case dbvmLoadFalse: sattr.bvalue = false; return; case dbvmLoadNull: sattr.oid = 0; return; case dbvmLoadIntConstant: sattr.ivalue = expr->ivalue; return; case dbvmLoadRealConstant: sattr.fvalue = expr->fvalue; return; case dbvmLoadRectangleConstant: sattr.rvalue = expr->rvalue; return; case dbvmLoadStringConstant: sattr.array.base = expr->svalue.str; sattr.array.size = expr->svalue.len; return; case dbvmOrBool: execute(expr->operand[0], iattr, sattr); if (sattr.bvalue == 0) { execute(expr->operand[1], iattr, sattr); } 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 dbvmAddRectangle: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.rvalue += sattr2.rvalue; 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 dbvmEqRectangle: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = sattr.rvalue == sattr2.rvalue; return; case dbvmNeRectangle: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = sattr.rvalue != sattr2.rvalue; return; case dbvmGtRectangle: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = sattr.rvalue > sattr2.rvalue; return; case dbvmGeRectangle: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = sattr.rvalue >= sattr2.rvalue; return; case dbvmLtRectangle: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = sattr.rvalue < sattr2.rvalue; return; case dbvmLeRectangle: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = sattr.rvalue <= sattr2.rvalue; return; case dbvmOverlapsRectangle: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = sattr.rvalue & sattr2.rvalue; return; case dbvmRectangleArea: execute(expr->operand[0], iattr, sattr); sattr.fvalue = (double)area(sattr.rvalue); 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:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -