with sql_exceptions; package body sql_double_precision_pkg is null_value_error : exception renames sql_exceptions. null_value_error; function without_null_base (value : sql_double_precision) return sql_double_precision_not_null is begin if value. is_null then raise null_value_error; else return value. value; end if; end without_null_base; function with_null_base (value : sql_double_precision_not_null) return sql_double_precision is begin return (false, value); end with_null_base; procedure assign_with_check (left : in out sql_double_precision; right : sql_double_precision; first, last : sql_double_precision_not_null) is begin if right. is_null then left. is_null := true; elsif (right. value < first or else right. value > last) then raise constraint_error; else left := right; end if; end assign_with_check; function null_sql_double_precision return sql_double_precision is null_holder : sql_double_precision; begin return (null_holder); -- relies on default expression for is_null end null_sql_double_precision; function "+" (right : sql_double_precision) return sql_double_precision is begin return right; end "+"; function "-" (right : sql_double_precision) return sql_double_precision is begin return (right. is_null, - (right. value)); end "-"; function "abs" (right : sql_double_precision) return sql_double_precision is begin return (right. is_null, abs (right. value)); end "abs"; function "+" (left, right : sql_double_precision) return sql_double_precision is begin if left. is_null or right. is_null then return null_sql_double_precision; else return (false, (left. value + right. value)); end if; end "+"; function "*" (left, right : sql_double_precision) return sql_double_precision is begin if left. is_null or right. is_null then return null_sql_double_precision; else return (false, (left. value * right. value)); end if; end "*"; function "-" (left, right : sql_double_precision) return sql_double_precision is begin if left. is_null or right. is_null then return null_sql_double_precision; else return (false, (left. value - right. value)); end if; end "-"; function "/" (left, right : sql_double_precision) return sql_double_precision is begin if left. is_null or right. is_null then return null_sql_double_precision; else return (false, (left. value / right. value)); end if; end "/"; function "**" (left : sql_double_precision; right : integer) return sql_double_precision is begin if left. is_null then return null_sql_double_precision; else return (false, (left. value ** right)); end if; end "**"; function equals (left, right : sql_double_precision) return boolean_with_unknown is begin if left. is_null or right. is_null then return unknown; elsif left. value = right. value then return true; else return false; end if; end equals; function not_equals (left, right : sql_double_precision) return boolean_with_unknown is begin if left. is_null or right. is_null then return unknown; elsif left. value = right. value then return false; else return true; end if; end not_equals; function "<" (left, right : sql_double_precision) return boolean_with_unknown is begin if left. is_null or right. is_null then return unknown; elsif left. value < right. value then return true; else return false; end if; end "<"; function ">" (left, right : sql_double_precision) return boolean_with_unknown is begin if left. is_null or right. is_null then return unknown; elsif left. value > right. value then return true; else return false; end if; end ">"; function "<=" (left, right : sql_double_precision) return boolean_with_unknown is begin if left. is_null or right. is_null then return unknown; elsif left. value <= right. value then return true; else return false; end if; end "<="; function ">=" (left, right : sql_double_precision) return boolean_with_unknown is begin if left. is_null or right. is_null then return unknown; elsif left. value >= right. value then return true; else return false; end if; end ">="; function is_null (value : sql_double_precision) return boolean is begin return value. is_null; end; function not_null (value : sql_double_precision) return boolean is begin return not value. is_null; end; function "=" (left, right : sql_double_precision) return boolean is begin if left. is_null or else right. is_null then return false; else return left. value = right. value; end if; end "="; function "<" (left, right : sql_double_precision) return boolean is begin if left. is_null or else right. is_null then return false; else return left. value < right. value; end if; end "<"; function ">" (left, right : sql_double_precision) return boolean is begin if left. is_null or else right. is_null then return false; else return left. value > right. value; end if; end ">"; function "<=" (left, right : sql_double_precision) return boolean is begin if left. is_null or else right. is_null then return false; else return left. value <= right. value; end if; end "<="; function ">=" (left, right : sql_double_precision) return boolean is begin if left. is_null or else right. is_null then return false; else return left. value >= right. value; end if; end ">="; package body sql_double_precision_ops is function with_null (value : without_null_type) return with_null_type is begin return (with_null_base (sql_double_precision_not_null (value))); end with_null; function without_null (value : with_null_type) return without_null_type is begin return (without_null_type (sql_double_precision_not_null'(without_null_base (value)))); end without_null; procedure assign (left : in out with_null_type; right : in with_null_type) is begin assign_with_check (left, right, sql_double_precision_not_null (without_null_type'first), sql_double_precision_not_null (without_null_type'last)); end assign; end; end;