25 #include <drizzled/charset.h>
26 #include <drizzled/type/decimal.h>
27 #include <drizzled/table.h>
42 void Item_func_format::fix_length_and_dec()
44 collation.set(default_charset());
45 uint32_t char_length= args[0]->max_length/args[0]->collation.collation->mbmaxlen;
46 max_length= ((char_length + (char_length-args[0]->decimals)/3) *
47 collation.collation->mbmaxlen);
68 dec= (int) args[1]->val_int();
69 if (args[1]->null_value)
76 dec_length= dec ? dec+1 : 0;
79 if (args[0]->result_type() == DECIMAL_RESULT ||
80 args[0]->result_type() == INT_RESULT)
83 res= args[0]->val_decimal(&dec_val);
84 if ((null_value=args[0]->null_value))
86 class_decimal_round(E_DEC_FATAL_ERROR, res, dec,
false, &rnd_dec);
88 str_length= str->length();
94 double nr= args[0]->val_real();
95 if ((null_value=args[0]->null_value))
97 nr= my_double_round(nr, (int64_t) dec,
false,
false);
99 str->set_real(nr, dec, default_charset());
100 if (nr == numeric_limits<double>::quiet_NaN())
102 str_length=str->length();
107 if (str_length >= dec_length+4)
110 length= str->length()+(diff=((int)(str_length- dec_length-1))/3);
111 str= copy_if_not_alloced(&tmp_str,str,length);
113 tmp= (
char*) str->ptr()+length - dec_length-1;
114 for (pos= (
char*) str->ptr()+length-1; pos != tmp; pos--)
133 void Item_func_format::print(
String *str)
135 str->append(STRING_WITH_LEN(
"format("));