23
23
It is interface module to fixed precision decimals library.
25
Most functions use 'uint32_t mask' as parameter, if during operation error
25
Most functions use 'uint 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 uint32_t my_decimal_size(uint32_t precision, uint32_t scale)
79
inline uint my_decimal_size(uint precision, uint scale)
82
82
Always allocate more space to allow library to put decimal point
89
inline int my_decimal_int_part(uint32_t precision, uint32_t decimals)
89
inline int my_decimal_int_part(uint precision, uint 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
uint32_t precision() const { return intg + frac; }
127
uint precision() const { return intg + frac; }
130
#ifndef DRIZZLE_CLIENT
130
131
int decimal_operation_results(int result);
133
inline int decimal_operation_results(int result)
137
#endif /*DRIZZLE_CLIENT*/
133
140
void max_my_decimal(my_decimal *to, int precision, int frac)
142
149
max_my_decimal(to, DECIMAL_MAX_PRECISION, 0);
145
inline int check_result(uint32_t mask, int result)
152
inline int check_result(uint mask, int result)
147
154
if (result & mask)
148
155
decimal_operation_results(result);
152
inline int check_result_and_overflow(uint32_t mask, int result, my_decimal *val)
159
inline int check_result_and_overflow(uint mask, int result, my_decimal *val)
154
161
if (check_result(mask, result) & E_DEC_OVERFLOW)
164
inline uint32_t my_decimal_length_to_precision(uint32_t length, uint32_t scale,
171
inline uint my_decimal_length_to_precision(uint length, uint scale,
165
172
bool unsigned_flag)
167
174
return (uint) (length - (scale>0 ? 1:0) - (unsigned_flag ? 0:1));
170
inline uint32_t my_decimal_precision_to_length(uint32_t precision, uint8_t scale,
177
inline uint32_t my_decimal_precision_to_length(uint precision, uint8_t scale,
171
178
bool unsigned_flag)
173
180
set_if_smaller(precision, DECIMAL_MAX_PRECISION);
193
int my_decimal_get_binary_size(uint32_t precision, uint32_t scale)
200
int my_decimal_get_binary_size(uint precision, uint scale)
195
202
return decimal_bin_size((int)precision, (int)scale);
207
int my_decimal2binary(uint32_t mask, const my_decimal *d, unsigned char *bin, int prec,
214
int my_decimal2binary(uint mask, const my_decimal *d, uchar *bin, int prec,
212
int binary2my_decimal(uint32_t mask, const unsigned char *bin, my_decimal *d, int prec,
219
int binary2my_decimal(uint mask, const uchar *bin, my_decimal *d, int prec,
215
222
return check_result(mask, bin2decimal(bin, (decimal_t*) d, prec, scale));
235
int my_decimal_round(uint32_t mask, const my_decimal *from, int scale,
242
int my_decimal_round(uint mask, const my_decimal *from, int scale,
236
243
bool truncate, my_decimal *to)
238
245
return check_result(mask, decimal_round((decimal_t*) from, to, scale,
244
int my_decimal_floor(uint32_t mask, const my_decimal *from, my_decimal *to)
251
int my_decimal_floor(uint mask, const my_decimal *from, my_decimal *to)
246
253
return check_result(mask, decimal_round((decimal_t*) from, to, 0, FLOOR));
251
int my_decimal_ceiling(uint32_t mask, const my_decimal *from, my_decimal *to)
258
int my_decimal_ceiling(uint mask, const my_decimal *from, my_decimal *to)
253
260
return check_result(mask, decimal_round((decimal_t*) from, to, 0, CEILING));
257
int my_decimal2string(uint32_t mask, const my_decimal *d, uint32_t fixed_prec,
258
uint32_t fixed_dec, char filler, String *str);
264
#ifndef DRIZZLE_CLIENT
265
int my_decimal2string(uint mask, const my_decimal *d, uint fixed_prec,
266
uint fixed_dec, char filler, String *str);
261
int my_decimal2int(uint32_t mask, const my_decimal *d, bool unsigned_flag,
270
int my_decimal2int(uint mask, const my_decimal *d, bool unsigned_flag,
264
273
my_decimal rounded;
274
int my_decimal2double(uint32_t mask __attribute__((unused)),
283
int my_decimal2double(uint mask __attribute__((unused)),
275
284
const my_decimal *d, double *result)
277
286
/* No need to call check_result as this will always succeed */
283
int str2my_decimal(uint32_t mask, char *str, my_decimal *d, char **end)
292
int str2my_decimal(uint mask, char *str, my_decimal *d, char **end)
285
294
return check_result_and_overflow(mask, string2decimal(str,(decimal_t*)d,end),
290
int str2my_decimal(uint32_t mask, const char *from, uint32_t length,
299
int str2my_decimal(uint mask, const char *from, uint length,
291
300
const CHARSET_INFO * charset, my_decimal *decimal_value);
293
302
#if defined(DRIZZLE_SERVER)
295
int string2my_decimal(uint32_t mask, const String *str, my_decimal *d)
304
int string2my_decimal(uint mask, const String *str, my_decimal *d)
297
306
return str2my_decimal(mask, str->ptr(), str->length(), str->charset(), d);
304
313
#endif /*defined(DRIZZLE_SERVER) */
307
int double2my_decimal(uint32_t mask, double val, my_decimal *d)
316
int double2my_decimal(uint mask, double val, my_decimal *d)
309
318
return check_result_and_overflow(mask, double2decimal(val, (decimal_t*)d), d);
314
int int2my_decimal(uint32_t mask, int64_t i, bool unsigned_flag, my_decimal *d)
323
int int2my_decimal(uint mask, int64_t i, bool unsigned_flag, my_decimal *d)
316
325
return check_result(mask, (unsigned_flag ?
317
326
uint64_t2decimal((uint64_t)i, d) :
335
int my_decimal_add(uint32_t mask, my_decimal *res, const my_decimal *a,
344
int my_decimal_add(uint mask, my_decimal *res, const my_decimal *a,
336
345
const my_decimal *b)
338
347
return check_result_and_overflow(mask,
345
int my_decimal_sub(uint32_t mask, my_decimal *res, const my_decimal *a,
354
int my_decimal_sub(uint mask, my_decimal *res, const my_decimal *a,
346
355
const my_decimal *b)
348
357
return check_result_and_overflow(mask,
355
int my_decimal_mul(uint32_t mask, my_decimal *res, const my_decimal *a,
364
int my_decimal_mul(uint mask, my_decimal *res, const my_decimal *a,
356
365
const my_decimal *b)
358
367
return check_result_and_overflow(mask,
365
int my_decimal_div(uint32_t mask, my_decimal *res, const my_decimal *a,
374
int my_decimal_div(uint mask, my_decimal *res, const my_decimal *a,
366
375
const my_decimal *b, int div_scale_inc)
368
377
return check_result_and_overflow(mask,
376
int my_decimal_mod(uint32_t mask, my_decimal *res, const my_decimal *a,
385
int my_decimal_mod(uint mask, my_decimal *res, const my_decimal *a,
377
386
const my_decimal *b)
379
388
return check_result_and_overflow(mask,