| 6614 | |
| 6615 | |
| 6616 | dsc* evlSqrt(thread_db* tdbb, const SysFunction* function, const NestValueArray& args, |
| 6617 | impure_value* impure) |
| 6618 | { |
| 6619 | fb_assert(args.getCount() == 1); |
| 6620 | |
| 6621 | Request* request = tdbb->getRequest(); |
| 6622 | |
| 6623 | const dsc* value = EVL_expr(tdbb, request, args[0]); |
| 6624 | if (request->req_flags & req_null) // return NULL if value is NULL |
| 6625 | return NULL; |
| 6626 | |
| 6627 | if (value->isDecOrInt128()) |
| 6628 | { |
| 6629 | DecimalStatus decSt = tdbb->getAttachment()->att_dec_status; |
| 6630 | impure->vlu_misc.vlu_dec128 = MOV_get_dec128(tdbb, value); |
| 6631 | |
| 6632 | if (impure->vlu_misc.vlu_dec128.compare(decSt, CDecimal128(0)) < 0) |
| 6633 | { |
| 6634 | status_exception::raise(Arg::Gds(isc_expression_eval_err) << |
| 6635 | Arg::Gds(isc_sysf_argmustbe_nonneg) << Arg::Str(function->name)); |
| 6636 | } |
| 6637 | |
| 6638 | impure->vlu_misc.vlu_dec128 = impure->vlu_misc.vlu_dec128.sqrt(decSt); |
| 6639 | impure->vlu_desc.makeDecimal128(&impure->vlu_misc.vlu_dec128); |
| 6640 | } |
| 6641 | else |
| 6642 | { |
| 6643 | impure->vlu_misc.vlu_double = MOV_get_double(tdbb, value); |
| 6644 | |
| 6645 | if (impure->vlu_misc.vlu_double < 0) |
| 6646 | { |
| 6647 | status_exception::raise(Arg::Gds(isc_expression_eval_err) << |
| 6648 | Arg::Gds(isc_sysf_argmustbe_nonneg) << Arg::Str(function->name)); |
| 6649 | } |
| 6650 | |
| 6651 | impure->vlu_misc.vlu_double = sqrt(impure->vlu_misc.vlu_double); |
| 6652 | impure->vlu_desc.makeDouble(&impure->vlu_misc.vlu_double); |
| 6653 | } |
| 6654 | |
| 6655 | return &impure->vlu_desc; |
| 6656 | } |
| 6657 | |
| 6658 | |
| 6659 | dsc* evlTrunc(thread_db* tdbb, const SysFunction* function, const NestValueArray& args, |
nothing calls this directly
no test coverage detected