MySQL 9.5.0
Source Code Documentation
my_decimal.h
Go to the documentation of this file.
1/* Copyright (c) 2005, 2025, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is designed to work with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23
24#ifndef MY_DECIMAL_INCLUDED
25#define MY_DECIMAL_INCLUDED
26
27/**
28 @file
29
30 It is interface module to fixed precision decimals library.
31
32 Most functions use 'uint mask' as parameter, if during operation error
33 which fit in this mask is detected then it will be processed automatically
34 here. (errors are E_DEC_* constants, see include/decimal.h)
35
36 Most function are just inline wrappers around library calls
37*/
38
39#include <assert.h>
40#include <stdlib.h>
41#include <sys/types.h>
42#include <algorithm>
43#include <array>
44
45#include "decimal.h"
46
47#include "my_inttypes.h"
48#include "my_macros.h"
49#include "my_temporal.h"
50#include "my_time_t.h"
51#include "mysql/strings/dtoa.h"
53
54class String;
55struct MYSQL_TIME;
56
57static constexpr int DECIMAL_LONGLONG_DIGITS{22};
58
59/** maximum length of buffer in our big digits (uint32). */
60static constexpr int DECIMAL_BUFF_LENGTH{9};
61
62/** the number of digits that my_decimal can possibly contain */
64
65/**
66 maximum guaranteed precision of number in decimal digits (number of our
67 digits * number of decimal digits in one our big digit - number of decimal
68 digits in one our big digit decreased by 1 (because we always put decimal
69 point on the border of our big digits))
70*/
72 8 * 2};
73
74/**
75 maximum length of string representation (number of maximum decimal
76 digits + 1 position for sign + 1 position for decimal point, no terminator)
77*/
79
80/**
81 maximum size of packet length.
82*/
84
85inline int my_decimal_int_part(uint precision, uint decimals) {
86 return precision - ((decimals == DECIMAL_NOT_SPECIFIED) ? 0 : decimals);
87}
88
89/**
90 my_decimal class limits 'decimal_t' type to what we need in MySQL.
91
92 It contains internally all necessary space needed by the instance so
93 no extra memory is needed. Objects should be moved using copy CTOR
94 or assignment operator, rather than memcpy/memmove.
95*/
96
97class my_decimal : public decimal_t {
98 std::array<decimal_digit_t, DECIMAL_BUFF_LENGTH> buffer;
99
100 public:
101 my_decimal(const my_decimal &rhs) : decimal_t(rhs), buffer(rhs.buffer) {
102 rhs.sanity_check();
103 buf = buffer.data();
104 }
105
107 sanity_check();
108 rhs.sanity_check();
109 if (this == &rhs) return *this;
110 decimal_t::intg = rhs.intg;
111 decimal_t::frac = rhs.frac;
112 decimal_t::len = rhs.len;
113 decimal_t::sign = rhs.sign();
114 buffer = rhs.buffer;
115 decimal_t::buf = buffer.data();
116 return *this;
117 }
118
119 void init() {
121 buf = buffer.data();
122 decimal_make_zero(this);
123 }
124
126
127#ifndef NDEBUG
129#endif // NDEBUG
130
131 void sanity_check() const { assert(buf == buffer.data()); }
132
133 bool sign() const { return decimal_t::sign; }
134 void sign(bool s) { decimal_t::sign = s; }
135 uint precision() const { return intg + frac; }
136
137 /** Swap two my_decimal values */
138 void swap(my_decimal &rhs) { std::swap(*this, rhs); }
139
140#ifndef MYSQL_SERVER
141 // Error reporting in server code only.
142 int check_result(uint, int result) const { return result; }
143#else
144 int check_result(uint, int result) const;
145#endif
146};
147
148#ifndef NDEBUG
149void print_decimal(const my_decimal *dec);
150void print_decimal_buff(const my_decimal *dec, const uchar *ptr, int length);
151const char *dbug_decimal_as_string(char *buff, const my_decimal *val);
152#else
153#define dbug_decimal_as_string(A) NULL
154#endif
155
156bool str_set_decimal(uint mask, const my_decimal *val, String *str,
157 const CHARSET_INFO *cs, uint decimals);
158
159inline void max_my_decimal(my_decimal *to, int precision, int frac) {
160 assert((precision <= DECIMAL_MAX_PRECISION) && (frac <= DECIMAL_MAX_SCALE));
161 max_decimal(precision, frac, to);
162}
163
166}
167
168inline int check_result_and_overflow(uint mask, int result, my_decimal *val) {
169 if (val->check_result(mask, result) & E_DEC_OVERFLOW) {
170 const bool sign = val->sign();
171 val->sanity_check();
173 val->sign(sign);
174 }
175 /*
176 Avoid returning negative zero, cfr. decimal_cmp()
177 For result == E_DEC_DIV_ZERO *val has not been assigned.
178 */
179 if (result != E_DEC_DIV_ZERO && val->sign() && decimal_is_zero(val))
180 val->sign(false);
181 return result;
182}
183
184inline uint my_decimal_length_to_precision(uint length, uint scale,
185 bool unsigned_flag) {
186 /* Precision can't be negative thus ignore unsigned_flag when length is 0. */
187 assert(length || !scale);
188 const uint retval =
189 (uint)(length - (scale > 0 ? 1 : 0) - (unsigned_flag || !length ? 0 : 1));
190 return retval;
191}
192
194 uint8 scale,
195 bool unsigned_flag) {
196 /*
197 When precision is 0 it means that original length was also 0. Thus
198 unsigned_flag is ignored in this case.
199 */
200 assert(precision || !scale);
201 const uint32 retval = (uint32)(precision + (scale > 0 ? 1 : 0) +
202 (unsigned_flag || !precision ? 0 : 1));
203 if (retval == 0) return 1;
204 return retval;
205}
206
207inline uint32 my_decimal_precision_to_length(uint precision, uint8 scale,
208 bool unsigned_flag) {
209 /*
210 When precision is 0 it means that original length was also 0. Thus
211 unsigned_flag is ignored in this case.
212 */
213 assert(precision || !scale);
214 precision = std::min(precision, uint(DECIMAL_MAX_PRECISION));
215 return my_decimal_precision_to_length_no_truncation(precision, scale,
216 unsigned_flag);
217}
218
220 /* length of string representation including terminating '\0' */
221 return decimal_string_size(d);
222}
223
224inline int my_decimal_get_binary_size(uint precision, uint scale) {
225 return decimal_bin_size((int)precision, (int)scale);
226}
227
228inline void my_decimal2decimal(const my_decimal *from, my_decimal *to) {
229 *to = *from;
230}
231
232int my_decimal2binary(uint mask, const my_decimal *d, uchar *bin, int prec,
233 int scale);
234
235inline int binary2my_decimal(uint mask, const uchar *bin, my_decimal *d,
236 int prec, int scale) {
237 return d->check_result(mask, bin2decimal(bin, d, prec, scale, false));
238}
239
240/**
241 Decode DECIMAL from binary form
242
243 @param mask Error mask
244 @param bin Binary string to decode
245 @param d [out] DECIMAL buffer
246 @param prec Precision of stored value
247 @param scale Scale of stored value
248 @param keep_prec Whether to keep stored value's precision
249
250 @returns
251 conversion error
252*/
253
254inline int binary2my_decimal(uint mask, const uchar *bin, my_decimal *d,
255 int prec, int scale, bool keep_prec) {
256 return d->check_result(mask, bin2decimal(bin, d, prec, scale, keep_prec));
257}
258
260 /*
261 We need the up-cast here, since my_decimal has sign() member functions,
262 which conflicts with decimal_t::size
263 (and decimal_make_zero is a macro, rather than a function).
264 */
265 decimal_make_zero(static_cast<decimal_t *>(d));
266 return 0;
267}
268
269inline bool my_decimal_is_zero(const my_decimal *decimal_value) {
270 return decimal_is_zero(decimal_value);
271}
272
273inline int my_decimal_round(uint mask, const my_decimal *from, int scale,
274 bool truncate, my_decimal *to) {
275 return from->check_result(
276 mask, decimal_round(from, to, scale, (truncate ? TRUNCATE : HALF_UP)));
277}
278
279inline int my_decimal_floor(uint mask, const my_decimal *from, my_decimal *to) {
280 return from->check_result(mask, decimal_round(from, to, 0, FLOOR));
281}
282
283inline int my_decimal_ceiling(uint mask, const my_decimal *from,
284 my_decimal *to) {
285 return from->check_result(mask, decimal_round(from, to, 0, CEILING));
286}
287
288int my_decimal2string(uint mask, const my_decimal *d, uint fixed_prec,
289 uint fixed_dec, String *str);
290
291inline int my_decimal2string(uint mask, const my_decimal *d, String *str) {
292 return my_decimal2string(mask, d, 0, 0, str);
293}
294
295inline int my_decimal2int(uint mask, const my_decimal *d, bool unsigned_flag,
296 longlong *l) {
297 my_decimal rounded;
298 /* decimal_round can return only E_DEC_TRUNCATED */
299 decimal_round(d, &rounded, 0, HALF_UP);
300 return d->check_result(
301 mask, (unsigned_flag ? decimal2ulonglong(&rounded, (ulonglong *)l)
302 : decimal2longlong(&rounded, l)));
303}
304
305inline int my_decimal2double(uint, const my_decimal *d, double *result) {
306 /* No need to call check_result as this will always succeed */
307 return decimal2double(d, result);
308}
309
310inline int my_decimal2lldiv_t(uint mask, const my_decimal *d, lldiv_t *to) {
311 return d->check_result(mask, decimal2lldiv_t(d, to));
312}
313
314inline int str2my_decimal(uint mask, const char *str, my_decimal *d,
315 const char **end) {
317}
318
319int str2my_decimal(uint mask, const char *from, size_t length,
320 const CHARSET_INFO *charset, my_decimal *decimal_value);
321
325
326inline int double2my_decimal(uint mask, double val, my_decimal *d) {
328}
329
330inline int int2my_decimal(uint mask, longlong i, bool unsigned_flag,
331 my_decimal *d) {
332 return d->check_result(mask,
333 (unsigned_flag ? ulonglong2decimal((ulonglong)i, d)
334 : longlong2decimal(i, d)));
335}
336
337inline void my_decimal_neg(decimal_t *arg) {
338 // Avoid returning negative zero, cfr. decimal_cmp()
339 if (decimal_is_zero(arg)) {
340 arg->sign = false;
341 return;
342 }
343 arg->sign ^= 1;
344}
345
346inline int my_decimal_add(uint mask, my_decimal *res, const my_decimal *a,
347 const my_decimal *b) {
348 return check_result_and_overflow(mask, decimal_add(a, b, res), res);
349}
350
351inline int my_decimal_sub(uint mask, my_decimal *res, const my_decimal *a,
352 const my_decimal *b) {
353 return check_result_and_overflow(mask, decimal_sub(a, b, res), res);
354}
355
356inline int my_decimal_mul(uint mask, my_decimal *res, const my_decimal *a,
357 const my_decimal *b) {
358 return check_result_and_overflow(mask, decimal_mul(a, b, res), res);
359}
360
361inline int my_decimal_div(uint mask, my_decimal *res, const my_decimal *a,
362 const my_decimal *b, int div_scale_inc) {
363 return check_result_and_overflow(mask, decimal_div(a, b, res, div_scale_inc),
364 res);
365}
366
367inline int my_decimal_mod(uint mask, my_decimal *res, const my_decimal *a,
368 const my_decimal *b) {
369 return check_result_and_overflow(mask, decimal_mod(a, b, res), res);
370}
371
372/**
373 @retval -1 if a @< b
374 @retval 1 if a @> b
375 @retval 0 if a == b
376*/
377inline int my_decimal_cmp(const my_decimal *a, const my_decimal *b) {
378 return decimal_cmp(a, b);
379}
380
381inline bool operator<(const my_decimal &lhs, const my_decimal &rhs) {
382 return my_decimal_cmp(&lhs, &rhs) < 0;
383}
384
385inline bool operator!=(const my_decimal &lhs, const my_decimal &rhs) {
386 return my_decimal_cmp(&lhs, &rhs) != 0;
387}
388
389inline int my_decimal_intg(const my_decimal *a) { return decimal_intg(a); }
390
391void my_decimal_trim(ulong *precision, uint *scale);
392
393#endif // MY_DECIMAL_INCLUDED
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:169
Time_val is a temporal type that represents only time.
Definition: my_temporal.h:55
my_decimal class limits 'decimal_t' type to what we need in MySQL.
Definition: my_decimal.h:97
int check_result(uint, int result) const
report result of decimal operation.
Definition: my_decimal.cc:61
void sign(bool s)
Definition: my_decimal.h:134
my_decimal()
Definition: my_decimal.h:125
void init()
Definition: my_decimal.h:119
my_decimal & operator=(const my_decimal &rhs)
Definition: my_decimal.h:106
void sanity_check() const
Definition: my_decimal.h:131
my_decimal(const my_decimal &rhs)
Definition: my_decimal.h:101
uint precision() const
Definition: my_decimal.h:135
~my_decimal()
Definition: my_decimal.h:128
bool sign() const
Definition: my_decimal.h:133
void swap(my_decimal &rhs)
Swap two my_decimal values.
Definition: my_decimal.h:138
std::array< decimal_digit_t, DECIMAL_BUFF_LENGTH > buffer
Definition: my_decimal.h:98
int decimal_round(const decimal_t *from, decimal_t *to, int new_scale, decimal_round_mode mode)
Definition: decimal.cc:1658
int decimal_bin_size(int precision, int scale)
Definition: decimal.cc:1636
int decimal2longlong(const decimal_t *from, longlong *to)
Definition: decimal.cc:1179
int ulonglong2decimal(ulonglong from, decimal_t *to)
Definition: decimal.cc:1143
int decimal_mul(const decimal_t *from1, const decimal_t *from2, decimal_t *to)
Definition: decimal.cc:2088
static int decimal_string_size(const decimal_t *dec)
Returns the length of the buffer to hold string representation of the decimal (including decimal dot,...
Definition: decimal.h:134
int bin2decimal(const uchar *from, decimal_t *to, int precision, int scale, bool keep_prec=false)
Definition: decimal.cc:1491
int decimal_mod(const decimal_t *from1, const decimal_t *from2, decimal_t *to)
Definition: decimal.cc:2515
@ CEILING
Definition: decimal.h:37
@ FLOOR
Definition: decimal.h:38
@ HALF_UP
Definition: decimal.h:36
@ TRUNCATE
Definition: decimal.h:34
int decimal_add(const decimal_t *from1, const decimal_t *from2, decimal_t *to)
Definition: decimal.cc:2039
int decimal_is_zero(const decimal_t *from)
Definition: decimal.cc:2059
#define E_DEC_DIV_ZERO
Definition: decimal.h:150
int longlong2decimal(longlong from, decimal_t *to)
Definition: decimal.cc:1148
int decimal2lldiv_t(const decimal_t *from, lldiv_t *to)
Convert decimal to lldiv_t.
Definition: decimal.cc:1226
void max_decimal(int precision, int frac, decimal_t *to)
Definition: decimal.cc:435
int decimal2ulonglong(const decimal_t *from, ulonglong *to)
Definition: decimal.cc:1155
int decimal_div(const decimal_t *from1, const decimal_t *from2, decimal_t *to, int scale_incr)
Definition: decimal.cc:2483
int string2decimal(const char *from, decimal_t *to, const char **end)
Definition: decimal.cc:935
static void decimal_make_zero(decimal_t *dec)
Definition: decimal.h:123
int decimal2double(const decimal_t *from, double *to)
Definition: decimal.cc:1079
int decimal_cmp(const decimal_t *from1, const decimal_t *from2)
Definition: decimal.cc:2049
int decimal_intg(const decimal_t *from)
Returns the number of decimal digits before the decimal point in a decimal_t, with any insignificant ...
Definition: decimal.cc:2033
int double2decimal(double from, decimal_t *to)
Definition: decimal.cc:1104
int decimal_sub(const decimal_t *from1, const decimal_t *from2, decimal_t *to)
Definition: decimal.cc:2044
#define E_DEC_OVERFLOW
Definition: decimal.h:149
static constexpr int DECIMAL_NOT_SPECIFIED
Definition: dtoa.h:54
static constexpr int DECIMAL_MAX_SCALE
Definition: dtoa.h:53
static const std::string dec("DECRYPTION")
A better implementation of the UNIX ctype(3) library.
static mi_bit_type mask[]
Definition: mi_packrec.cc:141
int my_decimal_int_part(uint precision, uint decimals)
Definition: my_decimal.h:85
int my_decimal2binary(uint mask, const my_decimal *d, uchar *bin, int prec, int scale)
Definition: my_decimal.cc:222
void max_internal_decimal(my_decimal *to)
Definition: my_decimal.h:164
int check_result_and_overflow(uint mask, int result, my_decimal *val)
Definition: my_decimal.h:168
int my_decimal_sub(uint mask, my_decimal *res, const my_decimal *a, const my_decimal *b)
Definition: my_decimal.h:351
int int2my_decimal(uint mask, longlong i, bool unsigned_flag, my_decimal *d)
Definition: my_decimal.h:330
void print_decimal_buff(const my_decimal *dec, const uchar *ptr, int length)
Definition: my_decimal.cc:372
my_decimal * timeval2my_decimal(const my_timeval *tm, my_decimal *dec)
Convert timeval value to my_decimal.
Definition: my_decimal.cc:337
int double2my_decimal(uint mask, double val, my_decimal *d)
Definition: my_decimal.h:326
bool operator!=(const my_decimal &lhs, const my_decimal &rhs)
Definition: my_decimal.h:385
void max_my_decimal(my_decimal *to, int precision, int frac)
Definition: my_decimal.h:159
int my_decimal2string(uint mask, const my_decimal *d, uint fixed_prec, uint fixed_dec, String *str)
Converting decimal to string.
Definition: my_decimal.cc:126
static constexpr int DECIMAL_MAX_FIELD_SIZE
maximum size of packet length.
Definition: my_decimal.h:83
int my_decimal_get_binary_size(uint precision, uint scale)
Definition: my_decimal.h:224
static constexpr int DECIMAL_LONGLONG_DIGITS
Definition: my_decimal.h:57
int my_decimal2lldiv_t(uint mask, const my_decimal *d, lldiv_t *to)
Definition: my_decimal.h:310
bool str_set_decimal(uint mask, const my_decimal *val, String *str, const CHARSET_INFO *cs, uint decimals)
Converting decimal to string with character set conversion.
Definition: my_decimal.cc:172
int my_decimal_add(uint mask, my_decimal *res, const my_decimal *a, const my_decimal *b)
Definition: my_decimal.h:346
static constexpr int DECIMAL_BUFF_LENGTH
maximum length of buffer in our big digits (uint32).
Definition: my_decimal.h:60
int my_decimal_mod(uint mask, my_decimal *res, const my_decimal *a, const my_decimal *b)
Definition: my_decimal.h:367
void my_decimal_neg(decimal_t *arg)
Definition: my_decimal.h:337
int my_decimal_floor(uint mask, const my_decimal *from, my_decimal *to)
Definition: my_decimal.h:279
int my_decimal2double(uint, const my_decimal *d, double *result)
Definition: my_decimal.h:305
bool my_decimal_is_zero(const my_decimal *decimal_value)
Definition: my_decimal.h:269
void print_decimal(const my_decimal *dec)
Definition: my_decimal.cc:359
uint my_decimal_length_to_precision(uint length, uint scale, bool unsigned_flag)
Definition: my_decimal.h:184
int binary2my_decimal(uint mask, const uchar *bin, my_decimal *d, int prec, int scale)
Definition: my_decimal.h:235
uint32 my_decimal_precision_to_length(uint precision, uint8 scale, bool unsigned_flag)
Definition: my_decimal.h:207
void my_decimal_trim(ulong *precision, uint *scale)
Definition: my_decimal.cc:344
int my_decimal_cmp(const my_decimal *a, const my_decimal *b)
Definition: my_decimal.h:377
my_decimal * date2my_decimal(const MYSQL_TIME *ltime, my_decimal *dec)
Convert datetime value to my_decimal in format YYYYMMDDhhmmss.ffffff.
Definition: my_decimal.cc:310
bool operator<(const my_decimal &lhs, const my_decimal &rhs)
Definition: my_decimal.h:381
int my_decimal_intg(const my_decimal *a)
Definition: my_decimal.h:389
int my_decimal_set_zero(my_decimal *d)
Definition: my_decimal.h:259
int my_decimal_div(uint mask, my_decimal *res, const my_decimal *a, const my_decimal *b, int div_scale_inc)
Definition: my_decimal.h:361
int my_decimal_round(uint mask, const my_decimal *from, int scale, bool truncate, my_decimal *to)
Definition: my_decimal.h:273
void my_decimal2decimal(const my_decimal *from, my_decimal *to)
Definition: my_decimal.h:228
static constexpr int DECIMAL_MAX_PRECISION
maximum guaranteed precision of number in decimal digits (number of our digits * number of decimal di...
Definition: my_decimal.h:71
int my_decimal2int(uint mask, const my_decimal *d, bool unsigned_flag, longlong *l)
Definition: my_decimal.h:295
static constexpr int DECIMAL_MAX_STR_LENGTH
maximum length of string representation (number of maximum decimal digits + 1 position for sign + 1 p...
Definition: my_decimal.h:78
int my_decimal_string_length(const my_decimal *d)
Definition: my_decimal.h:219
int my_decimal_ceiling(uint mask, const my_decimal *from, my_decimal *to)
Definition: my_decimal.h:283
static constexpr int DECIMAL_MAX_POSSIBLE_PRECISION
the number of digits that my_decimal can possibly contain
Definition: my_decimal.h:63
int my_decimal_mul(uint mask, my_decimal *res, const my_decimal *a, const my_decimal *b)
Definition: my_decimal.h:356
int str2my_decimal(uint mask, const char *str, my_decimal *d, const char **end)
Definition: my_decimal.h:314
const char * dbug_decimal_as_string(char *buff, const my_decimal *val)
Definition: my_decimal.cc:381
uint32 my_decimal_precision_to_length_no_truncation(uint precision, uint8 scale, bool unsigned_flag)
Definition: my_decimal.h:193
my_decimal * time2my_decimal(const Time_val *ltime, my_decimal *dec)
Convert time value to my_decimal in format hhmmss.ffffff.
Definition: my_decimal.cc:324
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
uint8_t uint8
Definition: my_inttypes.h:63
unsigned char uchar
Definition: my_inttypes.h:52
long long int longlong
Definition: my_inttypes.h:55
uint32_t uint32
Definition: my_inttypes.h:67
Some common macros.
Server classes for temporal handling (DATE, TIME, DATETIME)
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1078
Definition: buf0block_hint.cc:30
const std::string charset("charset")
Definition: commit_order_queue.h:34
bool length(const dd::Spatial_reference_system *srs, const Geometry *g1, double *length, bool *null) noexcept
Computes the length of linestrings and multilinestrings.
Definition: length.cc:76
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:192
std::string truncate(const std::string &str, const size_t max_length)
Truncates the given string to max_length code points.
Definition: utils_string.cc:418
struct result result
Definition: result.h:34
static void swap(String &a, String &b) noexcept
Definition: sql_string.h:650
Definition: m_ctype.h:421
Definition: mysql_time.h:82
Base struct used to represent decimal data type.
Definition: decimal.h:48
int frac
The number of decimal digits after the point.
Definition: decimal.h:53
decimal_digit_t * buf
An array of decimal_digit_t's.
Definition: decimal.h:60
int intg
The number of decimal digits (NOT number of decimal_digit_t's !) before the point.
Definition: decimal.h:51
bool sign
False means positive, true means negative.
Definition: decimal.h:58
int len
The length of buf (length of allocated space) in decimal_digit_t's, not in bytes.
Definition: decimal.h:56
Replacement of system's struct timeval to ensure we can carry 64 bit values even on a platform which ...
Definition: my_time_t.h:45
Definition: result.h:30