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, 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, 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);
180
161
String from_as_str;
181
162
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),
164
push_warning_printf(table->in_use, DRIZZLE_ERROR::WARN_LEVEL_WARN,
165
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
166
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
186
167
"decimal", from_as_str.c_ptr(), field_name,
187
(uint32_t) table->in_use->row_count);
188
my_decimal_set_zero(&decimal_value);
168
(uint32_t) table->in_use->row_count);
169
my_decimal_set_zero(&decimal_value);
252
int Field_decimal::store_decimal(const my_decimal *decimal_value)
229
int Field_new_decimal::store_decimal(const my_decimal *decimal_value)
254
231
return store_value(decimal_value);
258
int Field_decimal::store_time(DRIZZLE_TIME *ltime,
259
enum enum_drizzle_timestamp_type )
235
int Field_new_decimal::store_time(DRIZZLE_TIME *ltime,
236
enum enum_drizzle_timestamp_type t_type __attribute__((unused)))
261
my_decimal decimal_value;
262
return store_value(date2my_decimal(ltime, &decimal_value));
238
my_decimal decimal_value;
239
return store_value(date2my_decimal(ltime, &decimal_value));
266
double Field_decimal::val_real(void)
243
double Field_new_decimal::val_real(void)
269
246
my_decimal decimal_value;
271
ASSERT_COLUMN_MARKED_FOR_READ;
273
247
my_decimal2double(E_DEC_FATAL_ERROR, val_decimal(&decimal_value), &dbl);
279
int64_t Field_decimal::val_int(void)
252
int64_t Field_new_decimal::val_int(void)
282
255
my_decimal decimal_value;
284
ASSERT_COLUMN_MARKED_FOR_READ;
286
256
my_decimal2int(E_DEC_FATAL_ERROR, val_decimal(&decimal_value), false, &i);
292
my_decimal* Field_decimal::val_decimal(my_decimal *decimal_value)
261
my_decimal* Field_new_decimal::val_decimal(my_decimal *decimal_value)
294
ASSERT_COLUMN_MARKED_FOR_READ;
296
263
binary2my_decimal(E_DEC_FATAL_ERROR, ptr, decimal_value,
298
265
return(decimal_value);
302
String *Field_decimal::val_str(String *val_buffer,
269
String *Field_new_decimal::val_str(String *val_buffer,
270
String *val_ptr __attribute__((unused)))
305
272
my_decimal decimal_value;
307
ASSERT_COLUMN_MARKED_FOR_READ;
309
273
uint32_t fixed_precision= decimal_precision ? precision : 0;
310
274
my_decimal2string(E_DEC_FATAL_ERROR, val_decimal(&decimal_value),
311
275
fixed_precision, dec, '0', val_buffer);
316
int Field_decimal::cmp(const unsigned char *a,const unsigned char*b)
280
int Field_new_decimal::cmp(const unsigned char *a,const unsigned char*b)
318
282
return memcmp(a, b, bin_size);
322
void Field_decimal::sort_string(unsigned char *buff,
286
void Field_new_decimal::sort_string(unsigned char *buff,
287
uint32_t length __attribute__((unused)))
325
289
memcpy(buff, ptr, bin_size);
329
void Field_decimal::sql_type(String &str) const
293
void Field_new_decimal::sql_type(String &str) const
331
295
const CHARSET_INFO * const cs= str.charset();
332
296
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)
302
Save the field metadata for new decimal fields.
304
Saves the precision in the first byte and decimals() in the second
305
byte of the field metadata array at index of *metadata_ptr and
308
@param metadata_ptr First byte of field metadata
310
@returns number of bytes written to metadata_ptr
312
int Field_new_decimal::do_save_field_metadata(unsigned char *metadata_ptr)
314
*metadata_ptr= precision;
315
*(metadata_ptr + 1)= decimals();
321
Returns the number of bytes field uses in row-based replication
324
This method is used in row-based replication to determine the number
325
of bytes that the field consumes in the row record format. This is
326
used to skip fields in the master that do not exist on the slave.
328
@param field_metadata Encoded size in field metadata
330
@returns The size of the field based on the field metadata.
332
uint32_t Field_new_decimal::pack_length_from_metadata(uint32_t field_metadata)
351
334
uint32_t const source_precision= (field_metadata >> 8U) & 0x00ff;
352
335
uint32_t const source_decimal= field_metadata & 0x00ff;
353
336
uint32_t const source_size= my_decimal_get_binary_size(source_precision,
355
338
return (source_size);
359
uint32_t Field_decimal::is_equal(CreateField *new_field_ptr)
361
return ((new_field_ptr->sql_type == real_type()) &&
362
((new_field_ptr->flags & UNSIGNED_FLAG) ==
363
(uint32_t) (flags & UNSIGNED_FLAG)) &&
364
((new_field_ptr->flags & AUTO_INCREMENT_FLAG) ==
365
(uint32_t) (flags & AUTO_INCREMENT_FLAG)) &&
366
(new_field_ptr->length == max_display_length()) &&
367
(new_field_ptr->decimals == dec));
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
343
Check to see if field size is compatible with destination.
345
This method is used in row-based replication to verify that the slave's
346
field size is less than or equal to the master's field size. The
347
encoded field metadata (from the master or source) is decoded and compared
348
to the size of this field (the slave or destination).
350
@param field_metadata Encoded size in field metadata
352
@retval 0 if this field's size is < the source field's size
353
@retval 1 if this field's size is >= the source field's size
355
int Field_new_decimal::compatible_field_size(uint32_t field_metadata)
358
uint32_t const source_precision= (field_metadata >> 8U) & 0x00ff;
359
uint32_t const source_decimal= field_metadata & 0x00ff;
360
uint32_t const source_size= my_decimal_get_binary_size(source_precision,
362
uint32_t const destination_size= row_pack_length();
363
compatible= (source_size <= destination_size);
365
compatible= (source_precision <= precision) &&
366
(source_decimal <= decimals());
371
uint32_t Field_new_decimal::is_equal(Create_field *new_field)
373
return ((new_field->sql_type == real_type()) &&
374
((new_field->flags & UNSIGNED_FLAG) ==
375
(uint) (flags & UNSIGNED_FLAG)) &&
376
((new_field->flags & AUTO_INCREMENT_FLAG) ==
377
(uint) (flags & AUTO_INCREMENT_FLAG)) &&
378
(new_field->length == max_display_length()) &&
379
(new_field->decimals == dec));
384
Unpack a decimal field from row data.
386
This method is used to unpack a decimal or numeric field from a master
387
whose size of the field is less than that of the slave.
389
@param to Destination of the data
390
@param from Source of the data
391
@param param_data Precision (upper) and decimal (lower) values
393
@return New pointer into memory based on from + length of the data
383
395
const unsigned char *
384
Field_decimal::unpack(unsigned char* to,
385
const unsigned char *from,
396
Field_new_decimal::unpack(unsigned char* to,
397
const unsigned char *from,
389
401
if (param_data == 0)
390
402
return Field::unpack(to, from, param_data, low_byte_first);
405
417
a decimal and write that to the raw data buffer.
407
419
decimal_digit_t dec_buf[DECIMAL_MAX_PRECISION];
409
conv_dec.len= from_precision;
410
conv_dec.buf= dec_buf;
421
dec.len= from_precision;
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.
424
Note: bin2decimal does not change the length of the field. So it is
425
just the first step the resizing operation. The second step does the
426
resizing using the precision and decimals from the slave.
416
bin2decimal((unsigned char *)from, &conv_dec, from_precision, from_decimal);
417
decimal2bin(&conv_dec, to, precision, decimals());
428
bin2decimal((unsigned char *)from, &dec, from_precision, from_decimal);
429
decimal2bin(&dec, to, precision, decimals());
420
432
memcpy(to, from, len); // Sizes are the same, just copy the data.
424
} /* namespace drizzled */