📄 database.cpp
字号:
}
iattr.removeTemporaries();
iattr.db->handleError(IndexOutOfRangeError, NULL,
int(sattr2.ivalue));
}
sattr.base = (byte*)sattr.array.base + int(sattr2.ivalue)*expr->offs;
return;
case dbvmRectangleCoord:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
if ((nat8)sattr2.ivalue >= rectangle::dim*2) {
if (expr->operand[1]->cop == dbvmVariable) {
longjmp(iattr.exists_iterator[expr->operand[1]->offs].unwind, 1);
}
iattr.removeTemporaries();
iattr.db->handleError(IndexOutOfRangeError, NULL,
int(sattr2.ivalue));
}
sattr.fvalue = sattr.rvalue.boundary[int(sattr2.ivalue)];
return;
case dbvmCharAt:
execute(expr->operand[0], iattr, sattr);
execute(expr->operand[1], iattr, sattr2);
if ((nat8)sattr2.ivalue >= (nat8)(sattr.array.size-1)) {
if (expr->operand[1]->cop == dbvmVariable) {
longjmp(iattr.exists_iterator[expr->operand[1]->offs].unwind, 1);
}
iattr.removeTemporaries();
iattr.db->handleError(IndexOutOfRangeError, NULL,
int(sattr2.ivalue));
}
sattr.ivalue = (byte)sattr.array.base[int(sattr2.ivalue)];
return;
case dbvmExists:
iattr.exists_iterator[expr->offs].index = 0;
if (setjmp(iattr.exists_iterator[expr->offs].unwind) == 0) {
do {
execute(expr->operand[0], iattr, sattr);
iattr.exists_iterator[expr->offs].index += 1;
} while (!sattr.bvalue);
} else {
sattr.bvalue = false;
}
return;
case dbvmVariable:
sattr.ivalue = iattr.exists_iterator[expr->offs].index;
return;
case dbvmLoadVarBool:
sattr.bvalue = *(bool*)((char*)expr->var + iattr.paramBase);
return;
case dbvmLoadVarInt1:
sattr.ivalue = *(int1*)((char*)expr->var + iattr.paramBase);
return;
case dbvmLoadVarInt2:
sattr.ivalue = *(int2*)((char*)expr->var + iattr.paramBase);
return;
case dbvmLoadVarInt4:
sattr.ivalue = *(int4*)((char*)expr->var + iattr.paramBase);
return;
case dbvmLoadVarInt8:
sattr.ivalue = *(db_int8*)((char*)expr->var + iattr.paramBase);
return;
case dbvmLoadVarReal4:
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -