MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / evlTrunc

Function evlTrunc

src/jrd/SysFunction.cpp:6659–6789  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

6657
6658
6659dsc* evlTrunc(thread_db* tdbb, const SysFunction* function, const NestValueArray& args,
6660 impure_value* impure)
6661{
6662 fb_assert(args.getCount() >= 1);
6663
6664 Request* request = tdbb->getRequest();
6665
6666 const dsc* value = EVL_expr(tdbb, request, args[0]);
6667 if (request->req_flags & req_null) // return NULL if value is NULL
6668 return NULL;
6669
6670 SLONG resultScale = 0;
6671 if (args.getCount() > 1)
6672 {
6673 const dsc* scaleDsc = EVL_expr(tdbb, request, args[1]);
6674 if (request->req_flags & req_null) // return NULL if scaleDsc is NULL
6675 return NULL;
6676
6677 resultScale = MOV_get_long(tdbb, scaleDsc, 0);
6678 if (!(resultScale >= MIN_SCHAR && resultScale <= MAX_SCHAR))
6679 {
6680 status_exception::raise(Arg::Gds(isc_expression_eval_err) <<
6681 Arg::Gds(isc_sysf_invalid_scale) <<
6682 Arg::Str(function->name));
6683 }
6684 resultScale = -resultScale;
6685 }
6686
6687 if (value->isExact())
6688 {
6689 SSHORT scale = value->dsc_scale;
6690 if (value->isInt128())
6691 impure->vlu_misc.vlu_int128 = MOV_get_int128(tdbb, value, scale);
6692 else
6693 impure->vlu_misc.vlu_int64 = MOV_get_int64(tdbb, value, scale);
6694
6695 if (resultScale < scale)
6696 resultScale = scale;
6697
6698 scale -= resultScale;
6699
6700 if (scale < 0)
6701 {
6702 while (scale)
6703 {
6704 if (value->isInt128())
6705 impure->vlu_misc.vlu_int128 = impure->vlu_misc.vlu_int128 / 10;
6706 else
6707 impure->vlu_misc.vlu_int64 /= 10;
6708
6709 ++scale;
6710 }
6711 }
6712
6713 if (value->isInt128())
6714 impure->vlu_desc.makeInt128(resultScale, &impure->vlu_misc.vlu_int128);
6715 else
6716 impure->vlu_desc.makeInt64(resultScale, &impure->vlu_misc.vlu_int64);

Callers

nothing calls this directly

Calls 15

EVL_exprFunction · 0.85
MOV_get_longFunction · 0.85
raiseFunction · 0.85
GdsClass · 0.85
StrClass · 0.85
MOV_get_int128Function · 0.85
MOV_get_int64Function · 0.85
MOV_get_dec128Function · 0.85
MOV_get_doubleFunction · 0.85
isExactMethod · 0.80
isInt128Method · 0.80
makeInt128Method · 0.80

Tested by

no test coverage detected