| 6657 | |
| 6658 | |
| 6659 | dsc* 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); |
nothing calls this directly
no test coverage detected