22
#include <drizzled/server_includes.h>
23
23
#include <drizzled/field/decimal.h>
24
24
#include <drizzled/error.h>
25
25
#include <drizzled/table.h>
26
26
#include <drizzled/session.h>
31
28
extern my_decimal decimal_zero;
33
30
/****************************************************************************
35
****************************************************************************/
37
Field_decimal::Field_decimal(unsigned char *ptr_arg,
39
unsigned char *null_ptr_arg,
40
unsigned char null_bit_arg,
41
enum utype unireg_check_arg,
42
const char *field_name_arg,
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);
62
Field_decimal::Field_decimal(uint32_t len_arg,
67
:Field_num((unsigned char*) 0,
69
maybe_null_arg ? (unsigned char*) "": 0,
77
precision= my_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg);
78
set_if_smaller(precision, (uint32_t)DECIMAL_MAX_PRECISION);
79
assert((precision <= DECIMAL_MAX_PRECISION) &&
80
(dec <= DECIMAL_MAX_SCALE));
81
bin_size= my_decimal_get_binary_size(precision, dec);
85
int Field_decimal::reset(void)
32
****************************************************************************/
34
Field_new_decimal::Field_new_decimal(unsigned char *ptr_arg,
35
uint32_t len_arg, unsigned char *null_ptr_arg,
36
unsigned char null_bit_arg,
37
enum utype unireg_check_arg,
38
const char *field_name_arg,
39
uint8_t dec_arg,bool zero_arg,
41
:Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
42
unireg_check_arg, field_name_arg, dec_arg, zero_arg, unsigned_arg)
44
precision= my_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg);
45
set_if_smaller(precision, (uint32_t)DECIMAL_MAX_PRECISION);
46
assert((precision <= DECIMAL_MAX_PRECISION) &&
47
(dec <= DECIMAL_MAX_SCALE));
48
bin_size= my_decimal_get_binary_size(precision, dec);
52
Field_new_decimal::Field_new_decimal(uint32_t len_arg,
57
:Field_num((unsigned char*) 0, len_arg,
58
maybe_null_arg ? (unsigned char*) "": 0, 0,
59
NONE, name, dec_arg, 0, unsigned_arg)
61
precision= my_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg);
62
set_if_smaller(precision, (uint32_t)DECIMAL_MAX_PRECISION);
63
assert((precision <= DECIMAL_MAX_PRECISION) &&
64
(dec <= DECIMAL_MAX_SCALE));
65
bin_size= my_decimal_get_binary_size(precision, dec);
69
int Field_new_decimal::reset(void)
87
71
store_value(&decimal_zero);
141
int Field_decimal::store(const char *from, uint32_t length,
142
const CHARSET_INFO * const charset_arg)
125
int Field_new_decimal::store(const char *from, uint32_t length,
126
const CHARSET_INFO * const charset_arg)
145
129
my_decimal decimal_value;
147
ASSERT_COLUMN_MARKED_FOR_WRITE;
149
131
if ((err= str2my_decimal(E_DEC_FATAL_ERROR &
150
132
~(E_DEC_OVERFLOW | E_DEC_BAD_NUM),
151
133
from, length, charset_arg,
180
162
String from_as_str;
181
163
from_as_str.copy(from, length, &my_charset_bin);
183
push_warning_printf(table->in_use, DRIZZLE_ERROR::WARN_LEVEL_WARN,
184
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
185
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
165
push_warning_printf(table->in_use, DRIZZLE_ERROR::WARN_LEVEL_WARN,
166
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
167
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
186
168
"decimal", from_as_str.c_ptr(), field_name,
187
(uint32_t) table->in_use->row_count);
188
my_decimal_set_zero(&decimal_value);
169
(uint32_t) table->in_use->row_count);
170
my_decimal_set_zero(&decimal_value);
252
int Field_decimal::store_decimal(const my_decimal *decimal_value)
230
int Field_new_decimal::store_decimal(const my_decimal *decimal_value)
254
232
return store_value(decimal_value);
258
int Field_decimal::store_time(DRIZZLE_TIME *ltime,
259
enum enum_drizzle_timestamp_type )
236
int Field_new_decimal::store_time(DRIZZLE_TIME *ltime,
237
enum enum_drizzle_timestamp_type )
261
my_decimal decimal_value;
262
return store_value(date2my_decimal(ltime, &decimal_value));
239
my_decimal decimal_value;
240
return store_value(date2my_decimal(ltime, &decimal_value));
266
double Field_decimal::val_real(void)
244
double Field_new_decimal::val_real(void)
269
247
my_decimal decimal_value;
271
ASSERT_COLUMN_MARKED_FOR_READ;
273
248
my_decimal2double(E_DEC_FATAL_ERROR, val_decimal(&decimal_value), &dbl);
279
int64_t Field_decimal::val_int(void)
253
int64_t Field_new_decimal::val_int(void)
282
256
my_decimal decimal_value;
284
ASSERT_COLUMN_MARKED_FOR_READ;
286
257
my_decimal2int(E_DEC_FATAL_ERROR, val_decimal(&decimal_value), false, &i);
292
my_decimal* Field_decimal::val_decimal(my_decimal *decimal_value)
262
my_decimal* Field_new_decimal::val_decimal(my_decimal *decimal_value)
294
ASSERT_COLUMN_MARKED_FOR_READ;
296
264
binary2my_decimal(E_DEC_FATAL_ERROR, ptr, decimal_value,
298
266
return(decimal_value);
302
String *Field_decimal::val_str(String *val_buffer,
270
String *Field_new_decimal::val_str(String *val_buffer,
305
273
my_decimal decimal_value;
307
ASSERT_COLUMN_MARKED_FOR_READ;
309
274
uint32_t fixed_precision= decimal_precision ? precision : 0;
310
275
my_decimal2string(E_DEC_FATAL_ERROR, val_decimal(&decimal_value),
311
276
fixed_precision, dec, '0', val_buffer);
316
int Field_decimal::cmp(const unsigned char *a,const unsigned char*b)
281
int Field_new_decimal::cmp(const unsigned char *a,const unsigned char*b)
318
283
return memcmp(a, b, bin_size);
322
void Field_decimal::sort_string(unsigned char *buff,
287
void Field_new_decimal::sort_string(unsigned char *buff,
325
290
memcpy(buff, ptr, bin_size);
329
void Field_decimal::sql_type(String &str) const
294
void Field_new_decimal::sql_type(String &str) const
331
296
const CHARSET_INFO * const cs= str.charset();
332
297
str.length(cs->cset->snprintf(cs, (char*) str.ptr(), str.alloced_length(),
338
Returns the number of bytes field uses in row-based replication
341
This method is used in row-based replication to determine the number
342
of bytes that the field consumes in the row record format. This is
343
used to skip fields in the master that do not exist on the slave.
345
@param field_metadata Encoded size in field metadata
347
@returns The size of the field based on the field metadata.
349
uint32_t Field_decimal::pack_length_from_metadata(uint32_t field_metadata)
303
Save the field metadata for new decimal fields.
305
Saves the precision in the first byte and decimals() in the second
306
byte of the field metadata array at index of *metadata_ptr and
309
@param metadata_ptr First byte of field metadata
311
@returns number of bytes written to metadata_ptr
313
int Field_new_decimal::do_save_field_metadata(unsigned char *metadata_ptr)
315
*metadata_ptr= precision;
316
*(metadata_ptr + 1)= decimals();
322
Returns the number of bytes field uses in row-based replication
325
This method is used in row-based replication to determine the number
326
of bytes that the field consumes in the row record format. This is
327
used to skip fields in the master that do not exist on the slave.
329
@param field_metadata Encoded size in field metadata
331
@returns The size of the field based on the field metadata.
333
uint32_t Field_new_decimal::pack_length_from_metadata(uint32_t field_metadata)
351
335
uint32_t const source_precision= (field_metadata >> 8U) & 0x00ff;
352
336
uint32_t const source_decimal= field_metadata & 0x00ff;
353
337
uint32_t const source_size= my_decimal_get_binary_size(source_precision,
355
339
return (source_size);
359
uint32_t Field_decimal::is_equal(CreateField *new_field_ptr)
344
Check to see if field size is compatible with destination.
346
This method is used in row-based replication to verify that the slave's
347
field size is less than or equal to the master's field size. The
348
encoded field metadata (from the master or source) is decoded and compared
349
to the size of this field (the slave or destination).
351
@param field_metadata Encoded size in field metadata
353
@retval 0 if this field's size is < the source field's size
354
@retval 1 if this field's size is >= the source field's size
356
int Field_new_decimal::compatible_field_size(uint32_t field_metadata)
359
uint32_t const source_precision= (field_metadata >> 8U) & 0x00ff;
360
uint32_t const source_decimal= field_metadata & 0x00ff;
361
uint32_t const source_size= my_decimal_get_binary_size(source_precision,
363
uint32_t const destination_size= row_pack_length();
364
compatible= (source_size <= destination_size);
366
compatible= (source_precision <= precision) &&
367
(source_decimal <= decimals());
372
uint32_t Field_new_decimal::is_equal(CreateField *new_field_ptr)
361
374
return ((new_field_ptr->sql_type == real_type()) &&
362
375
((new_field_ptr->flags & UNSIGNED_FLAG) ==
372
Unpack a decimal field from row data.
374
This method is used to unpack a decimal or numeric field from a master
375
whose size of the field is less than that of the slave.
377
@param to Destination of the data
378
@param from Source of the data
379
@param param_data Precision (upper) and decimal (lower) values
381
@return New pointer into memory based on from + length of the data
385
Unpack a decimal field from row data.
387
This method is used to unpack a decimal or numeric field from a master
388
whose size of the field is less than that of the slave.
390
@param to Destination of the data
391
@param from Source of the data
392
@param param_data Precision (upper) and decimal (lower) values
394
@return New pointer into memory based on from + length of the data
383
396
const unsigned char *
384
Field_decimal::unpack(unsigned char* to,
385
const unsigned char *from,
397
Field_new_decimal::unpack(unsigned char* to,
398
const unsigned char *from,
389
402
if (param_data == 0)
390
403
return Field::unpack(to, from, param_data, low_byte_first);
409
422
conv_dec.len= from_precision;
410
423
conv_dec.buf= dec_buf;
412
Note: bin2decimal does not change the length of the field. So it is
413
just the first step the resizing operation. The second step does the
414
resizing using the precision and decimals from the slave.
425
Note: bin2decimal does not change the length of the field. So it is
426
just the first step the resizing operation. The second step does the
427
resizing using the precision and decimals from the slave.
416
429
bin2decimal((unsigned char *)from, &conv_dec, from_precision, from_decimal);
417
430
decimal2bin(&conv_dec, to, precision, decimals());