database.cpp

来自「FastDb是高效的内存数据库系统」· C++ 代码 · 共 2,469 行 · 第 1/5 页

CPP
2,469
字号

    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;

  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 = (*(db_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 = (*(db_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 = (*(db_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;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?