1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1
/* Copyright (C) 2005-2006 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
23
19
It is interface module to fixed precision decimals library.
25
Most functions use 'uint32_t mask' as parameter, if during operation error
21
Most functions use 'uint mask' as parameter, if during operation error
26
22
which fit in this mask is detected then it will be processed automatically
27
23
here. (errors are E_DEC_* constants, see include/decimal.h)
77
65
#define DECIMAL_MAX_FIELD_SIZE DECIMAL_MAX_PRECISION
80
inline uint32_t my_decimal_size(uint32_t precision, uint32_t scale)
68
inline uint my_decimal_size(uint precision, uint scale)
83
71
Always allocate more space to allow library to put decimal point
126
114
bool sign() const { return decimal_t::sign; }
127
115
void sign(bool s) { decimal_t::sign= s; }
128
uint32_t precision() const { return intg + frac; }
116
uint precision() const { return intg + frac; }
119
#ifndef DRIZZLE_CLIENT
131
120
int decimal_operation_results(int result);
122
inline int decimal_operation_results(int result)
126
#endif /*DRIZZLE_CLIENT*/
134
129
void max_my_decimal(my_decimal *to, int precision, int frac)
143
138
max_my_decimal(to, DECIMAL_MAX_PRECISION, 0);
146
inline int check_result(uint32_t mask, int result)
141
inline int check_result(uint mask, int result)
148
143
if (result & mask)
149
144
decimal_operation_results(result);
153
inline int check_result_and_overflow(uint32_t mask, int result, my_decimal *val)
148
inline int check_result_and_overflow(uint mask, int result, my_decimal *val)
155
150
if (check_result(mask, result) & E_DEC_OVERFLOW)
165
inline uint32_t my_decimal_length_to_precision(uint32_t length, uint32_t scale,
160
inline uint my_decimal_length_to_precision(uint length, uint scale,
166
161
bool unsigned_flag)
168
163
return (uint) (length - (scale>0 ? 1:0) - (unsigned_flag ? 0:1));
171
inline uint32_t my_decimal_precision_to_length(uint32_t precision, uint8_t scale,
166
inline uint32_t my_decimal_precision_to_length(uint precision, uint8_t scale,
172
167
bool unsigned_flag)
174
169
set_if_smaller(precision, DECIMAL_MAX_PRECISION);
194
int my_decimal_get_binary_size(uint32_t precision, uint32_t scale)
189
int my_decimal_get_binary_size(uint precision, uint scale)
196
191
return decimal_bin_size((int)precision, (int)scale);
208
int my_decimal2binary(uint32_t mask, const my_decimal *d, unsigned char *bin, int prec,
203
int my_decimal2binary(uint mask, const my_decimal *d, uchar *bin, int prec,
213
int binary2my_decimal(uint32_t mask, const unsigned char *bin, my_decimal *d, int prec,
208
int binary2my_decimal(uint mask, const uchar *bin, my_decimal *d, int prec,
216
211
return check_result(mask, bin2decimal(bin, (decimal_t*) d, prec, scale));
236
int my_decimal_round(uint32_t mask, const my_decimal *from, int scale,
231
int my_decimal_round(uint mask, const my_decimal *from, int scale,
237
232
bool truncate, my_decimal *to)
239
234
return check_result(mask, decimal_round((decimal_t*) from, to, scale,
245
int my_decimal_floor(uint32_t mask, const my_decimal *from, my_decimal *to)
240
int my_decimal_floor(uint mask, const my_decimal *from, my_decimal *to)
247
242
return check_result(mask, decimal_round((decimal_t*) from, to, 0, FLOOR));
252
int my_decimal_ceiling(uint32_t mask, const my_decimal *from, my_decimal *to)
247
int my_decimal_ceiling(uint mask, const my_decimal *from, my_decimal *to)
254
249
return check_result(mask, decimal_round((decimal_t*) from, to, 0, CEILING));
258
int my_decimal2string(uint32_t mask, const my_decimal *d, uint32_t fixed_prec,
259
uint32_t fixed_dec, char filler, String *str);
253
#ifndef DRIZZLE_CLIENT
254
int my_decimal2string(uint mask, const my_decimal *d, uint fixed_prec,
255
uint fixed_dec, char filler, String *str);
262
int my_decimal2int(uint32_t mask, const my_decimal *d, bool unsigned_flag,
259
int my_decimal2int(uint mask, const my_decimal *d, bool unsigned_flag,
265
262
my_decimal rounded;
275
int my_decimal2double(uint32_t mask __attribute__((unused)),
272
int my_decimal2double(uint mask __attribute__((unused)),
276
273
const my_decimal *d, double *result)
278
275
/* No need to call check_result as this will always succeed */
284
int str2my_decimal(uint32_t mask, char *str, my_decimal *d, char **end)
281
int str2my_decimal(uint mask, char *str, my_decimal *d, char **end)
286
283
return check_result_and_overflow(mask, string2decimal(str,(decimal_t*)d,end),
291
int str2my_decimal(uint32_t mask, const char *from, uint32_t length,
288
int str2my_decimal(uint mask, const char *from, uint length,
292
289
const CHARSET_INFO * charset, my_decimal *decimal_value);
294
291
#if defined(DRIZZLE_SERVER)
296
int string2my_decimal(uint32_t mask, const String *str, my_decimal *d)
293
int string2my_decimal(uint mask, const String *str, my_decimal *d)
298
295
return str2my_decimal(mask, str->ptr(), str->length(), str->charset(), d);
305
302
#endif /*defined(DRIZZLE_SERVER) */
308
int double2my_decimal(uint32_t mask, double val, my_decimal *d)
305
int double2my_decimal(uint mask, double val, my_decimal *d)
310
307
return check_result_and_overflow(mask, double2decimal(val, (decimal_t*)d), d);
315
int int2my_decimal(uint32_t mask, int64_t i, bool unsigned_flag, my_decimal *d)
312
int int2my_decimal(uint mask, int64_t i, bool unsigned_flag, my_decimal *d)
317
314
return check_result(mask, (unsigned_flag ?
318
315
uint64_t2decimal((uint64_t)i, d) :
336
int my_decimal_add(uint32_t mask, my_decimal *res, const my_decimal *a,
333
int my_decimal_add(uint mask, my_decimal *res, const my_decimal *a,
337
334
const my_decimal *b)
339
336
return check_result_and_overflow(mask,
346
int my_decimal_sub(uint32_t mask, my_decimal *res, const my_decimal *a,
343
int my_decimal_sub(uint mask, my_decimal *res, const my_decimal *a,
347
344
const my_decimal *b)
349
346
return check_result_and_overflow(mask,
356
int my_decimal_mul(uint32_t mask, my_decimal *res, const my_decimal *a,
353
int my_decimal_mul(uint mask, my_decimal *res, const my_decimal *a,
357
354
const my_decimal *b)
359
356
return check_result_and_overflow(mask,
366
int my_decimal_div(uint32_t mask, my_decimal *res, const my_decimal *a,
363
int my_decimal_div(uint mask, my_decimal *res, const my_decimal *a,
367
364
const my_decimal *b, int div_scale_inc)
369
366
return check_result_and_overflow(mask,
377
int my_decimal_mod(uint32_t mask, my_decimal *res, const my_decimal *a,
374
int my_decimal_mod(uint mask, my_decimal *res, const my_decimal *a,
378
375
const my_decimal *b)
380
377
return check_result_and_overflow(mask,