661
666
column read set or to register used fields in a view
664
bool Item_field::register_field_in_read_map(unsigned char *arg)
669
bool Item_field::register_field_in_read_map(uchar *arg)
666
Table *table= (Table *) arg;
671
TABLE *table= (TABLE *) arg;
667
672
if (field->table == table || !table)
668
673
bitmap_set_bit(field->table->read_set, field->field_index);
669
if (field->vcol_info && field->vcol_info->expr_item)
670
return field->vcol_info->expr_item->walk(&Item::register_field_in_read_map,
676
Mark field in bitmap supplied as *arg
680
bool Item_field::register_field_in_bitmap(unsigned char *arg)
682
MY_BITMAP *bitmap= (MY_BITMAP *) arg;
684
bitmap_set_bit(bitmap, field->field_index);
689
bool Item::check_cols(uint32_t c)
678
bool Item::check_cols(uint c)
909
898
String tmp(buff,sizeof(buff), &my_charset_bin),*res;
910
899
if (!(res=val_str(&tmp)) ||
911
900
str_to_datetime_with_warn(res->ptr(), res->length(),
912
ltime, fuzzydate) <= DRIZZLE_TIMESTAMP_ERROR)
901
ltime, fuzzydate) <= MYSQL_TIMESTAMP_ERROR)
917
int64_t value= val_int();
906
longlong value= val_int();
919
if (number_to_datetime(value, ltime, fuzzydate, &was_cut) == -1L)
908
if (number_to_datetime(value, ltime, fuzzydate, &was_cut) == -1LL)
921
910
char buff[22], *end;
922
end= int64_t10_to_str(value, buff, -10);
923
make_truncated_value_warning(current_thd, DRIZZLE_ERROR::WARN_LEVEL_WARN,
924
buff, (int) (end-buff), DRIZZLE_TIMESTAMP_NONE,
911
end= longlong10_to_str(value, buff, -10);
912
make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
913
buff, (int) (end-buff), MYSQL_TIMESTAMP_NONE,
932
memset(ltime, 0, sizeof(*ltime));
921
bzero((char*) ltime,sizeof(*ltime));
1627
1623
return result_field->val_str(str,&str_value);
1630
bool Item_field::get_date(DRIZZLE_TIME *ltime,uint32_t fuzzydate)
1626
bool Item_field::get_date(MYSQL_TIME *ltime,uint fuzzydate)
1632
1628
if ((null_value=field->is_null()) || field->get_date(ltime,fuzzydate))
1634
memset(ltime, 0, sizeof(*ltime));
1630
bzero((char*) ltime,sizeof(*ltime));
1640
bool Item_field::get_date_result(DRIZZLE_TIME *ltime,uint32_t fuzzydate)
1636
bool Item_field::get_date_result(MYSQL_TIME *ltime,uint fuzzydate)
1642
1638
if ((null_value=result_field->is_null()) ||
1643
1639
result_field->get_date(ltime,fuzzydate))
1645
memset(ltime, 0, sizeof(*ltime));
1641
bzero((char*) ltime,sizeof(*ltime));
1651
bool Item_field::get_time(DRIZZLE_TIME *ltime)
1647
bool Item_field::get_time(MYSQL_TIME *ltime)
1653
1649
if ((null_value=field->is_null()) || field->get_time(ltime))
1655
memset(ltime, 0, sizeof(*ltime));
1651
bzero((char*) ltime,sizeof(*ltime));
1832
1824
String *Item_uint::val_str(String *str)
1834
1826
// following assert is redundant, because fixed=1 assigned in constructor
1836
str->set((uint64_t) value, &my_charset_bin);
1827
DBUG_ASSERT(fixed == 1);
1828
str->set((ulonglong) value, &my_charset_bin);
1841
void Item_uint::print(String *str,
1842
enum_query_type query_type __attribute__((unused)))
1833
void Item_uint::print(String *str, enum_query_type query_type)
1844
1835
// latin1 is good enough for numbers
1845
str_value.set((uint64_t) value, default_charset());
1836
str_value.set((ulonglong) value, default_charset());
1846
1837
str->append(str_value);
1850
Item_decimal::Item_decimal(const char *str_arg, uint32_t length,
1851
const CHARSET_INFO * const charset)
1841
Item_decimal::Item_decimal(const char *str_arg, uint length,
1842
CHARSET_INFO *charset)
1853
1844
str2my_decimal(E_DEC_FATAL_ERROR, str_arg, length, charset, &decimal_value);
1854
1845
name= (char*) str_arg;
1855
decimals= (uint8_t) decimal_value.frac;
1846
decimals= (uint8) decimal_value.frac;
1857
1848
max_length= my_decimal_precision_to_length(decimal_value.intg + decimals,
1858
1849
decimals, unsigned_flag);
1861
Item_decimal::Item_decimal(int64_t val, bool unsig)
1852
Item_decimal::Item_decimal(longlong val, bool unsig)
1863
1854
int2my_decimal(E_DEC_FATAL_ERROR, val, unsig, &decimal_value);
1864
decimals= (uint8_t) decimal_value.frac;
1855
decimals= (uint8) decimal_value.frac;
1866
1857
max_length= my_decimal_precision_to_length(decimal_value.intg + decimals,
1867
1858
decimals, unsigned_flag);
1871
Item_decimal::Item_decimal(double val,
1872
int precision __attribute__((unused)),
1873
int scale __attribute__((unused)))
1862
Item_decimal::Item_decimal(double val, int precision, int scale)
1875
1864
double2my_decimal(E_DEC_FATAL_ERROR, val, &decimal_value);
1876
decimals= (uint8_t) decimal_value.frac;
1865
decimals= (uint8) decimal_value.frac;
1878
1867
max_length= my_decimal_precision_to_length(decimal_value.intg + decimals,
1879
1868
decimals, unsigned_flag);
1894
1883
Item_decimal::Item_decimal(my_decimal *value_par)
1896
1885
my_decimal2decimal(value_par, &decimal_value);
1897
decimals= (uint8_t) decimal_value.frac;
1886
decimals= (uint8) decimal_value.frac;
1899
1888
max_length= my_decimal_precision_to_length(decimal_value.intg + decimals,
1900
1889
decimals, unsigned_flag);
1904
Item_decimal::Item_decimal(const unsigned char *bin, int precision, int scale)
1893
Item_decimal::Item_decimal(const uchar *bin, int precision, int scale)
1906
1895
binary2my_decimal(E_DEC_FATAL_ERROR, bin,
1907
1896
&decimal_value, precision, scale);
1908
decimals= (uint8_t) decimal_value.frac;
1897
decimals= (uint8) decimal_value.frac;
1910
1899
max_length= my_decimal_precision_to_length(precision, decimals,
1911
1900
unsigned_flag);
1915
int64_t Item_decimal::val_int()
1904
longlong Item_decimal::val_int()
1918
1907
my_decimal2int(E_DEC_FATAL_ERROR, &decimal_value, unsigned_flag, &result);
2090
bool Item_null::eq(const Item *item,
2091
bool binary_cmp __attribute__((unused))) const
2077
bool Item_null::eq(const Item *item, bool binary_cmp) const
2092
2078
{ return item->type() == type(); }
2095
2081
double Item_null::val_real()
2097
2083
// following assert is redundant, because fixed=1 assigned in constructor
2084
DBUG_ASSERT(fixed == 1);
2102
int64_t Item_null::val_int()
2088
longlong Item_null::val_int()
2104
2090
// following assert is redundant, because fixed=1 assigned in constructor
2091
DBUG_ASSERT(fixed == 1);
2110
String *Item_null::val_str(String *str __attribute__((unused)))
2096
String *Item_null::val_str(String *str)
2112
2098
// following assert is redundant, because fixed=1 assigned in constructor
2099
DBUG_ASSERT(fixed == 1);
2118
my_decimal *Item_null::val_decimal(my_decimal *decimal_value __attribute__((unused)))
2104
my_decimal *Item_null::val_decimal(my_decimal *decimal_value)
2124
Item *Item_null::safe_charset_converter(const CHARSET_INFO * const tocs)
2110
Item *Item_null::safe_charset_converter(CHARSET_INFO *tocs)
2126
2112
collation.set(tocs);
2138
2124
default_set_param_func(Item_param *param,
2139
unsigned char **pos __attribute__((unused)),
2125
uchar **pos __attribute__((unused)),
2140
2126
ulong len __attribute__((unused)))
2142
2128
param->set_null();
2146
Item_param::Item_param(uint32_t pos_in_query_arg) :
2132
Item_param::Item_param(uint pos_in_query_arg) :
2147
2133
state(NO_VALUE),
2148
2134
item_result_type(STRING_RESULT),
2149
2135
/* Don't pretend to be a literal unless value for this item is set. */
2150
2136
item_type(PARAM_ITEM),
2151
param_type(DRIZZLE_TYPE_VARCHAR),
2137
param_type(MYSQL_TYPE_VARCHAR),
2152
2138
pos_in_query(pos_in_query_arg),
2153
2139
set_param_func(default_set_param_func),
2154
2140
limit_clause_param(false)
2214
2203
internal decimal value.
2217
void Item_param::set_decimal(char *str, ulong length)
2206
void Item_param::set_decimal(const char *str, ulong length)
2209
DBUG_ENTER("Item_param::set_decimal");
2222
str2my_decimal((uint)E_DEC_FATAL_ERROR, str, &decimal_value, &end);
2211
end= (char*) str+length;
2212
str2my_decimal(E_DEC_FATAL_ERROR, str, &decimal_value, &end);
2223
2213
state= DECIMAL_VALUE;
2224
2214
decimals= decimal_value.frac;
2225
2215
max_length= my_decimal_precision_to_length(decimal_value.precision(),
2226
2216
decimals, unsigned_flag);
2233
Set parameter value from DRIZZLE_TIME value.
2223
Set parameter value from MYSQL_TIME value.
2235
2225
@param tm datetime value to set (time_type is ignored)
2236
2226
@param type type of datetime value
2242
2232
the fact that even wrong value sent over binary protocol fits into
2243
2233
MAX_DATE_STRING_REP_LENGTH buffer.
2245
void Item_param::set_time(DRIZZLE_TIME *tm,
2246
enum enum_drizzle_timestamp_type time_type,
2247
uint32_t max_length_arg)
2235
void Item_param::set_time(MYSQL_TIME *tm, timestamp_type time_type,
2236
uint32 max_length_arg)
2238
DBUG_ENTER("Item_param::set_time");
2249
2240
value.time= *tm;
2250
2241
value.time.time_type= time_type;
2252
2243
if (value.time.year > 9999 || value.time.month > 12 ||
2253
2244
value.time.day > 31 ||
2254
((time_type != DRIZZLE_TIMESTAMP_TIME) && value.time.hour > 23) ||
2245
((time_type != MYSQL_TIMESTAMP_TIME) && value.time.hour > 23) ||
2255
2246
value.time.minute > 59 || value.time.second > 59)
2257
2248
char buff[MAX_DATE_STRING_REP_LENGTH];
2258
uint32_t length= my_TIME_to_str(&value.time, buff);
2259
make_truncated_value_warning(current_thd, DRIZZLE_ERROR::WARN_LEVEL_WARN,
2249
uint length= my_TIME_to_str(&value.time, buff);
2250
make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
2260
2251
buff, length, time_type, 0);
2261
set_zero_time(&value.time, DRIZZLE_TIMESTAMP_ERROR);
2252
set_zero_time(&value.time, MYSQL_TIMESTAMP_ERROR);
2264
2255
state= TIME_VALUE;
2266
2257
max_length= max_length_arg;
2272
2263
bool Item_param::set_str(const char *str, ulong length)
2265
DBUG_ENTER("Item_param::set_str");
2275
2267
Assign string with no conversion: data is converted only after it's
2276
2268
been written to the binary log.
2278
uint32_t dummy_errors;
2279
2271
if (str_value.copy(str, length, &my_charset_bin, &my_charset_bin,
2280
2272
&dummy_errors))
2282
2274
state= STRING_VALUE;
2283
2275
max_length= length;
2285
2277
/* max_length and decimals are set after charset conversion */
2286
/* sic: str may be not null-terminated */
2278
/* sic: str may be not null-terminated, don't add DBUG_PRINT here */
2291
2283
bool Item_param::set_longdata(const char *str, ulong length)
2285
DBUG_ENTER("Item_param::set_longdata");
2294
2288
If client character set is multibyte, end of long data packet
2295
2289
may hit at the middle of a multibyte character. Additionally,
2925
2919
current->mark_as_dependent(last);
2926
2920
if (thd->lex->describe & DESCRIBE_EXTENDED)
2928
char warn_buff[DRIZZLE_ERRMSG_SIZE];
2922
char warn_buff[MYSQL_ERRMSG_SIZE];
2929
2923
sprintf(warn_buff, ER(ER_WARN_FIELD_RESOLVED),
2930
2924
db_name, (db_name[0] ? "." : ""),
2931
2925
table_name, (table_name [0] ? "." : ""),
2932
2926
resolved_item->field_name,
2933
2927
current->select_number, last->select_number);
2934
push_warning(thd, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
2928
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
2935
2929
ER_WARN_FIELD_RESOLVED, warn_buff);
3787
3782
false otherwise
3790
bool Item_field::subst_argument_checker(unsigned char **arg)
3785
bool Item_field::subst_argument_checker(uchar **arg)
3792
3787
return (result_type() != STRING_RESULT) || (*arg);
3792
Convert a numeric value to a zero-filled string
3794
@param[in,out] item the item to operate on
3795
@param field The field that this value is equated to
3797
This function converts a numeric value to a string. In this conversion
3798
the zero-fill flag of the field is taken into account.
3799
This is required so the resulting string value can be used instead of
3800
the field reference when propagating equalities.
3803
static void convert_zerofill_number_to_string(Item **item, Field_num *field)
3805
char buff[MAX_FIELD_WIDTH],*pos;
3806
String tmp(buff,sizeof(buff), field->charset()), *res;
3808
res= (*item)->val_str(&tmp);
3809
field->prepend_zeros(res);
3810
pos= (char *) sql_strmake (res->ptr(), res->length());
3811
*item= new Item_string(pos, res->length(), field->charset());
3797
3816
Set a pointer to the multiple equality the field reference belongs to
3975
4004
String *Item::check_well_formed_result(String *str, bool send_error)
3977
4006
/* Check whether we got a well-formed string */
3978
const CHARSET_INFO * const cs= str->charset();
4007
CHARSET_INFO *cs= str->charset();
3979
4008
int well_formed_error;
3980
uint32_t wlen= cs->cset->well_formed_len(cs,
4009
uint wlen= cs->cset->well_formed_len(cs,
3981
4010
str->ptr(), str->ptr() + str->length(),
3982
4011
str->length(), &well_formed_error);
3983
4012
if (wlen < str->length())
3985
4014
THD *thd= current_thd;
3986
4015
char hexbuf[7];
3987
enum DRIZZLE_ERROR::enum_warning_level level;
3988
uint32_t diff= str->length() - wlen;
4016
enum MYSQL_ERROR::enum_warning_level level;
4017
uint diff= str->length() - wlen;
3989
4018
set_if_smaller(diff, 3);
3990
4019
octet2hex(hexbuf, str->ptr() + wlen, diff);
3991
4020
if (send_error)
4059
4088
@param table Table for which the field is created
4062
Field *Item::make_string_field(Table *table)
4091
Field *Item::make_string_field(TABLE *table)
4065
assert(collation.collation);
4094
DBUG_ASSERT(collation.collation);
4066
4095
if (max_length/collation.collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB)
4067
4096
field= new Field_blob(max_length, maybe_null, name,
4068
4097
collation.collation);
4098
/* Item_type_holder holds the exact type, do not change it */
4099
else if (max_length > 0 &&
4100
(type() != Item::TYPE_HOLDER || field_type() != MYSQL_TYPE_STRING))
4070
4101
field= new Field_varstring(max_length, maybe_null, name, table->s,
4071
4102
collation.collation);
4104
field= new Field_string(max_length, maybe_null, name,
4105
collation.collation);
4074
4107
field->init(table);
4088
4121
\# Created field
4091
Field *Item::tmp_table_field_from_field_type(Table *table, bool fixed_length __attribute__((unused)))
4124
Field *Item::tmp_table_field_from_field_type(TABLE *table, bool fixed_length)
4094
4127
The field functions defines a field to be not null if null_ptr is not 0
4096
unsigned char *null_ptr= maybe_null ? (unsigned char*) "" : 0;
4129
uchar *null_ptr= maybe_null ? (uchar*) "" : 0;
4099
4132
switch (field_type()) {
4100
case DRIZZLE_TYPE_NEWDECIMAL:
4101
field= new Field_new_decimal((unsigned char*) 0, max_length, null_ptr, 0,
4133
case MYSQL_TYPE_NEWDECIMAL:
4134
field= new Field_new_decimal((uchar*) 0, max_length, null_ptr, 0,
4102
4135
Field::NONE, name, decimals, 0,
4103
4136
unsigned_flag);
4105
case DRIZZLE_TYPE_TINY:
4106
field= new Field_tiny((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE,
4107
name, 0, unsigned_flag);
4109
case DRIZZLE_TYPE_LONG:
4110
field= new Field_long((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE,
4111
name, 0, unsigned_flag);
4113
case DRIZZLE_TYPE_LONGLONG:
4114
field= new Field_int64_t((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE,
4138
case MYSQL_TYPE_TINY:
4139
field= new Field_tiny((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
4140
name, 0, unsigned_flag);
4142
case MYSQL_TYPE_SHORT:
4143
field= new Field_short((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
4144
name, 0, unsigned_flag);
4146
case MYSQL_TYPE_LONG:
4147
field= new Field_long((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
4148
name, 0, unsigned_flag);
4150
case MYSQL_TYPE_LONGLONG:
4151
field= new Field_longlong((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
4115
4152
name, 0, unsigned_flag);
4117
case DRIZZLE_TYPE_DOUBLE:
4118
field= new Field_double((unsigned char*) 0, max_length, null_ptr, 0, Field::NONE,
4154
case MYSQL_TYPE_FLOAT:
4155
field= new Field_float((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
4156
name, decimals, 0, unsigned_flag);
4158
case MYSQL_TYPE_DOUBLE:
4159
field= new Field_double((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
4119
4160
name, decimals, 0, unsigned_flag);
4121
case DRIZZLE_TYPE_NULL:
4122
field= new Field_null((unsigned char*) 0, max_length, Field::NONE,
4162
case MYSQL_TYPE_NULL:
4163
field= new Field_null((uchar*) 0, max_length, Field::NONE,
4123
4164
name, &my_charset_bin);
4125
case DRIZZLE_TYPE_NEWDATE:
4166
case MYSQL_TYPE_NEWDATE:
4167
case MYSQL_TYPE_DATE:
4126
4168
field= new Field_newdate(maybe_null, name, &my_charset_bin);
4128
case DRIZZLE_TYPE_TIME:
4170
case MYSQL_TYPE_TIME:
4129
4171
field= new Field_time(maybe_null, name, &my_charset_bin);
4131
case DRIZZLE_TYPE_TIMESTAMP:
4173
case MYSQL_TYPE_TIMESTAMP:
4132
4174
field= new Field_timestamp(maybe_null, name, &my_charset_bin);
4134
case DRIZZLE_TYPE_DATETIME:
4176
case MYSQL_TYPE_DATETIME:
4135
4177
field= new Field_datetime(maybe_null, name, &my_charset_bin);
4179
case MYSQL_TYPE_YEAR:
4180
field= new Field_year((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
4138
4184
/* This case should never be chosen */
4186
/* If something goes awfully wrong, it's better to get a string than die */
4187
case MYSQL_TYPE_STRING:
4188
if (fixed_length && max_length < CONVERT_IF_BIGGER_TO_BLOB)
4190
field= new Field_string(max_length, maybe_null, name,
4191
collation.collation);
4140
4194
/* Fall through to make_string_field() */
4141
case DRIZZLE_TYPE_ENUM:
4142
case DRIZZLE_TYPE_VARCHAR:
4195
case MYSQL_TYPE_ENUM:
4196
case MYSQL_TYPE_SET:
4197
case MYSQL_TYPE_VAR_STRING:
4198
case MYSQL_TYPE_VARCHAR:
4143
4199
return make_string_field(table);
4144
case DRIZZLE_TYPE_BLOB:
4200
case MYSQL_TYPE_TINY_BLOB:
4201
case MYSQL_TYPE_MEDIUM_BLOB:
4202
case MYSQL_TYPE_LONG_BLOB:
4203
case MYSQL_TYPE_BLOB:
4145
4204
if (this->type() == Item::TYPE_HOLDER)
4146
4205
field= new Field_blob(max_length, maybe_null, name, collation.collation,
4508
4562
unsigned_flag= 1;
4511
int64_t Item_hex_string::val_int()
4565
longlong Item_hex_string::val_int()
4513
4567
// following assert is redundant, because fixed=1 assigned in constructor
4568
DBUG_ASSERT(fixed == 1);
4515
4569
char *end=(char*) str_value.ptr()+str_value.length(),
4516
*ptr=end-cmin(str_value.length(),(uint32_t)sizeof(int64_t));
4570
*ptr=end-min(str_value.length(),sizeof(longlong));
4519
4573
for (; ptr != end ; ptr++)
4520
value=(value << 8)+ (uint64_t) (unsigned char) *ptr;
4521
return (int64_t) value;
4574
value=(value << 8)+ (ulonglong) (uchar) *ptr;
4575
return (longlong) value;
4525
4579
my_decimal *Item_hex_string::val_decimal(my_decimal *decimal_value)
4527
4581
// following assert is redundant, because fixed=1 assigned in constructor
4529
uint64_t value= (uint64_t)val_int();
4582
DBUG_ASSERT(fixed == 1);
4583
ulonglong value= (ulonglong)val_int();
4530
4584
int2my_decimal(E_DEC_FATAL_ERROR, value, true, decimal_value);
4531
4585
return (decimal_value);
4535
int Item_hex_string::save_in_field(Field *field,
4536
bool no_conversions __attribute__((unused)))
4589
int Item_hex_string::save_in_field(Field *field, bool no_conversions)
4538
4591
field->set_notnull();
4539
4592
if (field->result_type() == STRING_RESULT)
4540
4593
return field->store(str_value.ptr(), str_value.length(),
4541
4594
collation.collation);
4544
uint32_t length= str_value.length();
4597
uint32 length= str_value.length();
4545
4598
if (length > 8)
4547
nr= field->flags & UNSIGNED_FLAG ? UINT64_MAX : INT64_MAX;
4600
nr= field->flags & UNSIGNED_FLAG ? ULONGLONG_MAX : LONGLONG_MAX;
4550
nr= (uint64_t) val_int();
4551
if ((length == 8) && !(field->flags & UNSIGNED_FLAG) && (nr > INT64_MAX))
4603
nr= (ulonglong) val_int();
4604
if ((length == 8) && !(field->flags & UNSIGNED_FLAG) && (nr > LONGLONG_MAX))
4556
return field->store((int64_t) nr, true); // Assume hex numbers are unsigned
4609
return field->store((longlong) nr, true); // Assume hex numbers are unsigned
4559
if (!field->store((int64_t) nr, true))
4560
field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE,
4612
if (!field->store((longlong) nr, true))
4613
field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE,
4566
void Item_hex_string::print(String *str,
4567
enum_query_type query_type __attribute__((unused)))
4619
void Item_hex_string::print(String *str, enum_query_type query_type)
4569
4621
char *end= (char*) str_value.ptr() + str_value.length(),
4570
*ptr= end - cmin(str_value.length(), (uint32_t)sizeof(int64_t));
4622
*ptr= end - min(str_value.length(), sizeof(longlong));
4571
4623
str->append("0x");
4572
4624
for (; ptr != end ; ptr++)
4574
str->append(_dig_vec_lower[((unsigned char) *ptr) >> 4]);
4575
str->append(_dig_vec_lower[((unsigned char) *ptr) & 0x0F]);
4626
str->append(_dig_vec_lower[((uchar) *ptr) >> 4]);
4627
str->append(_dig_vec_lower[((uchar) *ptr) & 0x0F]);
4661
4712
switch ((f_type=field_type())) {
4663
case DRIZZLE_TYPE_NULL:
4664
case DRIZZLE_TYPE_ENUM:
4665
case DRIZZLE_TYPE_BLOB:
4666
case DRIZZLE_TYPE_VARCHAR:
4667
case DRIZZLE_TYPE_NEWDECIMAL:
4714
case MYSQL_TYPE_NULL:
4715
case MYSQL_TYPE_ENUM:
4716
case MYSQL_TYPE_SET:
4717
case MYSQL_TYPE_TINY_BLOB:
4718
case MYSQL_TYPE_MEDIUM_BLOB:
4719
case MYSQL_TYPE_LONG_BLOB:
4720
case MYSQL_TYPE_BLOB:
4721
case MYSQL_TYPE_STRING:
4722
case MYSQL_TYPE_VAR_STRING:
4723
case MYSQL_TYPE_VARCHAR:
4724
case MYSQL_TYPE_NEWDECIMAL:
4670
4727
if ((res=val_str(buffer)))
4671
4728
result= protocol->store(res->ptr(),res->length(),res->charset());
4674
case DRIZZLE_TYPE_TINY:
4731
case MYSQL_TYPE_TINY:
4678
4735
if (!null_value)
4679
4736
result= protocol->store_tiny(nr);
4682
case DRIZZLE_TYPE_LONG:
4739
case MYSQL_TYPE_SHORT:
4740
case MYSQL_TYPE_YEAR:
4745
result= protocol->store_short(nr);
4748
case MYSQL_TYPE_LONG:
4686
4752
if (!null_value)
4687
4753
result= protocol->store_long(nr);
4690
case DRIZZLE_TYPE_LONGLONG:
4756
case MYSQL_TYPE_LONGLONG:
4694
4760
if (!null_value)
4695
result= protocol->store_int64_t(nr, unsigned_flag);
4698
case DRIZZLE_TYPE_DOUBLE:
4761
result= protocol->store_longlong(nr, unsigned_flag);
4764
case MYSQL_TYPE_FLOAT:
4767
nr= (float) val_real();
4769
result= protocol->store(nr, decimals, buffer);
4772
case MYSQL_TYPE_DOUBLE:
4700
4774
double nr= val_real();
4701
4775
if (!null_value)
4702
4776
result= protocol->store(nr, decimals, buffer);
4705
case DRIZZLE_TYPE_DATETIME:
4706
case DRIZZLE_TYPE_TIMESTAMP:
4779
case MYSQL_TYPE_DATETIME:
4780
case MYSQL_TYPE_DATE:
4781
case MYSQL_TYPE_TIMESTAMP:
4709
4784
get_date(&tm, TIME_FUZZY_DATE);
4710
4785
if (!null_value)
4712
if (f_type == DRIZZLE_TYPE_NEWDATE)
4787
if (f_type == MYSQL_TYPE_DATE)
4713
4788
return protocol->store_date(&tm);
4715
4790
result= protocol->store(&tm);
4719
case DRIZZLE_TYPE_TIME:
4794
case MYSQL_TYPE_TIME:
4723
4798
if (!null_value)
4724
4799
result= protocol->store_time(&tm);
5966
6038
double Item_cache_decimal::val_real()
5970
6042
my_decimal2double(E_DEC_FATAL_ERROR, &decimal_value, &res);
5974
int64_t Item_cache_decimal::val_int()
6046
longlong Item_cache_decimal::val_int()
5978
6050
my_decimal2int(E_DEC_FATAL_ERROR, &decimal_value, unsigned_flag, &res);
5982
6054
String* Item_cache_decimal::val_str(String *str)
5985
6057
my_decimal_round(E_DEC_FATAL_ERROR, &decimal_value, decimals, false,
5986
6058
&decimal_value);
5987
6059
my_decimal2string(E_DEC_FATAL_ERROR, &decimal_value, 0, 0, 0, str);
5991
my_decimal *Item_cache_decimal::val_decimal(my_decimal *val __attribute__((unused)))
6063
my_decimal *Item_cache_decimal::val_decimal(my_decimal *val)
5994
6066
return &decimal_value;
6251
bool Item_type_holder::join_types(THD *thd __attribute__((unused)),
6328
bool Item_type_holder::join_types(THD *thd, Item *item)
6254
uint32_t max_length_orig= max_length;
6255
uint32_t decimals_orig= decimals;
6330
uint max_length_orig= max_length;
6331
uint decimals_orig= decimals;
6332
DBUG_ENTER("Item_type_holder::join_types");
6333
DBUG_PRINT("info:", ("was type %d len %d, dec %d name %s",
6334
fld_type, max_length, decimals,
6335
(name ? name : "<NULL>")));
6336
DBUG_PRINT("info:", ("in type %d len %d, dec %d",
6337
get_real_type(item),
6338
item->max_length, item->decimals));
6256
6339
fld_type= Field::field_type_merge(fld_type, get_real_type(item));
6258
6341
int item_decimals= item->decimals;
6259
6342
/* fix variable decimals which always is NOT_FIXED_DEC */
6260
6343
if (Field::result_merge_type(fld_type) == INT_RESULT)
6261
6344
item_decimals= 0;
6262
decimals= cmax((int)decimals, item_decimals);
6345
decimals= max(decimals, item_decimals);
6264
6347
if (Field::result_merge_type(fld_type) == DECIMAL_RESULT)
6266
decimals= cmin((int)cmax(decimals, item->decimals), DECIMAL_MAX_SCALE);
6267
int precision= cmin(cmax(prev_decimal_int_part, item->decimal_int_part())
6349
decimals= min(max(decimals, item->decimals), DECIMAL_MAX_SCALE);
6350
int precision= min(max(prev_decimal_int_part, item->decimal_int_part())
6268
6351
+ decimals, DECIMAL_MAX_PRECISION);
6269
6352
unsigned_flag&= item->unsigned_flag;
6270
6353
max_length= my_decimal_precision_to_length(precision, decimals,
6311
6394
int delta1= max_length_orig - decimals_orig;
6312
6395
int delta2= item->max_length - item->decimals;
6313
max_length= cmax(delta1, delta2) + decimals;
6314
if (fld_type == DRIZZLE_TYPE_DOUBLE && max_length > DBL_DIG + 2)
6396
max_length= max(delta1, delta2) + decimals;
6397
if (fld_type == MYSQL_TYPE_FLOAT && max_length > FLT_DIG + 2)
6399
max_length= FLT_DIG + 6;
6400
decimals= NOT_FIXED_DEC;
6402
if (fld_type == MYSQL_TYPE_DOUBLE && max_length > DBL_DIG + 2)
6316
6404
max_length= DBL_DIG + 7;
6317
6405
decimals= NOT_FIXED_DEC;
6321
max_length= DBL_DIG+7;
6409
max_length= (fld_type == MYSQL_TYPE_FLOAT) ? FLT_DIG+6 : DBL_DIG+7;
6325
max_length= cmax(max_length, display_length(item));
6413
max_length= max(max_length, display_length(item));
6327
6415
maybe_null|= item->maybe_null;
6328
6416
get_full_info(item);
6330
6418
/* Remember decimal integer part to be used in DECIMAL_RESULT handleng */
6331
6419
prev_decimal_int_part= decimal_int_part();
6420
DBUG_PRINT("info", ("become type: %d len: %u dec: %u",
6421
(int) fld_type, max_length, (uint) decimals));
6344
uint32_t Item_type_holder::display_length(Item *item)
6434
uint32 Item_type_holder::display_length(Item *item)
6346
6436
if (item->type() == Item::FIELD_ITEM)
6347
6437
return ((Item_field *)item)->max_disp_length();
6349
6439
switch (item->field_type())
6351
case DRIZZLE_TYPE_TIMESTAMP:
6352
case DRIZZLE_TYPE_TIME:
6353
case DRIZZLE_TYPE_DATETIME:
6354
case DRIZZLE_TYPE_NEWDATE:
6355
case DRIZZLE_TYPE_VARCHAR:
6356
case DRIZZLE_TYPE_NEWDECIMAL:
6357
case DRIZZLE_TYPE_ENUM:
6358
case DRIZZLE_TYPE_BLOB:
6359
case DRIZZLE_TYPE_TINY:
6441
case MYSQL_TYPE_TIMESTAMP:
6442
case MYSQL_TYPE_DATE:
6443
case MYSQL_TYPE_TIME:
6444
case MYSQL_TYPE_DATETIME:
6445
case MYSQL_TYPE_YEAR:
6446
case MYSQL_TYPE_NEWDATE:
6447
case MYSQL_TYPE_VARCHAR:
6448
case MYSQL_TYPE_NEWDECIMAL:
6449
case MYSQL_TYPE_ENUM:
6450
case MYSQL_TYPE_SET:
6451
case MYSQL_TYPE_TINY_BLOB:
6452
case MYSQL_TYPE_MEDIUM_BLOB:
6453
case MYSQL_TYPE_LONG_BLOB:
6454
case MYSQL_TYPE_BLOB:
6455
case MYSQL_TYPE_VAR_STRING:
6456
case MYSQL_TYPE_STRING:
6457
case MYSQL_TYPE_TINY:
6361
case DRIZZLE_TYPE_LONG:
6459
case MYSQL_TYPE_SHORT:
6461
case MYSQL_TYPE_LONG:
6362
6462
return MY_INT32_NUM_DECIMAL_DIGITS;
6363
case DRIZZLE_TYPE_DOUBLE:
6463
case MYSQL_TYPE_FLOAT:
6465
case MYSQL_TYPE_DOUBLE:
6365
case DRIZZLE_TYPE_NULL:
6467
case MYSQL_TYPE_NULL:
6367
case DRIZZLE_TYPE_LONGLONG:
6469
case MYSQL_TYPE_LONGLONG:
6370
assert(0); // we should never go there
6472
DBUG_ASSERT(0); // we should never go there
6386
Field *Item_type_holder::make_field_by_type(Table *table)
6488
Field *Item_type_holder::make_field_by_type(TABLE *table)
6389
6491
The field functions defines a field to be not null if null_ptr is not 0
6391
unsigned char *null_ptr= maybe_null ? (unsigned char*) "" : 0;
6493
uchar *null_ptr= maybe_null ? (uchar*) "" : 0;
6394
6496
switch (fld_type) {
6395
case DRIZZLE_TYPE_ENUM:
6396
assert(enum_set_typelib);
6397
field= new Field_enum((unsigned char *) 0, max_length, null_ptr, 0,
6497
case MYSQL_TYPE_ENUM:
6498
DBUG_ASSERT(enum_set_typelib);
6499
field= new Field_enum((uchar *) 0, max_length, null_ptr, 0,
6398
6500
Field::NONE, name,
6399
6501
get_enum_pack_length(enum_set_typelib->count),
6400
6502
enum_set_typelib, collation.collation);
6402
6504
field->init(table);
6404
case DRIZZLE_TYPE_NULL:
6506
case MYSQL_TYPE_SET:
6507
DBUG_ASSERT(enum_set_typelib);
6508
field= new Field_set((uchar *) 0, max_length, null_ptr, 0,
6510
get_set_pack_length(enum_set_typelib->count),
6511
enum_set_typelib, collation.collation);
6515
case MYSQL_TYPE_NULL:
6405
6516
return make_string_field(table);