23 #include <drizzled/field/decimal.h>
24 #include <drizzled/error.h>
25 #include <drizzled/table.h>
26 #include <drizzled/session.h>
27 #include <drizzled/create_field.h>
35 Field_decimal::Field_decimal(
unsigned char *ptr_arg,
37 unsigned char *null_ptr_arg,
38 unsigned char null_bit_arg,
39 enum utype unireg_check_arg,
40 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);
57 Field_decimal::Field_decimal(uint32_t len_arg,
62 Field_num((unsigned char*) 0,
64 maybe_null_arg ? (unsigned char*)
"": 0,
72 precision= class_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg);
73 set_if_smaller(precision, (uint32_t)DECIMAL_MAX_PRECISION);
74 assert((precision <= DECIMAL_MAX_PRECISION) &&
75 (dec <= DECIMAL_MAX_SCALE));
76 bin_size= class_decimal_get_binary_size(precision, dec);
80 int Field_decimal::reset(
void)
97 max_Decimal(decimal_value, precision, decimals());
99 decimal_value->sign(
true);
122 int error= decimal_value->val_binary(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW,
ptr, precision, dec);
126 if (error != E_DEC_TRUNCATED)
130 buff.val_binary(E_DEC_FATAL_ERROR,
ptr, precision, dec);
139 int Field_decimal::store(
const char *from, uint32_t length,
145 ASSERT_COLUMN_MARKED_FOR_WRITE;
147 if ((err= decimal_value.
store(E_DEC_FATAL_ERROR &
148 ~(E_DEC_OVERFLOW | E_DEC_BAD_NUM),
149 from, length, charset_arg)) &&
150 getTable()->
in_use->abortOnWarning())
154 from_as_str.copy(from, length, &my_charset_bin);
156 push_warning_printf(getTable()->in_use, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
157 ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
158 ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
166 case E_DEC_TRUNCATED:
167 set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
171 set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
178 from_as_str.copy(from, length, &my_charset_bin);
180 push_warning_printf(getTable()->in_use, DRIZZLE_ERROR::WARN_LEVEL_WARN,
181 ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
182 ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
185 decimal_value.set_zero();
202 int Field_decimal::store(
double nr)
207 ASSERT_COLUMN_MARKED_FOR_WRITE;
209 err= double2_class_decimal(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW, nr,
213 if (check_overflow(err))
220 else if (err && !getTable()->in_use->got_warning)
226 int Field_decimal::store(int64_t nr,
bool unsigned_val)
231 ASSERT_COLUMN_MARKED_FOR_WRITE;
233 if ((err= int2_class_decimal(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW,
234 nr, unsigned_val, &decimal_value)))
236 if (check_overflow(err))
243 else if (err && not getTable()->in_use->got_warning)
249 int Field_decimal::store_decimal(
const type::Decimal *decimal_value)
259 return store_value(date2_class_decimal(<ime, &decimal_value));
263 double Field_decimal::val_real(
void)
const
268 ASSERT_COLUMN_MARKED_FOR_READ;
270 class_decimal2double(E_DEC_FATAL_ERROR, val_decimal(&decimal_value), &dbl);
276 int64_t Field_decimal::val_int(
void)
const
279 type::Decimal decimal_value;
281 ASSERT_COLUMN_MARKED_FOR_READ;
283 val_decimal(&decimal_value)->val_int32(E_DEC_FATAL_ERROR,
false, &i);
289 type::Decimal* Field_decimal::val_decimal(type::Decimal *decimal_value)
const
291 ASSERT_COLUMN_MARKED_FOR_READ;
293 binary2_class_decimal(E_DEC_FATAL_ERROR,
ptr, decimal_value,
295 return(decimal_value);
299 String *Field_decimal::val_str(String *val_buffer, String *)
const
301 type::Decimal decimal_value;
303 ASSERT_COLUMN_MARKED_FOR_READ;
311 int Field_decimal::cmp(
const unsigned char *a,
const unsigned char*b)
313 return memcmp(a, b, bin_size);
317 void Field_decimal::sort_string(
unsigned char *buff, uint32_t)
319 memcpy(buff,
ptr, bin_size);
336 uint32_t
const source_precision= (field_metadata >> 8U) & 0x00ff;
337 uint32_t
const source_decimal= field_metadata & 0x00ff;
338 uint32_t
const source_size= class_decimal_get_binary_size(source_precision,
340 return (source_size);
344 uint32_t Field_decimal::is_equal(
CreateField *new_field_ptr)
346 return ((new_field_ptr->
sql_type == real_type()) &&
347 ((new_field_ptr->flags & UNSIGNED_FLAG) ==
348 (uint32_t) (flags & UNSIGNED_FLAG)) &&
349 ((new_field_ptr->flags & AUTO_INCREMENT_FLAG) ==
350 (uint32_t) (flags & AUTO_INCREMENT_FLAG)) &&
351 (new_field_ptr->
length == max_display_length()) &&
352 (new_field_ptr->decimals == dec));
368 const unsigned char *
370 const unsigned char *from,
377 uint32_t from_precision= (param_data & 0xff00) >> 8U;
378 uint32_t from_decimal= param_data & 0x00ff;
380 uint32_t from_pack_len= class_decimal_get_binary_size(from_precision, from_decimal);
381 uint32_t len= (param_data && (from_pack_len < length)) ?
382 from_pack_len : length;
383 if ((from_pack_len && (from_pack_len < length)) ||
384 (from_precision < precision) ||
385 (from_decimal < decimals()))
392 decimal_digit_t dec_buf[DECIMAL_MAX_PRECISION];
394 conv_dec.len= from_precision;
395 conv_dec.buf= dec_buf;
401 bin2decimal((
unsigned char *)from, &conv_dec, from_precision, from_decimal);
405 memcpy(to, from, len);
bool set_warning(DRIZZLE_ERROR::enum_warning_level, drizzled::error_t code, int cuted_increment)
TODO: Rename this file - func.h is stupid.
bool store_value(const type::Decimal *decimal_value)
int store(uint32_t mask, const char *from, uint32_t length, const charset_info_st *charset)
Convert string for decimal when string can be in some multibyte charset.
int decimal2bin(const decimal_t *from, unsigned char *to, int precision, int frac)
Convert decimal to its binary fixed-length representation (suitable for comparing with memcmp) ...
void set_value_on_overflow(type::Decimal *decimal_value, bool sign)
virtual const unsigned char * unpack(unsigned char *to, const unsigned char *from, uint32_t param_data, bool low_byte_first)
int warn_if_overflow(int op_result)
uint32_t pack_length() const
int class_decimal2string(const type::Decimal *d, uint32_t fixed_dec, String *str)
Converting decimal to string.
int store_time(type::Time <ime, type::timestamp_t t_type)
uint32_t pack_length_from_metadata(uint32_t field_metadata)
enum_field_types sql_type
int bin2decimal(const unsigned char *from, decimal_t *to, int precision, int scale)
Restores decimal from its binary fixed-length representation.
virtual const unsigned char * unpack(unsigned char *to, const unsigned char *from, uint32_t param_data, bool low_byte_first)