28
28
const String my_null_string("NULL", 4, default_charset_info);
30
/****************************************************************************/
32
/* Hybrid_type_traits {_real} */
34
void Hybrid_type_traits::fix_length_and_dec(Item *item, Item *arg) const
36
item->decimals= NOT_FIXED_DEC;
37
item->max_length= item->float_length(arg->decimals);
40
static const Hybrid_type_traits real_traits_instance;
42
const Hybrid_type_traits *Hybrid_type_traits::instance()
44
return &real_traits_instance;
47
int64_t Hybrid_type_traits::val_int(Hybrid_type *val,
50
return (int64_t) rint(val->real);
54
Hybrid_type_traits::val_decimal(Hybrid_type *val, my_decimal *) const
56
double2my_decimal(E_DEC_FATAL_ERROR, val->real, val->dec_buf);
62
Hybrid_type_traits::val_str(Hybrid_type *val, String *to, uint8_t decimals) const
64
to->set_real(val->real, decimals, &my_charset_bin);
68
/* Hybrid_type_traits_decimal */
69
static const Hybrid_type_traits_decimal decimal_traits_instance;
71
const Hybrid_type_traits_decimal *Hybrid_type_traits_decimal::instance()
73
return &decimal_traits_instance;
78
Hybrid_type_traits_decimal::fix_length_and_dec(Item *item, Item *arg) const
80
item->decimals= arg->decimals;
81
item->max_length= cmin(arg->max_length + DECIMAL_LONGLONG_DIGITS,
82
(unsigned int)DECIMAL_MAX_STR_LENGTH);
86
void Hybrid_type_traits_decimal::set_zero(Hybrid_type *val) const
88
my_decimal_set_zero(&val->dec_buf[0]);
89
val->used_dec_buf_no= 0;
93
void Hybrid_type_traits_decimal::add(Hybrid_type *val, Field *f) const
95
my_decimal_add(E_DEC_FATAL_ERROR,
96
&val->dec_buf[val->used_dec_buf_no ^ 1],
97
&val->dec_buf[val->used_dec_buf_no],
98
f->val_decimal(&val->dec_buf[2]));
99
val->used_dec_buf_no^= 1;
105
what is '4' for scale?
107
void Hybrid_type_traits_decimal::div(Hybrid_type *val, uint64_t u) const
109
int2my_decimal(E_DEC_FATAL_ERROR, u, true, &val->dec_buf[2]);
110
/* XXX: what is '4' for scale? */
111
my_decimal_div(E_DEC_FATAL_ERROR,
112
&val->dec_buf[val->used_dec_buf_no ^ 1],
113
&val->dec_buf[val->used_dec_buf_no],
114
&val->dec_buf[2], 4);
115
val->used_dec_buf_no^= 1;
120
Hybrid_type_traits_decimal::val_int(Hybrid_type *val, bool unsigned_flag) const
123
my_decimal2int(E_DEC_FATAL_ERROR, &val->dec_buf[val->used_dec_buf_no],
124
unsigned_flag, &result);
130
Hybrid_type_traits_decimal::val_real(Hybrid_type *val) const
132
my_decimal2double(E_DEC_FATAL_ERROR, &val->dec_buf[val->used_dec_buf_no],
139
Hybrid_type_traits_decimal::val_str(Hybrid_type *val, String *to,
140
uint8_t decimals) const
142
my_decimal_round(E_DEC_FATAL_ERROR, &val->dec_buf[val->used_dec_buf_no],
143
decimals, false, &val->dec_buf[2]);
144
my_decimal2string(E_DEC_FATAL_ERROR, &val->dec_buf[2], 0, 0, 0, to);
148
/* Hybrid_type_traits_integer */
149
static const Hybrid_type_traits_integer integer_traits_instance;
151
const Hybrid_type_traits_integer *Hybrid_type_traits_integer::instance()
153
return &integer_traits_instance;
157
Hybrid_type_traits_integer::fix_length_and_dec(Item *item, Item *) const
160
item->max_length= MY_INT64_NUM_DECIMAL_DIGITS;
161
item->unsigned_flag= 0;
164
31
/*****************************************************************************