MySQL 8.3.0
Source Code Documentation
my_decimal.h
Go to the documentation of this file.
1/* Copyright (c) 2005, 2023, 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 also distributed 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 included with MySQL.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License, version 2.0, for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22
23#ifndef MY_DECIMAL_INCLUDED
24#define MY_DECIMAL_INCLUDED
25
26/**
27 @file
28
29 It is interface module to fixed precision decimals library.
30
31 Most functions use 'uint mask' as parameter, if during operation error
32 which fit in this mask is detected then it will be processed automatically
33 here. (errors are E_DEC_* constants, see include/decimal.h)
34
35 Most function are just inline wrappers around library calls
36*/
37
38#include <assert.h>
39#include <stdlib.h>
40#include <sys/types.h>
41#include <algorithm>
42
43#include "decimal.h"
44
45#include "my_inttypes.h"
46#include "my_macros.h"
47#include "my_time_t.h"
48#include "mysql/strings/dtoa.h"
50
51class String;
52struct MYSQL_TIME;
53
54static constexpr int DECIMAL_LONGLONG_DIGITS{22};
55
56/** maximum length of buffer in our big digits (uint32). */
57static constexpr int DECIMAL_BUFF_LENGTH{9};
58
59/** the number of digits that my_decimal can possibly contain */
61
62/**
63 maximum guaranteed precision of number in decimal digits (number of our
64 digits * number of decimal digits in one our big digit - number of decimal
65 digits in one our big digit decreased by 1 (because we always put decimal
66 point on the border of our big digits))
67*/
69 8 * 2};
70
71/**
72 maximum length of string representation (number of maximum decimal
73 digits + 1 position for sign + 1 position for decimal point, no terminator)
74*/
76
77/**
78 maximum size of packet length.
79*/
81
82inline int my_decimal_int_part(uint precision, uint decimals) {
83 return precision - ((decimals == DECIMAL_NOT_SPECIFIED) ? 0 : decimals);
84}
85
86/**
87 my_decimal class limits 'decimal_t' type to what we need in MySQL.
88
89 It contains internally all necessary space needed by the instance so
90 no extra memory is needed. Objects should be moved using copy CTOR
91 or assignment operator, rather than memcpy/memmove.
92*/
93
94class my_decimal : public decimal_t {
95/*
96 Several of the routines in strings/decimal.c have had buffer
97 overrun/underrun problems. These are *not* caught by valgrind.
98 To catch them, we allocate dummy fields around the buffer,
99 and test that their values do not change.
100 */
101#if !defined(NDEBUG)
102 int foo1;
103#endif
104
106
107#if !defined(NDEBUG)
108 int foo2;
109 static const int test_value = 123;
110#endif
111
112 public:
113 my_decimal(const my_decimal &rhs) : decimal_t(rhs) {
114 rhs.sanity_check();
115#if !defined(NDEBUG)
118#endif
119 for (uint i = 0; i < DECIMAL_BUFF_LENGTH; i++) buffer[i] = rhs.buffer[i];
120 buf = buffer;
121 }
122
124 sanity_check();
125 rhs.sanity_check();
126 if (this == &rhs) return *this;
127 decimal_t::operator=(rhs);
128 for (uint i = 0; i < DECIMAL_BUFF_LENGTH; i++) buffer[i] = rhs.buffer[i];
129 buf = buffer;
130 return *this;
131 }
132
133 void init() {
134#if !defined(NDEBUG)
137#endif
138 /*
139 Do not initialize more of the base class,
140 we want to catch uninitialized use.
141 */
143 buf = buffer;
144 }
145
147
148#ifndef NDEBUG
150#endif // NDEBUG
151
152 void sanity_check() const {
153 assert(foo1 == test_value);
154 assert(foo2 == test_value);
155 assert(buf == buffer);
156 }
157
158 bool sign() const { return decimal_t::sign; }
159 void sign(bool s) { decimal_t::sign = s; }
160 uint precision() const { return intg + frac; }
161
162 /** Swap two my_decimal values */
163 void swap(my_decimal &rhs) { std::swap(*this, rhs); }
164
165#ifndef MYSQL_SERVER
166 // Error reporting in server code only.
167 int check_result(uint, int result) const { return result; }
168#else
169 int check_result(uint, int result) const;
170#endif
171};
172
173#ifndef NDEBUG
174void print_decimal(const my_decimal *dec);
175void print_decimal_buff(const my_decimal *dec, const uchar *ptr, int length);
176const char *dbug_decimal_as_string(char *buff, const my_decimal *val);
177#else
178#define dbug_decimal_as_string(A) NULL
179#endif
180
181bool str_set_decimal(uint mask, const my_decimal *val, String *str,
182 const CHARSET_INFO *cs, uint decimals);
183
185
186inline void max_my_decimal(my_decimal *to, int precision, int frac) {
187 assert((precision <= DECIMAL_MAX_PRECISION) && (frac <= DECIMAL_MAX_SCALE));
188 max_decimal(precision, frac, to);
189}
190
193}
194
195inline int check_result_and_overflow(uint mask, int result, my_decimal *val) {
196 if (val->check_result(mask, result) & E_DEC_OVERFLOW) {
197 const bool sign = val->sign();
198 val->sanity_check();
200 val->sign(sign);
201 }
202 /*
203 Avoid returning negative zero, cfr. decimal_cmp()
204 For result == E_DEC_DIV_ZERO *val has not been assigned.
205 */
206 if (result != E_DEC_DIV_ZERO && val->sign() && decimal_is_zero(val))
207 val->sign(false);
208 return result;
209}
210
211inline uint my_decimal_length_to_precision(uint length, uint scale,
212 bool unsigned_flag) {
213 /* Precision can't be negative thus ignore unsigned_flag when length is 0. */
214 assert(length || !scale);
215 const uint retval =
216 (uint)(length - (scale > 0 ? 1 : 0) - (unsigned_flag || !length ? 0 : 1));
217 return retval;
218}
219
221 uint8 scale,
222 bool unsigned_flag) {
223 /*
224 When precision is 0 it means that original length was also 0. Thus
225 unsigned_flag is ignored in this case.
226 */
227 assert(precision || !scale);
228 const uint32 retval = (uint32)(precision + (scale > 0 ? 1 : 0) +
229 (unsigned_flag || !precision ? 0 : 1));
230 if (retval == 0) return 1;
231 return retval;
232}
233
234inline uint32 my_decimal_precision_to_length(uint precision, uint8 scale,
235 bool unsigned_flag) {
236 /*
237 When precision is 0 it means that original length was also 0. Thus
238 unsigned_flag is ignored in this case.
239 */
240 assert(precision || !scale);
241 precision = std::min(precision, uint(DECIMAL_MAX_PRECISION));
242 return my_decimal_precision_to_length_no_truncation(precision, scale,
243 unsigned_flag);
244}
245
247 /* length of string representation including terminating '\0' */
248 return decimal_string_size(d);
249}
250
251inline int my_decimal_get_binary_size(uint precision, uint scale) {
252 return decimal_bin_size((int)precision, (int)scale);
253}
254
255inline void my_decimal2decimal(const my_decimal *from, my_decimal *to) {
256 *to = *from;
257}
258
259int my_decimal2binary(uint mask, const my_decimal *d, uchar *bin, int prec,
260 int scale);
261
262inline int binary2my_decimal(uint mask, const uchar *bin, my_decimal *d,
263 int prec, int scale) {
264 return d->check_result(mask, bin2decimal(bin, d, prec, scale, false));
265}
266
267/**
268 Decode DECIMAL from binary form
269
270 @param mask Error mask
271 @param bin Binary string to decode
272 @param d [out] DECIMAL buffer
273 @param prec Precision of stored value
274 @param scale Scale of stored value
275 @param keep_prec Whether to keep stored value's precision
276
277 @returns
278 conversion error
279*/
280
281inline int binary2my_decimal(uint mask, const uchar *bin, my_decimal *d,
282 int prec, int scale, bool keep_prec) {
283 return d->check_result(mask, bin2decimal(bin, d, prec, scale, keep_prec));
284}
285
287 /*
288 We need the up-cast here, since my_decimal has sign() member functions,
289 which conflicts with decimal_t::size
290 (and decimal_make_zero is a macro, rather than a function).
291 */
292 decimal_make_zero(static_cast<decimal_t *>(d));
293 return 0;
294}
295
296inline bool my_decimal_is_zero(const my_decimal *decimal_value) {
297 return decimal_is_zero(decimal_value);
298}
299
300inline int my_decimal_round(uint mask, const my_decimal *from, int scale,
301 bool truncate, my_decimal *to) {
302 return from->check_result(
303 mask, decimal_round(from, to, scale, (truncate ? TRUNCATE : HALF_UP)));
304}
305
306inline int my_decimal_floor(uint mask, const my_decimal *from, my_decimal *to) {
307 return from->check_result(mask, decimal_round(from, to, 0, FLOOR));
308}
309
310inline int my_decimal_ceiling(uint mask, const my_decimal *from,
311 my_decimal *to) {
312 return from->check_result(mask, decimal_round(from, to, 0, CEILING));
313}
314
315int my_decimal2string(uint mask, const my_decimal *d, uint fixed_prec,
316 uint fixed_dec, String *str);
317
318inline int my_decimal2string(uint mask, const my_decimal *d, String *str) {
319 return my_decimal2string(mask, d, 0, 0, str);
320}
321
322inline int my_decimal2int(uint mask, const my_decimal *d, bool unsigned_flag,
323 longlong *l) {
324 my_decimal rounded;
325 /* decimal_round can return only E_DEC_TRUNCATED */
326 decimal_round(d, &rounded, 0, HALF_UP);
327 return d->check_result(
328 mask, (unsigned_flag ? decimal2ulonglong(&rounded, (ulonglong *)l)
329 : decimal2longlong(&rounded, l)));
330}
331
332inline int my_decimal2double(uint, const my_decimal *d, double *result) {
333 /* No need to call check_result as this will always succeed */
334 return decimal2double(d, result);
335}
336
337inline int my_decimal2lldiv_t(uint mask, const my_decimal *d, lldiv_t *to) {
338 return d->check_result(mask, decimal2lldiv_t(d, to));
339}
340
341inline int str2my_decimal(uint mask, const char *str, my_decimal *d,
342 const char **end) {
344}
345
346int str2my_decimal(uint mask, const char *from, size_t length,
347 const CHARSET_INFO *charset, my_decimal *decimal_value);
348
352
353inline int double2my_decimal(uint mask, double val, my_decimal *d) {
355}
356
357inline int int2my_decimal(uint mask, longlong i, bool unsigned_flag,
358 my_decimal *d) {
359 return d->check_result(mask,
360 (unsigned_flag ? ulonglong2decimal((ulonglong)i, d)
361 : longlong2decimal(i, d)));
362}
363
364inline void my_decimal_neg(decimal_t *arg) {
365 // Avoid returning negative zero, cfr. decimal_cmp()
366 if (decimal_is_zero(arg)) {
367 arg->sign = false;
368 return;
369 }
370 arg->sign ^= 1;
371}
372
373inline int my_decimal_add(uint mask, my_decimal *res, const my_decimal *a,
374 const my_decimal *b) {
375 return check_result_and_overflow(mask, decimal_add(a, b, res), res);
376}
377
378inline int my_decimal_sub(uint mask, my_decimal *res, const my_decimal *a,
379 const my_decimal *b) {
380 return check_result_and_overflow(mask, decimal_sub(a, b, res), res);
381}
382
383inline int my_decimal_mul(uint mask, my_decimal *res, const my_decimal *a,
384 const my_decimal *b) {
385 return check_result_and_overflow(mask, decimal_mul(a, b, res), res);
386}
387
388inline int my_decimal_div(uint mask, my_decimal *res, const my_decimal *a,
389 const my_decimal *b, int div_scale_inc) {
390 return check_result_and_overflow(mask, decimal_div(a, b, res, div_scale_inc),
391 res);
392}
393
394inline int my_decimal_mod(uint mask, my_decimal *res, const my_decimal *a,
395 const my_decimal *b) {
396 return check_result_and_overflow(mask, decimal_mod(a, b, res), res);
397}
398
399/**
400 @retval -1 if a @< b
401 @retval 1 if a @> b
402 @retval 0 if a == b
403*/
404inline int my_decimal_cmp(const my_decimal *a, const my_decimal *b) {
405 return decimal_cmp(a, b);
406}
407
408inline bool operator<(const my_decimal &lhs, const my_decimal &rhs) {
409 return my_decimal_cmp(&lhs, &rhs) < 0;
410}
411
412inline bool operator!=(const my_decimal &lhs, const my_decimal &rhs) {
413 return my_decimal_cmp(&lhs, &rhs) != 0;
414}
415
416inline int my_decimal_intg(const my_decimal *a) { return decimal_intg(a); }
417
418void my_decimal_trim(ulong *precision, uint *scale);
419
420#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:166
my_decimal class limits 'decimal_t' type to what we need in MySQL.
Definition: my_decimal.h:94
int check_result(uint, int result) const
report result of decimal operation.
Definition: my_decimal.cc:60
int foo2
Definition: my_decimal.h:108
void sign(bool s)
Definition: my_decimal.h:159
decimal_digit_t buffer[DECIMAL_BUFF_LENGTH]
Definition: my_decimal.h:105
static const int test_value
Definition: my_decimal.h:109
my_decimal()
Definition: my_decimal.h:146
void init()
Definition: my_decimal.h:133
my_decimal & operator=(const my_decimal &rhs)
Definition: my_decimal.h:123
void sanity_check() const
Definition: my_decimal.h:152
int foo1
Definition: my_decimal.h:102
my_decimal(const my_decimal &rhs)
Definition: my_decimal.h:113
uint precision() const
Definition: my_decimal.h:160
~my_decimal()
Definition: my_decimal.h:149
bool sign() const
Definition: my_decimal.h:158
void swap(my_decimal &rhs)
Swap two my_decimal values.
Definition: my_decimal.h:163
int decimal_round(const decimal_t *from, decimal_t *to, int new_scale, decimal_round_mode mode)
Definition: decimal.cc:1652
int decimal_bin_size(int precision, int scale)
Definition: decimal.cc:1630
int decimal2longlong(const decimal_t *from, longlong *to)
Definition: decimal.cc:1174
int ulonglong2decimal(ulonglong from, decimal_t *to)
Definition: decimal.cc:1138
int decimal_mul(const decimal_t *from1, const decimal_t *from2, decimal_t *to)
Definition: decimal.cc:2082
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:128
int bin2decimal(const uchar *from, decimal_t *to, int precision, int scale, bool keep_prec=false)
Definition: decimal.cc:1485
int decimal_mod(const decimal_t *from1, const decimal_t *from2, decimal_t *to)
Definition: decimal.cc:2509
@ 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:2033
int decimal_is_zero(const decimal_t *from)
Definition: decimal.cc:2053
#define E_DEC_DIV_ZERO
Definition: decimal.h:144
int longlong2decimal(longlong from, decimal_t *to)
Definition: decimal.cc:1143
int decimal2lldiv_t(const decimal_t *from, lldiv_t *to)
Convert decimal to lldiv_t.
Definition: decimal.cc:1221
void max_decimal(int precision, int frac, decimal_t *to)
Definition: decimal.cc:431
int32 decimal_digit_t
Definition: decimal.h:40
int decimal2ulonglong(const decimal_t *from, ulonglong *to)
Definition: decimal.cc:1150
int decimal_div(const decimal_t *from1, const decimal_t *from2, decimal_t *to, int scale_incr)
Definition: decimal.cc:2477
int string2decimal(const char *from, decimal_t *to, const char **end)
Definition: decimal.cc:931
static void decimal_make_zero(decimal_t *dec)
Definition: decimal.h:117
int decimal2double(const decimal_t *from, double *to)
Definition: decimal.cc:1074
int decimal_cmp(const decimal_t *from1, const decimal_t *from2)
Definition: decimal.cc:2043
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:2027
int double2decimal(double from, decimal_t *to)
Definition: decimal.cc:1099
int decimal_sub(const decimal_t *from1, const decimal_t *from2, decimal_t *to)
Definition: decimal.cc:2038
#define E_DEC_OVERFLOW
Definition: decimal.h:143
static constexpr int DECIMAL_NOT_SPECIFIED
Definition: dtoa.h:53
static constexpr int DECIMAL_MAX_SCALE
Definition: dtoa.h:52
static const std::string dec("DECRYPTION")
A better implementation of the UNIX ctype(3) library.
static mi_bit_type mask[]
Definition: mi_packrec.cc:140
int my_decimal_int_part(uint precision, uint decimals)
Definition: my_decimal.h:82
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:191
int check_result_and_overflow(uint mask, int result, my_decimal *val)
Definition: my_decimal.h:195
int my_decimal_sub(uint mask, my_decimal *res, const my_decimal *a, const my_decimal *b)
Definition: my_decimal.h:378
int int2my_decimal(uint mask, longlong i, bool unsigned_flag, my_decimal *d)
Definition: my_decimal.h:357
void print_decimal_buff(const my_decimal *dec, const uchar *ptr, int length)
Definition: my_decimal.cc:369
my_decimal * timeval2my_decimal(const my_timeval *tm, my_decimal *dec)
Convert timeval value to my_decimal.
Definition: my_decimal.cc:334
int double2my_decimal(uint mask, double val, my_decimal *d)
Definition: my_decimal.h:353
bool operator!=(const my_decimal &lhs, const my_decimal &rhs)
Definition: my_decimal.h:412
void max_my_decimal(my_decimal *to, int precision, int frac)
Definition: my_decimal.h:186
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:125
static constexpr int DECIMAL_MAX_FIELD_SIZE
maximum size of packet length.
Definition: my_decimal.h:80
int my_decimal_get_binary_size(uint precision, uint scale)
Definition: my_decimal.h:251
static constexpr int DECIMAL_LONGLONG_DIGITS
Definition: my_decimal.h:54
int my_decimal2lldiv_t(uint mask, const my_decimal *d, lldiv_t *to)
Definition: my_decimal.h:337
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:171
int my_decimal_add(uint mask, my_decimal *res, const my_decimal *a, const my_decimal *b)
Definition: my_decimal.h:373
static constexpr int DECIMAL_BUFF_LENGTH
maximum length of buffer in our big digits (uint32).
Definition: my_decimal.h:57
int my_decimal_mod(uint mask, my_decimal *res, const my_decimal *a, const my_decimal *b)
Definition: my_decimal.h:394
void my_decimal_neg(decimal_t *arg)
Definition: my_decimal.h:364
int my_decimal_floor(uint mask, const my_decimal *from, my_decimal *to)
Definition: my_decimal.h:306
int my_decimal2double(uint, const my_decimal *d, double *result)
Definition: my_decimal.h:332
bool my_decimal_is_zero(const my_decimal *decimal_value)
Definition: my_decimal.h:296
void print_decimal(const my_decimal *dec)
Definition: my_decimal.cc:356
uint my_decimal_length_to_precision(uint length, uint scale, bool unsigned_flag)
Definition: my_decimal.h:211
int binary2my_decimal(uint mask, const uchar *bin, my_decimal *d, int prec, int scale)
Definition: my_decimal.h:262
uint32 my_decimal_precision_to_length(uint precision, uint8 scale, bool unsigned_flag)
Definition: my_decimal.h:234
void my_decimal_trim(ulong *precision, uint *scale)
Definition: my_decimal.cc:341
int my_decimal_cmp(const my_decimal *a, const my_decimal *b)
Definition: my_decimal.h:404
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:408
int my_decimal_intg(const my_decimal *a)
Definition: my_decimal.h:416
int my_decimal_set_zero(my_decimal *d)
Definition: my_decimal.h:286
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:388
int my_decimal_round(uint mask, const my_decimal *from, int scale, bool truncate, my_decimal *to)
Definition: my_decimal.h:300
my_decimal * time2my_decimal(const MYSQL_TIME *ltime, my_decimal *dec)
Convert time value to my_decimal in format hhmmss.ffffff.
Definition: my_decimal.cc:324
void my_decimal2decimal(const my_decimal *from, my_decimal *to)
Definition: my_decimal.h:255
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:68
int my_decimal2int(uint mask, const my_decimal *d, bool unsigned_flag, longlong *l)
Definition: my_decimal.h:322
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:75
int my_decimal_string_length(const my_decimal *d)
Definition: my_decimal.h:246
int my_decimal_ceiling(uint mask, const my_decimal *from, my_decimal *to)
Definition: my_decimal.h:310
static constexpr int DECIMAL_MAX_POSSIBLE_PRECISION
the number of digits that my_decimal can possibly contain
Definition: my_decimal.h:60
int my_decimal_mul(uint mask, my_decimal *res, const my_decimal *a, const my_decimal *b)
Definition: my_decimal.h:383
int str2my_decimal(uint mask, const char *str, my_decimal *d, const char **end)
Definition: my_decimal.h:341
const char * dbug_decimal_as_string(char *buff, const my_decimal *val)
Definition: my_decimal.cc:378
uint32 my_decimal_precision_to_length_no_truncation(uint precision, uint8 scale, bool unsigned_flag)
Definition: my_decimal.h:220
my_decimal decimal_zero
Definition: mysqld.cc:1528
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:55
uint8_t uint8
Definition: my_inttypes.h:62
unsigned char uchar
Definition: my_inttypes.h:51
long long int longlong
Definition: my_inttypes.h:54
uint32_t uint32
Definition: my_inttypes.h:66
Some common macros.
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1065
Definition: buf0block_hint.cc:29
const std::string charset("charset")
Definition: commit_order_queue.h:33
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:75
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:191
struct result result
Definition: result.h:33
Definition: m_ctype.h:422
Definition: mysql_time.h:81
intg is the number of decimal digits (NOT number of decimal_digit_t's !) before the point frac is the...
Definition: decimal.h:51
int frac
Definition: decimal.h:52
int intg
Definition: decimal.h:52
bool sign
Definition: decimal.h:53
int len
Definition: decimal.h:52
Replacement of system's struct timeval to ensure we can carry 64 bit values even on a platform which ...
Definition: my_time_t.h:44
Definition: result.h:29
void swap(const varlen_element &a, const varlen_element &b)
Definition: varlen_sort.h:65