38
40
unsigned char null_bit_arg,
39
41
enum utype unireg_check_arg,
40
42
const char *field_name_arg,
51
precision= class_decimal_length_to_precision(len_arg, dec_arg, false);
52
set_if_smaller(precision, (uint32_t)DECIMAL_MAX_PRECISION);
53
assert((precision <= DECIMAL_MAX_PRECISION) && (dec <= DECIMAL_MAX_SCALE));
54
bin_size= class_decimal_get_binary_size(precision, dec);
55
precision= my_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg);
56
set_if_smaller(precision, (uint32_t)DECIMAL_MAX_PRECISION);
57
assert((precision <= DECIMAL_MAX_PRECISION) &&
58
(dec <= DECIMAL_MAX_SCALE));
59
bin_size= my_decimal_get_binary_size(precision, dec);
57
62
Field_decimal::Field_decimal(uint32_t len_arg,
58
63
bool maybe_null_arg,
62
Field_num((unsigned char*) 0,
64
maybe_null_arg ? (unsigned char*) "": 0,
67
:Field_num((unsigned char*) 0,
69
maybe_null_arg ? (unsigned char*) "": 0,
72
precision= class_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg);
77
precision= my_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg);
73
78
set_if_smaller(precision, (uint32_t)DECIMAL_MAX_PRECISION);
74
79
assert((precision <= DECIMAL_MAX_PRECISION) &&
75
80
(dec <= DECIMAL_MAX_SCALE));
76
bin_size= class_decimal_get_binary_size(precision, dec);
81
bin_size= my_decimal_get_binary_size(precision, dec);
91
96
@param sign sign of value which caused overflow
94
void Field_decimal::set_value_on_overflow(type::Decimal *decimal_value,
99
void Field_decimal::set_value_on_overflow(my_decimal *decimal_value,
97
max_Decimal(decimal_value, precision, decimals());
102
max_my_decimal(decimal_value, precision, decimals());
99
104
decimal_value->sign(true);
109
114
If it does, stores the decimal in the buffer using binary format.
110
115
Otherwise sets maximal number that can be stored in the field.
112
@param decimal_value type::Decimal
117
@param decimal_value my_decimal
120
bool Field_decimal::store_value(const type::Decimal *decimal_value)
125
bool Field_decimal::store_value(const my_decimal *decimal_value)
122
int error= decimal_value->val_binary(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW, ptr, precision, dec);
124
if (warn_if_overflow(error))
129
if (warn_if_overflow(my_decimal2binary(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW,
130
decimal_value, ptr, precision, dec)))
126
if (error != E_DEC_TRUNCATED)
129
set_value_on_overflow(&buff, decimal_value->sign());
130
buff.val_binary(E_DEC_FATAL_ERROR, ptr, precision, dec);
133
set_value_on_overflow(&buff, decimal_value->sign());
134
my_decimal2binary(E_DEC_FATAL_ERROR, &buff, ptr, precision, dec);
140
142
const CHARSET_INFO * const charset_arg)
143
type::Decimal decimal_value;
145
my_decimal decimal_value;
145
147
ASSERT_COLUMN_MARKED_FOR_WRITE;
147
if ((err= decimal_value.store(E_DEC_FATAL_ERROR &
149
if ((err= str2my_decimal(E_DEC_FATAL_ERROR &
148
150
~(E_DEC_OVERFLOW | E_DEC_BAD_NUM),
149
from, length, charset_arg)) &&
150
getTable()->in_use->abortOnWarning())
151
from, length, charset_arg,
153
getTable()->in_use->abort_on_warning)
152
155
/* Because "from" is not NUL-terminated and we use %s in the ER() */
153
156
String from_as_str;
182
185
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
183
186
"decimal", from_as_str.c_ptr(), field_name,
184
187
(uint32_t) getTable()->in_use->row_count);
185
decimal_value.set_zero();
188
my_decimal_set_zero(&decimal_value);
198
Fix following when double2_class_decimal when double2decimal
201
Fix following when double2my_decimal when double2decimal
199
202
will return E_DEC_TRUNCATED always correctly
202
205
int Field_decimal::store(double nr)
204
type::Decimal decimal_value;
207
my_decimal decimal_value;
207
210
ASSERT_COLUMN_MARKED_FOR_WRITE;
209
err= double2_class_decimal(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW, nr,
212
err= double2my_decimal(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW, nr,
226
229
int Field_decimal::store(int64_t nr, bool unsigned_val)
228
type::Decimal decimal_value;
231
my_decimal decimal_value;
231
234
ASSERT_COLUMN_MARKED_FOR_WRITE;
233
if ((err= int2_class_decimal(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW,
236
if ((err= int2my_decimal(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW,
234
237
nr, unsigned_val, &decimal_value)))
236
239
if (check_overflow(err))
249
int Field_decimal::store_decimal(const type::Decimal *decimal_value)
252
int Field_decimal::store_decimal(const my_decimal *decimal_value)
251
254
return store_value(decimal_value);
255
int Field_decimal::store_time(type::Time <ime,
258
int Field_decimal::store_time(DRIZZLE_TIME *ltime,
259
enum enum_drizzle_timestamp_type )
258
type::Decimal decimal_value;
259
return store_value(date2_class_decimal(<ime, &decimal_value));
261
my_decimal decimal_value;
262
return store_value(date2my_decimal(ltime, &decimal_value));
263
266
double Field_decimal::val_real(void)
266
type::Decimal decimal_value;
269
my_decimal decimal_value;
268
271
ASSERT_COLUMN_MARKED_FOR_READ;
270
class_decimal2double(E_DEC_FATAL_ERROR, val_decimal(&decimal_value), &dbl);
273
my_decimal2double(E_DEC_FATAL_ERROR, val_decimal(&decimal_value), &dbl);
276
279
int64_t Field_decimal::val_int(void)
279
type::Decimal decimal_value;
282
my_decimal decimal_value;
281
284
ASSERT_COLUMN_MARKED_FOR_READ;
283
val_decimal(&decimal_value)->val_int32(E_DEC_FATAL_ERROR, false, &i);
286
my_decimal2int(E_DEC_FATAL_ERROR, val_decimal(&decimal_value), false, &i);
289
type::Decimal* Field_decimal::val_decimal(type::Decimal *decimal_value)
292
my_decimal* Field_decimal::val_decimal(my_decimal *decimal_value)
291
294
ASSERT_COLUMN_MARKED_FOR_READ;
293
binary2_class_decimal(E_DEC_FATAL_ERROR, ptr, decimal_value,
296
binary2my_decimal(E_DEC_FATAL_ERROR, ptr, decimal_value,
295
298
return(decimal_value);
299
302
String *Field_decimal::val_str(String *val_buffer,
302
type::Decimal decimal_value;
305
my_decimal decimal_value;
304
307
ASSERT_COLUMN_MARKED_FOR_READ;
306
class_decimal2string(val_decimal(&decimal_value),
309
uint32_t fixed_precision= decimal_precision ? precision : 0;
310
my_decimal2string(E_DEC_FATAL_ERROR, val_decimal(&decimal_value),
311
fixed_precision, dec, '0', val_buffer);
308
312
return val_buffer;
347
351
uint32_t const source_precision= (field_metadata >> 8U) & 0x00ff;
348
352
uint32_t const source_decimal= field_metadata & 0x00ff;
349
uint32_t const source_size= class_decimal_get_binary_size(source_precision,
353
uint32_t const source_size= my_decimal_get_binary_size(source_precision,
351
355
return (source_size);
388
392
uint32_t from_precision= (param_data & 0xff00) >> 8U;
389
393
uint32_t from_decimal= param_data & 0x00ff;
390
394
uint32_t length=pack_length();
391
uint32_t from_pack_len= class_decimal_get_binary_size(from_precision, from_decimal);
395
uint32_t from_pack_len= my_decimal_get_binary_size(from_precision, from_decimal);
392
396
uint32_t len= (param_data && (from_pack_len < length)) ?
393
397
from_pack_len : length;
394
398
if ((from_pack_len && (from_pack_len < length)) ||