Skip to content

Commit

Permalink
Added typedef decimal_digits_t (uint16) for number of digits in most
Browse files Browse the repository at this point in the history
aspects of decimals and integers

For fields and Item's uint8 should be good enough. After
discussions with Alexander Barkov we choose uint16 (for now)
as some format functions may accept +256 digits.

The reason for this patch was to make the usage and storage of decimal
digits simlar. Before this patch decimals was stored/used as uint8,
int and uint.  The lengths for numbers where also using a lot of
different types.

Changed most decimal variables and functions to use the new typedef.

squash! af7f091

Use decimal_digits_t for all aspects of digits (total, precision
and scale), both for decimals and integers.
  • Loading branch information
montywi authored and vuvova committed May 19, 2021
1 parent aee8445 commit fa7d4ab
Show file tree
Hide file tree
Showing 19 changed files with 277 additions and 228 deletions.
28 changes: 16 additions & 12 deletions include/decimal.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,24 +43,27 @@ typedef struct st_decimal_t {
int internal_str2dec(const char *from, decimal_t *to, char **end,
my_bool fixed);
int decimal2string(const decimal_t *from, char *to, int *to_len,
int fixed_precision, int fixed_decimals,
decimal_digits_t fixed_precision,
decimal_digits_t fixed_decimals,
char filler);
int decimal2ulonglong(const decimal_t *from, ulonglong *to);
int ulonglong2decimal(ulonglong from, decimal_t *to);
int decimal2longlong(const decimal_t *from, longlong *to);
int longlong2decimal(longlong from, decimal_t *to);
int decimal2double(const decimal_t *from, double *to);
int double2decimal(double from, decimal_t *to);
int decimal_actual_fraction(const decimal_t *from);
int decimal2bin(const decimal_t *from, uchar *to, int precision, int scale);
int bin2decimal(const uchar *from, decimal_t *to, int precision, int scale);

int decimal_size(int precision, int scale);
int decimal_bin_size(int precision, int scale);
int decimal_result_size(decimal_t *from1, decimal_t *from2, char op,
int param);

int decimal_intg(const decimal_t *from);
decimal_digits_t decimal_actual_fraction(const decimal_t *from);
int decimal2bin(const decimal_t *from, uchar *to, decimal_digits_t precision,
decimal_digits_t scale);
int bin2decimal(const uchar *from, decimal_t *to, decimal_digits_t precision,
decimal_digits_t scale);

uint decimal_size(decimal_digits_t precision, decimal_digits_t scale);
uint decimal_bin_size(decimal_digits_t precision, decimal_digits_t scale);
uint decimal_result_size(decimal_t *from1, decimal_t *from2, char op,
int param);

decimal_digits_t decimal_intg(const decimal_t *from);
int decimal_add(const decimal_t *from1, const decimal_t *from2, decimal_t *to);
int decimal_sub(const decimal_t *from1, const decimal_t *from2, decimal_t *to);
int decimal_cmp(const decimal_t *from1, const decimal_t *from2);
Expand All @@ -71,7 +74,8 @@ int decimal_mod(const decimal_t *from1, const decimal_t *from2, decimal_t *to);
int decimal_round(const decimal_t *from, decimal_t *to, int new_scale,
decimal_round_mode mode);
int decimal_is_zero(const decimal_t *from);
void max_decimal(int precision, int frac, decimal_t *to);
void max_decimal(decimal_digits_t precision, decimal_digits_t frac,
decimal_t *to);

#define string2decimal(A,B,C) internal_str2dec((A), (B), (C), 0)
#define string2decimal_fixed(A,B,C) internal_str2dec((A), (B), (C), 1)
Expand Down
1 change: 1 addition & 0 deletions include/m_ctype.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ typedef const struct my_collation_handler_st MY_COLLATION_HANDLER;
typedef const struct unicase_info_st MY_UNICASE_INFO;
typedef const struct uni_ctype_st MY_UNI_CTYPE;
typedef const struct my_uni_idx_st MY_UNI_IDX;
typedef uint16 decimal_digits_t;

typedef struct unicase_info_char_st
{
Expand Down
2 changes: 1 addition & 1 deletion mysys/ma_dyncol.c
Original file line number Diff line number Diff line change
Expand Up @@ -1208,7 +1208,7 @@ dynamic_column_decimal_read(DYNAMIC_COLUMN_VALUE *store_it_here,
(length - intg_len - frac_len) >
(size_t) (DECIMAL_BUFF_LENGTH*sizeof(decimal_digit_t)) ||
decimal_bin_size(intg + frac, frac) !=
(int) (length - intg_len - frac_len))
(uint) (length - intg_len - frac_len))
return ER_DYNCOL_FORMAT;

if (bin2decimal(data, &store_it_here->x.decimal.value, precision, scale) !=
Expand Down
10 changes: 5 additions & 5 deletions plugin/type_inet/sql_type_inet.h
Original file line number Diff line number Diff line change
Expand Up @@ -402,19 +402,19 @@ class Type_handler_inet6: public Type_handler
bool can_return_time() const override { return false; }
bool convert_to_binary_using_val_native() const override { return true; }

uint Item_time_precision(THD *thd, Item *item) const override
decimal_digits_t Item_time_precision(THD *thd, Item *item) const override
{
return 0;
}
uint Item_datetime_precision(THD *thd, Item *item) const override
decimal_digits_t Item_datetime_precision(THD *thd, Item *item) const override
{
return 0;
}
uint Item_decimal_scale(const Item *item) const override
decimal_digits_t Item_decimal_scale(const Item *item) const override
{
return 0;
}
uint Item_decimal_precision(const Item *item) const override
decimal_digits_t Item_decimal_precision(const Item *item) const override
{
/*
This will be needed if we ever allow cast from INET6 to DECIMAL.
Expand All @@ -429,7 +429,7 @@ class Type_handler_inet6: public Type_handler
Returns how many digits a divisor adds into a division result.
See Item::divisor_precision_increment() in item.h for more comments.
*/
uint Item_divisor_precision_increment(const Item *) const override
decimal_digits_t Item_divisor_precision_increment(const Item *) const override
{
return 0;
}
Expand Down
14 changes: 8 additions & 6 deletions sql/field.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1500,7 +1500,7 @@ bool Field::make_empty_rec_store_default_value(THD *thd, Item *item)
Field_num::Field_num(uchar *ptr_arg,uint32 len_arg, uchar *null_ptr_arg,
uchar null_bit_arg, utype unireg_check_arg,
const LEX_CSTRING *field_name_arg,
uint8 dec_arg, bool zero_arg, bool unsigned_arg)
decimal_digits_t dec_arg, bool zero_arg, bool unsigned_arg)
:Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
unireg_check_arg, field_name_arg),
dec(dec_arg),zerofill(zero_arg),unsigned_flag(unsigned_arg)
Expand Down Expand Up @@ -3293,18 +3293,19 @@ Field *Field_decimal::make_new_field(MEM_ROOT *root, TABLE *new_table,
** Field_new_decimal
****************************************************************************/

static uint get_decimal_precision(uint len, uint8 dec, bool unsigned_val)
static decimal_digits_t get_decimal_precision(uint len, decimal_digits_t dec,
bool unsigned_val)
{
uint precision= my_decimal_length_to_precision(len, dec, unsigned_val);
return MY_MIN(precision, DECIMAL_MAX_PRECISION);
return (decimal_digits_t) MY_MIN(precision, DECIMAL_MAX_PRECISION);
}

Field_new_decimal::Field_new_decimal(uchar *ptr_arg,
uint32 len_arg, uchar *null_ptr_arg,
uchar null_bit_arg,
enum utype unireg_check_arg,
const LEX_CSTRING *field_name_arg,
uint8 dec_arg,bool zero_arg,
decimal_digits_t dec_arg,bool zero_arg,
bool unsigned_arg)
:Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
unireg_check_arg, field_name_arg, dec_arg, zero_arg, unsigned_arg)
Expand Down Expand Up @@ -4833,7 +4834,7 @@ int Field_double::store(longlong nr, bool unsigned_val)
1 Value was truncated
*/

int truncate_double(double *nr, uint field_length, uint dec,
int truncate_double(double *nr, uint field_length, decimal_digits_t dec,
bool unsigned_flag, double max_value)
{
int error= 0;
Expand Down Expand Up @@ -10402,7 +10403,8 @@ void Column_definition::create_length_to_internal_length_bit()
void Column_definition::create_length_to_internal_length_newdecimal()
{
DBUG_ASSERT(length < UINT_MAX32);
uint prec= get_decimal_precision((uint)length, decimals, flags & UNSIGNED_FLAG);
decimal_digit_t prec= get_decimal_precision((uint)length, decimals,
flags & UNSIGNED_FLAG);
pack_length= my_decimal_get_binary_size(prec, decimals);
}

Expand Down
Loading

0 comments on commit fa7d4ab

Please sign in to comment.