17
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
#include "drizzled/sql_select.h"
22
#include "drizzled/error.h"
23
#include "drizzled/show.h"
24
#include "drizzled/item/cmpfunc.h"
25
#include "drizzled/item/cache_row.h"
26
#include "drizzled/item/type_holder.h"
27
#include "drizzled/item/sum.h"
28
#include "drizzled/item/copy_string.h"
29
#include "drizzled/function/str/conv_charset.h"
30
#include "drizzled/sql_base.h"
31
#include "drizzled/util/convert.h"
32
#include "drizzled/plugin/client.h"
33
#include "drizzled/time_functions.h"
35
#include "drizzled/field/str.h"
36
#include "drizzled/field/num.h"
37
#include "drizzled/field/blob.h"
38
#include "drizzled/field/enum.h"
39
#include "drizzled/field/null.h"
40
#include "drizzled/field/date.h"
41
#include "drizzled/field/decimal.h"
42
#include "drizzled/field/real.h"
43
#include "drizzled/field/double.h"
44
#include "drizzled/field/int32.h"
45
#include "drizzled/field/int64.h"
46
#include "drizzled/field/num.h"
47
#include "drizzled/field/timestamp.h"
48
#include "drizzled/field/datetime.h"
49
#include "drizzled/field/varstring.h"
50
#include "drizzled/internal/m_string.h"
21
#include <drizzled/sql_select.h>
22
#include <drizzled/error.h>
23
#include <drizzled/show.h>
24
#include <drizzled/item/cmpfunc.h>
25
#include <drizzled/item/cache_row.h>
26
#include <drizzled/item/type_holder.h>
27
#include <drizzled/item/sum.h>
28
#include <drizzled/item/copy_string.h>
29
#include <drizzled/function/str/conv_charset.h>
30
#include <drizzled/sql_base.h>
31
#include <drizzled/util/convert.h>
32
#include <drizzled/plugin/client.h>
33
#include <drizzled/time_functions.h>
34
#include <drizzled/field/str.h>
35
#include <drizzled/field/num.h>
36
#include <drizzled/field/blob.h>
37
#include <drizzled/field/date.h>
38
#include <drizzled/field/datetime.h>
39
#include <drizzled/field/decimal.h>
40
#include <drizzled/field/double.h>
41
#include <drizzled/field/enum.h>
42
#include <drizzled/field/epoch.h>
43
#include <drizzled/field/int32.h>
44
#include <drizzled/field/int64.h>
45
#include <drizzled/field/microtime.h>
46
#include <drizzled/field/null.h>
47
#include <drizzled/field/real.h>
48
#include <drizzled/field/size.h>
49
#include <drizzled/field/time.h>
50
#include <drizzled/field/varstring.h>
51
#include <drizzled/current_session.h>
52
#include <drizzled/session.h>
53
#include <drizzled/internal/m_string.h>
54
#include <drizzled/item/ref.h>
55
#include <drizzled/item/subselect.h>
56
#include <drizzled/sql_lex.h>
57
#include <drizzled/system_variables.h>
138
145
String *Item::val_string_from_decimal(String *str)
140
my_decimal dec_buf, *dec= val_decimal(&dec_buf);
147
type::Decimal dec_buf, *dec= val_decimal(&dec_buf);
144
my_decimal_round(E_DEC_FATAL_ERROR, dec, decimals, false, &dec_buf);
145
my_decimal2string(E_DEC_FATAL_ERROR, &dec_buf, 0, 0, 0, str);
151
class_decimal_round(E_DEC_FATAL_ERROR, dec, decimals, false, &dec_buf);
152
class_decimal2string(&dec_buf, 0, str);
149
my_decimal *Item::val_decimal_from_real(my_decimal *decimal_value)
156
type::Decimal *Item::val_decimal_from_real(type::Decimal *decimal_value)
151
158
double nr= val_real();
155
double2my_decimal(E_DEC_FATAL_ERROR, nr, decimal_value);
162
double2_class_decimal(E_DEC_FATAL_ERROR, nr, decimal_value);
156
163
return (decimal_value);
159
my_decimal *Item::val_decimal_from_int(my_decimal *decimal_value)
166
type::Decimal *Item::val_decimal_from_int(type::Decimal *decimal_value)
161
168
int64_t nr= val_int();
165
int2my_decimal(E_DEC_FATAL_ERROR, nr, unsigned_flag, decimal_value);
172
int2_class_decimal(E_DEC_FATAL_ERROR, nr, unsigned_flag, decimal_value);
166
173
return decimal_value;
169
my_decimal *Item::val_decimal_from_string(my_decimal *decimal_value)
176
type::Decimal *Item::val_decimal_from_string(type::Decimal *decimal_value)
173
179
if (!(res= val_str(&str_value)))
176
end_ptr= (char*) res->ptr()+ res->length();
177
if (str2my_decimal(E_DEC_FATAL_ERROR & ~E_DEC_BAD_NUM,
182
if (decimal_value->store(E_DEC_FATAL_ERROR & ~E_DEC_BAD_NUM,
181
decimal_value) & E_DEC_BAD_NUM)
185
res->charset()) & E_DEC_BAD_NUM)
183
push_warning_printf(current_session,
187
push_warning_printf(&getSession(),
184
188
DRIZZLE_ERROR::WARN_LEVEL_WARN,
185
189
ER_TRUNCATED_WRONG_VALUE,
186
190
ER(ER_TRUNCATED_WRONG_VALUE), "DECIMAL",
189
193
return decimal_value;
192
my_decimal *Item::val_decimal_from_date(my_decimal *decimal_value)
196
type::Decimal *Item::val_decimal_from_date(type::Decimal *decimal_value)
196
if (get_date(<ime, TIME_FUZZY_DATE))
200
if (get_date(ltime, TIME_FUZZY_DATE))
198
my_decimal_set_zero(decimal_value);
202
decimal_value->set_zero();
199
203
null_value= 1; // set NULL, stop processing
202
return date2my_decimal(<ime, decimal_value);
206
return date2_class_decimal(<ime, decimal_value);
205
my_decimal *Item::val_decimal_from_time(my_decimal *decimal_value)
209
type::Decimal *Item::val_decimal_from_time(type::Decimal *decimal_value)
209
if (get_time(<ime))
211
my_decimal_set_zero(decimal_value);
215
decimal_value->set_zero();
214
return date2my_decimal(<ime, decimal_value);
218
return date2_class_decimal(<ime, decimal_value);
217
221
double Item::val_real_from_decimal()
219
223
/* Note that fix_fields may not be called for Item_avg_field items */
221
my_decimal value_buff, *dec_val= val_decimal(&value_buff);
225
type::Decimal value_buff, *dec_val= val_decimal(&value_buff);
224
my_decimal2double(E_DEC_FATAL_ERROR, dec_val, &result);
228
class_decimal2double(E_DEC_FATAL_ERROR, dec_val, &result);
230
234
/* Note that fix_fields may not be called for Item_avg_field items */
232
my_decimal value, *dec_val= val_decimal(&value);
236
type::Decimal value, *dec_val= val_decimal(&value);
235
my_decimal2int(E_DEC_FATAL_ERROR, dec_val, unsigned_flag, &result);
240
dec_val->val_int32(E_DEC_FATAL_ERROR, unsigned_flag, &result);
239
int Item::save_time_in_field(Field *field)
245
bool Item::save_time_in_field(Field *field)
242
if (get_time(<ime))
243
250
return set_field_to_null(field);
244
252
field->set_notnull();
245
return field->store_time(<ime, DRIZZLE_TIMESTAMP_TIME);
254
return field->store_time(ltime, type::DRIZZLE_TIMESTAMP_TIME);
248
int Item::save_date_in_field(Field *field)
257
bool Item::save_date_in_field(Field *field)
251
if (get_date(<ime, TIME_FUZZY_DATE))
261
if (get_date(ltime, TIME_FUZZY_DATE))
252
262
return set_field_to_null(field);
253
264
field->set_notnull();
254
return field->store_time(<ime, DRIZZLE_TIMESTAMP_DATETIME);
266
return field->store_time(ltime, type::DRIZZLE_TIMESTAMP_DATETIME);
281
295
with_sum_func(false),
282
296
is_autogenerated_name(true),
283
297
with_subselect(false),
284
collation(&my_charset_bin, DERIVATION_COERCIBLE)
298
collation(&my_charset_bin, DERIVATION_COERCIBLE),
299
_session(*current_session)
286
301
cmp_context= (Item_result)-1;
288
303
/* Put item in free list so that we can free all items at end */
289
Session *session= current_session;
290
next= session->free_list;
291
session->free_list= this;
304
next= getSession().free_list;
305
getSession().free_list= this;
294
308
Item constructor can be called during execution other then SQL_COM
295
command => we should check session->lex->current_select on zero (session->lex
309
command => we should check session->lex().current_select on zero (session->lex
296
310
can be uninitialised)
298
if (session->lex->current_select)
312
if (getSession().lex().current_select)
300
enum_parsing_place place= session->lex->current_select->parsing_place;
314
enum_parsing_place place= getSession().lex().current_select->parsing_place;
301
315
if (place == SELECT_LIST || place == IN_HAVING)
302
session->lex->current_select->select_n_having_items++;
316
getSession().lex().current_select->select_n_having_items++;
320
334
is_autogenerated_name(item->is_autogenerated_name),
321
335
with_subselect(item->with_subselect),
322
336
collation(item->collation),
323
cmp_context(item->cmp_context)
337
cmp_context(item->cmp_context),
325
340
/* Put this item in the session's free list */
326
next= session->free_list;
327
session->free_list= this;
341
next= getSession().free_list;
342
getSession().free_list= this;
330
345
uint32_t Item::float_length(uint32_t decimals_par) const
337
352
Item_result restype= result_type();
339
354
if ((restype == DECIMAL_RESULT) || (restype == INT_RESULT))
340
return min(my_decimal_length_to_precision(max_length, decimals, unsigned_flag),
355
return min(class_decimal_length_to_precision(max_length, decimals, unsigned_flag),
341
356
(uint32_t) DECIMAL_MAX_PRECISION);
342
357
return min(max_length, (uint32_t) DECIMAL_MAX_PRECISION);
345
360
int Item::decimal_int_part() const
347
return my_decimal_int_part(decimal_precision(), decimals);
362
return class_decimal_int_part(decimal_precision(), decimals);
350
void Item::print(String *str, enum_query_type)
365
void Item::print(String *str)
352
367
str->append(full_name());
355
void Item::print_item_w_name(String *str, enum_query_type query_type)
370
void Item::print_item_w_name(String *str)
357
print(str, query_type);
422
437
if (orig_len != length && ! is_autogenerated_name)
425
push_warning_printf(current_session,
440
push_warning_printf(&getSession(),
426
441
DRIZZLE_ERROR::WARN_LEVEL_WARN,
427
442
ER_NAME_BECOMES_EMPTY,
428
443
ER(ER_NAME_BECOMES_EMPTY),
429
444
str + length - orig_len);
431
push_warning_printf(current_session,
446
push_warning_printf(&getSession(),
432
447
DRIZZLE_ERROR::WARN_LEVEL_WARN,
433
448
ER_REMOVED_SPACES,
434
449
ER(ER_REMOVED_SPACES),
451
466
! my_strcasecmp(system_charset_info, name, item->name);
454
Item *Item::safe_charset_converter(const CHARSET_INFO * const tocs)
469
Item *Item::safe_charset_converter(const charset_info_st * const tocs)
456
471
Item_func_conv_charset *conv= new Item_func_conv_charset(this, tocs, 1);
457
472
return conv->safe ? conv : NULL;
460
bool Item::get_date(DRIZZLE_TIME *ltime,uint32_t fuzzydate)
475
bool Item::get_date(type::Time <ime,uint32_t fuzzydate)
462
if (result_type() == STRING_RESULT)
465
String tmp(buff,sizeof(buff), &my_charset_bin),*res;
466
if (!(res=val_str(&tmp)) ||
467
str_to_datetime_with_warn(res->ptr(), res->length(),
468
ltime, fuzzydate) <= DRIZZLE_TIMESTAMP_ERROR)
473
int64_t value= val_int();
475
if (number_to_datetime(value, ltime, fuzzydate, &was_cut) == -1L)
478
end= internal::int64_t10_to_str(value, buff, -10);
479
make_truncated_value_warning(current_session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
480
buff, (int) (end-buff), DRIZZLE_TIMESTAMP_NONE,
488
memset(ltime, 0, sizeof(*ltime));
483
else if (result_type() == STRING_RESULT)
485
char buff[type::Time::MAX_STRING_LENGTH];
486
String tmp(buff,sizeof(buff), &my_charset_bin),*res;
487
if (!(res=val_str(&tmp)) ||
488
str_to_datetime_with_warn(&getSession(), res->ptr(), res->length(),
489
<ime, fuzzydate) <= type::DRIZZLE_TIMESTAMP_ERROR)
496
int64_t value= val_int();
497
type::datetime_t date_value;
499
ltime.convert(date_value, value, fuzzydate);
501
if (not type::is_valid(date_value))
503
char buff[DECIMAL_LONGLONG_DIGITS], *end;
504
end= internal::int64_t10_to_str(value, buff, -10);
505
make_truncated_value_warning(&getSession(), DRIZZLE_ERROR::WARN_LEVEL_WARN,
506
buff, (int) (end-buff), type::DRIZZLE_TIMESTAMP_NONE, NULL);
492
bool Item::get_time(DRIZZLE_TIME *ltime)
519
bool Item::get_time(type::Time <ime)
521
char buff[type::Time::MAX_STRING_LENGTH];
495
522
String tmp(buff,sizeof(buff),&my_charset_bin),*res;
496
if (!(res=val_str(&tmp)) ||
497
str_to_time_with_warn(res->ptr(), res->length(), ltime))
523
if (!(res=val_str(&tmp)) or
524
str_to_time_with_warn(&getSession(), res->ptr(), res->length(), <ime))
499
memset(ltime, 0, sizeof(*ltime));
505
bool Item::get_date_result(DRIZZLE_TIME *ltime,uint32_t fuzzydate)
534
bool Item::get_date_result(type::Time <ime,uint32_t fuzzydate)
507
return get_date(ltime,fuzzydate);
536
return get_date(ltime, fuzzydate);
510
539
bool Item::is_null()
753
782
Item_ref to allow fields from view being stored in tmp table.
755
784
Item_aggregate_ref *item_ref;
756
uint32_t el= fields.elements;
785
uint32_t el= fields.size();
757
786
Item *real_itm= real_item();
759
788
ref_pointer_array[el]= real_itm;
760
if (!(item_ref= new Item_aggregate_ref(&session->lex->current_select->context,
789
if (!(item_ref= new Item_aggregate_ref(&session->lex().current_select->context,
761
790
ref_pointer_array + el, 0, name)))
762
791
return; /* fatal_error is set */
763
792
if (type() == SUM_FUNC_ITEM)
764
793
item_ref->depended_from= ((Item_sum *) this)->depended_from();
765
794
fields.push_front(real_itm);
766
session->change_item_tree(ref, item_ref);
1058
1089
bool Item::is_datetime()
1060
switch (field_type())
1062
case DRIZZLE_TYPE_DATE:
1063
case DRIZZLE_TYPE_DATETIME:
1064
case DRIZZLE_TYPE_TIMESTAMP:
1066
case DRIZZLE_TYPE_BLOB:
1067
case DRIZZLE_TYPE_VARCHAR:
1068
case DRIZZLE_TYPE_DOUBLE:
1069
case DRIZZLE_TYPE_DECIMAL:
1070
case DRIZZLE_TYPE_ENUM:
1071
case DRIZZLE_TYPE_LONG:
1072
case DRIZZLE_TYPE_LONGLONG:
1073
case DRIZZLE_TYPE_NULL:
1074
case DRIZZLE_TYPE_UUID:
1091
return field::isDateTime(field_type());
1082
1094
String *Item::check_well_formed_result(String *str, bool send_error)
1084
1096
/* Check whether we got a well-formed string */
1085
const CHARSET_INFO * const cs= str->charset();
1097
const charset_info_st * const cs= str->charset();
1086
1098
int well_formed_error;
1087
1099
uint32_t wlen= cs->cset->well_formed_len(cs,
1088
1100
str->ptr(), str->ptr() + str->length(),
1089
1101
str->length(), &well_formed_error);
1090
1102
if (wlen < str->length())
1092
Session *session= current_session;
1093
1104
char hexbuf[7];
1094
1105
enum DRIZZLE_ERROR::enum_warning_level level;
1095
1106
uint32_t diff= str->length() - wlen;
1109
push_warning_printf(session, level, ER_INVALID_CHARACTER_STRING,
1120
push_warning_printf(&getSession(), level, ER_INVALID_CHARACTER_STRING,
1110
1121
ER(ER_INVALID_CHARACTER_STRING), cs->csname, hexbuf);
1115
bool Item::eq_by_collation(Item *item, bool binary_cmp, const CHARSET_INFO * const cs)
1126
bool Item::eq_by_collation(Item *item, bool binary_cmp, const charset_info_st * const cs)
1117
const CHARSET_INFO *save_cs= 0;
1118
const CHARSET_INFO *save_item_cs= 0;
1128
const charset_info_st *save_cs= 0;
1129
const charset_info_st *save_item_cs= 0;
1119
1130
if (collation.collation != cs)
1121
1132
save_cs= collation.collation;
1186
1195
name, decimals, 0, unsigned_flag);
1188
1197
case DRIZZLE_TYPE_NULL:
1189
field= new Field_null((unsigned char*) 0, max_length, name, &my_charset_bin);
1198
field= new Field_null((unsigned char*) 0, max_length, name);
1191
1200
case DRIZZLE_TYPE_DATE:
1192
field= new Field_date(maybe_null, name, &my_charset_bin);
1201
field= new Field_date(maybe_null, name);
1204
case DRIZZLE_TYPE_MICROTIME:
1205
field= new field::Microtime(maybe_null, name);
1194
1208
case DRIZZLE_TYPE_TIMESTAMP:
1195
field= new Field_timestamp(maybe_null, name, &my_charset_bin);
1209
field= new field::Epoch(maybe_null, name);
1197
1211
case DRIZZLE_TYPE_DATETIME:
1198
field= new Field_datetime(maybe_null, name, &my_charset_bin);
1212
field= new Field_datetime(maybe_null, name);
1214
case DRIZZLE_TYPE_TIME:
1215
field= new field::Time(maybe_null, name);
1217
case DRIZZLE_TYPE_BOOLEAN:
1200
1218
case DRIZZLE_TYPE_UUID:
1201
1219
case DRIZZLE_TYPE_ENUM:
1202
1220
case DRIZZLE_TYPE_VARCHAR:
1429
uint32_t Item::max_char_length() const
1431
return max_length / collation.collation->mbmaxlen;
1434
void Item::fix_length_and_charset(uint32_t max_char_length_arg, charset_info_st *cs)
1436
max_length= char_to_byte_length_safe(max_char_length_arg, cs->mbmaxlen);
1437
collation.collation= cs;
1440
void Item::fix_char_length(uint32_t max_char_length_arg)
1442
max_length= char_to_byte_length_safe(max_char_length_arg, collation.collation->mbmaxlen);
1445
void Item::fix_char_length_uint64_t(uint64_t max_char_length_arg)
1447
uint64_t max_result_length= max_char_length_arg *
1448
collation.collation->mbmaxlen;
1450
if (max_result_length >= MAX_BLOB_WIDTH)
1452
max_length= MAX_BLOB_WIDTH;
1457
max_length= max_result_length;
1461
void Item::fix_length_and_charset_datetime(uint32_t max_char_length_arg)
1463
collation.set(&my_charset_bin);
1464
fix_char_length(max_char_length_arg);
1401
1467
Item_result item_cmp_type(Item_result a,Item_result b)
1403
1469
if (a == STRING_RESULT && b == STRING_RESULT)
1530
1596
if (res_type == DECIMAL_RESULT)
1532
my_decimal item_buf, *item_val,
1598
type::Decimal item_buf, *item_val,
1533
1599
field_buf, *field_val;
1534
1600
item_val= item->val_decimal(&item_buf);
1535
1601
if (item->null_value)
1536
1602
return 1; // This must be true
1537
1603
field_val= field->val_decimal(&field_buf);
1538
return !my_decimal_cmp(item_val, field_val);
1604
return !class_decimal_cmp(item_val, field_val);
1541
1607
double result= item->val_real();
1592
1658
Values with MY_INT32_NUM_DECIMAL_DIGITS digits may or may not fit into
1593
1659
Int32 -> make them field::Int64.
1595
if (item->max_length >= (MY_INT32_NUM_DECIMAL_DIGITS - 1))
1596
new_field=new field::Int64(item->max_length, maybe_null,
1597
item->name, item->unsigned_flag);
1661
if (item->unsigned_flag)
1663
new_field= new field::Size(item->max_length, maybe_null,
1664
item->name, item->unsigned_flag);
1666
else if (item->max_length >= (MY_INT32_NUM_DECIMAL_DIGITS - 1))
1668
new_field= new field::Int64(item->max_length, maybe_null,
1669
item->name, item->unsigned_flag);
1599
new_field=new field::Int32(item->max_length, maybe_null,
1600
item->name, item->unsigned_flag);
1673
new_field= new field::Int32(item->max_length, maybe_null,
1674
item->name, item->unsigned_flag);
1603
1679
case STRING_RESULT:
1604
1680
assert(item->collation.collation);
1606
enum enum_field_types type;
1608
1683
DATE/TIME fields have STRING_RESULT result type.
1609
1684
To preserve type they needed to be handled separately.
1611
if ((type= item->field_type()) == DRIZZLE_TYPE_DATETIME ||
1612
type == DRIZZLE_TYPE_DATE ||
1613
type == DRIZZLE_TYPE_TIMESTAMP)
1686
if (field::isDateTime(item->field_type()))
1615
1688
new_field= item->tmp_table_field_from_field_type(table, 1);
1800
1873
std::ostream& operator<<(std::ostream& output, const Item &item)
1803
output << item.name;
1805
output << drizzled::display::type(item.type());
1875
switch (item.type())
1877
case drizzled::Item::SUBSELECT_ITEM :
1878
case drizzled::Item::FIELD_ITEM :
1879
case drizzled::Item::SUM_FUNC_ITEM :
1880
case drizzled::Item::STRING_ITEM :
1881
case drizzled::Item::INT_ITEM :
1882
case drizzled::Item::REAL_ITEM :
1883
case drizzled::Item::NULL_ITEM :
1884
case drizzled::Item::VARBIN_ITEM :
1885
case drizzled::Item::COPY_STR_ITEM :
1886
case drizzled::Item::FIELD_AVG_ITEM :
1887
case drizzled::Item::DEFAULT_VALUE_ITEM :
1888
case drizzled::Item::PROC_ITEM :
1889
case drizzled::Item::COND_ITEM :
1890
case drizzled::Item::REF_ITEM :
1891
case drizzled::Item::FIELD_STD_ITEM :
1892
case drizzled::Item::FIELD_VARIANCE_ITEM :
1893
case drizzled::Item::INSERT_VALUE_ITEM :
1894
case drizzled::Item::ROW_ITEM:
1895
case drizzled::Item::CACHE_ITEM :
1896
case drizzled::Item::TYPE_HOLDER :
1897
case drizzled::Item::PARAM_ITEM :
1898
case drizzled::Item::DECIMAL_ITEM :
1899
case drizzled::Item::FUNC_ITEM :
1900
case drizzled::Item::BOOLEAN_ITEM :
1903
output << item.full_name();
1905
output << drizzled::display::type(item.type());
1808
1911
return output; // for multiple << operators.