45 #if defined (__cplusplus) 51 #if defined (SUPPRESS_STRLEN_WARNING) 52 #define strlen(s1) ((int) strlen(s1)) 56 #define DB_LONG_NUMERIC_MULTIPLIER 2 58 #define CARRYOVER(arg) ((arg) >> 8) 59 #define GET_LOWER_BYTE(arg) ((arg) & 0xff) 60 #define NUMERIC_ABS(a) ((a) >= 0 ? a : -a) 61 #define TWICE_NUM_MAX_PREC (2*DB_MAX_NUMERIC_PRECISION) 62 #define SECONDS_IN_A_DAY (int)(24L * 60L * 60L) 64 #define ROUND(x) ((x) > 0 ? ((x) + .5) : ((x) - .5)) 72 static const char fast_mod[20] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
73 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
77 #if !defined(SERVER_MODE) 81 #if !defined(SERVER_MODE) 86 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9
108 #if defined(SERVER_MODE) 109 static void numeric_init_pow_of_2 (
void);
113 #if defined(SERVER_MODE) 114 static void numeric_init_pow_of_10 (
void);
143 static int numeric_get_msb_for_dec (
int src_prec,
int src_scale,
unsigned char *src,
int *dest_prec,
int *dest_scale,
166 return (arg[0] & 0x80) ?
true :
false;
247 for (; digit >= 0 && carry == 1; digit--)
250 carry = (answer[digit] == 0) ? 1 : 0;
271 carry = (answer[digit] == 0xff) ? 1 : 0;
286 memset (answer, 0, size);
300 memset (answer, 0xff, size);
336 unsigned int answer_bit = 0;
338 char arg1_dec, arg2_dec;
343 arg1_dec = arg1->
digits[digit];
344 arg2_dec = arg2->
digits[digit];
367 answer_bit = (arg1_dec + arg2_dec) + (answer_bit >= 10);
394 #if defined(SERVER_MODE) 400 numeric_init_pow_of_2 (
void)
419 #if !defined(SERVER_MODE) 429 return &powers_of_2[exp];
453 #if defined(SERVER_MODE) 459 numeric_init_pow_of_10 (
void)
478 #if !defined(SERVER_MODE) 491 #if defined(SERVER_MODE) 497 numeric_init_power_value_string (
void)
499 numeric_init_pow_of_2 ();
500 numeric_init_pow_of_10 ();
526 unsigned int buf_size;
544 msb[digit] = (local_arg2[digit] << numbits) | (local_arg2[digit + 1] >> (8 - numbits));
548 msb[DB_NUMERIC_BUF_SIZE - 1] = (local_arg2[DB_NUMERIC_BUF_SIZE - 1] << numbits) | (local_arg1[0] >> (8 - numbits));
551 for (digit = 0; digit < buf_size - 1; digit++)
553 lsb[digit] = (local_arg1[digit] << numbits) | (local_arg1[digit + 1] >> (8 - numbits));
557 lsb[buf_size - 1] = local_arg1[buf_size - 1] << numbits;
580 if (arg1[digit] != arg2[digit])
582 return (arg1[digit] > arg2[digit]) ? 1 : (-1);
617 unsigned int buf_size;
629 for (digit = 0; digit < buf_size; digit++)
631 answer[digit] = ~(answer[digit]);
658 last = length - numbytes - 1;
659 for (digit = 0; digit < length; digit++)
661 if (first <= digit && digit <= last)
663 answer[digit] = arg[digit - first];
714 if (pad != 0xff && pad != 0)
725 if (arg[digit] != pad)
731 return (arg[digit] & 0x80) == (pad & 0x80) ?
true :
false;
749 if (pad != 0xff && pad != 0)
760 if (arg[digit] != pad)
766 return (arg[digit] & 0x80) == (pad & 0x80) ?
true :
false;
780 return ((arg[pos / 8]) & (0x01 << (7 - (pos % 8)))) ?
true :
false;
822 unsigned int answer_bit = 0;
826 for (digit = size - 1; digit >= 0; digit--)
828 answer_bit = (arg1[digit] + arg2[digit]) +
CARRYOVER (answer_bit);
871 unsigned int answer_bit;
883 *positive_ans =
true;
897 *positive_ans =
false;
904 *positive_ans = !(*positive_ans);
915 if (temp_arg2[digit2] != 0)
926 ((
unsigned int) temp_arg1[digit1] * (
unsigned int) temp_arg2[digit2]) +
953 unsigned int nbit, total_bit;
954 unsigned int buf_size;
960 int neg_remainder =
false;
972 total_bit = buf_size * 8;
982 neg_sign = ~neg_sign;
983 neg_remainder =
true;
990 neg_sign = ~neg_sign;
1003 for (nbit = 0; nbit < total_bit; nbit++)
1011 answer[buf_size - 1] += 1;
1065 int long_arg1, long_arg2;
1107 for (i = 0; i < total_nums; i++)
1115 if (!(arg[i] & 0x80))
1123 for (i = 0; i < total_nums; i++)
1209 int arg1_sign, arg2_sign;
1214 if (arg1_sign < arg2_sign)
1218 else if (arg1_sign > arg2_sign)
1251 bool negative =
false;
1274 if ((
int) arg[0] > 0x7f)
1329 for (loop = 0; loop < dscale && ret ==
NO_ERROR; loop++)
1371 if (scale1 == scale2)
1373 cprec = MAX (prec1, prec2);
1379 else if (scale1 < scale2)
1381 scale_diff = scale2 - scale1;
1382 prec1 = scale_diff + prec1;
1390 cprec = MAX (prec1, prec2);
1396 scale_diff = scale1 - scale2;
1397 prec2 = scale_diff + prec2;
1405 cprec = MAX (prec1, prec2);
1425 int prec1, scale1, prec2, scale2;
1436 scale = MAX (scale1, scale2);
1492 if (result.
digits[i] == -1)
1498 *dec_str = result.
digits[
i] +
'0';
1534 *dest_prec = src_prec;
1535 *dest_scale = src_scale;
1548 *dest_scale = src_scale;
1563 *dest_scale = src_scale - truncation_diff;
1876 int max_scale, scale1, scale2;
1883 int scale, scaleup = 0;
1916 max_scale = MAX (scale1, scale2);
1919 scaleup = (max_scale + scale2) - scale1;
1940 int new_scale, new_prec;
1943 new_scale = scale + scale_delta;
1944 new_prec = prec + scale_delta;
1989 divisor_p = dbv2_copy;
2125 int prec1 = 0, prec2 = 0, scale1 = 0, scale2 = 0;
2126 int prec_common = 0, scale_common = 0;
2157 if (prec1 == prec2 && scale1 == scale2)
2188 if (prec1 - scale1 < prec2 - scale2)
2190 prec_common = prec2 - scale2;
2194 prec_common = prec1 - scale1;
2197 if (scale1 > scale2)
2199 scale_common = scale1;
2203 scale_common = scale2;
2251 pad = (arg >= 0) ? 0 : 0xff;
2262 answer[digit] = pad;
2282 pad = (arg >= 0) ? 0 : 0xff;
2297 answer[digit] = pad;
2320 if (arg[digit] != pad)
2352 DB_NUMERIC zero_scale_numeric, numeric_rem, numeric_tmp;
2354 zero_scale_numeric.
d.
buf[0] =
'\0';
2355 numeric_rem.
d.
buf[0] =
'\0';
2356 numeric_tmp.
d.
buf[0] =
'\0';
2403 ptr = (
char *) answer;
2404 for (i = 0; i <
sizeof (
DB_BIGINT); i++)
2406 #if OR_BYTE_ORDER == OR_LITTLE_ENDIAN 2433 char temp_buffer[10];
2435 bool is_negative =
false;
2440 if (*dec_str ==
'-')
2447 ntot_digits =
strlen ((
char *) dec_str);
2448 chunk = (
char *) dec_str + ntot_digits;
2449 for (dec_dig = ntot_digits - 1; dec_dig >= 0; dec_dig -= 9)
2451 ndigits = MIN (dec_dig + 1, 9);
2453 memcpy (temp_buffer, chunk, ndigits);
2454 temp_buffer[ndigits] =
'\0';
2455 chunk_value = (int) atol (temp_buffer);
2456 if (chunk_value != 0)
2460 if (dec_dig != ntot_digits - 1)
2505 if (local_num[i / 8] == 0)
2509 for (j = 0; j < 8; j++)
2522 if (result.
digits[i] == -1)
2528 *dec_str = result.
digits[
i] +
'0';
2556 *adouble = atof (num_string) / pow (10.0, scale);
2574 double scaled_double;
2575 int scaled_int, estimated_precision;
2576 scaled_double = (adouble *
numeric_Pow_of_10[dst_scale]) + (adouble < 0.0 ? -0.5 : 0.5);
2577 scaled_int = (int) scaled_double;
2594 if (scaled_int < 10L)
2596 estimated_precision = 1;
2598 else if (scaled_int < 100L)
2600 estimated_precision = 2;
2602 else if (scaled_int < 1000L)
2604 estimated_precision = 3;
2606 else if (scaled_int < 10000L)
2608 estimated_precision = 4;
2610 else if (scaled_int < 100000L)
2612 estimated_precision = 5;
2614 else if (scaled_int < 1000000L)
2616 estimated_precision = 6;
2618 else if (scaled_int < 10000000L)
2620 estimated_precision = 7;
2622 else if (scaled_int < 100000000L)
2624 estimated_precision = 8;
2626 else if (scaled_int < 1000000000L)
2628 estimated_precision = 9;
2632 estimated_precision = 10;
2639 if (estimated_precision < dst_scale)
2641 estimated_precision = dst_scale;
2644 *prec = estimated_precision;
2670 const int res_num_digits = src_prec - src_scale;
2672 assert (src_prec - src_scale <= dst_prec);
2682 for (i = 0; i < dst_prec - res_num_digits; i++)
2684 new_dec_num[
i] =
'0';
2688 for (i = 0; i < res_num_digits; i++)
2690 const int idx_new_dec = dst_prec - res_num_digits +
i;
2691 const int idx_dec_str =
strlen (dec_str) - src_prec +
i;
2692 new_dec_num[idx_new_dec] = dec_str[idx_dec_str];
2721 assert (src_scale <= dst_scale);
2731 for (i = 0; i < src_scale; i++)
2733 new_dec_num[
i] = dec_str[
strlen (dec_str) - src_scale +
i];
2737 for (i = src_scale; i < dst_scale; i++)
2739 new_dec_num[
i] =
'0';
2743 new_dec_num[dst_scale] =
'\0';
2766 for (i = 0; i < scale; i++)
2768 if (dec_str[len - scale + i] !=
'0')
2821 switch (_fpclass (d))
2839 switch (std::fpclassify (d))
2879 *prec = dst_scale ? dst_scale : 1;
2883 numeric_str[i++] =
'0';
2885 numeric_str[
i] =
'\0';
2902 *prec = dst_scale ? dst_scale : 1;
2906 numeric_str[i++] =
'0';
2908 numeric_str[
i] =
'\0';
2935 ndigits =
strlen (numeric_str + 1);
2939 char *dst = MIN (numeric_str + 1 + ndigits - decpt,
2940 numeric_str +
sizeof numeric_str /
sizeof numeric_str[0] - 1), *src = dst + decpt;
2951 while (src >= numeric_str + 1)
2959 while (dst > numeric_str)
2976 if (decpt < ndigits)
2979 *scale = ndigits - decpt;
2985 char *dst = numeric_str + 1 + decpt, *src = numeric_str + 1 + ndigits;
3003 numeric_str[1 + *prec] =
'0';
3008 numeric_str[1 + *prec] =
'\0';
3014 numeric_str[0] =
'-';
3029 #if defined (ENABLE_UNUSED_FUNCTION) 3044 numeric_coerce_double_to_num (
double adouble,
DB_C_NUMERIC num,
int *prec,
int *scale)
3073 bool leading_zeroes =
true;
3074 bool sign_found =
false;
3075 bool negate_value =
false;
3076 bool pad_character_zero =
false;
3077 bool trailing_spaces =
false;
3078 bool decimal_part =
false;
3086 for (i = 0; i < astring_length && ret ==
NO_ERROR; i += skip_size)
3089 if (astring[i] ==
'.')
3091 leading_zeroes =
false;
3092 decimal_part =
true;
3093 scale = astring_length - (i + 1);
3095 else if (leading_zeroes)
3097 if (astring[i] >=
'1' && astring[i] <=
'9')
3099 leading_zeroes =
false;
3100 num_string[prec] = astring[
i];
3106 else if (astring[i] ==
'+' || astring[i] ==
'-')
3111 if (astring[i] ==
'-')
3113 negate_value =
true;
3121 else if (astring[i] ==
'0')
3124 pad_character_zero =
true;
3147 if (!trailing_spaces)
3149 trailing_spaces =
true;
3158 else if (astring[i] ==
',')
3166 else if (astring[i] >=
'0' && astring[i] <=
'9')
3168 num_string[prec] = astring[
i];
3196 if (prec == 0 && pad_character_zero)
3199 num_string[0] =
'0';
3200 num_string[prec] =
'\0';
3205 num_string[prec] =
'\0';
3246 bool round_up =
false;
3249 if (src_num ==
NULL)
3255 if (src_prec <= dest_prec && src_scale == dest_scale)
3264 negate_answer =
true;
3270 negate_answer =
false;
3277 if (src_scale < dest_scale)
3279 scale_diff = dest_scale - src_scale;
3280 orig_length =
strlen (num_string);
3281 for (i = 0; i < scale_diff; i++)
3283 num_string[orig_length +
i] =
'0';
3285 num_string[orig_length + scale_diff] =
'\0';
3287 else if (dest_scale < src_scale)
3289 scale_diff = src_scale - dest_scale;
3290 orig_length =
strlen (num_string);
3291 if (num_string[orig_length - scale_diff] >=
'5' && num_string[orig_length - scale_diff] <=
'9')
3295 num_string[orig_length - scale_diff] =
'\0';
3303 for (i = 0, len =
strlen (num_string) - dest_prec; i < len; i++)
3305 if (num_string[i] >=
'1' && num_string[i] <=
'9')
3315 bool is_all_nine =
true;
3316 for (len =
strlen (num_string), i = len - dest_prec; i < len; i++)
3318 if (num_string[i] !=
'9')
3320 is_all_nine =
false;
3391 int precision, scale;
3392 int desired_precision, desired_scale;
3448 desired_precision = MAX (desired_precision, precision);
3482 desired_precision, desired_scale, num);
3621 if (return_string ==
NULL)
3627 strcpy (return_string, str_buf);
3653 int hour, minute, second;
3666 int year, month, day;
3702 v_datetime.
date = (int) tmp_bi;
3852 bool found_first_non_zero =
false;
3868 temp_size = (int) strnlen (temp,
sizeof (temp));
3869 for (i = 0; i < temp_size; i++)
3879 if (i == temp_size - scale)
3886 if (!found_first_non_zero && temp[i] >=
'1' && temp[i] <=
'9')
3888 found_first_non_zero =
true;
3892 if (found_first_non_zero || i >= temp_size - scale - 1)
3894 buf[nbuf] = temp[
i];
DB_C_FLOAT db_get_float(const DB_VALUE *value)
#define GET_LOWER_BYTE(arg)
int db_make_datetime(DB_VALUE *value, const DB_DATETIME *datetime)
int numeric_internal_float_to_num(float afloat, int dst_scale, DB_C_NUMERIC num, int *prec, int *scale)
int db_value_scale(const DB_VALUE *value)
#define LANG_SYS_COLLATION
static DEC_STRING * numeric_get_pow_of_2(int exp)
static bool initialized_10
#define db_locate_numeric(value)
static void numeric_div(DB_C_NUMERIC arg1, DB_C_NUMERIC arg2, DB_C_NUMERIC answer, DB_C_NUMERIC remainder)
int db_make_bigint(DB_VALUE *value, const DB_BIGINT num)
int db_get_int(const DB_VALUE *value)
#define DB_DEFAULT_NUMERIC_DIVISION_SCALE
DB_C_DOUBLE db_get_double(const DB_VALUE *value)
void numeric_coerce_num_to_double(DB_C_NUMERIC num, int scale, double *adouble)
int db_make_varchar(DB_VALUE *value, const int max_char_length, DB_CONST_C_CHAR str, const int char_str_byte_size, const int codeset, const int collation_id)
static bool numeric_is_bit_set(DB_C_NUMERIC arg, int pos)
int numeric_db_value_div(const DB_VALUE *dbv1, const DB_VALUE *dbv2, DB_VALUE *answer)
int numeric_db_value_negate(DB_VALUE *answer)
static void numeric_copy_long(DB_C_NUMERIC dest, DB_C_NUMERIC source, bool is_long_num)
int db_make_numeric(DB_VALUE *value, const DB_C_NUMERIC num, const int precision, const int scale)
bool numeric_db_value_is_zero(const DB_VALUE *arg)
DB_C_NUMERIC db_get_numeric(const DB_VALUE *value)
static bool initialized_2
static int numeric_prec_scale_when_overflow(const DB_VALUE *dbv1, const DB_VALUE *dbv2, DB_VALUE *dbv1_common, DB_VALUE *dbv2_common)
int numeric_db_value_compare(const DB_VALUE *dbv1, const DB_VALUE *dbv2, DB_VALUE *answer)
#define TP_FLOAT_MANTISA_DECIMAL_PRECISION
static void numeric_decrease(DB_C_NUMERIC answer)
static void numeric_copy(DB_C_NUMERIC dest, DB_C_NUMERIC source)
int db_make_date(DB_VALUE *value, const int month, const int day, const int year)
char digits[TWICE_NUM_MAX_PREC]
static const char fast_mod[20]
int numeric_db_value_coerce_to_num(DB_VALUE *src, DB_VALUE *dest, DB_DATA_STATUS *data_status)
double db_value_get_monetary_amount_as_double(const DB_VALUE *value)
int numeric_db_value_sub(const DB_VALUE *dbv1, const DB_VALUE *dbv2, DB_VALUE *answer)
static void numeric_shift_byte(DB_C_NUMERIC arg, int numbytes, DB_C_NUMERIC answer, int length)
#define DB_VALUE_PRECISION(value)
static void numeric_init_dec_str(DEC_STRING *answer)
bool intl_is_space(const char *str, const char *str_end, const INTL_CODESET codeset, int *space_size)
static DEC_STRING powers_of_2[DB_NUMERIC_BUF_SIZE *16]
#define DB_DEFAULT_NUMERIC_SCALE
int numeric_coerce_num_to_num(DB_C_NUMERIC src_num, int src_prec, int src_scale, int dest_prec, int dest_scale, DB_C_NUMERIC dest_num)
#define DB_VALUE_SCALE(value)
void numeric_coerce_num_to_int(DB_C_NUMERIC arg, int *answer)
static void numeric_init_pow_of_2_helper(void)
#define TP_DOUBLE_MANTISA_DECIMAL_PRECISION
#define TP_DOUBLE_AS_CHAR_LENGTH
static bool numeric_is_long(DB_C_NUMERIC arg)
static int numeric_longnum_to_shortnum(DB_C_NUMERIC answer, DB_C_NUMERIC long_arg)
int db_make_short(DB_VALUE *value, const DB_C_SHORT num)
static unsigned char powers_of_10[TWICE_NUM_MAX_PREC+1][DB_NUMERIC_BUF_SIZE]
unsigned int DB_TIMESTAMP
static void numeric_negate(DB_C_NUMERIC answer)
#define OR_CHECK_DOUBLE_OVERFLOW(i)
TP_DOMAIN * tp_domain_resolve_default(DB_TYPE type)
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
#define DB_MAX_NUMERIC_PRECISION
static int get_significant_digit(DB_BIGINT i)
static void numeric_coerce_big_num_to_dec_str(unsigned char *num, char *dec_str)
int db_make_monetary(DB_VALUE *value, const DB_CURRENCY type, const double amount)
static int numeric_get_msb_for_dec(int src_prec, int src_scale, unsigned char *src, int *dest_prec, int *dest_scale, DB_C_NUMERIC dest)
int numeric_db_value_increase(DB_VALUE *arg)
static void numeric_sub(DB_C_NUMERIC arg1, DB_C_NUMERIC arg2, DB_C_NUMERIC answer, int size)
static bool numeric_is_zero(DB_C_NUMERIC arg)
static int numeric_scale_by_ten(DB_C_NUMERIC arg, bool is_long_num)
static void return_string(CSS_CONN_ENTRY *conn, unsigned short request_id, char **buffer, int *buffer_size)
#define ER_IT_DATA_OVERFLOW
static bool numeric_is_bigint(DB_C_NUMERIC arg)
#define OR_CHECK_SHORT_OVERFLOW(i)
static void numeric_get_integral_part(const DB_C_NUMERIC num, const int src_prec, const int src_scale, const int dst_prec, DB_C_NUMERIC dest)
static int numeric_compare(DB_C_NUMERIC arg1, DB_C_NUMERIC arg2)
int numeric_db_value_coerce_from_num(DB_VALUE *src, DB_VALUE *dest, DB_DATA_STATUS *data_status)
#define DB_VALUE_DOMAIN_TYPE(value)
void numeric_coerce_bigint_to_num(DB_BIGINT arg, DB_C_NUMERIC answer)
static int numeric_scale_dec(const DB_C_NUMERIC arg, int dscale, DB_C_NUMERIC answer)
#define OR_CHECK_INT_OVERFLOW(i)
static void numeric_add(DB_C_NUMERIC arg1, DB_C_NUMERIC arg2, DB_C_NUMERIC answer, int size)
static void numeric_negate_long(DB_C_NUMERIC answer, bool is_long_num)
unsigned char buf[DB_NUMERIC_BUF_SIZE]
#define TP_DOMAIN_TYPE(dom)
static bool numeric_is_negative(DB_C_NUMERIC arg)
static void numeric_increase(DB_C_NUMERIC answer)
unsigned short db_get_enum_short(const DB_VALUE *value)
#define NUMERIC_MAX_STRING_SIZE
unsigned char * DB_C_NUMERIC
const char * pr_type_name(DB_TYPE id)
void numeric_coerce_int_to_num(int arg, DB_C_NUMERIC answer)
static void numeric_add_dec_str(DEC_STRING *arg1, DEC_STRING *arg2, DEC_STRING *answer)
#define MILLISECONDS_OF_ONE_DAY
static bool numeric_is_longnum_value(DB_C_NUMERIC arg)
static bool numeric_is_fraction_part_zero(const DB_C_NUMERIC num, const int scale)
static void numeric_init_pow_of_10_helper(void)
int numeric_db_value_is_positive(const DB_VALUE *dbvalue)
static int numeric_fast_convert(double adouble, int dst_scale, DB_C_NUMERIC num, int *prec, int *scale)
void numeric_coerce_num_to_dec_str(DB_C_NUMERIC num, char *dec_str)
int numeric_coerce_num_to_bigint(DB_C_NUMERIC arg, int scale, DB_BIGINT *answer)
int numeric_db_value_coerce_from_num_strict(DB_VALUE *src, DB_VALUE *dest)
#define db_private_alloc(thrd, size)
int numeric_db_value_mul(const DB_VALUE *dbv1, const DB_VALUE *dbv2, DB_VALUE *answer)
need_clear_type need_clear
DB_BIGINT db_get_bigint(const DB_VALUE *value)
#define DB_DEFAULT_NUMERIC_PRECISION
int db_make_time(DB_VALUE *value, const int hour, const int minute, const int second)
static int numeric_scale_dec_long(DB_C_NUMERIC answer, int dscale, bool is_long_num)
#define DB_LONG_NUMERIC_MULTIPLIER
int db_make_float(DB_VALUE *value, const DB_C_FLOAT num)
static void numeric_get_fractional_part(const DB_C_NUMERIC num, const int src_scale, const int dst_prec, DB_C_NUMERIC dest)
#define DB_DEFAULT_PRECISION
static void numeric_long_div(DB_C_NUMERIC a1, DB_C_NUMERIC a2, DB_C_NUMERIC answer, DB_C_NUMERIC remainder, bool is_long_num)
int numeric_internal_double_to_num(double adouble, int dst_scale, DB_C_NUMERIC num, int *prec, int *scale)
char * numeric_db_value_print(const DB_VALUE *val, char *buf)
#define OR_CHECK_FLOAT_OVERFLOW(i)
void numeric_coerce_dec_str_to_num(const char *dec_str, DB_C_NUMERIC result)
#define ER_OBJ_INVALID_ARGUMENTS
enum fp_value_type FP_VALUE_TYPE
enum intl_codeset INTL_CODESET
bool prm_get_bool_value(PARAM_ID prm_id)
DB_C_SHORT db_get_short(const DB_VALUE *value)
int db_make_varnchar(DB_VALUE *value, const int max_nchar_length, DB_CONST_C_NCHAR str, const int nchar_str_byte_size, const int codeset, const int collation_id)
#define DB_VALUE_TYPE(value)
#define DB_CURRENCY_DEFAULT
static DB_C_NUMERIC numeric_get_pow_of_10(int exp)
int db_make_null(DB_VALUE *value)
static bool numeric_overflow(DB_C_NUMERIC arg, int exp)
#define DB_IS_NULL(value)
int db_make_double(DB_VALUE *value, const DB_C_DOUBLE num)
void db_date_decode(const DB_DATE *date, int *monthp, int *dayp, int *yearp)
#define DB_NUMERIC_BUF_SIZE
int db_make_timestamp(DB_VALUE *value, const DB_C_TIMESTAMP timeval)
int db_make_int(DB_VALUE *value, const int num)
void numeric_db_value_abs(DB_C_NUMERIC src_num, DB_C_NUMERIC dest_num)
#define DB_NUMERIC_OVERFLOW_LIMIT
int db_make_char(DB_VALUE *value, const int char_length, DB_CONST_C_CHAR str, const int char_str_byte_size, const int codeset, const int collation_id)
static double numeric_Pow_of_10[10]
int numeric_db_value_add(const DB_VALUE *dbv1, const DB_VALUE *dbv2, DB_VALUE *answer)
static void numeric_double_shift_bit(DB_C_NUMERIC arg1, DB_C_NUMERIC arg2, int numbits, DB_C_NUMERIC lsb, DB_C_NUMERIC msb, bool is_long_num)
static void numeric_mul(DB_C_NUMERIC a1, DB_C_NUMERIC a2, bool *positive_flag, DB_C_NUMERIC answer)
int numeric_coerce_string_to_num(const char *astring, int astring_length, INTL_CODESET codeset, DB_VALUE *result)
static void numeric_zero(DB_C_NUMERIC answer, int size)
void db_time_decode(DB_TIME *timeval, int *hourp, int *minutep, int *secondp)
static int numeric_internal_real_to_num(double adouble, int dst_scale, DB_C_NUMERIC num, int *prec, int *scale, bool is_float)
static FP_VALUE_TYPE get_fp_value_type(double d)
#define DB_NUMERIC_UNDERFLOW_LIMIT
#define TWICE_NUM_MAX_PREC
int db_make_nchar(DB_VALUE *value, const int nchar_length, DB_CONST_C_NCHAR str, const int nchar_str_byte_size, const int codeset, const int collation_id)
static void numeric_shortnum_to_longnum(DB_C_NUMERIC long_answer, DB_C_NUMERIC arg)
static int numeric_compare_pos(DB_C_NUMERIC arg1, DB_C_NUMERIC arg2)
static void numeric_increase_long(DB_C_NUMERIC answer, bool is_long_num)
int db_value_domain_init(DB_VALUE *value, const DB_TYPE type, const int precision, const int scale)
static void numeric_negative_one(DB_C_NUMERIC answer, int size)
static int numeric_common_prec_scale(const DB_VALUE *dbv1, const DB_VALUE *dbv2, DB_VALUE *dbv1_common, DB_VALUE *dbv2_common)