23
23
It is interface module to fixed precision decimals library.
25
Most functions use 'uint mask' as parameter, if during operation error
25
Most functions use 'uint32_t mask' as parameter, if during operation error
26
26
which fit in this mask is detected then it will be processed automatically
27
27
here. (errors are E_DEC_* constants, see include/decimal.h)
76
76
#define DECIMAL_MAX_FIELD_SIZE DECIMAL_MAX_PRECISION
79
inline uint my_decimal_size(uint precision, uint scale)
79
inline uint32_t my_decimal_size(uint32_t precision, uint32_t scale)
82
82
Always allocate more space to allow library to put decimal point
89
inline int my_decimal_int_part(uint precision, uint decimals)
89
inline int my_decimal_int_part(uint32_t precision, uint32_t decimals)
91
91
return precision - ((decimals == DECIMAL_NOT_SPECIFIED) ? 0 : decimals);
125
125
bool sign() const { return decimal_t::sign; }
126
126
void sign(bool s) { decimal_t::sign= s; }
127
uint precision() const { return intg + frac; }
127
uint32_t precision() const { return intg + frac; }
130
130
int decimal_operation_results(int result);
142
142
max_my_decimal(to, DECIMAL_MAX_PRECISION, 0);
145
inline int check_result(uint mask, int result)
145
inline int check_result(uint32_t mask, int result)
147
147
if (result & mask)
148
148
decimal_operation_results(result);
152
inline int check_result_and_overflow(uint mask, int result, my_decimal *val)
152
inline int check_result_and_overflow(uint32_t mask, int result, my_decimal *val)
154
154
if (check_result(mask, result) & E_DEC_OVERFLOW)
164
inline uint my_decimal_length_to_precision(uint length, uint scale,
164
inline uint32_t my_decimal_length_to_precision(uint32_t length, uint32_t scale,
165
165
bool unsigned_flag)
167
167
return (uint) (length - (scale>0 ? 1:0) - (unsigned_flag ? 0:1));
170
inline uint32_t my_decimal_precision_to_length(uint precision, uint8_t scale,
170
inline uint32_t my_decimal_precision_to_length(uint32_t precision, uint8_t scale,
171
171
bool unsigned_flag)
173
173
set_if_smaller(precision, DECIMAL_MAX_PRECISION);
193
int my_decimal_get_binary_size(uint precision, uint scale)
193
int my_decimal_get_binary_size(uint32_t precision, uint32_t scale)
195
195
return decimal_bin_size((int)precision, (int)scale);
207
int my_decimal2binary(uint mask, const my_decimal *d, unsigned char *bin, int prec,
207
int my_decimal2binary(uint32_t mask, const my_decimal *d, unsigned char *bin, int prec,
212
int binary2my_decimal(uint mask, const unsigned char *bin, my_decimal *d, int prec,
212
int binary2my_decimal(uint32_t mask, const unsigned char *bin, my_decimal *d, int prec,
215
215
return check_result(mask, bin2decimal(bin, (decimal_t*) d, prec, scale));
235
int my_decimal_round(uint mask, const my_decimal *from, int scale,
235
int my_decimal_round(uint32_t mask, const my_decimal *from, int scale,
236
236
bool truncate, my_decimal *to)
238
238
return check_result(mask, decimal_round((decimal_t*) from, to, scale,
244
int my_decimal_floor(uint mask, const my_decimal *from, my_decimal *to)
244
int my_decimal_floor(uint32_t mask, const my_decimal *from, my_decimal *to)
246
246
return check_result(mask, decimal_round((decimal_t*) from, to, 0, FLOOR));
251
int my_decimal_ceiling(uint mask, const my_decimal *from, my_decimal *to)
251
int my_decimal_ceiling(uint32_t mask, const my_decimal *from, my_decimal *to)
253
253
return check_result(mask, decimal_round((decimal_t*) from, to, 0, CEILING));
257
int my_decimal2string(uint mask, const my_decimal *d, uint fixed_prec,
258
uint fixed_dec, char filler, String *str);
257
int my_decimal2string(uint32_t mask, const my_decimal *d, uint32_t fixed_prec,
258
uint32_t fixed_dec, char filler, String *str);
261
int my_decimal2int(uint mask, const my_decimal *d, bool unsigned_flag,
261
int my_decimal2int(uint32_t mask, const my_decimal *d, bool unsigned_flag,
264
264
my_decimal rounded;
274
int my_decimal2double(uint mask __attribute__((unused)),
274
int my_decimal2double(uint32_t mask __attribute__((unused)),
275
275
const my_decimal *d, double *result)
277
277
/* No need to call check_result as this will always succeed */
283
int str2my_decimal(uint mask, char *str, my_decimal *d, char **end)
283
int str2my_decimal(uint32_t mask, char *str, my_decimal *d, char **end)
285
285
return check_result_and_overflow(mask, string2decimal(str,(decimal_t*)d,end),
290
int str2my_decimal(uint mask, const char *from, uint length,
290
int str2my_decimal(uint32_t mask, const char *from, uint32_t length,
291
291
const CHARSET_INFO * charset, my_decimal *decimal_value);
293
293
#if defined(DRIZZLE_SERVER)
295
int string2my_decimal(uint mask, const String *str, my_decimal *d)
295
int string2my_decimal(uint32_t mask, const String *str, my_decimal *d)
297
297
return str2my_decimal(mask, str->ptr(), str->length(), str->charset(), d);
304
304
#endif /*defined(DRIZZLE_SERVER) */
307
int double2my_decimal(uint mask, double val, my_decimal *d)
307
int double2my_decimal(uint32_t mask, double val, my_decimal *d)
309
309
return check_result_and_overflow(mask, double2decimal(val, (decimal_t*)d), d);
314
int int2my_decimal(uint mask, int64_t i, bool unsigned_flag, my_decimal *d)
314
int int2my_decimal(uint32_t mask, int64_t i, bool unsigned_flag, my_decimal *d)
316
316
return check_result(mask, (unsigned_flag ?
317
317
uint64_t2decimal((uint64_t)i, d) :
335
int my_decimal_add(uint mask, my_decimal *res, const my_decimal *a,
335
int my_decimal_add(uint32_t mask, my_decimal *res, const my_decimal *a,
336
336
const my_decimal *b)
338
338
return check_result_and_overflow(mask,
345
int my_decimal_sub(uint mask, my_decimal *res, const my_decimal *a,
345
int my_decimal_sub(uint32_t mask, my_decimal *res, const my_decimal *a,
346
346
const my_decimal *b)
348
348
return check_result_and_overflow(mask,
355
int my_decimal_mul(uint mask, my_decimal *res, const my_decimal *a,
355
int my_decimal_mul(uint32_t mask, my_decimal *res, const my_decimal *a,
356
356
const my_decimal *b)
358
358
return check_result_and_overflow(mask,
365
int my_decimal_div(uint mask, my_decimal *res, const my_decimal *a,
365
int my_decimal_div(uint32_t mask, my_decimal *res, const my_decimal *a,
366
366
const my_decimal *b, int div_scale_inc)
368
368
return check_result_and_overflow(mask,
376
int my_decimal_mod(uint mask, my_decimal *res, const my_decimal *a,
376
int my_decimal_mod(uint32_t mask, my_decimal *res, const my_decimal *a,
377
377
const my_decimal *b)
379
379
return check_result_and_overflow(mask,